2.4 线程及其实现
DESCRIPTION
2.4 线程及其实现. 2.4.1 引入多线程的动机 2.4.2 多线程环境中的进程和线程 2.4.3 线程的实现. 2.4.1 引入多线程的动机. 单线程 ( 结构 ) 进程( Single Threaded Process ) 多线程(结构)进程( Multiple Threaded process ). 单线程结构进程给并发程序设计效率带来问题. • 进程切换开销大 • 进程通信代价大 • 进程间的并发性粒度较粗,并发度不高 • 不适应并行计算和分布并行计算的要求 • 不适合客户 / 服务器计算的要求。. 线程的概念 (1). - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/1.jpg)
2.4 线程及其实现2.4.1 引入多线程的动机2.4.2 多线程环境中的进程和线程2.4.3 线程的实现
![Page 2: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/2.jpg)
2.4.1 引入多线程的动机
• 单线程 ( 结构 ) 进程( Single T
hreaded Process ) • 多线程(结构)进程( Multipl
e Threaded process )
![Page 3: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/3.jpg)
单线程结构进程给并发程序设计效率带来问题
• 进程切换开销大• 进程通信代价大• 进程间的并发性粒度较粗,并发度不
高• 不适应并行计算和分布并行计算的要
求• 不适合客户 / 服务器计算的要求。
![Page 4: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/4.jpg)
线程的概念 (1)操作系统中引入进程的目的是为
了使多个程序并发执行,以改善资源使用率和提高系统效率,
操作系统中再引入线程,则是为了减少程序并发执行时所付出的时空开销,使得并发粒度更细、并发性更好。
![Page 5: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/5.jpg)
线程的概念 (2) 解决问题的基本思路: • 把进程的两项功能--“独立分配资
源”与“被调度分派执行”分离开来, • 进程作为系统资源分配和保护的独立
单位,不需要频繁地切换; • 线程作为系统调度和分派的基本单位,
能轻装运行,会被频繁地调度和切换,在这种指导思想下,产生了线程的概念。
![Page 6: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/6.jpg)
2.4.2 多线程环境中的进程与线程 多线程结构进程
进程 进程PCB
资源 线程控制块
用户栈
核心栈
线程控制块
用户栈
核心栈
…
线程 n控制块
用户栈核心栈存储区存储空间
全局数据
程序代码 线程 1 线程 1
线程控制块
…
线程 2 线程 1
线程控制块
用户栈
核心栈
线程 i 线程 n
![Page 7: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/7.jpg)
多线程环境中进程的定义 进程是操作系统中除处理器外进
行的资源分配和保护的基本单位,它有一个独立的虚拟地址空间,用来容纳进程映像 ( 如与进程关联的程序与数据 ) ,并以进程为单位对各种资源实施保护,如受保护地访问处理器、文件、外部设备及其他进程 ( 进程间通信 ) 。
![Page 8: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/8.jpg)
多线程环境中的线程概念 线程是操作系统进程中能够独
立执行的实体(控制流),是处理器调度和分派的基本单位。线程是进程的组成部分,每个进程内允许包含多个并发执行的实体(控制流),这就是多线程。
![Page 9: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/9.jpg)
线程组成线程惟一标识符及线程状态信息;未运行时保存的线程上下文;可把
线程看成是进程中一个独立的程序计数器在操作;
核心栈,核心态下工作时,保存参数,函数调用时的返回地址等;
用于存放线程局部变量及用户栈的私有存储区。
![Page 10: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/10.jpg)
线程又称轻量进程 • 线程运行在进程的上下文中 ,
并使用进程的资源和环境。 • 系统调度的基本单位是线程而
不是进程 ,每当创建一个进程时,至少要同时为该进程创建一个线程,否则该进程无法被调度执行。
•Linux线程做法不一样。
![Page 11: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/11.jpg)
线程的状态线程状态有:运行、就绪和阻塞,
线程的状态转换也类似于进程。挂起状态对线程是没有意义的,如果进程挂起后被对换出主存,则它的所有线程因共享了进程的地址空间,也必须全部对换出去。
![Page 12: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/12.jpg)
线程管理和线程库 (1)• 多线程技术利用线程包 (库 ) 提供
线程原语集来支持多线程运行,• 有的操作系统直接支持多线程,而
有的操作系统不支持多线程。• 线程包 (库 ) 可分成两种:用户空
间中运行的线程包 (库 ) 和内核中运行的线程包 (库 ) 。
![Page 13: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/13.jpg)
线程管理和线程库 (2) 线程包 (库 ) 提供一组 API,支持应
用程序创建、调度、撤销和管理线程的运行。基本线程控制原语:
•孵化( Spawn ):又称创建线程。 •封锁( Block):又称阻塞线程。 • 活化( Unblock ):又称恢复线
程。 • 结束( Finish ):又称撤销线程。
![Page 14: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/14.jpg)
并发多线程程序设计的优点• 快速线程切换。• 减少(系统)管理开销。•( 线程)通信易于实现。•( 线程)通信易于实现。• 并行程度提高。• 节省主存空间。
![Page 15: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/15.jpg)
多线程技术的应用 进程中线程多种组织方式: 第一种是调度员/工作者模式 第二种是组模式 第三种是流水线模式 多线程技术的应用 •前台和后台工作 • C/S 应用模式 •异步处理 •加快执行速度。 • 设计用户接口。
![Page 16: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/16.jpg)
2.4.3 线程的实现从实现角度看,线程分成 :
• 用户级线程 ULT( 如 Java ,Informix)
• 内核级线程 KLT( 如 OS/2) 。•混合式线程 ( 如, Solaris) 。
![Page 17: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/17.jpg)
2.5 Linux进程与线程 进程描述符 task_struct 中包含:进程标识、链接信息、调度信息、文件信息、虚存空间信息、信号处理信息等。
Linux中认为线程就是共享地址空间及其他资源的进程,故并没有单独为线程定义数据结构,有一套在用户模式下运行的线程库 -pthread ,但每个线程都拥有惟一隶属于自己的 task_struct 。
![Page 18: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/18.jpg)
Linux2.4 进程的核心栈、 PCB 和虚存映象
esp 存放堆栈栈顶指针
核心栈
struct task_struct
8KB
0
0x08048000
0x40000000
0xc0000000
内核虚存
用 户 栈 ( 运 行 时创建 )
共享库主存映象区
运行时堆空间堆 (malloc创建 )读 /写段
只读段从可执行文件加载
esp
用户代码不可见
未 用
brk
![Page 19: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/19.jpg)
Linux2.6进程的核心栈进程核心栈进程核心栈
栈顶
栈指针 esp
thread_info{*task … }}
current
task_struct
进程的核心栈、 *task和 task_struct 结构
![Page 20: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/20.jpg)
Linux进程的运行环境信息 thread_info 结构
包含: 进程描述符 task_struct 指针、当前 CPU号、底层标志、 线程同步标志、 内核抢占计数器等。
![Page 21: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/21.jpg)
Linux2.6 task_struct 增加用于调度的新成员,主要有:动态优先级 prio静态优先级 static_prio正常优先级 normal_prio优先级数组 prio_array进程平均等待时间 sleep_avg负载平衡权重 load_weight 等
![Page 22: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/22.jpg)
Linux进程状态TASK_RUNNINGTASK_INTERRUPTIBLETASK_UNINTERRUPTIBLETASK_ZOMBIE。TASK_STOPPEDTASK_SWAPPING
![Page 23: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/23.jpg)
Linux进程状态及转换
wake_up_interruptible()wake_up( )
TASK_ZOMBIE
TASK_ZOMBIE
TASK_RUNNING
TASK_RUNNING
TASK_UNINTERRUPTIBLE
TASK_UNINTERRUPTIBLE
TASK_INTERRUPTIBLE
TASK_INTERRUPTIBLE
TASK_STOPPED
TASK_STOPPED
占有 CPU运行 占有 CPU运行
schedule( )
时间片到
schedule( )interruptible_sleep_on( )
schedulle( )sleep_on( )
wake_up()
创建 do_fork( )
do_exit( )schedule( )syscall_trace( )sys_exit( )
收到 SIG_KILL 或 SIG_CONT后,执行wake_up( )
![Page 24: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/24.jpg)
2.6Windows 2003 进程与线程 进程是资源的容器,容纳各种分配到
的资源如主存、已打开文件等; 线程是可被内核调度的执行实体,可
被中断,使 CPU能转向另一线程执行。 进程和线程用对象来实现。
![Page 25: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/25.jpg)
Windows 对象分类 (1) Windows 是一个基于对象的操作系统,
用对象来表示所有的系统资源。 (1) 执行体对象 由执行体的组件实现的对象,用来实现各种外部功能,用户态程序( 服务器对象 ) 可访问执行体对象。
执行体对象:进程、线程、区域、文件、事件、事件对、文件映射、互斥、信号量、计时器、对象目录、符号连接、关键字、端口、存取令牌和终端等。
![Page 26: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/26.jpg)
Windows 对象分类 (2) (2) 内核对象 内核实现的更原始的对象集合,包括:内核过程对象、异步过程调用对象、延迟过程调用对象、中断对象、电源通知对象、电源状态对象、调度程序对象等。
内核对象对用户态代码是不可见的,仅在执行体内创建和使用,许多执行体对象包含一个或多个内核对象,而内核对象能提供仅能由内核来完成的基本功能。
![Page 27: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/27.jpg)
Windows 对象分类 (3)Windows 对象结构对象头对象体 对象管理器
![Page 28: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/28.jpg)
进程及控制和使用的资源
对象句柄表
虚拟地址空间描述符
文件 x
信号量 y
区域 z
…
VAD VAD VAD VAD VAD VAD VAD VAD进程
访问令牌
可用对象
句柄 1
句柄 2
线程 线程 线程
句柄 3
![Page 29: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/29.jpg)
对象和句柄间的关系
应用程序 应用程序
执行体对象 执行体对象 执行体 执行体
内 核 内 核
用户态
核心态
句柄
内核对象
![Page 30: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/30.jpg)
进程对象 ( 进程描述表结构 )
EPROCESS
…void *UniqueprocessId;…
…void *UniqueprocessId;…
KPROCESS
…uint32 kernelTime;uint32 UserTime;…byte State;…
NT 内核NT 内核
NT 执行体NT 执行体
![Page 31: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/31.jpg)
线程对象 ( 进程和线程描述表结构 )
KTHREADKTHREAD
EPROCESS
KPROCESS ETHREAD
KTHREADKTHREAD
KTHREAD NT 内核
NT 执行体
![Page 32: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/32.jpg)
调用 CreateProcess 函数创建进程 创建WIN32 进程的具体步骤:• 打开将在进程中被执行的映像文件( .EXE)。• 创建Windows2000/XP 执行体进程对象。• 创建初始线程(堆栈、描述表、执行体线程对象)。
• 通知WIN32子系统已创建了一个新的进程,以便它可设置新的进程和线程。
•启动初始线程的执行。• 在新进程和线程的描述表中完成地址空间的初始化,加载所需的 DLL,并开始程序的执行
![Page 33: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/33.jpg)
调用 CreateThread 函数创建线程 创建WIN32 线程的具体步骤:• 在进程地址空间内为线程创建用户态堆栈;初始化
线程描述表;• 调用 NtCreateThread创建执行体线程对象。包括:增加进程中的线程计数,创建并初始化执行体线程块,生成新线程 ID,从非页交换区分配线程的内核堆栈,设置线程环境块 TEB ,设置线程起始地址和用户指定的 WIN32起始地址,设置 KTHREAD块,设置指向进程访问令牌的指针和创建时间;
• 通知WIN32子系统已创建新线程,以便设置新的进程和线程;
• 置新线程为准备态,把其句柄和 ID返回到调用进程;调用 ResumeThread ,线程将被激活并调度执行。
![Page 34: 2.4 线程及其实现](https://reader036.vdocuments.site/reader036/viewer/2022081417/5681352a550346895d9c9472/html5/thumbnails/34.jpg)
Windows 进程和线程状态
资源可用
事件完成但资源不可用
事件完成资源可用
阻塞挂起
终止
可运行
不可运行
选中 切换
抢占或时间片到 Running
运行态Ready就绪态
Standby准备态
Terminated中止态
Waiting等待态
Transition过渡态