线程成本

Tom*_*mmy 6 resources multithreading operating-system

我了解如何用我选择的语言创建线程,也了解互斥锁,以及共享数据的危险等,但是我对操作系统将如何管理线程以及每个线程的成本有所把握。我遇到了所有相关的严重问题,而表达我的理解极限的最清晰方法可能就是通过这些问题。

产生线程的成本是多少?设计软件时是否值得担心?创建线程的成本之一必须是其自己的堆栈指针和进程计数器,然后是在调度程序将其移入或移出内核时将所有工作寄存器复制到的空间,但是还有什么呢?

是可用于一个程序的堆栈数量在进程的线程之间平均分配,还是先到先得?

我能以某种方式检查启动时(程序的)硬件的内核数量。如果我在具有N个内核的计算机上运行,​​是否应该将线程数保持为N-1?

cni*_*tar 5

然后,当调度程序将其移入或移出内核时,需要复制所有工作寄存器的空间,但是还有什么呢?

一种不太明显的成本是对调度程序施加的压力,如果需要处理数千个线程,该压力可能会开始阻塞。内存并不是真正的问题。通过正确的调整,您可以获得一个“线程”以占用很少的内存,而不仅仅是其堆栈。这种调整可能很困难(即clone(2)直接在linux下使用等),但是可以做到。

一个程序可用的堆栈量是在进程的线程之间平均分配还是先到先得?

每个线程都有自己的堆栈,通常您可以控制其大小。

如果我在具有N个内核的计算机上运行,​​则应将线程数保持为N-1

检查核的数量很容易,但是特定于环境。但是,仅当您的工作负载包含CPU密集型操作且I / O很少时,才将线程数限制为内核数才有意义。如果涉及到I / O,则您可能希望拥有比内核更多的线程。