![]() |
1
2
小心不要混淆
优先购买权
具有过程的能力
睡觉
. 即使使用非抢占调度程序,进程也可以休眠。这是进程等待I/O时发生的情况。该进程进行系统调用,例如
另一方面 优先购买权 体系结构调度程序停止进程执行的能力 没有它的合作 . 中断可以发生在程序指令流的任何地方。控件返回到调度程序,调度程序随后可以执行其他进程并返回到中断(抢占)进程。大多数调度程序在允许进程运行到预定时间段的情况下分配时间片,如果更高优先级的进程需要时间片,则在该时间段之后它将被抢占。 除非您正在编写驱动程序或内核代码,否则您不必太担心底层机制。在编写用户空间应用程序时,关键概念是(1)一些系统调用可能 块 这意味着您的进程将一直处于休眠状态直到事件发生,(2)在可抢占的系统(所有主流的现代操作系统)上,您的程序可能随时被抢占,以便其他进程可以运行。 *请注意,在某些平台中,例如Linux, 线 实际上是与另一个进程共享其虚拟地址空间的另一个进程。因此,调度程序对进程和线程的处理完全相同。 |
![]() |
2
2
我不清楚你的问题是关于理论还是实践。实际上,在每一个现代操作系统中,I/O操作都是特权操作。这意味着,为了让用户进程或线程访问文件、设备等,它必须发出系统调用。 然后内核就有机会做任何它认为合适的事情。例如,它可以检查I/O操作是否会阻塞,从而在发出操作后切换正在运行的(即__调用_调度程序)进程。 注意,即使内核没有处理计时器中断,这个机制也可以工作。总之,一般来说,这取决于您的系统。例如,在没有操作系统存在的嵌入式系统中(或最小的操作系统),在发出阻塞操作之前调用调度程序可能是用户代码的全部责任。 |
![]() |
3
0
内核可以是抢占的,而不是调度程序。
弗斯特
如果内核能够在时间量过期或更高优先级的进程可以运行时切换到另一个进程,那么我们将讨论 非自愿优先购买权 即抢占内核,它可以发生在下面解释的不同地方。
区别在于
另一方面,
这是什么时候解释的
唤醒不会真正导致进入schedule()。他们添加了 任务到运行队列,就这样。 如果添加到运行队列的新任务抢占了当前任务 任务,然后wakeup设置tif_need重新扫描并schedule()获取 在最近可能的情况下打电话:
|
![]() |
user107586 · 如何处理等待句柄不会导致无限循环? 5 月前 |
![]() |
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 6 月前 |
![]() |
BenjiFB · C#内存缓存:在一次操作中追加到列表? 6 月前 |
![]() |
András Takács · Python多线程问题 10 月前 |
|
András Takács · Python多线程错误 10 月前 |