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



Scheduling Information
调度器需要这些信息以便判定系统中哪个进程最迫切需要运行 。

Identifiers
系统中每个进程都有进程标志 。进程标志并不是task数组的索引 , 它仅仅是个数字 。每个进程还有一个用户与组标志 , 它们用来控制进程对系统中文件和设备的存取权限 。

Inter-Process Communication
Linux支持经典的Unix IPC机制 , 如信号、管道和信号灯以及系统V中IPC机制 , 包括共享内存、信号灯和消息队列 。我们将在IPC一章中详细讨论Linux中IPC机制 。

Links
Linux系统中所有进程都是相互联系的 。除了初始化进程外 , 所有进程都有一个父进程 。新进程不是被创建 , 而是被复制 , 或者从以前的进程克隆而来 。每个进程对应的task_struct结构中包含有指向其父进程和兄弟进程(具有相同父进程的进程)以及子进程的指针 。我们可以使用pstree 命令来观察Linux系统中运行进程间的关系:

init(1)- -crond(98)
|-emacs(387)
|-gpm(146)
|-inetd(110)
|-kerneld(18)
|-kflushd(2)
|-klogd(87)
|-kswapd(3)
|-login(160)---bash(192)---emacs(225)
|-lpd(121)
|-mingetty(161)
|-mingetty(162)
|-mingetty(163)
|-mingetty(164)
|-login(403)---bash(404)---pstree(594)
|-sendmail(134)
|-syslogd(78)
`-update(166)


另外 , 系统中所有进程都用一个双向链表连接起来 , 而它们的根是init进程的task_struct数据结构 。这 个链表被Linux核心用来寻找系统中所有进程 , 它对ps或者kill命令提供了支持 。

Times and Timers
核心需要记录进程的创建时间以及在其生命期中消耗的CPU时间 。时钟每跳动一次 , 核心就要更新保存在jiffies变量中 , 记录进程在系统和用户模式下消耗的时间量 。Linux支持与进程相关的interval定时器 , 进程可以通过系统调用来设定定时器以便在定时器到时后向它发送信号 。这些定时器可以是一次性的或者周期性的 。

File system
进程可以自由地打开或关闭文件 , 进程的task_struct结构中包含一个指向每个打开文件描叙符的指针以及指向两个VFS inode的指针 。每个VFS inode唯一地标记文件中的一个目录或者文件 , 同时还对底层文件系统提供统一的接口 。Linux对文件系统的支持将在filesystem一章中详细描叙 。这两个指针 , 一个指向进程的根目录 , 另一个指向其当前或者pwd目录 。pwd从Unix命令pwd中派生出来 ,  用来显示当前工作目录 。这两个VFS inode包含一个count域 , 当多个进程引用它们时 , 它的值将增加 。这就是为什么你不能删除进程当前目录 , 或者其子目录的原因 。

Virtual memory
多数进程都有一些虚拟内存(核心线程和后台进程没有) , Linux核心必须跟踪虚拟内存与系统物理内存的映射关系 。

Processor Specific Context
进程可以认为是系统当前状态的总和 。进程运行时 , 它将使用处理器的寄存器以及堆栈等等 。进程被挂起时 , 进程的上下文-所有的CPU相关的状态必须保存在它的task_struct结构中 。当调度器重新调度该进程时 , 所有上下文被重新设定 。

4.2Identifiers
和其他Unix一样 , Linux使用用户和组标志符来检查对系统中文件和可执行映象的访问权限 。Linux系统中所有的文件都有所有者和允许的权限 , 这些权限描叙了系统使用者对文件或者目录的使用权 。基本的权限是读、写和可执行 , 这些权限被分配给三类用户:文件的所有者 , 属于相同组的进程以及系统中所有进程 。每类用户具有不同的权限 , 例如一个文件允许其拥有者读写 , 但是同组的只能读而其他进程不允许访问 。

Linux使用组将文件和目录的访问特权授予一组用户 , 而不是单个用户或者系统中所有进程 。如可以为某个软件项目中的所有用户创建一个组 , 并将其权限设置成只有他们才允许读写项目中的源代码 。一个进程可以同时属于多个组(最多为32个) , 这些组都被放在进程的task_struct中的group数组中 。只要某组进程可以存取某个文件 , 则由此组派生出的进程对这个文件有相应的组访问权限 。

推荐阅读