关注
牛头不对马嘴,建议加深理解
有一个进程,首先通过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
牛客热帖
更多
正在热议
更多
# 国企还是互联网,你怎么选? #
122633次浏览 947人参与
# 找工作,行业重要还是岗位重要? #
8458次浏览 105人参与
# 五一之后,实习真的很难找吗? #
47155次浏览 340人参与
# 盲审过后你想做什么? #
13014次浏览 117人参与
# 应届生进小公司有什么影响吗 #
67244次浏览 984人参与
# 外包能不能当跳板? #
22339次浏览 192人参与
# 25届秋招公司红黑榜 #
257365次浏览 1083人参与
# 租房找室友 #
13598次浏览 98人参与
# 小厂实习有必要去吗 #
42373次浏览 260人参与
# 领导秒批的请假话术 #
10215次浏览 76人参与
# 蚂蚁集团工作体验 #
10832次浏览 70人参与
# 设计人如何选offer #
98598次浏览 690人参与
# 五一假期,你打算“躺”还是“卷”? #
33996次浏览 456人参与
# 考研可以缓解求职焦虑吗 #
21647次浏览 255人参与
# 如果校招重来我最想改变的是 #
245352次浏览 2781人参与
# 面试等了一周没回复,还有戏吗 #
116024次浏览 1078人参与
# 一句话证明你在找工作 #
292046次浏览 2400人参与
# 大疆的机械笔试比去年难吗 #
69725次浏览 603人参与
# 找工作前vs找工作后的心路变化 #
7249次浏览 64人参与
# 潍柴工作体验 #
17041次浏览 17人参与