测验:进程与线程
同一进程中的两个线程不共享什么?
- 分配给堆的内存区域
- 函数调用栈
- 全局变量和静态变量
- 打开文件描述符
为什么 fork() 看起来会复制其父级的整个地址空间,而实际上它更便宜?
- 这是因为页面是通过写时复制来共享的,但页面仅在修改时才被复制。
- 这是因为内核异步推迟了复制。
- 因为子进程不使用内存
- 因为父进程立即终止
什么占上下文切换实际成本的最大部分?
- 保存和恢复寄存器值到PCB的时间
- 是时候分配新的 PCB 了
- 切换后缓存和 TLB 未命中的间接成本
- 调度程序选择下一个进程的时间
当我在容器中将应用程序作为进程 1 启动时,僵尸进程堆积起来。原因是什么?
- 因为容器运行时不发送信号
- 1 号进程需要照顾孤儿,但普通应用程序没有该代码。
- 由于cgroup中进程数量的限制
- wait 系统调用在容器内不起作用。
在 ps 输出中,关于处于状态 D(不间断等待)的进程,哪项陈述是正确的?
- 它通常正在等待磁盘或网络文件系统I/O,并且不能立即被信号唤醒。
- 由于信号处理正常,因此可以用kill -9立即终止。
- 这意味着 100% 的 CPU 正在用于计算。
- 这是已经结束但尚未被其父母继承的僵尸状态的另一个名称。
如果将 CPU 密集型任务的线程数设置为远大于核心数,会发生什么情况?
- 吞吐量随着线程数量线性增加
- 增加的上下文切换和缓存污染实际上可能会降低吞吐量。
- 操作系统仅自动运行尽可能多的核心,因此没有区别。
- 仅内存使用量增加,但性能保持不变
一对一线程模型(Linux、Windows)比多对一模型如何更好?
- 一个线程中的阻塞系统调用不会停止其他线程,并且可以在多个内核上实现真正的并行执行。
- 线程创建更便宜
- 上下文切换发生在用户空间,使其速度更快
- 线程数量没有限制