首页 > 代码库 > 进程
进程
定义:进程是程序执行时的一个实例。
所有进程都有一个父进程。
当一个进程创建时,它几乎与父进程相同。她接受父进程地址空间的一个拷贝,并从进行创建系统调用的下一条指令开始执行与父进程相同的代码。尽管父子进程可以共享含有程序代码的页,但是他们各自有独立的数据拷贝。
进程描述符
进程状态。进程状态是互斥的。
可运行状态(TASK_RUNING),进程要么在CPU上执行,要么准备执行
可中断的等待状态(TASK_INTERRUPTIBLE),进程被挂起(睡眠),直到某个条件变为真。产生一个硬件中断,释放进行正在等待的系统资源,或者传递一个信号都是可以唤醒进程的条件。
不可中断的暂停状态(TASK_UINTERRUPTIBLE),与可中断的等待状态类似,但是有一个例外,把信号传递到睡眠进程不能改变它的状态。
暂停状态(TASK_STOPPED),进程的执行被暂停。当进程接收到SIGSTOP,SIGTSTP,SIGTTIN或者SITTOU信号后,进入暂停状态。
跟踪状态(TASK_TRACED),进程的执行已由debugger程序暂停。
僵死状态(EXIT_ZOMBIE),进程的执行被终止,但是父进程还没有发布wait4()或waitpid()系统调用来返回有关死亡进程的信息。发布wait()类系统调用前,内核不能丢弃包含在进程描述符中的数据。
僵死撤销状态(EXIT_DEAD),最终状态:由父进程刚发出wait()或waitpid()系统调用,因而进程由系统删除。为了防止其他执行线程在同一个进程上也执行wait()类系统调用(这是一种竞争条件),而把进程状态由僵死改为撤销状态。
标识一个进程
进程和进程描述符有非常严格的一一对应关系,这使得用32位进程描述符的地址标识进程称为一种方便的方式。另一方面,类Unix操作系统允许用户使用一个叫做进行标识符(process ID)的数来标识进程,PID存放在进行描述符的pid字段中。PID被顺序编号,PID有个上限,当不够用时必须开始循环已经闲杂的PID号。由于循环使用PID号,内核必须通过管理一个pidmap_array位图来表示当前已分配和闲置的PID。因为一个页框包含32768个位,所以在32位体系结构中pidmap_array位图存放在一个单独的页中。
进程描述符处理
内核把进程描述符存放在动态内存中。对于每个进程来说,内核都把两个不同的数据结构紧凑地存放在一个单独为进程分配的存储区域内:一个是与进程描述符相关的小数据结构thread_info,叫做线程描述符。另一个是内核态的进程堆栈。这个区域的大小通常是8K(两个页框)。考虑到效率问题,内核让这8K空间占据连续的两个页框并让第一页框的起始地址是213的倍数。