线程与用户级线程实现.ppt
第十八讲 线程概念,用户级线程实现目的与要求:掌握线程概念掌握线程概念,线程与进程区线程与进程区 别及用户级线程的实现别及用户级线程的实现.重点与难点:线程如何从原进程概念中剥离线程如何从原进程概念中剥离 出来,线程控制块,出来,线程控制块,线程状线程状 态。用户级线程实现方法及优态。用户级线程实现方法及优 缺点。缺点。作业:2,72,7 线程的引入 传统进程既是传统进程既是除处理机以外的除处理机以外的资源分配资源分配单位(如内存占用单位),又是执行单位。单位(如内存占用单位),又是执行单位。随着共享内存多外理机的发展,为了支持进随着共享内存多外理机的发展,为了支持进程内多道程序设计而引入线程程内多道程序设计而引入线程。8.1.1 8.1.1 对称多处理对称多处理 对对称称多多处处理理机机指指共共享享内内存存,且且多多个个处处理理机机都都可可响响应应中中断断并并可可以以运运行行用用户户和和核核心心程程序序的多处理机系统的多处理机系统。第第8 8章章 并行与分布式操作系统并行与分布式操作系统 8.1 8.1 并行操作系统并行操作系统 处理机处理机CacheCache处理机处理机CacheCache处理机处理机CacheCache.主存主存总线适配器总线适配器I/OI/O总线总线系统总线系统总线打印机打印机硬盘硬盘对称多处理机系统结构 新结构对操作系统的要求 多任务并行支持。希望同一进程的程序可多任务并行支持。希望同一进程的程序可同时在多同时在多CPUCPU上运行,同时还共享进程存储上运行,同时还共享进程存储空间。空间。同步支持。当运行在不同同步支持。当运行在不同CPUCPU上的程序访上的程序访问共享数据时,要有利用硬件支持的同步手问共享数据时,要有利用硬件支持的同步手段段(如:读后置如:读后置1 1)。)。每个每个CPUCPU都应该能够运行操作系统调度程都应该能够运行操作系统调度程序进行自行调度。序进行自行调度。多多CPU cacheCPU cache一致性的要求一致性的要求(全部由硬件实全部由硬件实现或由硬件和操作系统合作实现现或由硬件和操作系统合作实现)。线程概念线程概念 将原进程的将原进程的PCBPCB内容分成两部分。内容分成两部分。将第二部分内容作为线程描述表的内容,将第二部分内容作为线程描述表的内容,且进程内允许多个线程存在。且进程内允许多个线程存在。描述进程资源和空间的部分。描述进程资源和空间的部分。描述执行现场、状态及调度的部分。描述执行现场、状态及调度的部分。一、进程与线程区别新的进程被定义为:资源分配单位。资源分配单位。线程被定义为:CPUCPU分配单位(执行单位)。分配单位(执行单位)。新进程描述:一个独立的进程空间,可装入进程映像。一个独立的进程空间,可装入进程映像。一个独立的进程关联的执行文件。一个独立的进程关联的执行文件。进程所用系统资源。进程所用系统资源。一个或多个线程。一个或多个线程。进程在创建时一般同进程在创建时一般同时创建好第一个线程,其他线程按需要由时创建好第一个线程,其他线程按需要由用户程序请求创建。用户程序请求创建。线程TCB描述 线程标识信息;线程标识信息;状态和调度信息;状态和调度信息;现场信息(组织成栈帧)现场信息(组织成栈帧);线程私有存储区;线程私有存储区;指针指向指针指向PCBPCB。传统进程与多线程进程比较PCB用户栈用户地址空间核心栈a.传统进程模型用户栈核心栈用户栈核心栈用户地址空间PCBTCBTCB.b.多线程进程模型 二、多线程应用多线程可以方便地实现多线程可以方便地实现CPUCPU之间的并行,之间的并行,以及以及CPUCPU与外设间的并行。多线程与多进程与外设间的并行。多线程与多进程相比,多线程天然地共享空间,而多进程要相比,多线程天然地共享空间,而多进程要通过如通过如shmgetshmget系统调用才可共享部分空间。系统调用才可共享部分空间。举例:有任务有任务1 1和任务和任务2 2两个任务,把它们组两个任务,把它们组织到单进程中,然后与多线程中运行的时间织到单进程中,然后与多线程中运行的时间花费进行比较。花费进行比较。任务任务1 1等等I/OI/O任务任务1 1任务任务2 2等等I/OI/O任务任务2 2a.a.单线程进程单单线程进程单CPUCPU执行执行任务任务1 1任务任务1 1等等I/OI/O任务任务2 2任务任务2 2等等I/OI/O线程线程1 1处理机处理机1 1线程线程2 2处理机处理机2 2b.b.多线程进程多多线程进程多CPUCPU执行执行线程线程1 1线程线程2 2CPUCPU切换切换任务任务1 1等等I/OI/O等等CPUCPU任务任务1 1任务任务2 2等等I/OI/O任务任务2 2c.c.多线程进程单多线程进程单CPUCPU执行执行等等CPUCPU 三、线程状态变化 进程产生时同时产生第一个线程,其进程产生时同时产生第一个线程,其他线程在以后由任一线程请求创建。他线程在以后由任一线程请求创建。线程创建后运行过程中的三个主要状线程创建后运行过程中的三个主要状态是:运行、就绪、阻塞。态是:运行、就绪、阻塞。运行运行就绪就绪结束结束阻塞阻塞结束结束被调度被调度时间片时间片完完或被剥或被剥夺夺等待事等待事件件事件发事件发生生重新初始重新初始化化创建创建 原进程的运行、就绪、阻塞状态已变为原进程的运行、就绪、阻塞状态已变为针对线程,而原挂起状态反映的是进程映像针对线程,而原挂起状态反映的是进程映像在不在内存,因而还是进程的状态。在不在内存,因而还是进程的状态。四、线程间通信与同步四、线程间通信与同步 线程间通过共享空间通信。线程间通过共享空间通信。可以通过同步原语可以通过同步原语(系统调用系统调用/或或利用硬同步指令的同步函数利用硬同步指令的同步函数),实现,实现互斥与同步。互斥与同步。五、多线程编程接口举例五、多线程编程接口举例 UNIXUNIX的的pthreadpthread库所提供的有关线程函数。库所提供的有关线程函数。1.1.创建线程创建线程 int pthread_create(pthread_t int pthread_create(pthread_t tid,const tid,const pthread_attr_t pthread_attr_t attr,void attr,void(func)(void func)(void),),void void arg)arg);2.2.等待某线程结束等待某线程结束int pthread_join(pthread_t tid,void int pthread_join(pthread_t tid,void status);status);tid tid是我们必须要等待线程的是我们必须要等待线程的tidtid 3.3.获得正在执行线程的获得正在执行线程的IDIDpthread_t pthread_self(void);pthread_t pthread_self(void);4.4.将线程变为独立状态将线程变为独立状态 int pthread_detach(pthread_t tid);int pthread_detach(pthread_t tid);线程或者是可汇合的(线程或者是可汇合的(joinablejoinable)或者是独立的)或者是独立的(detacheddetached)。当可汇合的线程终止时,其线程)。当可汇合的线程终止时,其线程IDID和退出和退出状态将保留,直到另外一个线程调用状态将保留,直到另外一个线程调用pthread_joinpthread_join。独立。独立的线程终止时,所有的资源都释放,因而不能等待它终止。的线程终止时,所有的资源都释放,因而不能等待它终止。如果一个线程需要知道另一个线程什么时候终止,最好保如果一个线程需要知道另一个线程什么时候终止,最好保留第二个线程的可汇合性。留第二个线程的可汇合性。5.5.线程结束线程结束 void pthread_exit(void void pthread_exit(void status);status);6.6.加锁加锁/解锁解锁 int pthread_mutex_lock(pthread_mutex_t*mutex)int pthread_mutex_lock(pthread_mutex_t*mutex)int pthread_mutex_unlock(pthread_mutex_t int pthread_mutex_unlock(pthread_mutex_t*mutex)*mutex)这两个函数用于对临界区的加锁和解锁,以保证对共这两个函数用于对临界区的加锁和解锁,以保证对共享数据的互斥操作。享数据的互斥操作。MutexMutex是指向锁结构的地址。是指向锁结构的地址。8.1.3 8.1.3 线程实现线程实现 两种典型实现多线程的方法为:多线库方法和两种典型实现多线程的方法为:多线库方法和核心方法。核心方法。一、多线库实现的用户级线程 不改变操作系统内核而开发一个多线程函数库不改变操作系统内核而开发一个多线程函数库,这是一种非操作系统的实现方法这是一种非操作系统的实现方法,是一种过渡的方是一种过渡的方法。法。由多线程库提供线程创建、结束、同步等函由多线程库提供线程创建、结束、同步等函数,而进程主程序作为主线程运行,以后可调用数,而进程主程序作为主线程运行,以后可调用多线程库的创建线程函数创建用户级线程。多线程库的创建线程函数创建用户级线程。操作系统只看到进程,只做进程调度,而由操作系统只看到进程,只做进程调度,而由多线程库调度用户级线程分时地在进程中运行多线程库调度用户级线程分时地在进程中运行。多线库多线库P P多线库多线库P P进程进程1 1进程进程2 2进程调度进程调度CPUCPU由传统进程支持实现用户级多线程的示意图 创建用户级线程函数处理过程 接收新线程执行函数及初始变量值接收新线程执行函数及初始变量值;在进程用户空间中分配在进程用户空间中分配TCBTCB表、栈区和私表、栈区和私有存储区,初始化上述表格;有存储区,初始化上述表格;将将TCBTCB表中的线程状态改为就绪;表中的线程状态改为就绪;运行线程调度程序;运行线程调度程序;返回被调度线程的现场。返回被调度线程的现场。进程调度与多线库线程调度对比 用户程序调用任一多线程库函数,在函用户程序调用任一多线程库函数,在函数处理结束时,都去运行线程调度。调用数处理结束时,都去运行线程调度。调用返回时,可能返回到另一线程。返回时,可能返回到另一线程。用户程序在自陷或被中断进入内核,在用户程序在自陷或被中断进入内核,在内核处理结束时,都去运行进程调度程序。内核处理结束时,都去运行进程调度程序。用户级线程与进程的关系 多线程分时地在进程内运行,多线库多线程分时地在进程内运行,多线库线程调度是选取线程占用进程,内核进程线程调度是选取线程占用进程,内核进程调度是选取进程占用调度是选取进程占用CPUCPU。用户级线程的优势 线程管理开销小线程管理开销小;无需修改操作系统核心;无需修改操作系统核心;用户级线程的缺点 不能做到同一进程内线程在多不能做到同一进程内线程在多CPUCPU并行;并行;线程因线程因I/0I/0等原因阻塞于内核时,多线库等原因阻塞于内核时,多线库调度器不知道。调度器不知道。