《UNIX环境高级编程》第三部分进程之进程控制

来源:互联网 发布:查看linux版本命令 编辑:程序博客网 时间:2024/05/18 00:04

3 进程控制(第8章)

3.1 进程标识

每个进程都有一个非负整型表示的唯一进程ID,且进程ID标识符总是唯一的。

系统中的专用进程有:

ID=0的进程为调度进程,也被成为交换进程(swapper),该进程是内核的一部分,是内核中的系统进程,不执行任何磁盘上的程序;

ID=1的进程为init进程,在自举过程结束时由内核调用;init进程不会终止,为普通用户进程,不是如调度进程一样的内核中的系统进程,但以超级用户权限运行;

ID=2的进程是页守护进程,此进程负责支持虚拟存储器系统的分页操作,是提供操作系统服务的内核进程。

linux系统启动时,它将运行一个名为init的进程,该进程为系统运行的第一个进程,可把init看作是操作系统的进程管理器,它是其他所有进程的祖先进程,即树状结构的整个所有进程的根节点。

3.2 fork

UNIX系统的基本进程控制原语,用fork创建新进程,用exec初始执行新的程序,exit函数和wait函数处理终止和等待终止;(必须熟悉掌握)

#include  <unistd.h>

pid_t  fork(void);        返回值:子进程返回0,父进程返回子进程ID,出错返回-1;

fork创建的新进程为子进程;

fork函数被调用1次,但返回2次,两次返回的区别是子进程返回值为0,父进程返回值为新建子进程的进程ID;

fork的作用是复制一个与当前进程一样的进程,新进程所有数据和原进程相同,但是一个全新的进程,且为原进程的子进程;

PID为1到32768的正整数,其中1为init进程,其他进程从2开始依次编号,用完后再从2重新开始。

除了进程0,其他所有进程都由系统调用fork创建,除了进程0外的进程都只有一个父进程,但一个父进程可以有多个子进程;

父进程和子进程共享同一个文件偏移量;

子进程对变量所做的改变并不影响父进程中该变量的值;

fork失败原因:1,系统中存在太多进程;2,该实际用户ID的进程总数超过系统限制;

fork的两种用法:1,父进程希望复制自己,使父进程和子进程同时执行不同的代码段;2,一个进程要执行一个不同函数。

3.3 exit

进程的5种正常终止方式和3种异常终止方式:

正常终止方式:1,在main函数中执行return语句;2,调用exit函数;3,调用_exit或_Exit函数;4,进程的最后一个线程在其启动例程中执行return语句。该进程以终止状态0返回,该线程的返回值也不用作进程的返回值;5,进程的最后一个线程调用pthread_exit函数,进程终止状态总是0。

异常终止方式:1,调用abort,产生SIGABRT信号;2,当进程接收到某些信号时;3,最后一个线程取消请求作为响应;

另外,子进程是在父进程调用fork后生成的,并将终止状态返回给父进程。如果父进程在子进程之前终止,则这些子进程将由init进程收养,即在一个进程终止时,内核逐个检查所有活动进程判断是否是正要终止进程的子进程,如果是,则该进程的父进程ID就改为1,以确保每个进程都有一个父进程。

僵死进程:一个已经终止,但是其父进程尚未对其进程善后处理的进程,善后例如获取终止子进程的有关信息(进程ID,进程终止状态,进程使用CPU的时间总量)、释放它占用的资源。

善后处理:内核为每个终止子进程保存了一定量的信息,当终止进程的父进程调用wait或waitpid函数时可得到这些信息,便不会成为僵死进程。

由init进程的子进程,可能是init直接产生的进程,也可能是父进程已终止,由init收养的进程;且这些收养的进程不会成为僵死进程,因为init被编写为无论何时只要有一个子进程终止就会调用一个wait函数获得其终止状态。

3.4 wait和waitpid

子进程终止是一个异步事件,在父进程运行的任何时间都可能发生,当终止时内核会给其父进程发送SIGCHLD信号作为异步通知。进程由于接收到SIGCHLD信号而调用wait,我们期望wait立即返回。但如果随机时间点调用wait,则进程可能会阻塞。

#include <sys/wait.h>

pid_t  wait(int  *statloc);

pid_t  waitpid(pid_t  pid, int  *statloc,  int  options);      成功则返回进程ID,出错则返回0;

调用后可能情况:1,如果所有子进程还在运行,则阻塞;2,如果一个子进程已终止,正等待父进程获取终止状态,则取得子进程的终止状态后立即返回;3,如果没有任何子进程,则立即出错返回。

wait和waitpid的区别:1,在一个子进程终止前,wait使其调用者阻塞,而waitpid有一选择,可使调用者不阻塞;2,waitpid并不等待在其调用之后的第一个终止子进程,它可控制它所等待的进程。

3.5 exec

函数fork创建新的子进程后,子进程往往要调用一种exec函数以执行另一个程序。exec使用磁盘上的一个新程序替换当前进程的正文段、数据段、堆段和栈段;

exec函数不创建新的进程,也不改变前后的进程ID,在exec前后实际用户ID和实际组ID保持不变,而有效ID是否改变则取决于所执行程序文件的设置用户ID位和设置组ID位是否设置。

3.6 进程调度

调度策略和调度优先级都是由内核确定的,进程可以通过调整nice值降低它对CPU的占有,选择以更低优先级运行;只有特权进程允许提高调度权限;

nice值越小,优先级越高;

0 0
原创粉丝点击