c - 系统调用中间的上下文切换
问题描述
假设我们在进程中有 2 个线程。现在我们运行以下代码:
read(fd, buf, 10);
其中 fd 是线程之间共享的一些文件描述符(例如静态),而 buf 是线程之间不共享的数组(局部变量)。
现在,假设文件是 1KB,文件中的前 10 个字符是“AAAAAAAAAA”,其余的都是“B”。(“BBBBBB……”)。
现在如果我们只有一个处理器,如果在每个线程中打印它们,buf 的输出是什么?
我知道答案是其中一个数组总是只有 A 而另一个只有 B,但我不完全理解为什么,因为我认为在这个系统调用中间可能有一个上下文切换(阅读) 然后两个 buf 中都会有 A。
上下文切换甚至可能发生在系统调用的中间吗?如果是这样,您认为 buf 在执行结束时会发生什么?
解决方案
现代磁盘无法以 10 字节粒度执行读写操作,而是以扇区为单位执行读写操作,传统上,硬盘驱动器 (HDD) 为 512 字节。
将 10 个字符复制到线程缓冲区的速度非常快,尽管不能保证在上下文切换之前。
一个获得感觉的简单程序是让 2 个线程打印到同一个控制台,一个打印,另一个+
打印-
。+
先检查有多少-
。无论如何,对于最初的问题,将数组的大小更改为 1024 并从 1024A
开始,您很可能会看到不同之处。
推荐阅读
- c - scanner.l:22:警告,规则无法匹配
- angular - 动画中的过渡在 Angular 中不起作用
- javascript - ColorLuminance 错误的颜色
- javascript - Eslint - 在 React 组件中突出显示错误/未定义方法的响应规则是什么?
- python - sklearn.decomposition 中的 PCA 中的 fit、transform 和 fit_transform 有什么作用?
- angular - highchart 删除第一点
- jsf - 从 websphere 迁移到 glassfish
- c# - c# linq 相当复杂的排序
- javascript - 使用 Route 组件中的 react Router 设置父级的状态
- android - DJI 相机位置相对于 Phatom DJI 4 位置