学习python多线程有一段时间了,但是有几个问题很迷茫-
书上说用户级线程必须映射到内核线程和 操作系统只创建和维护内核级线程。
pythonthreading库会用到什么线程模型?此外,谁在内核和用户级线程之间做出选择?是操作系统还是程序员有发言权?
如果使用多对一模型(如图所示),我认为这不是真正的多线程,因为所有线程都映射到一个内核线程。
有没有办法让操作系统在我的 python 程序中遵循特定的线程模型?
一个进程的所有正在运行的线程是否可以显示,它们的状态分别标记为内核或用户级别。也可以显示两个级别(用户和内核)之间的映射吗?
通常,你永远不会直接创建“内核级线程”——你在用户空间所做的一切都会在用户空间执行,否则即使是随机的浏览器 JavaScript 也会在内核级执行,保证在几秒钟内整个互联网都会变黑。
因此,在大多数语言中,线程接口(如果支持的话)与实际的“内核线程”相去甚远,并且根据实现,它将链接到较低级别的线程接口(例如
pthreads
)或只是模拟用户不知道的线程。沿着这条链向下,pthreads
可能会或可能不会链接到实际的“内核”线程(在 Linux 上恰好是这样,但在 Windows 上有另一个分离级别)但即便如此,代码在用户空间中执行 - “支持”内核线程在那里控制代码单独运行的调度。
threading
接口链接到 pthreads
所以,从技术上讲,有一个从 Python 线程一直到内核线程的链。然而,Python 也有 可怕的 GIL 几乎可以保证,除了一些主要与 I/O 相关的罕见异常,没有两个线程会同时执行,这几乎使得它的线程在协作多任务模式下运行。但是,由于在大多数系统上进程也由内核线程支持,您仍然可以通过使用 multiprocessing
接口充分利用它们。
此外,直到您的系统上有多个内核/CPU,甚至内核线程都以协作多任务模式执行,因此从技术上讲,内核线程不能保证您所描述的实际多线程。
关于如何列出线程及其依赖关系,可以使用
top -H -p <pid>
展示一个进程的线程树
此外,直到你的系统上有多个内核/CPU,甚至内核 线程以协作多任务模式执行,因此,从技术上讲, 内核线程并不能像您一样保证实际的多线程 描述它。
这是不准确的——即使在单核 CPU 上,内核线程也不是“合作的”,它们是抢占式的。不同之处在于,对于抢占式线程,它们的运行时间都是有保证的。在协作式多任务处理中,一个写得不好的线程可能会使所有其他线程在任何运行时都饿死。