牛客852940586号 level
获赞
103
粉丝
9
关注
85
看过 TA
425
门头沟学院
2025
运维开发工程师
IP属地:山东
分享校招八股面
私信
关注
疯犬丨哈士奇:最快到家要到十点钟(收拾东西,赶路),在家躺平放空+洗澡到十一点,十一点以后才是个人真正的休息时间,吃吃夜宵,看看电影,刷刷手机到十二点甚至一点,然后睡觉,第二天八点起来,继续循环。 双休日终于有时间休息了,因为不愿意动,不认识人,不想出门,窝在住的地方,随便过过一天就没了,第二天继续重复。有的时候会想学习学习,偶尔提升提升也就是其中一个下午的时间,浑浑噩噩就过去了。
0 点赞 评论 收藏
分享
河和静子:牛头不对马嘴,建议加深理解 有一个进程,首先通过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,进程也不会退出。因为这个操作是不可中断的
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客企业服务