Operating system sleep()与进程阻塞

Operating system sleep()与进程阻塞,operating-system,linux-kernel,Operating System,Linux Kernel,我经常混淆sleep()、阻塞调用和抢占概念。据我所知,无论进程在做什么,抢占都完全由调度器完成。除非进程处于某个关键部分或执行原子指令,否则调度器可以根据调度算法抢占进程并将其放入等待进程列表中 另一方面,sleep()调用调度程序在指定的时间间隔内阻止它;作为参数传递给sleep() 阻塞调用类似于等待操作完成,如I/O操作,如磁盘读/写、来自另一个设备的信号等 有人能给我更全面地解释一下这些工具的工作原理,或者给我指出一些可靠的资源吗? 谢谢。你的观点绝对正确。(链接) 当进程执行阻塞调用

我经常混淆sleep()、阻塞调用和抢占概念。据我所知,无论进程在做什么,抢占都完全由调度器完成。除非进程处于某个关键部分或执行原子指令,否则调度器可以根据调度算法抢占进程并将其放入等待进程列表中

另一方面,sleep()调用调度程序在指定的时间间隔内阻止它;作为参数传递给sleep()

阻塞调用类似于等待操作完成,如I/O操作,如磁盘读/写、来自另一个设备的信号等

有人能给我更全面地解释一下这些工具的工作原理,或者给我指出一些可靠的资源吗?
谢谢。

你的观点绝对正确。(链接)


当进程执行阻塞调用时,它会等待操作停止 完成

我不完全确定你是否正确理解了这一点。假设您的程序发出I/O命令,例如
read()
。您的进程不会等待操作完成:在I/O操作完成之前,它不会保持处理器。调用
read()
时,处理器的控制权将让与操作系统,操作系统将提示I/O操作。与CPU速度相比,这些操作的速度非常慢,它们由专用硬件执行,这意味着CPU在此期间可以自由执行其他操作,直到硬件发出信号(例如,通过硬件中断)

从运行
read()
的程序的角度来看,它只知道调用了
read()
:指向当前指令的寄存器没有更改,其虚拟内存与以前相同。该过程被“阻止”。这并不意味着CPU没有运行

从操作系统的角度来看,程序处于等待模式,直到硬件发出信号表明它已经执行了任务。同时,调度程序已唤醒另一个进程,恢复其上下文(即CPU寄存器的值已设置为其刚进入睡眠前的值,等等),并开始执行其代码

当硬件完成时,会发生中断,操作系统会通过将进程标记为可执行来确认中断。根据调度程序策略,它可以恢复进程上下文并立即开始执行,或者等到当前进程完成其时间片后再切换上下文


阅读有关linux调度器实现的更多信息:。

您所说的一切都是正确的。您还想知道什么?当进程执行阻塞调用时,它会等待操作完成。因此,当此操作完成时,被阻止的进程是否立即开始运行,或者调度程序在被阻止后控制它并根据其意愿进行调度?