Chinaunix
标题:
内核级线程与用户级线程调度优先级
[打印本页]
作者:
zhangyuxiu
时间:
2014-02-18 14:01
标题:
内核级线程与用户级线程调度优先级
如题,想知道内核级线程和用户级线程在调度时候,哪个优先级高?为什么?
如果不能一概论之的话,需要考虑哪些因素,求解答或推荐资料。
谢谢~
作者:
humjb_1983
时间:
2014-02-19 08:42
内核和用户的线程(进程)在调度时都是平等的,谁优先取决于其优先级、调度算法等调度相关的因素。
作者:
zhangyuxiu
时间:
2014-02-19 10:47
回复
2#
humjb_1983
我现在知道了内核级线程的调度是由内核调度器负责的,而用户级线程的调度是由线程库来支持的,每个进程都可以定制化自己的调度算法。
但是,关于用户级线程可以采用的调度算法一般有哪些?
作者:
humjb_1983
时间:
2014-02-19 11:20
不知道你说的“用户级线程”具体是个什么概念?个人理解调度都是由内核调度器负责的,没听说过用户态线程库负责的说法呢?呵呵
作者:
humjb_1983
时间:
2014-02-19 11:24
本帖最后由 humjb_1983 于 2014-02-19 11:25 编辑
zhangyuxiu 发表于 2014-02-19 10:47
回复 2# humjb_1983
刚看了你发了blog,linux中应该没有你说的“用户级线程”的概念。linux中的线程,就是一个轻量级的进程。
作者:
junnyg
时间:
2014-02-19 11:31
回复
3#
zhangyuxiu
你的理解有点偏差,有些概念混淆了,linux内核采用的是1:1核心线程模型,每个用户线程在内核中都有对应的一个task_struct去管理,由内核的调度器进行调度;内核线程与用户线程的区别在于运行级别以及内存空间的不同,在调度层面两者是等价的
建议先看看深入理解linux内核这本书,再结合走读linux内核代码
作者:
zhangyuxiu
时间:
2014-02-20 08:56
回复
6#
junnyg
看到很多比较用户级线程,用户线程,内核级线程,内核线程的帖子。如:
http://bbs.chinaunix.net/thread-3660774-1-1.html
这些概念已经过时了么?我们现在使用的linux系统,就比如说内核2.6.32等,都已经没有“用户级线程”的概念了么?
作者:
humjb_1983
时间:
2014-02-20 11:26
各个操作系统的实现不一样,如果要学习linux,建议只看linux相关的实现和内容,否则很容易混淆的。
作者:
wth0722
时间:
2014-02-21 10:16
建議可以先去聊解NPTL跟LinuxThread
大致上來說線程在內核裡面線程依舊被當作是一個歷程,並且依舊利用了clone()系統調用(在NPTL庫裡調用)。然而,NPTL必需內核級的特異扶持來告終,例如必需掛起然後再喚醒線程的線程同步原語futex.
NPTL也是一個1*1的線程庫,即便說,當你利用pthread_create()調用創立一個線程後,在內核裡就相應創立了一個調動實體,在linux裡即便一個新曆程,這個措施最大可能的簡化了線程的告終。
作者:
zhangyuxiu
时间:
2014-02-21 11:02
回复
9#
wth0722
恩,我阅读了NPTL与Linux Thread的相关知识,现在看到网上的评论,有一点无法确定谁对谁错的:
主要是关于Linux下的Linux Threads到底有没有这样的缺点:一个进程中的某个线程阻塞,会引起整个进程阻塞?
第一种说法:“ 早期的LinuxThread就是用户级线程,全部实现在用户空间中,kernel不参与调度。主要问题是一个用户级线程如果被阻塞,整个进程都会被阻塞,而且没有办法让一个进程里面的多个线程运行在多处理器上。需要内核支持调度的线程的话,就是目前Linux使用的线程,NPTL,线程调度需要kernel来进行的,这样就解决了用户级线程的问题了。”
第二种说法:线程模型有三种,N:1线程模型,1:1线程模型和N:M的线程模型。N∶1用户线程模型:N条用户线程只由一条内核进程/线程调度。内核不干涉线程的任何生命活动,用户态线程工作在“进程竞争范围”。因此,线程的创建、删除和环境切换都很高效。但是缺点同样明显,因为一个进程同一时间只能在一个CPU中执行。所以在SMP中,无论系统有多少CPU,同一进程中的所有线程都只能由一个CPU去执行。另外,如果其中某条线程执行了一个“阻塞”操作,比如read和write,那么整个进程中的其它线程都会被阻塞,这也违背了线程的概念。目前,采用这种模型的线程库大概有,FreeBSD下的libc_r。
1∶1 核心线程模型:1条用户线程对应一条内核进程/线程来调度,即以核心态线程实现。应用程序创建的每一个线程都由一个核心线程直接管理,内核将每一个核心线程都调度到系统CPU上。所有线程都工作在“系统竞争范围”。这种方式也是现在大多线程库采用的模式。它完全克服了N:1模型的缺点,但较之在线程的创建、删除、切换的代价更昂贵。目前,采用这种模型的线程库大概有,FreeBSD下的libthr,Linux下的LinuxThreads,NPTL。”
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2