Threads 线程 为什么要引入线程 – WEB 服务器 同时处理多个客户请求 – 创建多个进程降低响应时间 – 进程开销较大 ( 上下文切换 ) 线程 ( 轻量级进程 ) – 是 CPU 调度的一个基本单位
WEB server/Http request IE WEB Server …. … jpg data 2.jpg data
FlashGet / eMule /BT
1 、线程的引入 为了解决以进程为运行单位而产生的并发性不 高和系统开销大的缺陷。 人们希望将进程作为调度和分派的独立单位属 性与作为拥有资源的独立单位属性分开。使得 运行者尽量不拥有资源,轻装上阵;而拥有资 源者尽量少切换。 引入线程作为轻装运行的独立单位,而进程作 为资源拥有单位。可大大提高系统的并发程度, 同时又减少系统的时空开销。
单线程与多线程
2 、线程的定义 定义:线程是由进程所包含的一个实体,并能 被系统独立调度和分派的基本单位,亦即独立 运行的实体或进程中的一条执行路径或线索。 组成:线程由线程控制块( TCB )、保存线程 的程序计数器、局部变量、少数状态参数和返 回地址等信息的一组寄存器和堆栈组成。 传统的进程称为重型进程 (Heavy Weight Process) ,而将线程有时称为轻型进程( Light Weight Process) 。 一个进程中至少有一个线程,并继承或共享进 程资源。
3 、线程属性 轻型实体:基本不拥有资源,只共享进程的资 源; 独立调度和分派的基本单位:线程是独立运行 的基本单位,且切换开销极小; 并发执行:线程之间(同一进程或非同一进程) 可并发执行; 共享进程资源:进程的内存空间、 I/O 设备、文 件、数据等。
4 、线程与进程的比较(重点) 相似的地方: – 都可以并发执行; – 都有就绪、执行、阻塞这些基本状态,也 都可以在这些基本状态间转换状态;从创 建到撤销都有一定的生命周期; – 都需要同步工具。
– 在引入线程的 OS 中,线程代替进程成为独立调 度和分派的基本单位,进程则仍是拥有资源的 基本单位。 – 并发粒度不同。同一个进程里的不同线程之间, 以及不同进程的线程之间都可以并发执行,所 以线程拥有更好的并发性。 – 拥有资源数量不同。进程是拥有资源的基本单 位,线程除了些在运行过程中必不可少的资源 外基本上不拥有系统资源,它可以访问自己所 在的进程的资源。 – 管理开销不同。创建、撤销进程时系统都要为 之分配和回收资源,所以进程切换用的时空开 销相对要多于线程。进程间通信很麻烦,而同 一进程的线程间则通过共享进程的资源很方便 地通信和同步,同步开销小得多。 不同的地方:
Benefits Responsiveness – 可以获得快速的用户响应,如在 C/S 模式下, web server 为每个用户连接运行一个线程; RPC 服务器 中, RPC 服务进程会开启多个线程服务于每个 RPC request Resource Sharing – 进程是拥有资源的基本单位( CPU ,地址空间, I/O 资源),进程中的线程可以共享这些资源 Economy – 创建线程比创建进程更快,进程内的线程切换 ( context switch) 比进程更快, solaris 中创建线程 比进程快 30 倍,线程切换比进程切换快 5 倍 Utilization of SMP Architectures – 可以充分利用多处理器体系结构,使得一个进程中 的线程在不同的处理器上运行,提高进程执行的并 行度
一些应用程序可以分成若干相对独立的部 分 [Word 的后台打印, 拼写检查等,IE 浏览 器 ] 每一部分用一个线程来实现 一个线程阻塞时可调度同一进程的另一个 线程运行而不是切换进程 线程间通信无需内核干预 需要解决进行线程间同步 Application benefits of threads
三种线程状态 : running, ready, blocked 线程无挂起状态 Termination of a process, will terminates all threads within the process Threads States( 线程状态 )
User Level Threads(ULT) 内核不关注线程的存在 所有的线程管理由应用程序通过调用 ULT 库实 现 线程间的切换无需内核模式下的特权指令(无 模式转换) 线程调度由特定的应用 程序完成 例子 - POSIX Pthreads - Mach C-threads 一种 UNIX 的操作系统, 采用微内核 - Solaris threads Java 线程:创建 Thread 类的子类或实现 Runable 接口
User Level Threads library 用户级线程库 Contains codes for: ( 包含以下代码 ) – creating and destroying threads( 线程的创 建和撤消 ) – passing messages and data between threads 线程间数据和消息的传递 – scheduling thread execution 对线程的调度 – saving and restoring thread contexts 对线程上下文的保存和恢复
Advantages Thread switching does not involve the kernel: no mode switching 无模式 ( 管态 / 目态 ) 转换 Scheduling can be application specific: choose the best algorithm. 可选择最好的调度算法 ULTs can run on any OS. Only needs a thread library 只要有库, 就可在任何操作 系统运行 Inconveniences Most system calls are blocking and the kernel blocks processes. So all threads within the process will be blocked 多数的系统调用将阻塞该进程 的所有线程 The kernel can only assign processes to processors. Two threads within the same process cannot run simultaneously on two processors 一个进程的两个线程不能同在 两个处理器上同时运行 用户级线程的优缺点
Kernel Level Threads(KLT) 内核级的线程 内核完成对所有线程的管理 无线程库,但内核供内核线程的编程接口( API ) 内核需要维护进程和线程的上下文信息 线程间的调度由内核完成 调度的基本单位是线程 例子 - Windows 95/98/NT/ Solaris - Tru64 UNIX - BeOS 处理机
Advantages the kernel can simultaneously schedule many threads of the same process on many processors 内核可在多处理机上同时对一个 进程的多个线程进行调度 blocking is done on a thread level 阻塞仅限线程级别 kernel routines can be multithreaded 内核程序也可以是多线程 Inconveniences thread switching within the same process involves the kernel. We have 2 mode switches per thread switch 同进程的线程内的转换涉 及内核, 每一个线程的转换 需要两个模式转换 this results in a significant performance slowing down 导致系统性能的下降 内核级的线程
Multithreading Models 多线程模式 Many-to-One ( 多对一 ) One-to-One ( 一对一 ) Many-to-Many ( 多对多 )
Many-to-One Many user-level threads mapped to single kernel thread. (纯用户级线程) Used on systems that do not support kernel threads.( 常用 于不支持内核线程的 系统中 )
One-to-One Each user-level thread maps to kernel thread. (纯核心级线程) Examples – Windows 95/98/NT/2000 – OS/2
Many-to-Many Model 混合式线程 Allows many user level threads to be mapped to many kernel threads. Takes advantage of many-to-one and one- to-one models Allows the operating system to create a sufficient( 充足的 ) number of kernel threads. 例子 – Solaris 2 – Windows NT/2000 with the ThreadFiber 纤程 package
Many-to-Many Model
多线程与单线程 多线程 : 操作系统支持在一个进程中有多个执行 线程 单线程 : 操作系统不支持线程概念 MS-DOS 支持单用户进程及单线程 传统 UNIX 支持多用户进程但每进程只支持一个 线程 现今的操作系统,如 Solaris, Windows, 支持多 线程 Solaris: SUN 微系统公司开发的一种网络操作系统