linux - linux调度进程还是线程?

标签 linux multithreading process kernel scheduling

看完this所以问题我有一些疑问。请帮助理解。

调度涉及决定何时运行进程以及运行多长时间。

  1. linux 内核调度线程还是进程?由于进程和线程在内核内部没有区别,调度程序如何对待它们?

  2. 每个线程的数量是如何决定的? 一个。如果为一个进程决定了一个时间量(比如 100us),那么该进程的所有线程之间是否共享?或者 b.每个线程的时间片由调度程序决定?

注意:问题 1 和 2 是相关的,可能看起来相同,但只是想弄清楚事情是如何工作的,将它们都发布在这里。

最佳答案

Linux 调度程序(在最新的 Linux 内核上,例如至少 3.0)正在调度可调度任务或只是任务

任务可能是:

  • 单线程进程(例如由 fork 创建,没有任何线程库)
  • 多线程进程中的任何线程(包括其主线程),特别是 Posix 线程 (pthreads)
  • 内核任务,在内核内部启动并留在内核空间(例如 kworkernfsiodkjournald kauditd, kswapd 等等...)

换句话说,多线程进程中的线程像非线程一样被调度——即单线程进程。

低级clone(2) syscall 创建用户态可调度任务(并且可以用于创建 fork-ed 进程或用于线程库的实现,如 pthread)。除非你是底层线程库实现者,否则你不会想直接使用clone

据我所知,对于多线程进程,内核(几乎)不是在调度进程,而是在调度内部的每个单独线程(包括主线程)。

实际上,有一些线程组的概念和affinity在日程安排中,但我不太了解他们

现在,处理器通常有多个核心,每个核心都在运行一个任务(在某个给定的时刻),因此您确实有多个任务并行运行。

CPU 量子时间是给任务的,不是给进程的

关于linux - linux调度进程还是线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15601155/

相关文章:

c - OpenSSL 不会释放文件句柄

multithreading - 获取对当前boost::thread/中断主线程的引用

c++ - 在 Linux 中从单独的单线程进程生成多线程进程的问题

c# - 重定向但也显示进程输出流

linux - 具有多个家庭目录的本地用户

linux - 管道中的 while 循环对 Solaris/bin/sh 但对 Linux 没有副作用

c - 编程 Linux 应用程序以同时播放多个声音

C# 单元测试 - Thread.Sleep(x) - 如何模拟系统时钟

c# - 是否必须提供与C#中的多线程相关的事件的场景?

go - 在 golang : Prevent child processes to receive signals from calling process