线程
一、认识线程
1.线程的引入
多道程序管理:追求效率的目的下实现“并发”
利用进程实现的多道程序系统中
进程是一个可拥有资源的独立单位;
是一个可独立调度和分派资源的基本单位
有如下频繁操作:创建进程、撤销进程、进程切换
PCB信息,CPU环境的管理等付出不少时空开销,尤其在进程切换上。
所以并发程度不是随意设定的:
并发进程数量不宜过多,切换频率不宜过高。
限制并发程度问题所在:进程实体信息量大,对进程的管理操作越多,与运行时间的比值就越大,运行效率就低。
怎样进一步提高并发效率,节约时空开销?
以进程为单位分配资源
将进程划分为多个功能单位调度执行。
多线程系统中,同一个进程中的多个线程
共享进程资源
可并发执行
2.线程的属性
多线程OS中,一个进程包括多个线程,每个线程都是利用CPU的基本单位。
轻型实体:只需一点必不可少的、能保证独立运行的资源。(TCB)
独立调度和分派的基本单位:调度切换迅速且开销小。
可并发执行
共享进程资源:同进程中的线程可共享相同的进程地址空间、已打开文件、信号量机构等。
3.线程的信息
状态参数
标识符、运行状态、优先级、寄存器状态、堆栈、专有存储器、信号屏蔽等。
运行状态
执行、就绪、阻塞
4. 线程的创建和终止
在多线程OS中,应用程序启动时,通常只有一个线程(初始化线程)在执行,它根据需要再创建若干线程。
5.多线程系统中的进程
进程只是用于分配系统资源
包括多个线程
不是执行实体,线程在进程范围内作为执行实体。
* 线程与进程的比较
调度:线程作为CPU调度的基本单位,而进程只作为其它资源分配单位。
并发性:进程之间可以并发,实质上是不同进程中的两个线程并发。一个进程的多个线程之间亦可并发。
拥有资源:进程间资源相互独立;同一进程的各线程间共享。某进程内的线程在其它进程不可见
系统开销:线程上下文切换在同进程环境下上下文切换要快得多。因为同进程内线程间共享内存地址和打开的文件资源;
6.线程的管理
同步和通信机制
1)互斥锁
比较简单的,控制线程互斥访问资源;
适用于高频度使用的关键共享数据和程序段;
unlock和lock两个锁操作原语;
2)条件变量
与互斥锁一起使用
锁保证互斥进入临界区,但利用条件变量使线程阻塞
注意不满足条件时,wait条件变量:
释放互斥锁
进程阻塞在条件变量指向队列中
被唤醒后要重新再设互斥锁
3)信号量
私用信号量(private samephore)
用于同进程的线程间同步,数据结构存放在应用程序的地址空间。属于特定进程,OS感知不到其存在。
公用信号量(public samephore)
用于不同进程间或不同进程中线程的同步,数据结构由OS管理,存放在受保护的系统存储区。
互斥锁是为了上锁而优化的;条件变量是为了等待而优化的;信号灯即可用于上锁,也可用于等待,因而可能导致更多的开销和更高的复杂性。
三种机制适用逐渐复杂的同步情况
二、线程的实现方式
1.内核线程KST(kernel-level thread)
依赖于内核,利用系统调用由OS内核在内核空间完成创建、撤消、切换等线程工作。时间片分配给线程,所以多线程的进程获得更多CPU时间。
2.用户线程ULT(user-level thread)
无须利用系统调用,不依赖于OS核心。进程利用线程库函数创建、同步、调度和管理控制用户线程。调度由应用软件内部进行,通常采用非抢先式和更简单的规则,也无需用户态/核心态切换,速度比kst快。
3.组合方式
内核支持多KST线程的管理,同时也允许用户应用程序级的线程管理。
用户级线程需借助某种形式的中间系统取得内核服务,用户程序复杂
运行时系统:管理和控制线程的函数/过程集合。
内核控制线程,轻型进程LWP
1、Runtime System
2、轻权进程(LightWeight Process)