我已经研究 python 中的多线程有一段时间了,但是我对一些问题感到困惑-
- 首先,python线程库创建的线程是用户级线程还是内核级线程?
书上说用户级线程必须映射到内核线程并且
操作系统仅创建和维护内核级线程。
python中将使用哪种线程模型线程库 https://docs.python.org/3/library/threading.html?此外,谁在内核级线程和用户级线程之间做出选择?是操作系统的问题还是程序员有发言权?
If the 多对一模型 https://www.tutorialspoint.com/multi-threading-models(如图所示)使用,我认为这不是真正的多线程,因为所有线程都映射到单个内核线程。
-
有没有办法指导操作系统在我的 python 程序中遵循某种线程模型?
-
是否可以显示进程的所有正在运行的线程,并将其状态分别标记为内核或用户级别。还可以显示两个级别(用户和内核)之间的映射吗?
通常,你永远不会直接创建“内核级线程”——你在用户空间中所做的一切都会在用户空间中执行,否则即使是随机的浏览器 JavaScript 也会在内核级执行,保证在几秒钟内整个互联网将陷入黑暗。
因此,在大多数语言中,线程接口(如果支持)与实际的“内核线程”相距甚远,并且根据实现,它将链接到较低级别的线程接口(pthreads https://en.wikipedia.org/wiki/POSIX_Threads例如)或者只是模拟用户不知道的线程。顺着那条链条往下走,pthreads
可能会或可能不会链接到实际的“内核”线程(在 Linux 上确实如此,但在 Windows 上有另一个级别的分离),但即使如此,代码也会在用户空间中执行 - “支持”内核线程就在那里为了控制代码单独运行的调度。
说到 CPython,它threading https://docs.python.org/3/library/threading.html接口链接到pthreads
因此,从技术上讲,存在一条从 Python 线程一直到内核线程的链。不过,Python 也有可怕的GIL https://wiki.python.org/moin/GlobalInterpreterLock几乎可以保证,除了一些主要与 I/O 相关的罕见异常之外,不会有两个线程同时执行,这几乎使其线程以协作多任务模式运行。然而,由于大多数系统进程也由内核线程支持,因此您仍然可以通过使用multiprocessing https://docs.python.org/3/library/multiprocessing.html界面。
另外,除非系统上有多个核心/CPU,否则内核线程都会以协作多任务模式执行,因此从技术上讲,内核线程不能保证您所描述的实际多线程。
至于如何列出线程及其依赖关系,可以使用top -H -p <pid>
显示进程的线程树。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)