用户级线程和内核级线程
来源:互联网 发布:婚礼入场音乐知乎 编辑:程序博客网 时间:2024/05/01 13:24
转载地址:http://blog.sina.com.cn/s/blog_aed82f6f0102vxm9.html
1.内核级线程:
(1)线程的创建、撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调度实体的线程。
(2)这些线程可以在全系统内进行资源的竞争。
(3)内核空间内为每一个内核支持线程设置了一个线程控制块(TCB),内核根据该控制块,感知线程的存在,并进行控制。
在一定程度上类似于进程,只是创建、调度的开销要比进程小。有的统计是1:10
2.用户级线程:
(1)用户级线程仅存在于用户空间。——>对比内核(3)
(2)内核并不能看到用户线程。——>重要的区别
(3)内核资源的分配仍然是按照进程进行分配的;各个用户线程只能在进程内进行资源竞争。
图6-1(a)显示了用户级线程,图6-1(b)显示了内核级线程,
图6-1
用户级线程驻留在用户空间或模式。运行时库管理这些线程,它也位于用户空间。它们对于操作系统是不可见的,因此无法被调度到处理器内核。每个线程并不具有自身的线程上下文。因此,就线程的同时执行而言,任意给定时刻每个进程只能够有一个线程在运行,而且只有一个处理器内核会被分配给该进程。对于一个进程,可能有成千上万个用户级线程,但是它们对系统资源没有影响。运行时库调度并分派这些线程。如同在图6-1(a)中看到的那样,库调度器从进程的多个线程中选择一个线程,然后该线程和该进程允许的一个内核线程关联起来。内核线程将被操作系统调度器指派到处理器内核。用户级线程是一种"多对一"的线程映射。
内核级线程驻留在内核空间,它们是内核对象。有了内核线程,每个用户线程被映射或绑定到一个内核线程。用户线程在其生命期内都会绑定到该内核线程。一旦用户线程终止,两个线程都将离开系统。这被称作"一对一"线程映射,如图6-1(b)所示。操作系统调度器管理、调度并分派这些线程。运行时库为每个用户级线程请求一个内核级线程。操作系统的内存管理和调度子系统必须要考虑到数量巨大的用户级线程。您必须了解每个进程允许的线程的最大数目是多少。操作系统为每个线程创建上下文。线程的上下文将在本章稍后部分介绍。进程的每个线程在资源可用时都可以被指派到处理器内核。
posix线程调度是一个混合模型,很灵活,足以在标准的特定实现中支持用户级和内核级的线程。模型中包括两级调度--线程及和内核实体级。线程级与用户级线程类似,内核实体由内核调度。由线程库来决定它需要多少内核实体,以及他们是如何映射的。
POSIX引入了一个线程调度竞争范围(thread-scheduling contention scope)的概念,这个.概念赋予了程序员一些控制权,使它们可以控制怎样将内核实体映射为线程。线程的contentionscope属性可是PTHREAD_SCOPE_PROCESS,也可以是PTHREAD_SCOPE_SYSTEM。带有PTHREAD_SCOPE_PROCESS属性的线程与它所在的进程中的其他线程竞争处理器资源。带有PTHREAD_SCOPE_SYSTEM属性的线程很像内核级线程,他们在全系统的范围内竞争处理器资源。POSIX的一种映射方式将PTHREAD_SCOPE_SYSTEM线程和内核实体之间绑定起来。
内核级线程创建时先设置线程属性PTHREAD_SCOPE_SYSTEM,代码如下,:
pthread_attr_tattr;
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);//设置内核级的线程,以获取较高的响应速度
//创建线程
ret =pthread_create(&iAcceptThreadId, &attr, AcceptThread,NULL);
POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。默认为PTHREAD_SCOPE_PROCESS。目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。
关于线程的绑定,牵涉到另外一个概念:轻进程(LWP:LightWeightProcess)。轻进程可以理解为内核线程,它位于用户层和系统层之间。系统对线程资源的分配、对线程的控制是通过轻进程来实现的,一个轻进程可以控制一个或多个线程。默认状况下,启动多少轻进程、哪些轻进程来控制哪些线程是由系统来控制的,这种状况即称为非绑定的。绑定状况下,则顾名思义,即某个线程固定的"绑"在一个轻进程之上。被绑定的线程具有较高的响应速度,这是因为CPU时间片的调度是面向轻进程的,绑定的线程可以保证在需要的时候它总有一个轻进程可用。通过设置被绑定的轻进程的优先级和调度级可以使得绑定的线程满足诸如实时反应之类的要求。
设置线程绑定状态的函数为pthread_attr_setscope,它有两个参数,第一个是指向属性结构的指针,第二个是绑定类型,它有两个取值:PTHREAD_SCOPE_SYSTEM(绑定的)和PTHREAD_SCOPE_PROCESS(非绑定的)。
- 内核级线程和用户级线程
- 用户级线程和内核级线程
- 用户级线程和内核级线程
- 用户级线程和内核级线程
- 用户级线程和内核级线程
- 内核级线程 和 用户级线程
- 用户级线程和内核级线程
- 用户级线程和内核级线程
- 用户级线程和内核级线程
- 用户级线程和内核级线程
- 用户级线程和内核级线程
- 用户级线程和内核级线程
- 用户级线程和内核级线程
- 用户级线程和内核级线程
- 用户级线程和内核级线程
- 用户级线程和内核级线程
- 用户级线程和内核级线程
- 用户级线程和内核级线程
- Immutable 详解及 React 中实践
- IoC容器和依赖注入模式(转)---Martin Fowler(软件开发之父)
- PYC文件是什么?为什么有pyc文件?
- UVAlive 7308 Tom and Jerry 【几何数学】
- laravel_基础_中间件
- 用户级线程和内核级线程
- SlidingMenu以及日夜模式切换配置
- Washing Clothes poj 3211(01背包)
- Android项目前的准备
- 从苏宁电器到卡巴斯基第06篇:我在佳木斯的日子(中)
- android 6.26 apache 第一行代码 HttpHostConnectException: Connection to
- DirectShow之接口实战篇、
- java基础(八)Math/代码块/继承成员方法指南的关系/继承中成员变量之间的关系/方法的重写/继承中构造方法之间的关系/this和super的区别
- HDU 5119 Happy Matt Friends