pra*_*tsm 22 linux multithreading kernel scheduling process
看完这个问题后,我有些疑惑.请帮助理解.
调度涉及决定何时运行流程以及何种时间.
linux内核是否安排了线程或进程?由于进程和线程在内核中没有区别,调度程序如何处理它们?
如何确定每个线程的量程?一个.如果为一个过程决定一个时间量(比如说100us)那么在进程的所有线程之间共享?或b.每个线程的量程由调度程序决定?
注意:问题1和问题2是相关的,可能看起来相同但只是想明确事情是如何工作的.
Bas*_*tch 35
Linux调度程序(在最近的Linux内核上,例如至少3.0)调度可调度任务或简单任务.
任务可能是:
fork没有任何线程库创建)kworker,nfsiod,kjournald,kauditd,kswapd等等...)换句话说,多线程进程内的线程被安排为非线程 - 单线程进程.
低级clone(2)系统调用创建用户域可调度任务(可用于创建fork-ed进程或用于实现线程库,如pthread).除非您是低级线程库实现者,否则您不希望clone直接使用.
AFAIK,对于多线程进程,内核(几乎)不调度进程,而是每个单独的线程(包括主线程).
实际上,在调度中有一些线程组和亲和力的概念,但我不太了解它们
目前,处理器通常具有多个核心,并且每个核心都在运行任务(在某个特定时刻),因此您可以并行运行多个任务.
CPU量子时间被赋予任务,而不是进程
POSIX 线程规范的 NPTL 实现将线程视为内核中的一个不同进程,具有唯一性task_struct(因此pid也是如此),因此每个线程本身都是可调度的,如上所述。因此,每个线程都有自己的时间片,并且就像上面提到的进程一样被调度。
补充一下,目前Linux调度器不仅可以调度单个任务(一个简单的进程),还可以调度进程组甚至用户(所有进程,属于一个用户)作为一个整体。这允许实现组调度,其中 CPU 时间首先在进程组之间分配,然后在这些组内分配给单个线程。
Linux 线程不直接操作进程或线程,而是与可调度实体一起工作。为代表struct sched_entity。公平地说,每个进程/线程都是一个,sched_entity但反过来可能不是真的。
要了解详细的进程调度,请参阅此处
| 归档时间: |
|
| 查看次数: |
10105 次 |
| 最近记录: |