《03第三章 多线程编程1 多核编程.ppt》由会员分享,可在线阅读,更多相关《03第三章 多线程编程1 多核编程.ppt(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第三章 多线程概述 l多线程技术运用恰当,多线程技术就能使硬件资源得到更加充分的利用,提高计算性能;反之,降低计算性能,导致应用程序发生一些不可预测的行为,甚至出现难以解决的故障。只要正确理解线程的运行方式,就可以避免这些可能出现的问题,达到充分发挥多线程技术的优势、提高计算性能的目的。进程概念l定义:进程是具有一定独立功能的程序关于一个数据集合的一次运行活动。可表示成四元组(P,C,D,S),其中P是程序代码,C是进程的控制状态,D是进程的数据,S是进程的执行状态。l状态:运行态(Run):进程占有处理机资源,正在运行;就绪态(Ready):进程本身具备运行条件,但由于处理机的个数少于可运行
2、进程的个数,暂未投入运行;等待态(Wait):进程本身不具备运行条件,即使分给它处理机也不能运行.进程正等待某一个事件的发生,如等待某一资源被释放,等待与该进程相关的I/O传输的完成信号等。进程概念l状态间转换当一个就绪进程获得处理机时,其状态由就绪变为运行;当一个运行进程被剥夺处理机时,其状态由运行变为就绪;当一个运行进程因某事件受阻时,如所申请资源被占用,启动I/O传输未完成,其状态由运行变为等待;当所等待事件发生时,如得到申请资源,I/O传输完成,其状态由等待变为就绪.进程概念l进程控制块(Process Control Block,PCB):标志进程存在的数据结构,其中包含系统对进程管
3、理需要的全部信息。进程标识用户标识进程状态调度参数现场信息家族联系程序地址当前打开文件消息队列指针资源使用情况进程队列指针进程概念l进程的组成 进程控制块:由于进程控制块中包含程序的地址信息,通过它可以找到程序在内存或外存的存放地址,也就找到了整个进程.PCB存于系统空间,只有操作系统能够对其存取,用户程序不能访问.实际上用户甚至感觉不到PCB的存在;程序:进程的“躯体”,其中包括代码和数据两个部分.现代操作系统都支持程序共享的功能,这就要求代码是“纯”的,即在运行期间不修改自身。数据一般包括静态变量、动态堆和动态栈。进程概念l进程的表示:PCB程序PCB代码数据+堆栈系统空间用户空间(a)(
4、b)进程概念l进程的队列:为实现对进程的管理,系统需要按照某种策略将进程排成若干队列,由于PCB是进程的代表,因而进程队列实际上是由进程PCB构成的队列.因为该队列通常由链的形式实现的,所以也称PCB链。系统中的进程队列分为如下三类:就绪队列、等待队列、运行队列。进程的队列l就绪队列整个系统一个.所有处于就绪状态的进程按照某种组织方式排在这一队列中.l等待队列每个等待事件一个,当进程等待某一事件时,进入与该事件相关的等待队列中;当某事件发生时,与该事件相关的一个或多个进程离开相应的等待队列,进入就绪队列.l运行队列在单CPU系统中只有一个,在多CPU系统中每个CPU各有一个,每个队列中只有一个
5、进程,指向运行队列头部的指针被称作运行指示字.进程概念l进程的类型系统进程 运行操作系统程序,完成操作系统的某些功能;用户进程运行用户程序,直接为用户服务。l特性:并发性:与其它进程一道在宏观上同时向前推进;动态性:进程是执行中的程序.此外进程的动态性还体现在如下两个方面:首先,进程是动态产生、动态消亡的;其次,在进程的生存期内,其状态处于经常性的动态变化之中;独立性:进程是调度的基本单位,它可以获得处理机并参与并发执行;交往性:进程在运行过程中可能会与其它进程发生直接或间接的相互作用;异步性:每个进程都以其相对独立、不可预知的速度向前推进;结构性:每个进程有一个控制块PCB。进程间相互联系与
6、相互作用 l多道系统中同时运行的并发进程一般有多个,在逻辑上,这些进程之间可能存在某种联系,也可能相对独立 相关进程:在逻辑上具有某种联系的进程称作相关进程;无关进程:在逻辑上没有任何联系的进程称作无关进程;l并发进程之间存在相互制约的关系,这种相互制约的关系称作进程间的相互作用.进程间相互作用的方式有两种:即直接相互作用和间接相互作用即直接相互作用和间接相互作用直接相互作用:进程之间不需要通过中间媒介而发生的相互作用,这种相互作用通常是有意识的;间接相互作用:进程之间需要通过某种中间媒介而发生的相互作用,这种相互作用通常是无意识的。进程的创建与撤销 l进程创建 建立一个PCB,并对其内容进行
7、初始化;为该进程分配必要的存储空间,并加载所要执行的程序(在UNIX系统中需要通过另外一个系统调用execl实现);将PCB送入就绪队列。l进程撤销完成使命的进程需要终止自己并告知操作系统,系统将对进程进行善后处理(收集进程状态信息、通知其父进程等),之后将收回进程所占有的所有资源(打开文件、内存等),最后撤销其PCB。,非正常终止也将进入操作系统进行善后处理。线程的概念l线程(thread)是进程上下文(context)中执行的代码序列,又被称为轻量级进程(light weight process),是进程内的一个相对独立的执行流。l在支持多线程的系统中:进程成为资源分配和保护的实体线程是被
8、调度执行的基本单元。l进程的资源包括进程的地址空间,打开的文件和I/O等l属于同一个进程的线程共享该进程的代码段和数据段,打开的文件,信号等还包含各自的线程ID,线程执行状态,CPU寄存器状态和栈线程的概念l进程和线程的区别:进程-是指程序在一个数据集合上运行的过程,是系统进行资源分配和调度运行的一个独立单位,有时也称为活动、路径或任务。如果说在操作系统中引入进程的目的,是为了使多个程序并发执行,以改善资源利用率及提高系统的吞吐量;那么,在操作系统中再引入线程则是为了减少程序并发执行时所付出的时空开销,使操作系统具有更好的并发性。进程是资源的分配单位。线程 是进程中的一个实体,是被系统调度和分
9、配的基本单元。每个程序至少包含一个线程,那就是主线程。线程自己只拥有很少的系统资源(如程序计数器、一组寄存器和栈),但它可与同属一个进程的其他线程共享所属进程所拥有的全部资源,同一进程中的多个线程之间可以并发执行,从而更好地改善了系统资源的利用率。线程是CPU的调度单位。l线程是“进程中的一条执行路径或线索”或“进程中的一个可调度实体”lSingle Threaded and Multithreaded Process Models线程的概念l线程具有如下优点:上下文切换速度快:由同一进程中的一个线程切换到另一个线程只需改变寄存器和栈,包括程序和数据在内的地址空间不变;系统开销小:创建线程比创
10、建进程所需完成的工作少,因而对于客户请求,服务器动态创建线程比动态创建进程具有更高的响应速度;通讯容易:由于同一进程中的多个线程地址空间共享,一个线程写到数据空间的信息可以直接被该进程中的另一线程读取,方便快捷;终止一个线程比终止一个进程的代价要小。线程的概念l线程与进程的区别:线程为轻量级进程(lightweight process,LWP),也是CPU调度和分派的基本单元;进程则被称为重量级进程(heavyweight process,HWP),它就是只拥有一个线程的进程。如果进程有多个控制线程,那么它就能同时执行多个任务。他们之间的关系可以简单的由下图表示:线程的概念l调度在传统的操作系
11、统中,CPU调度和分派的基本单位是进程。而在引入线程的操作系统中,则把线程作为CPU调度和分派的基本单位,进程则作为资源拥有的基本单位,从而使传统进程的两个属性分开,线程便能轻装运行,这样可以显著地提高系统的并发性。同一进程中线程的切换不会引起进程切换,从而避免了昂贵的系统调用。但是在由一个进程中的线程切换到另一进程中的线程时,依然会引起进程切换。线程的概念l并发性 在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间也可以并发执行,因而使操作系统具有更好的并发性,从而能更有效地使用系统资源和提高系统的吞吐量。例如,在一个未引入线程的单CPU操作系统中,若仅设置一个
12、文件服务进程,当它由于某种原因被封锁时,便没有其他的文件服务进程来提供服务。在引入了线程的操作系统中,可以在一个文件服务进程中设置多个服务线程。当第一个线程等待时,文件服务进程中的第二个线程可以继续运行;当第二个线程封锁时,第三个线程可以继续执行,从而显著地提高了文件服务的质量以及系统的吞吐量。线程的概念l系统开销 不论是引入了线程的操作系统,还是传统的操作系统,进程都是拥有系统资源的一个独立单位,它可以拥有自己的资源。一般地说,线程自己不拥有系统资源(也有一点必不可少的资源),但 它可以访问其隶属进程的资源。亦即一个进程的代码段、数据段以及系统资源(如已打开的文件、I/O设备等),可供同一进
13、程的其他所有线程共享。线程的概念l拥有资源 由于在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。类似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存环境的设置以及新被调度运行的进程的CPU环境的设置。而线程切换只需保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。可见,进程切换的开销也远大于线程切换的开销。此外,由于同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现也变得比较容易。在有的系统中,线程的切换、同步和通信都无需操作系统内核的干预。线程的概念l线程的结构 线程
14、的概念l线程控制块(Thread Control Block,TCB):线程控制块是标志线程存在的数据结构,其中包含系统对于线程进行管理所需要的全部信息 线程的概念l线程有两种实现方式:用户级线程(User Level Thread)和核心级线程(Kernel Level Thread)。更深入一步来讲我们还可以划分出硬件线程(Hardware Thread)。用户级线程在用户层通过线程库来实现。对它的创建、撤销和切换都不利用系统的调用。核心级线程由操作系统直接支持,即无论是在用户进程中的线程,还是系统进程中的线程,它们的创建、撤消和切换都由核心实现。硬件线程就是线程在硬件执行资源上的表现形式
15、。线程的概念l用户级别线程线程的概念l用户级别线程优点:线程不依赖于操作系统,可以采用与问题相关的调度策略,灵活性好;同一进程中的线程切换不需进入操作系统,因而实现效率较高;有关线程的所有管理工作都由在用户级实现的线程库来支持。l用户级别线程缺点:同一进程中的多个线程不能真正并行;由于线程对操作系统不可见,调度在进程级别,某进程中的一个线程通过系统调用进入操作系统受阻,该进程的其它线程也不能运行。l用户级别线程特征:户级线程的创建和管理等操作无须内核参与,操作更快 并行性不高,一个线程被系统阻塞后,整个进程被阻塞线程的概念l核心级别线程通过系统调用由操作系统创建,线程的控制结构TCB保存于操作
16、系统空间,线程状态转换由操作系统完成,线程是CPU调度的基本单位。l核心级别线程的优点是并发性好,在多CPU环境中同一进程中的多个线程可以真正并行执行 l核心级别线程的缺点是线程控制和状态转换需要进入操作系统完成,系统开销比较大.l特点并行性高,多个线程可被同时调度充分利用多处理器创建和管理代价高 多线程的映射模式 l对于实现了用户级线程和内核级线程的操作系统,用户级线程和内核级线程之间的可以有不同的映射方式:l多对一模型 多对一模型把多个用户级线程映射到一个内核级线程。线程的管理在用户空间实现,所以效率高。当一个线程因调用系统调用被阻塞时,整个进程被阻塞。另外,用户级线程不能在多处理器上并发
17、执行,不支持内核级线程的操作系统使用多对一模型。多线程的映射模式l多对一模型多线程的映射模式l一对一模型一对一模型把每个用户级线程影射到一个内核级线程。当一个线程阻塞时,其他线程仍然可以运行。lExamplesWindows 95/98/NT/2000OS/2l多对多模型多对多模型将m个用户级线程影射到n个内核级线程,mn。用户可以创建所需要的用户级线程,通过分配适当数目的内核级线程获得并发执行的优势并节省系统资源。ExamplesSolaris 2 线程生命周期l线程的标识通常用一个整数来标识一个线程 l线程的创建自动创建从main函数开始的主线程调用函数库接口创建一个新的线程(pthrea
18、d_create)l线程的终止执行完毕,或者调用了pthread_exit 主线程退出导致整个进程会终止 线程状态的转换l线程的状态就绪(ready):线程等待可用的处理器。运行(running):线程正在被执行。阻塞(blocked):线程正在等待某个事件的发生(比如I/O的完成,试图加锁一个被上锁的互斥量)。终止(terminated):线程从起始函数中返回或者调用pthread_exit。线程的应用l许多任务在逻辑上涉及多个控制流,控制流具有内在的并发性,当其中一些控制流被阻塞时,另外一些控制流仍可继续.在没有线程支持的条件下,只能采用单进程或多进程模式,单进程不能表达多控制流,多进程开
19、销大而且在无共享存储空间的条件下进程间交往困难.采用多线程一方面可以提高应用程序的并行性,另一方面也使程序设计简洁明晰。例如:Word文字编辑工具、Web服务器等。多线程程序设计l为什么要多线程程序设计某些应用具有内在的多个控制流结构,这些控制流具有合作性质,需要共享内存,采用多线程易于对问题建模,从而得到最自然的解决算法;在需要多控制流的应用中,多线程比多进程在速度上具有绝对优势,统计测试表明,线程的建立速度比进程的建立速度快100倍,进程内线程间的切换速度与进程间切换速度也有数量级之差;采用多线程可以提高处理机与设备之间的并行性.在单控制流情形下,启动设备的进程进入核心后将被阻塞,此时该进
20、程的其它代码也不能执行.若此时无其它可运行程序,处理机将被闲置.多线程结构在一个线程等待时,其它线程可以继续执行,从而使设备和处理机并行工作;在多核环境下,多线程可以并行执行,既可提高资源利用效率,又可提高进程推进速度。多线程机制l多核处理器的基本结构是共享存储的,多线程程序设计技术被认为是能够充分挖掘共享存储系统性能潜力的最有效的技术。l多线程机制的优点包括以下几个方面:创建一个线程比创建一个进程代价要小;线程之间的切换比进程间的切换代价小;充分利用多处理器;数据共享;快速响应特性;多线程编程可以使程序更加更加模块化,简化程序逻辑。多线程机制l在多处理器系统上,如果一个应用具有如下特征,就可
21、以利用多线程技术达到目标:前台后台操作;异步处理;需要加速执行;模块化程序结构。多线程环境下的进程控制语义l单线程环境下的进程控制接口在多线程环境下语义可能会发生变化,包括进程创建、进程终止、进程执行、信号处理等操作。进程创建创建进程的系统调用完成后,被创建的新进程复制调用进程的内容,当进程的一个线程中创建一个子进程,新的进程可以复制整个进程(包括所有线程)也可以只复制调用线程的内容;执行新的程序 在进程中执行新的程序,函数的语义在多线程环境下没有发生大的变化。Exec将会终止所有的线程,用新的程序覆盖进程的地址空间,并开始执行新的程序;多线程环境下的进程控制语义进程结束 在任何一个线程中调用
22、exit将会结束整个进程,另外从主线程返回也等同于调用exit而导致进程结束。如果要从线程中退出则调用专用的线程退出函数。信号处理信号是unix中系统通知进程的重要机制。信号可能是同步的也可能是异步的。发送给进程的信号在多线程环境下有多种选择:发送给引发信号的线程;发送给所有的线程;发送个特定的线程;指定一个线程处理所有的信号。线程的同步l由于线程共享同一进程的内存空间,多个线程可能需要同时访问同一个数据。l对共享数据的并发访问可能导致数据的不一致性l如果没有正确的保护措施,对共享数据的访问会造成数据的不一致和错误。l竞争条件若干进程并发地访问并且操纵共享数据的情况。共享数据的值取决于哪个进程
23、最后完成防止竞争条件,并发进程必须被同步线程的同步l例:如果一个进程有一个共享变量counter,两个线程producer和consumer,线程producer执行counter+,线程consumer执行counter-,这两个操作都需要多个机器指令来完成,Counter=5counter+counter-register1=counter register2=counterregister1=register1+1 register2=register2-1counter=register1 counter=register2可能的序列:可能的序列:Producer:register1=
24、counter (register1=5)Producer:register1=register1+1 (register1=6)Consumer:register2=counter (register2=5)Consumer:register2=register2-1 (register2=6)Producer:counter=register1 (counter=6)Consumer:counter=register2 (counter=4)顺序程序l顺序程序,程序的顺序性包括内部顺序性和外部顺序性。内部顺序性:对于一个进程来说,它的所有指令是按序执行的;外部顺序性,对于多个进程来说,所有
25、进程是依次执行的。P1活动:a1 a2 a3 a4,P2活动:b1 b2 b3 b4 顺序执行时,有如下两种情形:情形1:a1 a2 a3 a4 b1 b2 b3 b4 情形2:b1 b2 b3 b4 a1 a2 a3 a4 顺序程序l顺序程序的特性:顺序性:处理机严格按照指令次序依次执行,即仅当一条指令执行完后才开始执行下一条指令;封闭性:程序在执行过程中独占系统中的全部资源,该程序的运行环境只与其自身动作有关,不受其它程序及外界因素影响;可再现性:程序的执行结果与执行速度无关,而只与初始条件有关,给定相同的初始条件,程序的任意多次执行一定得到相同的执行结果.并发程序 l程序的并发性含义:内
26、部并发性,对于一个进程来说,它的所有指令可能按序执行,也可能不按次序执行;外部并发性:对于多个进程来说,所有进程是交叉(interleave)执行的.例如,对于上面P1和P2两个进程来说,只考虑外部并发性,具有许多情形:情形1:a1 b1 b2 a2 a3 b3 a4 b4 情形2:b1 b2 a1 a2 a3 b3 b4 a4 并发进程在其执行过程中,出现哪种交叉情形是不可预知的,这就是并发程序带来的不确定性 并发程序l并发程序特性:交叉性:程序并发执行对应某一种交叉,不同的交叉可能导致不同的计算结果,操作系统应当保证只产生导致正确结果的交叉,去除那些可能导致不正确结果的交叉;非封闭性:一个
27、进程的运行环境可能被其它进程所改变,从而相互影响;不可再现性:由于交叉的随机性,并发程序的多次执行可能对应不同的交叉,因而不能期望重新运行的程序能够再现上次运行的结果 l例:一个图书馆管理系统,连有两个终端,用户可通过终端借书.为简化问题,假设所有用户借阅的图书是相同的.设x代表图书的剩余数量,为两个终端用户服务的程序 进程互斥 l定义:两个或两个以上的进程,不能同时进入关于同一组共享变量的临界区域,否则可能发生与时间有关的错误,这种现象被称作进程互斥.l进程互斥是进程之间所发生的一种间接性相互作用,这种相互作用是进程本身不希望的,也是运行进程感觉不到的.进程互斥可能发生在相关进程之间,也可能
28、发生在不相关进程之间.l互斥量(Mutex)作为一种互斥设备,有两个状态,上锁和空闲。同一时刻只能有一个线程能够对互斥量加锁。对于一个已经被加锁的互斥量,当另外一个线程试图对它加锁时,该线程会被阻塞,知道该互斥量被释放。互斥量在Pthread线程库中被定义为pthread_mutex_t类型。互斥量(Mutex)lPthread线程库对一个互斥量的加锁操作是:int pthread_mutex_lock(pthread_mutex_t*mutex);int pthread_mutex_trylock(pthread_mutex_t*mutex);pthread_mutex_unlock(pth
29、read_mutex_t*mutex);/释放lproducer对counter变量的操作要先加锁互斥量,完成对counter的操作之后释放互斥量 pthread_mutex_lock(&counter_mutex);counter+;pthread_mutex_unlock(&counter_mutex);临界区域(critical region)l有些变量,两个进程或两个以上的进程均需要访问它们,这些变量被称作共享变量共享变量,也称公共变量,访问共享变量的程序段称作临界区域临界区域(critical region),也称为临界段(critical section)定义:多个进程均需要访问的
30、变量称为公共变量(shared variable);定义:访问共享变量的程序段称作临界区域(critical region),也称为临界段(critical section)共享变量可能属于操作系统空间,也可能属于用户进程空间.对于前者,其临界区域亦属于操作系统空间,而对于后者,其临界区域则属于用户进程空间.临界区l所有n 个进程竞争使用一些共享的数据。l每个进程有一个代码段,称为临界区,在那儿共享数据被访问。l问题保证当一个进程正在临界区执行时,没有另外的进程进入临界区执行l解决临界区问题需满足互斥:假定进程Pi在其临界区内执行,其他任何进程将被排斥在自己的临界区之外.有空让进:临界区虽没有
31、进程执行,但有些进程需要进入临界区,不能无限期地延长下一个要进入临界区进程的等待时间.有限等待:在一个进程提出进入临界区的请求和该请求得到答复的时间内,其他进程进入临界区前的等待时间必须是有限的.假定每个进程都以非零的的速率执行.没有任何关于这n个进程相对执行速率的假定临界区与进程互斥 l两个或两个以上的进程不能同时进入关于同一组共同一组共享变量享变量的临界区域临界区域,其中有两层含意:不容许多个进程同时进入关于同一组共享变量的相同的临界区域;不容许多个进程同时进入关于同一组共享变量的不同的临界区域.当然,如果容许,则有可能发生错误,亦有可能不发生错误,这与各个进程并发执行时的推进速度有关.l
32、这是保证正确性的要求,但这件事的实现应当由操作系统以及并发程序的设计者在编写程序时来保证,而这需要有必要的互斥机制.l临界区域可以嵌套 互斥的实现 l应当满足下面三个管理原则:正确性原则(correctness):任意时刻至多只能有一个进程处于关于同一组共享变量的临界区域之中;公平性原则(fairness):一个请求进入临界区的进程应当在有限等待时间内获得进入该临界区的机会;进展性原则(progress):当临界区空闲时,竞争进入临界区的多个进程在有限时间之内确定下一个进入临界区的进程.l临界区域的管理应当满足如下调度原则:当关于某一组共享变量的所有临界区域均为空闲时,一个要求进入该组共享变量
33、某一临界区域的进程应当能够立即进入;当关于某一组共享变量的某一临界区域被占用时,一个要求进入该组共享变量某一临界区域的进程应当等待;当一个进程离开关于某一组共享变量的某一临界区域时,应当容许某一个等待进入关于该组共享变量某一临界区域的进程进入.解释:使用临界区的原则l每次只允许一个进程处于它的临界区(CS)中l若有多个进程同时想进入CS,应在有限时间内让其中一个进程进入CS,以免阻塞l进程在CS内只能逗留有限时间l不应使要进入CS的进程无限期地等待在CS之外l在CS之外的进程不可以阻止其他进程进入CSl不要预期和假定进程进展的相对速度以及可用的处理器数目.因为这是不可预期的.思考题l设计一个涉及到线程互斥的问题,并将其解决?叙述问题,提供解决方案(使用互斥量、临界区)。