Unix创建新进程的唯一方法为fork。一个进程想要执行另一个程序,需要先fork,fork的子进程再调用exec函数族把自身替换成新程序。除此之外,Linux还提供了clone系统调用,clone的工作原理基本上与fork相同,但新进程不是独立于父进程的,而可以与其共享某些资源。可以指定需要共享和复制的资源种类,例如,父进程的内存数据、打开文件或安装的信号处理程序。clone用于实现线程,但仅仅该系统调用不足以做到这一点,还需要用户空间库才能提供完整的实现。
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid; //定义进程号,实际上是int类型
pid = fork();
if(pid == 0) //返回子进程
{
//获取目前进程的进程识别码
printf("child pid: %d\n", getpid());
} else {
printf("pid: %d\n", pid);//父进程中返回子进程的pid
printf("father pid: %d\n", getpid());
}
}
返回结果:
pid: 3381
father pid: 3380
child pid: 3381
用户态切换到核心态的两种方式:系统调用(主动调用)和中断(自动触发)
如果系统处于核心态并正在处理系统调用,那么系统中的其他进程是无法夺取其CPU时间的。 调度器必须等到系统调用执行结束,才能选择另一个进程执行,但中断可以中止系统调用。中断具有最高优先级,因为在中断触发后需要尽快处理。
rss和res意思一样。一个是ps里,一个是top里的
nice值:表示进程可被执行的优先级的修正数值,PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice。这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。
Linux提供资源限制(resource limit,rlimit)机制,对进程使用系统资源施加某些限制。
/proc/$pid/limits