Nik*_*ike 4 operating-system linux-kernel
我常常对sleep(),阻塞调用,抢占概念感到困惑.据我所知,抢占完全是由调度程序完成的,无论进程在做什么.除了进程处于某个关键部分或执行原子指令之外,调度程序可以根据调度算法抢占进程并将其放入等待进程列表中.
另一方面,sleep()调用调度程序在指定的时间间隔内阻塞它; 作为参数传递给sleep().
阻塞调用就像等待操作一样完成,如I/O操作,如磁盘读/写,来自其他设备的信号等.
有人能让我以更全面的方式向我解释这些工作,还是指出一些可靠的资源?谢谢.
当进程执行阻塞调用时,它等待操作完成.
我不完全确定你理解这一点.例如,假设您的程序发出I/O命令read().您的进程不会等待操作完成:在I/O操作完成之前,它不会保留处理器.当read()调用时,处理器的控制权将归于OS,这将提示I/O操作.与CPU速度相比,这些操作非常慢,并且它们由专用硬件执行,这意味着CPU可以在此期间自由执行其他操作,直到硬件发出信号表示它完成(通过硬件中断,实例).
从运行程序的角度来看read(),它所知道的只是read()被调用:指向当前指令的寄存器没有改变,其虚拟内存与之前相同.该过程被"阻止".这并不意味着CPU没有运行.
从操作系统的角度来看,程序处于等待模式,直到硬件发出信号表明它已执行任务.与此同时,调度程序唤醒了另一个进程,恢复了它的上下文(即CPU寄存器的值已经设置为它们在感觉睡眠之前的状态等),并开始执行其代码.
硬件完成后,会发生中断,操作系统通过将进程标记为可执行来确认.根据调度程序策略,它可以恢复进程上下文并立即开始执行,或者等到当前进程在切换上下文之前完成其时间片.
要阅读有关linux调度程序实现的更多信息:了解linux内核是一本非常好的书.