进程

  为了深刻描述程序动态执行过程的性质,人们引入“进程(Process)”概念。

  进程的定义

  进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。它是系统进行资源分配和调度的一个独立单位。

  进程的概念

  进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。

  进程描述符

  为了管理进程,内核必须对每个进程所做的事情进行清楚的描述。例如进程的优先级,进程是否在CPU上运行还是被阻塞,它的地址空间以及它可以访问的文件等等,这就是进程描述符的作用task_struct,它的字段包含了与进程相关的所有信息。

  进程的切换

  进行进程切换就是从正在运行的进程中收回处理器,然后再使待运行进程来占用处理器。这里所说的从某个进程收回处理器,实质上就是把进程存放在处理器的寄存器(PC, PSW, SP等)中的中间数据找个地方存起来,从而把处理器的寄存器腾出来让其他进程使用。那么被中止运行进程的中间数据存在何处好呢?当然这个地方应该是进程的私有堆栈。
  让进程来占用处理器,实质上是把某个进程存放在私有堆栈中寄存器的数据(前一次本进程被中止时的中间数据)再恢复到处理器的寄存器中去,并把待运行进程的断点送入处理器的程序指针PC,于是待运行进程就开始被处理器运行了,也就是这个进程已经占有处理器的使用权了

  在切换时,一个进程存储在处理器各寄存器中的中间数据叫做进程的上下文,所以进程的切换实质上就是被中止运行进程与待运行进程上下文的切换。在进程未占用处理器时,进程的上下文是存储在进程的私有堆栈中的。

  进程的私有堆栈

  对每个进程来说,Linux都把两个不同的数据结构紧凑的放在一个单独为进程分配的存储区域内,一个是内核态的进程堆栈,另一个是紧挨进程描述符的小数据结构thread_info,叫线程描述符,这块存储区域的大小通常为8192个字节(两个页框)。

  

  C语言使用如下的联合体来表示一个进程的线程描述符和内核栈:

  union thread_union {
  struct thread_info thread_info;
  unsigned long stack[2048]; /* 1024 for 4KB stacks */
  };

  进程的状态

   进程描述符中的state字段描述的当前进程所处的状态,它由一组标志组成,其中每个标志表示一种进程的状态,这些状态是互斥的,也就是说每个进程只能处于其中的一种状态:

  可运行状态(TASK_RUNNING):  要么在CPU上执行,要么准备在CPU上执行。

  可中断的等待状态(TASK_INTERRUPTIBLE):  进程休眠或被挂起时,直到某个条件变为真。产生一个硬件中断,释放进程正等待的系统资源,或传递一个信号都是可以唤醒进程的条件(把进程的状态放回到TASK_RUNNING).

  不可中断的等待状态(TASK_UNINTERRUPTIBLE):  与可中断的等待状态类似,但有一个例外,把信号传递到睡眠进程不能改变它的状态。

   暂停状态(TASK_STOPPED):  当进程收到SIGSTOP, SIGTSTP, SIGTTIN或SIGTTOU信号后,进入暂停状态。

   跟踪状态(TASK_TRACED):  进程的执行已由debugger程序暂停。当一个进程被另一个进程监控时(例如debugger执行ptrace()系统调用监控一个测试程序),任何信号都可以把这个进程至于TASK_TRACED状态。

  僵死状态(EXIT_ZOMBIE):  进程的执行被终止,但是,父进程还没有发布wait4或者waitpid()系统调用来返回有关死亡进程的消息。发布wait()系统调用前,内核不能丢弃包含在死进程描述符中的数据,因为父进程可能还需要它。

  僵死撤销状态(EXIT_DEAD):  最终状态,由于父进程刚刚发布wait4()或者waitpid()系统调用,因而进程由系统删除。

  state字段的值通常由简单的赋值语句设置,例如:

  p->state = TASK_RUNNING.

  也可使用set_task_state或者set_current_state来设置指定进程的状态和当前进程的状态。

原文地址:https://www.cnblogs.com/watson/p/3542607.html