线程
线程概念
现代操作系统中,进程只作为资源拥有者,而调度和运行的属性赋予新的实体——线程。
线程(Thread)是进程中实施调度和分派的基本单位。
线程引入
传统进程的两个基本属性:
资源的拥有者:
每个进程有自己的地址空间,保存进程映像,控制一些资源(文件,I/O设备),有状态、优先级、调度
调度单位
进程是一个执行轨迹
以上两个属性构成进程并发执行的基础
系统管理传统进程必须完成的操作:
- 创建进程
- 撤消进程
- 进程切换
缺点:负载重,时间空间开销大,限制并发度的提高
将进程的上述两个属性分开,线程因而产生。
引人进程的目的是为了使多个程序并发执行,以改善资源利用率、提高系统吞吐量。
线程的引人是为了减少程序并发执行时的所付出的时空开销。
1.线程的组成
- 每个线程有一个thread结构,即线程控制块TCB用于保存自己私有的信息,主要由以下4个基本部分组成:
- 线程必须在某个进程内执行
- 一个进程可以包含一个线程或多个线程
2.线程的状态
与进程相似,线程也有若干种状态
- 运行状态:线程在CPU上执行
- 就绪状态:具备运行条件,一旦分到CPU,可以马上投入运行
- 阻塞状态:线程在等待某个事件发生
- 终止状态:线程完成任务后
线程的状态转换是在一定的条件下实现的
3.线程的管理
线程创建:调用thread_create创建新线程,建立thread结构,分配栈结构等,设置为就绪状态,放入就绪队列
线程终止:线程完成工作后,调用thread_exit终止自身
线程等待:调用thread wait等待指定线程终止此时该线程处于阻塞状态,指定线程终止时转为就绪态
线程让权:调用thread_yield放弃CPU,让给另外的线程运行
4.线程和进程的关系
- 一个进程可以有多个线程,但至少要有一个线程;而一个线程只能在一个进程的地址空间内活动。
- 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
- 处理机分配给线程,即真正在处理机上运行的是线程。
- 线程在执行过程中需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
- 由于线程拥有较少的资源,但又具有传统进程的许多特性,有的把线程叫做轻型进程(light weightprocess, LWP),
- 把传统的进程叫做重型进程(heavy weightprocess,HWP),可把它看成拥有一个线程的进程。
5.引入线程的好处
①线程切换开销少。
②提高并发性。
③提升响应能力。
④利于充分发挥多处理器的效能。
线程的引用使系统设计变得复杂
无论是采用多进程还是一个进程的多线程来实现其并发性都是合理的,用哪一种结构更有效则取决于应用程序的要求。
线程的实现
很多系统中已经实现线程,如Solaris2,Windows2000,Linux,Java语言
实现线程的方式主要有:
- 在用户空间实现
- 在核心空间实现
- 组合方式:将用户级线程和核心级线程结合在一起,取长补短
1.在用户空间实现线程
把线程库整个地放在用户空间,内核对线程一无所知。
在用户空间实现线程的优点
- 线程切换速度很快。
- 调度算法可以是应用程序专用的。
- 用户级线程可以运行在任何操作系统上,包括不支持线程机制的操作系统。
用户级线程的主要缺点
- 系统调用的阻塞问题
- 在单纯用户级线程方式中,多线程应用程序不具有多处理器的优点。
2.在内核空间实现线程
内核知道线程存在,并对它们实施管理。
- 在多处理器系统中,内核可以同时调度同一进程的多个线程
- 如果一个进程的某个线程阻塞了,内核可以调度同一个进程的另一个线程。
- 优点:克服了用户级线程方式的主要缺陷;内核线程本身也可以是多线程的。
- 主要缺点:控制转移开销大。
3.组合方式
把用户级线程和内核级线程两种方式结合在一起,吸收二者优点,克服各自不足
内核只知道内核级线程,也只对它们实施调度
实现组合方式有不同的模型:
- 多对一模型
- 一对一模型
- 多对多模型
希望对你有帮助!加油!
若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!