表-线程 |
线程的引入原因 | 进程作为独立运行的基本单位所需具有的两个基本属性:①进程是可拥有资源的基本单位;②进程是可独立调度和分派的基本单位。 由于进程是资源的拥有者,因而在创建、撤销和切换中占用较大的时空开销,为更好地并发执行同时又减少并发执行时的时空开销,可将进程的两个属性分开,由操作系统分开处理,即对于作为调度和分派的基本单位,不同时作为拥有资源的单位,以做到“轻装上阵”;对于拥有资源的基本单位,不对之进行频繁的切换。基于以上思想引入线程作为独立调度和分派的基本单位,即独立运行的基本单位;进程仍作为拥有资源的基本单位。 |
线程的基本运行状态 | 基本状态 | 线程的基本运行状态包括:执行态、就绪态和阻塞态,各状态的定义同进程的相应状态。 |
线程创建 | 多线程OS中,应用程序启动时,仅有一个线程,称为初始化线程,该初始化线程可利用系统调用创建新线程。 |
线程终止 | 终止方式 | 终止线程有两种方式:①线程主动退出;②被其他线程强行终止。 |
终止处理 | 线程被终止后并不立即释放它所占有的资源,仅当进程中的其他线程执行了分离函数后,被终止的线程才与资源分离,此时的资源才能被其他线程利用。已被终止但尚未释放资源的线程,仍可被需要它的线程所调用,以使被终止线程重新恢复运行。为此调用者线程需调用一条称为“等待线程终止”的连接命令,来与该线程进行连接。在一个调用者线程调用“等待线程终止”的连接命令试图与指定线程相连接时,若指定线程尚未被终止,则调用者线程将阻塞,直至指定线程被终止后,调用者线程才能实现与它的连接并继续执行;若指定线程已被终止,则调用者线程不会被阻塞而是继续执行。 |
线程的同步机制 | 互斥锁 | 使用场合 | 用于实现线程间对资源的互斥访问。由于互斥锁的时间和空间开销均较低,因而适合于高频度使用的关键共享数据和程序段。 |
状态 | 开锁状态和关锁状态 |
操作 | 关锁lock | 线程对临界资源进行访问前需先对为该临界资源设置的互斥锁执行关锁命令,若互斥锁已处于关锁状态,则该线程将被阻塞;若互斥锁已处于开锁状态,则该线程可对临界资源进行访问。 |
开锁unlock | 对临界资源完成访问的线程需对为该临界资源设置的互斥锁执行开锁命令,同时将阻塞在该互斥锁上的一个线程唤醒。 |
尝试关锁trylock | 为减少线程被阻塞的机会,线程在对临界资源进行访问前可执行尝试关锁命令,若临界资源的互斥锁处于开锁状态,则尝试关锁命令返回一个指示成功的状态码;临界资源的互斥锁处于关锁状态,尝试关锁命令不会阻塞该线程,而是仅返回一个指示操作失败的状态码。 |
条件变量 | 使用场合 | 解决只用互斥锁可能引起的死锁。每个条件变量通常与一个互斥锁一起使用,即在创建互斥锁时便联系着一个条件变量。单纯的互斥锁用于短期锁定,用来保证对临界区的互斥进入;条件变量用于线程的长期等待,直至所等待的资源成为可用资源。 |
操作 | 资源申请 | 线程首先对互斥锁执行关锁操作,如果成功进入临界区,则检查临界资源的状态,若临界资源正处于忙碌状态,则该线程转为阻塞状态,然后对互斥锁执行开锁操作;若临界资源正处于空闲状态,则该线程可以使用该资源,同时将该资源置为忙碌状态,然后对互斥锁执行开锁操作。 |
资源释放 | 线程首先对互斥锁执行关锁操作,如果成功进入临界区,则将临界资源置为空闲状态,然后对互斥锁执行开锁操作,最后将该条件变量上等待的一个线程唤醒。 |
信号量 | 私用信号量 | 使用场合 | 用于同一进程中各线程间的同步。 |
存储空间 | 其数据结构存放于应用程序的地址空间中。 |
拥有者 | 私用信号量属于特定的进程所有,OS不知道私用信号量的存在。 |
公用信号量 | 使用场合 | 用于不同进程间或同一进程中不同线程间的同步。 |
存储空间 | 其数据结构存放在受保护的系统存储区。 |
拥有者 | 由OS为它分配空间并进行管理,供所有进程使用。 |