Linux 核心--5.Linux进程( 三 )



task_struct结构中有四对进程和组标志符:


uid, gid
表示运行进程的用户标志符和组标志符 。
effective uid and gid
有些程序可以在执行过程中将执行进程的uid和gid改成其程序自身的uid和gid(保存在描叙可执行映象的VFS inode属性中) 。这些程序被称为setuid程序 , 常在严格控制对某些服务的访问时使用 , 特别是那些为别的进程而运行的进程 , 例如网络后台进程 。有效uid和gid是那些setuid执行过程在执行时变化出的uid 和gid 。当进程试图访问特权数据或代码时 , 核心将检查进程的有效gid和uid 。
file system uid and gid
它们和有效uid和gid相似但用来检验进程的文件系统访问权限 。如运行在用户模式下的NFS服务器存取文件时 , NFS文件系统将使用这些标志符 。此例中只有文件系统uid和gid发生了改变(而非有效uid和gid) 。这样可以避免恶意用户向NFS服务器发送KILL信号 。
saved uid and gid
POSIX标准中要求实现这两个标志符 , 它们被那些通过系统调用改变进程uid和gid的程序使用 。当进程的原始uid和gid变化时 , 它们被用来保存真正的uid和gid 。

4.3调度
所有进程部分时间运行于用户模式 , 部分时间运行于系统模式 。如何支持这些模式 , 底层硬件的实现各不相同 , 但是存在一种安全机制可以使它们在用户模式和系统模式之间来回切换 。用户模式的权限比系统模式下的小得多 。进程通过系统调用切换到系统模式继续执行 。此时核心为进程而执行 。在Linux中 , 进程不能被抢占 。只要能够运行它们就不能被停止 。当进程必须等待某个系统事件时 , 它才决定释放出CPU 。例如进程可能需要从文件中读出字符 。一般等待发生在系统调用过程中 , 此时进程处于系统模式;处于等待状态的进程将被挂起而其他的进程被调度管理器选出来执行 。

进程常因为执行系统调用而需要等待 。由于处于等待状态的进程还可能占用CPU时间 , 所以Linux采用了预加载调度策略 。在此策略中 , 每个进程只允许运行很短的时间:200毫秒 , 当这个时间用完之后 , 系统将选择另一个进程来运行 , 原来的进程必须等待一段时间以继续运行 。这段时间称为时间片 。

调度器必须选择最迫切需要运行而且可以执行的进程来执行 。

可运行进程是一个只等待CPU资源的进程 。Linux使用基于优先级的简单调度算法来选择下一个运行进程 。当选定新进程后 , 系统必须将当前进程的状态 , 处理器中的寄存器以及上下文状态保存到task_struct结构中 。同时它将重新设置新进程的状态并将系统控制权交给此进程 。为了将CPU时间合理的分配给系统中每个可执行进程 , 调度管理器必须将这些时间信息也保存在task_struct中 。

policy
应用到进程上的调度策略 。系统中存在两类Linux进程:普通与实时进程 。实时进程的优先级要高于其它进程 。如果一个实时进程处于可执行状态 , 它将先得到执行 。实时进程又有两种策略:时间片轮转和先进先出 。在时间片轮转策略中 , 每个可执行实时进程轮流执行一个时间片 , 而先进先出策略每个可执行进程按各自在运行队列中的顺序执行并且顺序不能变化 。
priority
调度管理器分配给进程的优先级 。同时也是进程允许运行的时间(jiffies) 。系统调用renice可以改变进程的优先级 。
rt_priority
Linux支持实时进程 , 且它们的优先级要高于非实时进程 。调度器使用这个域给每个实时进程一个相对优先级 。同样可以通过系统调用来改变实时进程的优先级 。
counter
进程允许运行的时间(保存在jiffies中) 。进程首次运行时为进程优先级的数值 , 它随时间变化递减 。

推荐阅读