首页 > 解决方案 > 系统调用中间的上下文切换

问题描述

假设我们在进程中有 2 个线程。现在我们运行以下代码:

read(fd, buf, 10);

其中 fd 是线程之间共享的一些文件描述符(例如静态),而 buf 是线程之间不共享的数组(局部变量)。

现在,假设文件是​​ 1KB,文件中的前 10 个字符是“AAAAAAAAAA”,其余的都是“B”。(“BBBBBB……”)。

现在如果我们只有一个处理器,如果在每个线程中打印它们,buf 的输出是什么?

我知道答案是其中一个数组总是只有 A 而另一个只有 B,但我不完全理解为什么,因为我认为在这个系统调用中间可能有一个上下文切换(阅读) 然后两个 buf 中都会有 A。

上下文切换甚至可能发生在系统调用的中间吗?如果是这样,您认为 buf 在执行结束时会发生什么?

标签: clinux-kerneloperating-system

解决方案


现代磁盘无法以 10 字节粒度执行读写操作,而是以扇区为单位执行读写操作,传统上,硬盘驱动器 (HDD) 为 512 字节。
将 10 个字符复制到线程缓冲区的速度非常快,尽管不能保证在上下文切换之前。

一个获得感觉的简单程序是让 2 个线程打印到同一个控制台,一个打印,另一个+打印-+先检查有多少-。无论如何,对于最初的问题,将数组的大小更改为 1024 并从 1024A开始,您很可能会看到不同之处。


推荐阅读