您好,欢迎访问三七文档
第五章线程25.1概述•什么是线程?•为什么需要引入线程?•内核线程和用户线程3线程的定义•线程(thread),有时也被称为轻量级进程(lightweightprocess,LWP)–线程是CPU使用的基本单元–线程由如下部分组成:•线程ID•PC指针•一组寄存器•调用栈–同一进程内的所有线程共享代码段、数据段和其它操作系统资源(如文件、信号等)。4单线程进程和多线程进程55.1.1动机•应用程序通常实现得像一个具有多个控制线程的独立进程,例如:–网页浏览器可能包括:•显示图片和文字的线程•从网络接收数据的线程–字处理器可能包括:•格式化显示文本和图像的线程•读入用户键盘输入的线程•拼写和语法检查的线程–网页服务器可能包括:•许多完成相似或者不同功能的不同线程65.1.2优点•响应度高:如果对一个交互式应用程序采用多线程,即使其部分阻塞或执行冗长的操作,那么该程序仍能够继续执行,从而增加了对用户的响应度。•资源共享:线程默认共享它们所属进程的内存和资源。7优点•经济:创建和切换代价小–例如在Solaris2中•进程创建要比线程创建慢30倍•进程上下文切换要比线程上下文切换慢5倍•多处理器体系结构的利用–单线程的进程只能运行在一个CPU上,无论系统中有多少个CPU。85.1.3用户线程与内核线程•用户线程–在内核之上支持–在用户层通过线程库来实现•线程库支持创建、调度和管理线程,而无需内核干预–在单线程内核上,任何一个用户级线程若执行阻塞系统调用就会引起整个进程阻塞,即使还有其他线程可以在应用程序内运行•用户级线程库包括:–POSIXPthreads–MachC-threads–Solaris2UI-threads9用户线程与内核线程•内核线程–由操作系统直接支持:内核负责在内核空间执行线程创建、调度和管理;–创建和管理比用户线程慢;–线程之间的阻塞相互独立(既一个线程执行阻塞系统调用时,内核可以调度进程里的其它线程执行);–更好的支持多CPU体系结构;•例如:–WindowsNT/2000–Solaris2–Tru64UNIX105.2多线程模型•用户线程和内核线程的对应关系,形成了三种多线程模型:–多对一模型(m:1)–一对一模型(1:1)–多对多模型(m:n)115.2.1多对一模型12多对一模型•多个用户线程映射到一个内核线程•线程的管理在用户空间内完成,效率比较高–通常用于不支持内核线程的系统上•缺点–一个线程阻塞将导致整个进程阻塞–多个线程不能并行运行在多处理器上•例如•Solaris2系统的Greenthreads•Unix的Pthreads135.2.2一对一模型14一对一模型•每个用户线程都映射到一个用户线程上–提供了更好的并发性(某个线程的阻塞不一定导致进程的阻塞)–支持多处理器•缺点–创建用户线程造成的高开销•例如–Windows95/98/NT/2000–OS/2155.2.3多对多模型16多对多模型•多路复用了许多用户线程到同样数量或者更小数量的内核线程上。m:n(m=n)•允许编程人员创建足够多的用户线程•避免线程阻塞引起进程阻塞、支持多处理器•例如–Solaris2–IRIX–HP-UX–Tru64UNIX175.3若干多线程的问题•系统调用fork和exec•线程取消•信号处理•线程池•线程特定数据185.3.1系统调用fork和exec•fork用于创建一个独立的、重复的进程•在多线程程序里,有的UNIX有两种形式的fork–一种复制进程中所有的线程•用于没有在fork后立即调用exec的情况–一种仅仅复制调用了系统调用fork的线程•用于在fork后立即调用exec的情况•exec参数所指定的程序会替换整个进程195.3.2线程取消•线程取消是在线程完成之前来终止进程的任务•例如:–多个线程并发执行以搜索数据库并且一个线程返回了结果–用户按下网页浏览器上的停止按钮,装入网页的线程就被取消20两种线程取消的情况•目标线程:要被取消的线程•异步取消:一个线程立即终止目标线程–要取消的线程正在更新与其它线程所共享的数据–往往并不收回所有系统资源•延迟取消:目标线程不断的检查它是否应终止,允许一个线程检查它是否是在安全的点被取消。(Pthread称这些点为取消点)215.3.3信号处理•信号在UNIX系统中用做通知进程某个特定事件已经发生了–信号是由特定事件的发生所产生的–产生的信号要发送到进程–一旦发送,信号必须要加以处理•忽略也是一种处理22同步和异步信号•同步信号–非法内存访问,被零除–同步信号发送到执行操作而产生信号的同一进程•异步信号–一个信号是由运行进程之外的事件所产生–用特殊键(Ctrl-C),定时器时间到期–异步信号被发送到另一个进程23信号处理•每个信号可能由下列处理程序之一来处理:–缺省信号处理程序,当处理信号时由内核运行的–用户定义的信号处理程序24信号发送•单线程程序的信号总是发送给进程•对于多线程程序,信号发送存在如下选择–发送信号到信号所应用的线程–发送信号到进程内的每个线程–发送信号到进程内的某些线程–规定一个特定线程以接收进程的所有信号•发送信号的方法依赖于所产生信号的类型255.3.4线程池•使用线程池的理由–避免创建和终止进程的开销,以更快的服务–限制了可存在线程的数量,从而限制了CPU时间和内存的使用•影响池中线程数量的因素–系统中CPU的数量–物理内存的大小–并发客户的请求的期望值265.3.5线程特定数据•同属一个进程的线程共享进程数据•线程特定数据:每个线程需要一定数据的自己的拷贝•例如–对于事务处理系统,需要通过独立线程以处理各个请求–每个事务都有一个唯一标识符,为了让每个线程与其唯一标识符相关联,可以使用线程特定数据。•绝大多数线程库提供了对线程特定数据的支持,如Win32,Pthreads,Java275.9小结•线程是进程内的控制流•多线程进程在同一地址空间内包括多个不同的控制流•用户级线程–对程序员来说是可见的,对内核来说是未知的–用户空间的线程库通常管理用户级线程–优缺点28小结•内核线程–操作系统内核支持和管理内核级的线程–利和弊•三种模型–多对一m:1–一对一,1:1–多对多,m:n(m=n)29小结•多线程问题–系统调用fork()andexec()–线程取消–信号处理–线程特定数据30•作业–3,4,6
本文标题:什么是线程
链接地址:https://www.777doc.com/doc-3141861 .html