欢迎来到天天文库
浏览记录
ID:28389391
大小:529.50 KB
页数:44页
时间:2018-12-09
《多核程序设计 -》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第二章多线程编程方法综述免费午餐结束了为了充分利用多个计算核心,提高整个程序的吞吐率,主要是利用多线程线程的基本概念线程的同步多线程编程模型多线程编程的原则及要点3内容1.线程的基本概念进程(早期)进程作为能独立运行的基本单位。进程是程序在计算机上的一次执行活动。程序是死的(静态的),进程是活的(动态的)。进程是系统进行资源分配和调度运行的一个独立单位(也称为任务)。引入进程的目的:为了使多个程序并发执行,来改善资源利用率及提高系统的吞吐量。引入线程的目的:为了减少程序并发执行时所付出的时空开销,使操作系统具有更好的并发性。线程线程:是进程中的一个实体,是被系统调度和分配的基
2、本单元。每个程序至少包含一个线程,主线程。线程拥有很少的系统资源:程序计数器、一组寄存器和栈同一进程所属的各线程共享进程的全部资源同一个进程中的多个线程可以并发执行,从而更好地改善了资源利用率。1.1线程与进程的区别线程是轻量级的进程,是CPU调度和分配的基本单位。传统意义的进程是重量级进程。1.1线程与进程的区别调度传统的操作系统,进程是CPU调度和分配的基本单位。引入线程的操作系统,线程是CPU调度和分配的基本单位,而进程是资源拥有的基本单位。进程的两个属性分开,线程轻装运行,可以显著提高系统的并发性。同一个进程的线程切换简单。1.1线程与进程的区别并发性进程之间可以并发
3、执行一个进程的多个线程之间也可以并发执行例:未引入线程的操作系统,只有一个文件服务进程,它由于某种原因被封锁,就没有其他的文件服务进程来提供服务。若引入线程,一个文件服务进程中设置多个服务线程。1.1线程与进程的区别系统开销进程是拥有系统资源的一个独立单位线程不拥有系统资源(只有一点必不可少的资源),可以访问其隶属进程的资源。一个进程的代码段、数据段以及系统资源(如打开的文件、I/O设备等),可供进程的所有线程共享。1.1线程与进程的区别拥有资源创建和撤销进程时,系统都要为之分配和回收资源,如内存空间、I/O设备等。操作系统所付出的开销将显著大于创建和撤销线程时的开销。进程切
4、换涉及到当前进程CPU环境的保存和新被调度进程的CPU环境的设置。线程的切换只需保存少量寄存器的内容,不涉及存储器。1.2用户级线程、核心级线程和硬件线程根据多线程实现机制:线程又被分为用户级线程和内核级线程用户级线程:在用户层通过线程库来实现。对它的创建、撤销和切换都不利用系统的调用。核心级线程:由操作系统直接支持,即无论是在用户进程中的线程,还是系统进程中的线程,它们的创建、撤销和切换都由核心实现。1.2用户级线程、核心级线程和硬件线程硬件线程就是线程在硬件执行资源上的表现形式单个线程一般都包括三个层次:用户级线程映射到核心级线程,再通过硬件相应的接口作为硬件线程来执行。
5、用户级线程和核心级线程之间的映射方式多对一模型:把多个用户级线程映射到一个核心级线程一对一模型:把每个用户级线程影射到一个核心级线程多对多模型:将m个用户级线程影射到n个核心级线程,m≥n多对多映射1.3线程的生命周期线程的生命周期:线程从创建到消亡的过程。2线程的同步为什么需要线程同步?线程共享同一进程的内存空间多个线程可能需要同时访问同一个数据如果没有正确的保护措施,对共享数据的访问会造成数据的不一致和错误。线程1线程2i=8i=9i++i--j=ij=i最后的结果取决于线程执行的顺序常用的线程同步方法互斥(Mutualexclusion)当一个线程进入某个临界区域(访问
6、线程共享数据的代码段),此时其他想访问这个临界区域的线程就必须等待。临界区(Critical_Section)信号量(Semaphore)互斥量(Mutex)条件同步(Conditionsychronization)执行线程将一直处于阻塞状态直道系统满足指定的条件。条件变量(ConditionalVariable)2.1临界区-----互斥临界区是指包含共享数据的一段代码,这些代码可能被多个线程访问或修改。当一个线程在临界区内执行的时候,不能有其他任何线程被允许在临界区执行。临界区:进入区和退出区进入区退出区临界区2.2信号量信号量被定义为一个整数变量对信号量只能通过两个原子
7、操作P(wait等信号,减量操作)和V(signal给信号,增量操作)signal(S){S.value++;if(S.value<=0){RemoveaprocesspfromS.L;Wakeup(p);}}wait(S){S.value--;if(S.value<0){AddthisprocesstoS.L;Block()}}锁类似于信号量,不同之处在于同一时刻只能使用一个锁。锁对应两个原子操作:Acquire()获取操作,将锁据为己有并把状态改为已加锁,如果该锁已被其他线程占有则等待,锁状态保持未
此文档下载收益归作者所有