网站设计制作价钱,上饶市建设局有什么网站,学做电影网站,帮朋友做网站 知乎1.直接谈论Linux的进程状态
Linux进程状态本质上是task_struct这个结构体内的一个变量用来存储进程状态。 task_struct { //内部的一个属性 int status; } R运行状态#xff08;running#xff09;: 并不意味着进程一定在运行中#xff0c;它表明进程要么是在运行中要么在运…1.直接谈论Linux的进程状态
Linux进程状态本质上是task_struct这个结构体内的一个变量用来存储进程状态。 task_struct { //内部的一个属性 int status; } R运行状态running: 并不意味着进程一定在运行中它表明进程要么是在运行中要么在运行队列里。 S睡眠状态sleeping): 意味着进程在等待事件完成这里的睡眠有时候也叫做可中断睡眠interruptible sleep。 D磁盘休眠状态Disk sleep有时候也叫不可中断睡眠状态uninterruptible sleep在这个状态的进程通常会等待IO的结束。 T停止状态stopped 可以通过发送 SIGSTOP 信号给进程来停止T进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。 t(tracing stop) X死亡状态dead这个状态只是一个返回状态你不会在任务列表里看到这个状态。 R进程运行的状态 S休眠状态 进程在等待“资源”就绪
这个状态下是可以用kill命令杀掉
所以又可以被称为可中断睡眠
T/t让进程暂停等待被进一步唤醒
kill -l:列出所有可用的信号名称
kill -9 pid:杀掉一个进程
kill -19 pid:暂停一个进程
kill -18 pid:解除进程的暂停
t是我们在调试程序时会出现的一种暂停状态当我们的程序在断点处停下此时即是t状态。
D磁盘休眠状态(深度睡眠或不可中断睡眠)不可被kill杀掉
Linux系统比较特有的一种进程状态 假设有个进程要将1GB的数据交给磁盘来存储磁盘收到进程的请求找到一块空间进行存储这时进程就要等待磁盘输出结束进程进入S态当内存严重不足时Linux操作系统有权利杀掉进程来释放空间当Linux操作系统刚好把我们正在等待磁盘资源响应的进程杀掉时就会出现问题磁盘如果申请空间失败会回来告诉进程但此时进程已经被杀掉那怎么办这就会发生这1GB数据丢失的问题 所以就有了D状态的出现D状态下的进程是不可被杀的就不会出现这个问题了 2.僵尸进程和孤儿进程
僵尸进程 僵死状态Zombies是一个比较特殊的状态。当进程退出并且父进程使用wait()系统调用,后面讲 没有读取到子进程退出的返回代码时就会产生僵死(尸)进程僵死进程会以终止状态保持在进程表中 并且会一直在等待父进程读取退出状态代码。 所以只要子进程退出父进程还在运行但父进程没有读取子进程状态子进程进入Z状态。 1 #includestdio.h2 #includesys/types.h3 #includeunistd.h4 5 int main()6 {7 pid_t id fork();8 if(id 0)9 {10 //child11 int cnt 5;12 while(cnt--)13 {14 printf(I am a child process, pid:%d, ppid:%d\n, getpid(), getppid());15 }16 }17 else18 {19 //parent 20 int cnt 5;21 while(cnt)22 {23 printf(I am a parent process, pid:%d, ppid:%d\n, getpid(), getppid());24 }25 } 26 return 0;27 }已经运行完毕但是需要维持自己的退出信息在自己的进程task_struct中会记录自己的退出信息未来让父进程进行读取但该这个子进程已经结束父进程没有读取到子进程状态。
如果没有父进程读取这个僵尸进程将会一直存在
因为进程 task_struct内核数据结构 进程的代码和数据子进程结束即代码和数据读取的结束但task_struct仍然存在如果父进程不去回收就会造成内存泄漏问题
僵尸进程会等待着OS释放这个状态就是X状态无法查看的状态。
总结
我们已经启动的所有进程我们怎么从来没有关注过僵尸呢内存泄漏
直接在命令行中启动的进程他的父进程是bashbash会自动回收新进程的Z
孤儿进程 孤儿进程父进程如果先退出子进程就会变成孤儿进程。 孤儿进程一般都是会被1号进程OS本身领养 孤儿进程为什么要被OS领养依旧要保证子进程正常被回收 3.进程的阻塞和挂起运行(纯理论)
操作系统学科里的阻塞挂起等状态 运行并发和并行 进程在运行队列中 该进程的状态就是R状态 我已经准备好了可以随时被调度 一个进程一旦持有CPU会一直运行到这个进程结束吗不会
这些进程是基于时间片进行轮转调度的 并发让多个进程以切换的方式进行调度在一个时间段内同时得以推进代码就叫做并发。 如果我们有多个CPU每个CPU独立的在调度各自的进程这时就有了并行的概念。 并行任何时刻都有多个进程在真的同时运行我们叫做并行 阻塞态 我们平常写c语言代码都可能会用到scanf我们知道scanf函数需要我们输入一些信息该进程才能继续运行下去
其实这个状态就可以叫做阻塞态
等待等待键盘资源是否就绪键盘上面有没有被用户按下的按键按键数据交给进程。
我们知道操作系统是就是软硬件资源的管理者
操作系统如何对硬件进行管理先描述在组织
入队列的不是进程的代码和数据而是进程的task_struct
不是只有CPU才有自己的运行队列各种其他的设备键盘显示器等也是有着自己的wait_queue等待队列当键盘没有按下对应的数据时这时的进程其实是在键盘的等待队列中的等待键盘输入再链接入CPU的运行队列中去
像这种进程没有处在CPU的运行队列中的状态一般即是阻塞态。
我们常说的S态和D态就是阻塞。
挂起态 挂起态是一种用空间换取时间的方法。 当OS 内存特别吃紧的时候为了更合理的使用内存空间。
OS会把那些处于阻塞态的或其他的一些进程换入到swap分区存储该进程对应的代码和数据需要使用时我们再唤出这种就叫做阻塞挂起用户层是感受不到这种操作的
但是如果swap分区过于大的话会发生频繁的唤入唤出这会导致效率问题所以swap分区设置一般不易过大。
4.进程切换的话题 我们知道进程都是在并发运行着一个进程时间片结束又会运行下一个进程那我们的数据是如何稳定的保存呢这样频繁的进程切换会不会导致数据的丢失?不会
进程在切换最重要的一件事情是上下文数据的保护和恢复
CPU的寄存器
寄存器本身是硬件具有数据的存储能力CPU的寄存器硬件只有一套
CPU内部的数据可以有多套有几个进程就有几套与该进程所对应的上下文数据
寄存器 寄存器的内容