计算机操作系统第九章
一簇蓝色精灵的小确幸
CHENYING0907
struct task_struct {
…
unsigned short uid;
int pid;
int processor;
…先权,该优先权反映了一个进程获得CPU使用权的资格,即高优先权的进程优先得到运行。
Linux调度时机
通常引起Linux系统中进程调度的原因有如下几种:
(1)CPU执行的进程发生状态转换
(2)就绪队列中增加了新进程。
(3)正在执行的进程所分配的时间片用完。
(4)执行系统调用的进程返回到用户态。
(5)系统内核结束中断处理返回到用户态。
(6)直接执行调度程序。
Linux调度算法
Linux的进程控制块PCB(task_struct)中有四个成员:policy、priority、rt_priority和counter,其中unsigned long policy的值表示不同类型进程的调度策略,其取值范围为:
l SCHED_OTHER(值为0):对应普通进程优先级轮转法(round robin);
l SCHED_FIFO(值为1):对应实时进程先来先服务算法;
l SCHED_RR(值为2):对应实时进程优先级轮转算法。
Linux进程切换的方式
(1)自动请愿方式。即通过系统调用,将自己转换成阻塞、僵死、暂停等状态。这样的系统调用有sys_wait4( )、sys_nanosleep( )、sys_pause( )和sys_exit( )等,它们都是通过直接调用schedule( )函数来进行进程切换的。这种切换方式是可以预见的。
(2)非主动方式。进程由系统空间返回到用户空间,即从中断、系统调用或异常返回到用户空间执行时,其可执行的时间片已经用完,系统将转入schedule( )函数重新调度。
Linux进程的通信机制
管道 (pipe)及有名管道 (namedpipe)
信号(signal)
消息队列 (message)
信号量(semaphore)
共享内存
套接字(sockets)
管道通信的实现方式是由内核通过共享数据页来完成的
无名管道的特点是:
(1)管道是半双工的,数据只能向一个方向流动。管道只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)的通信。
(2)单独构成一种独立的文件系统。对于管道两端的进程而言,管道就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并只存在于内存中。
(3)数据的读出和写入在管道的两端进行,一个进程向管道的一端写入的内容被管道另一端的进程读出。
有名管道的特点是:
不同于管道之处在于它提供一个路径名与之关联。这样,即使不存在亲缘关系的进程,也可以使用访问路径,通过有名管道相互通信。
从信号发送到信号处理函数的执行完毕,一个完整的信号生命周期可由四个重要事件来刻画:
l 信号的诞生。指的是触发信号的事件发生,如检测到硬件异常、定时器超时及调用信号发送函数kill( )。
l 信号在目标进程中注册。指的是信号值加入到进程的等待处理信号集中,只要信号在进程的等待处理信号集中,表明进程已经知道这些信号的存在,但还没来得及处理,或者该信号被进程阻塞。
l 信号在进程中的注销。在目标进程执行过程中,会检测是否有信号等待处理。如果存在待处理信号且该信号没有被进程阻塞,则在运行相应的信号处理函数前,要把信号在进程中注销。
l 信号生命终止。进程注销信号后,立即执行相应的信号处理函数,执行完毕后,信号的本次发送对进程的影响彻底结束。
Linux把信号量、消息和共享内存定义为
System V的IPC对象。
struct ipc_perm {
key_t key; /*整型,为0时表示private,非0时表示public*/
ushort uid; /*资源拥有者的有效标识*/
ushort gid; /*资源拥有者所在组的有效标识*/
ushort cuid; /*资源创建者的有效标识*/
ushort cgid; /*资源创建者所在组的有效标识*/
ushort mode; /*访问模式,其含义同文件访问模式*/
ushort seq; /*序列号*/
} ;
Linux中
计算机操作系统第九章 来自淘豆网www.taodocs.com转载请标明出处.