关注
牛头不对马嘴,建议加深理解
有一个进程,首先通过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
相关推荐
牛客热帖
更多
正在热议
更多
# 父母问你工作找得怎么样,怎么回 #
4430次浏览 63人参与
# 想从事Agent应该学习哪些技术? #
943次浏览 26人参与
# 厦门银行科技岗值不值得投 #
19448次浏览 427人参与
# 从投递到OC,你用了多久 #
5744次浏览 48人参与
# 什么人最适合大厂? #
2617次浏览 29人参与
# 哪一刻你突然觉得实习“有点值了” #
4270次浏览 48人参与
# AI时代还有必要刷leetcode吗? #
1167次浏览 23人参与
# 有哪些公司在面试时考察AICoding? #
1642次浏览 21人参与
# HR面都在聊什么? #
1718次浏览 29人参与
# 哪些公司面试还在问八股? #
1620次浏览 32人参与
# 哪些公司一直卡在简历筛选 #
108829次浏览 376人参与
# 一人一道大厂面试题 #
130783次浏览 1326人参与
# 拿到offer之后,可以做些什么 #
106188次浏览 514人参与
# Agent面试会问什么? #
44733次浏览 1545人参与
# 春招至今,你收到几个面试了? #
140295次浏览 1622人参与
# 说说你知道的学历厂 #
404512次浏览 1445人参与
# 总结:哪家公司最喜欢泡池子 #
170198次浏览 612人参与
# 一人分享一个skill #
11936次浏览 251人参与
# 小红书笔试 #
82900次浏览 361人参与
# 计算机有哪些岗位值得去? #
393297次浏览 2828人参与
# 邪修秋招思路 #
96242次浏览 1280人参与
查看10道真题和解析