操作系统的进程状态及linux实例

进程的三态模型

我们在操作系统原理中,最初了解的就是进程的三态模型。
1. 运行:所谓的占用cpu的进程。
2. 就绪:进程被分配了到了除了cpu以外的所有资源,就绪进程可能有多个并被放在一个就绪队列中。(时间片用完后,进程从运行态变为就绪态)
3. 阻塞:进程由于某个事件暂停执行,等待事件的完成(或是资源的到来);
操作系统的进程状态及linux实例_第1张图片

linux进程实例

从ps的输出来看

ps(process status)进程状态,用来查看进程的状态的命令。
我们一般就用 。
ps aux查看当前内存中的所有进程状态。
ps中的进程状态
1. D 不可中断(uninterruptible sleep(usually IO))
2. R 运行(runnable)
3. S 中断(sleep)
4. T 停止(traced or stopped)//其实这个traced不是太明白????
5. Z 僵死(defunct process(zombie))
给几个实际的例子吧。
1. 孤儿进程的例子(linux下调用sleep函数是秒)(调用了sleep函数进程进入S状态)
github源码
操作系统的进程状态及linux实例_第2张图片
这是运行后ps命令后的结果
PS:孤儿进程的产生,父进程先于子进程退出,子进程由init进程领养,并回收PCB。(引申一下,对于我们接一下来将的僵尸进程的处理方法,我们一般是无法kill一个僵尸进程,但是我们可以kill它的父进程,让僵尸进程,成为孤儿进程,继而有init来回收PCB)(再引申一下,在linux内核下,对于进程也有两个父节点,一个是real_parent,一个是parent养父的概念。)
2. 僵尸进程的例子
github源码
操作系统的进程状态及linux实例_第3张图片
僵尸进程如何产生:子进程退出后,父进程没有调用waitpid,子进程的进程描述符仍然存在于系统中。
这里看一下如何处理僵尸进程。
操作系统的进程状态及linux实例_第4张图片
3. 不可中断状态例子。
github源码
操作系统的进程状态及linux实例_第5张图片
这个状态需要解释一下,进程不响应异步信号,kill -9 无法杀死一个正在睡眠的父进程。(但是我在实验的时候做到了这个问题?????这里需要下去好好看看操作系统的进程状态及linux实例_第6张图片

从linux内核源码的角度来看

  1. 首先先说下我的内核版本
    操作系统的进程状态及linux实例_第7张图片
  2. 在来看一下内核源码的位置
    操作系统的进程状态及linux实例_第8张图片
  3. 源码中我们要锁定一个头文件sched.h(调度)
    这里写图片描述
  4. 用vim打开在正常模式下(即按下ESC后的模式)输入/TASK_RUNNING进行检索,光标将定位在以下内容处。
    操作系统的进程状态及linux实例_第9张图片
  5. 现在开始简单的介绍一下其中的几个标志位。
    1. TASK_RUNNING(可运行态):是原理课中的就绪态和运行态的合并。所以当遇到可执行队列的时候指的就是这个TASK_RUNNING状态。
    2. TASK_INTERRUPTIBLE(可中断的睡眠状态):这种状态一般是等待某个事件的发生(可能是某个信号),被阻塞了,将该进程的struct_task放入等待事件的对待队列中,当事件到来被唤醒。
    3. TASK_UNINTERRUPTIBLE(不可中断的睡眠状态):与2相类似但是不响应异步信号。(这个状态需要深入的去看看!!!!这里浅谈)
    4. __TASK_STOPPED(暂停状态):向一个进程发送SIGSTOP信号,可以将该进程从原有状态进入__TASK_STOPPED状态。(SIGSTOP,SIGKILL都是强制的无法被重置signal处理函数),若想进程发送SIGCONT信号,则从__TASK_STOPPED回到TASK_RUNNING态。
      今天就且说到这里。
  6. 留给自己一些思考??
    1. 宏定义的时候用0, 1, 2, 4, 8这些数字是对应每一个位进行设置的,便于进行位运算。
    2. 能否提供更多的应用场景。

你可能感兴趣的:(linux进程,操作系统,linux,进程状态,ps命令,linux内核)