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