operating-system - 操作系统中的“调度延迟”和“上下文切换”有什么区别?
问题描述
我目前正在研究 Silberschatz 书中的操作系统,并且遇到了“调度延迟”概念。书上是这样定义的:
调度程序停止一个进程并启动另一个进程所花费的时间称为调度延迟。
这不就是“上下文切换”的定义吗?这两个术语之间有什么区别还是可以互换?
解决方案
让我们尝试一个“有点现实”的场景,假设一个任务以前用于read()
从管道中获取数据,但当时没有数据,因此该任务被阻塞;然后某些东西将数据写入管道,导致任务再次被解除阻塞。在这种情况下:
- 调度程序将任务从“运行内核代码的前一个任务”切换到“未阻塞运行内核代码的任务”。这可能需要 40 纳秒。
- 内核(现在在未阻塞任务的上下文中运行)将数据复制到原始
read()
调用提供的缓冲区中,并安排read()
调用应该返回的参数(例如读取的字节数)。这可能需要另外 50 纳秒。 - 内核决定它没有什么好做的,所以它返回用户空间,又花了 10 纳秒。
在这里,上下文切换时间为 40 纳秒,但调度延迟(由本书作者定义)为 100 纳秒。
推荐阅读
- java - 使用迭代器向前然后向后遍历 LinkedList
- java - DL4J 尝试使用 cpu 而不是 cuda
- php - 单击表单中的提交按钮后,一切都变得不确定
- c# - 在 net core 中,控制器是否接受具有两个单词的名称,例如“UserAccessController”?
- haskell - 通过递归Haskell找到数组的第二个元素
- linux - 使用 /proc/kcore 调试内核
- presto - 将非iso日期时间字符串解析为presto中的日期部分
- tabulator - 通过 php 加载数据未捕获的 ReferenceError
- javascript - 对象json数据中的javascript/jquery对象
- php - PHP:处理动态正则表达式中的分隔符