赞
踩
为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。
进程的状态在哪里呢?
进程状态在进程控制块PCB中
进程的意义是什么呢?
方便OS快速判断进程,完成特定的功能,比如调度。本质上是一种分类。
运行状态一定占用CPU嘛? 不一定!
R状态只要是在运行队列中都叫R状态。
并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里
意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
有时候也叫不可中断睡眠(深度睡眠)状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
S和D状态有什么区别呢?
当进程处于D状态时,该进程不可被杀死。S状态时,系统是可以杀掉该进程。
当我们完成某种任务的时候,任务条件不具备,需要进程进行某种等待。
所谓的进程,在运行的时候,有可能因为运行需要,可能会在不同的队列里!!
在不同的队列,所处的状态是不一样的!
进程的本质是一种分类,我们用不同的队列来分类!
我们把从运行状态的task_struct(run_queue)放到等待队列中,就叫做挂起等待(阻塞);
从等待队列,放到运行队列,被CPU调度就叫做唤醒进程。
可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
一旦死亡了,就意味着会回收它的资源,这里的资源 = 进程相关的内核数据结构+你的代码和数据;
这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
为什么要有僵尸状态呢?
因为需要辨别进程死亡退出的原因。
那如何辨别呢?查看进程退出的信息。
进程退出的信息也是数据,这个数据跟进程强相关,保存在task_struct。
一个进程的退出并不是直接退出的,而是先让这个进程进入僵尸状态,然后系统会将进程退出的所以信息写在这个进程的PCB里面,供系统或父进程来读取。
所以当进程退出时不立即释放我们的进程,而让我们这个进程的退出信息暂时维护起来,此时这种状态的task_struct就叫做僵尸也叫做Z状态。
所以正常的进程死亡流程是:先是Z状态,然后由Z变成X状态,最后程序才被释放掉。
但是我们发现我们的代码明明还在跑,为什么会是S状态呢?
代码在向显示器上打印数据,因为显示器是外设,相对于CPU来说,显示器非常的慢,IO等待外设就绪是需要花时间的,所以我们查看时大部分都是S状态。
首先我们要了解两个信号
然后这时我们就可以向进程发送暂停信号
也可以向进程发送继续信号
但是此时我们发现R信号后面没有带+号,并且我们向进程发送Ctrl+C时无法结束进程了,为什么呢?
因为我们发送暂停和继续此时进程变成了后台运行。
那怎么暂停这个程序呢?
向进程发送9号信号就可以了。
如何查看Z状态呢?
当子进程退出,父进程没有回收子进程时,此时的子进程的状态就是Z状态。
先设置出父子进程,运行时让父进程休眠,子进程运行。
子进程没有退出时的状态
杀掉子进程
杀掉子进程后子进程状态为Z
因为此时父进程没有及时回收子进程,导致子进程变成Z状态。
僵尸进程危害
父进程如果一直不读取,那子进程就一直处于Z状态?是的!
维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中。换句话说,Z状态一直不退出,PCB一直都要维护?是的!
那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!
因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!
内存泄漏?是的
如果此时父进程先退出而子进程还没退出会怎么样呢?
此时子进程就称之为“孤儿进程”
那么子进程后退出,进入Z之后,那该如何处理呢?
孤儿进程会被被1号init进程领养,当然要有init进程回收喽。
父子进程运行一段时间后父进程退出
父进程退出
子进程变成孤儿进程,被一号进程(操作系统)领养。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。