6.2 进程调度策略与信号
UNIX/Linux系统是分时系统,系统给每个进程分一个时间片,每个进程在自己的时间片内执行,当时间片结束时或从系统服务中返回时,动态计算进程的“优先级”。若有优先级高于当前进程的内存就绪态进程时,系统设置调度标志,并在以后某个时刻剥夺当前进程的执行权,而让优先级高的进程执行。
6.2.1 调度策略与优先级的计算
在UNIX/Linux系统中,每个进程在执行时的优先级是动态变化的,只有优先级最高的进程才能得到运行。一般来说,一个优先级最高的进程才能得到执行。随着执行时间的增加,优先级逐渐降低,执行了一段时间后,将放弃处理机,原因可能是时间片用完或资源不到位自动放弃处理机,也可能是被优先级高的进程抢占。若它没有执行完毕,则其优先级将变为“最低”,然后到调度队列的最后排队。随着等待时间的增加,它的优先将逐步增加,在队列中的位置逐步前移,直到优先级达到最高时才能被再次执行。
在优先级计算过程中有一个基本参数参与运算,这就是传统UNIX Nice Level优先级(优先数),它是一个静态参数。按传统做法,把这个参数记为NICE。系统为每个进程设置了一个默认的NICE值(0),通过nice命令,用户或管理员可以调整进程的NICE值,从而达到调整优先级的目的。在Linux中它的调整范围为−20~19;在其他的UNIX中,NICE的取值范围可能与此不同。沿用UNIX的传统,NICE的值越大,进程的优先级越低,进程得到执行的机会越少。尽管在Linux 2.6内核中不再保留NICE值,但作为nice命令的参数,它仍然可以被使用。
6.2.2 信号与软中断
UNIX/Linux中使用很多信号,用于进程通信与控制。
用户或进程可以向目的进程发送信号,实现一定程度的通信,完成指定的工作或达到某种指定的目的。用户对收到的信号可以采取系统指定的办法进行处理,也可采取自己的办法进行处理,也可忽略信号(参见shell编程)。Linux系统常用的中断信号如表6-1所示。
表6-1 Linux系统常用的中断信号
在表6-1 的信号中,可以按用途或产生原因分成多种类型。人工信号类有SIGHUP、SIGINT、SIGABRT、SIGKILL、SIGQUIT、SIGUSR1、SIGUSR2和SIGTERM,它们是由用户或应用程序产生的。错误检测类有SIGBUS、SIGFPE、SIGSEGV、SIGILL、SIGXCPU、SIGSTKFLT、SIGXFSZ、SIGIO和SIGPIPE,它们多是在程序执行过程中由硬件产生的。任务控制类有SIGCHLD、SIGTSTP、SIGSTOP、SIGCONT、SIGTTIN和SIGTTOU,它们是进程合作过程中产生和需要的。定时器类有SIGALRM、SIGVTALRM和SIGPROF,它们都是由不同定时器到点而发出的。其他类信号有SIGTRAP、SIGURG、SIGWINCH和SIGPWR。
通常只处理一些人工软中断信号,在这些信号中SIGHUP、SIGINT、SIGQUIT、SIGUSR1、SIGUSR2和SIGTERM是可屏蔽的,而SIGKILL是不可屏蔽的。