在Linux中,当需要从磁盘读取块时,进程状态会发生什么变化?被封锁了吗?如果是这样,如何选择另一个流程来执行?
在等待文件描述符返回read()或write()从文件描述符返回时,该过程将进入一种特殊的睡眠状态,称为“ D”或“磁盘睡眠”。这很特别,因为在这种状态下不能终止或中断该进程。等待ioctl()返回的进程也将以这种方式进入睡眠状态。
read()
write()
例外情况是,当文件(例如终端或其他字符设备)以O_NONBLOCK模式打开时,如果假定文件(例如调制解调器)需要时间来初始化,则通过该文件。但是,您在问题中指出了阻止设备。另外,我从未尝试过以ioctl()非阻塞模式打开的fd很可能会阻塞的(至少是在不知情的情况下)。
O_NONBLOCK
ioctl()
如何选择另一个进程完全取决于您使用的调度程序,以及其他进程可能在该调度程序中修改其权重的方法。
已知某些情况下的某些用户空间程序会一直保持这种状态,直到重新启动为止。这些通常与其他“僵尸”归为一类,但由于它们在技术上并未失效,因此该术语不正确。