面试遇到面试官问:假如有两个 python 死循环进程同时运行在单核 cpu 上,会有一个进程永远不会执行吗?为什么? 我回答:不会,时间片到期后会切换。
感觉我回答的有问题,于是设计实验想验证一下,新建一个 python 文件,在两个 shell 分别执行,给不同的参数并将输入重定向到同一文件中,这样设计有问题吗? 代码如下:
import sys
if __name__=="__main__":
while True:
print(sys.argv[1])
执行命令:
nohup python 1.py pid1 >./temp.out
nohup python 1.py pid2 >./temp.out
1
AlohaV2 2021-11-05 10:32:07 +08:00 1
我感觉你回答的没错——这是内核调度器的机制?只要调度器不被设置成实时模式,那应该就是分时间片的吧...
如果想验证的话,可以利用 taskset 命令让进程在同一 CPU 核上运行(当然开个单核虚拟机也可以)。 分配多进程也不必用在 bash 里搞,查一下 multiprocessing 模块吧。 |
2
ai277014717 2021-11-05 10:37:30 +08:00
操作系统要是不调度呢。例如实时操作系统。
|
4
UN2758 OP @ai277014717 #2 脑子里考虑到了实时操作系统的情况,但是书上好像没有讲,我思路就卡住了
|
5
CRVV 2021-11-05 11:04:28 +08:00 1
实时操作系统指的是严格按照进程优先级来调度,在 cpu 上执行的进程一定是优先级高的。
如果两个进程的优先级不同,那么只有一个在执行。 如果优先级相同,也是一样的分时间片执行。 https://www.freertos.org/RTOS-task-priority.html |
6
CRVV 2021-11-05 11:09:27 +08:00 1
这个实验设计有问题
1. > 会新建一个文件,两次都新建文件的话是两个进程分别在写自己的文件,要用 >> 2. python 的 stdout 有 buffer ,直接这么执行不太容易看出来结果,应该用 python -u 把 buffer 关掉 3. 原来说的死循环进程同时运行在单核 cpu 上,指的应该是纯粹的计算任务,不包含 io 的那种死循环,这个实验都在写文件了,放 rtos 上也会被调度的 |
7
whoosy 2021-11-05 17:37:11 +08:00
肯定会切换执行的 python 的进程切换是交给操作系统去管理 基于切换算法进行调度 时间片只是一个维度
|
8
UN2758 OP @AlohaV2 #1 在 linux 下,通过 multiprocess 执行两个多进程和通过 shell 执行两个单独的 python 命令有什么区别?我想到的,前者通过 fork 的方式产生,子进程会有父进程 pid,后者 ppid 是 1
|
9
AlohaV2 2021-11-08 11:23:30 +08:00
@UN2758 multiprocessing 可以指定以哪种模式产生新进程( Unix 默认是 fork )
参考 https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods |