关注
牛头不对马嘴,建议加深理解
有一个进程,首先通过fork和exec创建,创建好后他被放入ready queue等待调度。此时进程状态为就绪。
当时钟中断时,os会更新正在运行的进程的时间片,并根据不同的算法选择下一个线程,并完成上下文切换。被调度下去的线程的寄存器内容被保存在其对应的线程的内核线程的栈中。
此时被调度到的那个线程就从就绪 变成了 运行。然后被调度的线程请求了一次IO操作,他就先发起系统调用,通过将系统调用号以及参数压入栈中再触发环境异常进行。CPU捕捉到异常后将其 IP寄存器 切换到中断向量表中对应中断的处理函数处同时进入内核态。此处会进行一次上下文切换。线程还是当时那个线程,不过那个线程不再是用户态了而是内核态。os发现线程请求的是io操作,就把他放到对应io操作的waiting queue中,然后进入do_timer函数,更新时间片、保存上下文、调度下一个进程。此时原来的线程还是内核态。但是对外表现为阻塞。
等IO操作到达后,CPU收到IO 中断同样的流程切换到中断处理函数以及内核态。此时os会查看是哪种io操作,并通知对应io操作的waiting queue,从waiting queue中找到对应的线程,假如说正好是你刚刚那个线程,那你的刚刚的那个线程就会拿到io操作的数据,接着os将其从waiting queue取出来放到ready queue,等待调度。
等调度到这个线程后,他已经拿到了IO数据,将会走退出系统调用的流程。注意此时还是内核态。他会先回复上下文,同时设置CPU运行模式,然后返回到用户态,一次系统调用就完成了。
不过系统调用都是glibc给你封装好的,所以他会走glibc对应的函数的返回流程,你的线程调用的那个IO操作函数就拿到返回数据了。此时还是运行中。
接着运行者发现ram不够用了,此时会吧一些重要级低的线程挂起。挂起就是说把就绪等待调度的线程(或者是运行中的线程强制停止放入ready queue中)从内存中清除,放到磁盘中。此时进程就是挂起状态,既不在任何IO的waiting queue也不再任何CPU的ready queue中。
等待和阻塞是一样的。
top里面的那三个是另外一个含义了。
僵尸进程:父进程通过fork创建子进程之后,当子进程结束后,会释放自己的资源。但是有一个资源是他释放不了的,就是pcb表。刚刚说的上下文就是存在pcb表中的。pcb表存放着线程的运行状态,比如rip rsp 以及rax rsi等等重要寄存器的值。还有进程号 等等一大堆核心资源。os通过pcb表管理着一个进程。子进程结束后,会发送一个信号给父进程,通知子进程结束,然后父进程接受这个信号后就会回收子进程pcb表。如果你的父进程不去处理这个信号,那子进程就不会被回收,就是僵尸进程。不过如果父进程此时挂了,拿他就是孤儿进程了,那么这个子进程会归pid=1的init进程(系统启动进程pid=0,它创建的第一个进程就是pid=1的init进程)(linux 6.7貌似更新了,单独拿了一个进程出来处理孤儿进程,然后pid随机)
可中断睡眠:进程在waiting queue中就是睡眠。不可中断睡眠和可中断睡眠都是睡眠状态(又名阻塞状态,等待状态)。
区别在于这个waiting queue的归属。waiting queue由动作归属和queue组成,有的动作是可以接收信号从而中断的,有的是不可以的。
举个例子,一个程序,你输入a 他输出a+1,那么他起来后就会进入等待键盘输入的waiting queue中。但是此时你可以ctrl + C给他发一个终止信号,他是可以接受到这个信号然后终止的。(你的ctrl + C 被shell捕捉到,shell就给这个程序的进程发了一个single。你在shell中打开一个进程,本质上是shell先fork自己创建子进程,然后通过exec加载你打开的进程的elf文件,所以两者是亲缘进程,可以发信号和pipe。你之所以能看到那个进程的输出,也是因为他通过pipe把输出给到shell,shell再呈现给你)。
还有一种IO操作,比如你发了一个磁盘IO读请求,然后等待响应。这个时候你就会在这个磁盘IO的waiting queue中。没收到响应的话你尽管ctrl+C,进程也不会退出。因为这个操作是不可中断的
查看原帖
3 1
相关推荐
点赞 评论 收藏
分享
牛客热帖
更多
- 1... 27届暑期前端高频面试题汇总(字节百度阿里快手等多家大厂)6058
- 2... 字节三面3188
- 3... 美团计划裁员30%,测试和产品砍一半,测试全栈化时代来了!2019
- 4... 26前端的深夜1441
- 5... 你说你用Claude,你用的是 CLI,还是 Agent、Opus?1211
- 6... 字节实习一个月祛魅了1058
- 7... 继续实习VS暑假沉淀,怎么选....1053
- 8... 今天陌陌的笔试怎么样1026
- 9... 收到了字节的AIoffer911
- 10... xdm,开发投麻了,顺手试试投了测试,但是又有点犹豫1. 如果干了测试,以后找正式的开发是不是会更难?(没到万不得已,我还是想走开发)2. 合同签一年,这个会不会太久了?值得一去吗?给点建议#实习,不懂就问#623
正在热议
更多
# 27届实习投递记录 #
171777次浏览 1704人参与
# 拼多多集团-PDD笔试 #
114022次浏览 699人参与
# 拼多多工作体验 #
68535次浏览 465人参与
# 求职遇到的搞笑事件 #
201548次浏览 1026人参与
# 找工作时遇到的神仙HR #
1252876次浏览 5957人参与
# 体制内上岸心路历程 #
39942次浏览 231人参与
# 小米求职进展汇总 #
1084842次浏览 6551人参与
# 国庆前的秋招小结 #
305235次浏览 1758人参与
# 硬件人秋招进展 #
298178次浏览 4055人参与
# 得物app工作体验 #
71270次浏览 125人参与
# AI时代下,你的岗位要求有什么变化? #
43412次浏览 290人参与
# 满分简历要如何准备? #
323358次浏览 3385人参与
# 我的AI电子员工 #
45245次浏览 262人参与
# 万物皆可发面经 #
7192次浏览 88人参与
# 通信和硬件还有转码的必要吗 #
110965次浏览 648人参与
# 今年找实习到底有多难? #
109696次浏览 501人参与
# 扒一扒那些奇葩实习经历 #
161451次浏览 1185人参与
# 26届校招投递进展 #
684175次浏览 3970人参与
# 重来一次,我还会选择这个专业吗 #
479632次浏览 4012人参与
# 秋招开始捡漏了吗 #
251003次浏览 1065人参与
