zhh操作系统.docx
- 文档编号:27058704
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:11
- 大小:213.08KB
zhh操作系统.docx
《zhh操作系统.docx》由会员分享,可在线阅读,更多相关《zhh操作系统.docx(11页珍藏版)》请在冰豆网上搜索。
zhh操作系统
操作系统
课程设计报告
题目:
关于操作系统多线程实现技术的研究
院系:
国际教育学院
专业班级:
互联网12级2班
姓名:
赵豪豪
撰写日期:
2015年6月24日
关于操作系统多线程实现技术的研究
摘要:
本次报告阐述了两种进程内多线程实现技术:
一、核心线程实现技术;二、多线程库实现技术,并对比分析了它们的优缺点。
在此基础上,总结出了现代操作系统多采用的多线程实现技术——混合实现技术。
关键字:
操作系统多线程进程
1.前言
在传统操作系统中,进程是系统进行资源分配的单位,也是处理器调度的独立单位,进程在任一时刻只有一个执行控制流,我们将这种结构的进程称单线程。
这种单线程的结构的进程已不能适应当今计算机技术的迅猛发展。
从硬件技术的发展来看,并行处理和计算机网络均要求解决细粒度的并行以更好地发挥多处理器的能力。
从软件技术的发展来看,系统软件和应用软件均要求人们设计出多事件并发处理的系统。
但是传统进程管理方式的进程切换代价和进程通信代价均较大,从而限制了并行的粒度和并行的效率.因此要求操作系统改进进程结构,提供新的机制,于是出现了多线程(结构)进程(multiplethreadedprocess)。
随着多处理机的发展,为了方便用户开发多任务并行程序,进程内多线程概念被提了出来,使得用户可以开发共享地址空间的并发或并行程序。
在传统操作系统中,进程是系统进行资源分配的单位,也是处理器调度的独立单位,进程在任一时刻只有一个执行控制流,我们将这种结构的进程称单线程。
这种单线程的结构的进程已不能适应当今计算机技术的迅猛发展。
为了支持用户进程内多线程,有两种典型的线程实现方法,即多线库支持线程实现和核心支持线程实现。
多线库支持的进程内多线程是在原操作系统不作更改的情形下,由库程序实现多线程管理,多线库实现的多线程分时地在进程中进行,由多线库线程调度器负责线程的调度与切换,在内核看来,该进程进行着用户的程序而完全不知何时再用户多线程中切换。
核心支持线程实现是在多处理系统出现后,因多线库支持的进程内多线程并不能够同时在多个处理机上运行,需要操作系统见到进程内多线程的存在,并为这些线程占用处理机运行。
我们把多线库支持的线程陈作用户级线程,把核心支持的线程称为核心级线程,或轻权进程LWP,在现代操作系统中,往往结合这两种实现方法,以满足用户方便地进行多任务程序设计且使多任务高效地占用多处理机运行。
2.线程的概念
传统操作系统中的单线程进程由进程控制块和用户地址空间、以及管理进程执行的调用/返回行为的系统堆栈或用户堆栈构成.如果把进程的管理和执行分离,进程作为操作系统中进行保护和资源分配的单位,允许一个进程中包含有多个可并发执行的控制流,这些控制流切换时不必通过进程调度,通信时可以直接借助于共享的内存区,这就形成了多线程进程.图1是单线程进程和多线程进程的模型。
图1.单线程进程和多线程进程的模型
在多线程环境中,仍然有与进程相关的PCB和用户地址空间,每个线程还存在独立的堆栈,及包含线程状态信息的线程控制块.线程之间的关系较为密切,一个进程中的所有线程共享其拥有的状态和资源.它们驻留在相同的地址空间,可以存取相同的数据。
在多线程环境中,进程是操作系统中进行保护和资源分配的独立单位,它具有:
①一个虚拟地址空间,用来容纳进程的映象;②对CPU、进程、文件和资源等的存取保护机制。
线程则是指进程中的一条执行路径(控制流),每个进程内允许包含多个并行执行的路径,这就是多线程.线程是系统进行处理器调度的基本单位,同一个进程中的所有线程共享进程获得的主存空间和资源,线程具有:
①一个线程执行状态;②一个受保护的线程上下文;③一个独立的程序指令计数器;④一个执行堆栈;⑤一个容纳局部变量的静态存储器。
多线程的益处在于:
提高应用程序响应;使多处理器效率更高;改善程序结构;占用较少的系统资源;把线程和远程过程调用RPC结合起来;提高了系统性能等。
以MicrosoftWord为例:
在进行文件打印时,就默认选择了后台打印方式,打印处理会在继续编辑文档的同时异步进行。
此时Word创建了独立的线程来进行打印处理,并将打印线程的优先级设定低于处理用户输入的线程,这在Windows2000与WindowsNT4.0中能够得到,它们真正采用抢占式多任务,支持多线程应用。
此外,IIS、组件服务和SQLServer全部都是多线程的。
在实际应用中包含多个独立任务的问题适合用多线程方法解决。
3.多线程编程
当用fork()创建一个新进程时,新进程是子进程,原始进程是父进程。
这样就创建了非常有用的进程层次关系。
而在线程中不存在这样的层次关系,此时主线程可以创建一个新线程,新线程可以创建另一个新线程,它们在等同的层次上。
一个程序启动时,会创建一个称作初始线程的单个线程,其他的线程由pthreadcreate()函数创建。
与进程中waitpid()函数等待所有子进程终止不同,如果要等待一个线程终止,必须将线程的标识tid传送给pthreadjoin()系统调用。
多线程要比普通程序设计复杂得多。
由于任一时刻都可能有多个线程同时执行,所以,许多的变量、数据都可能会被其他线程所修改。
这就是多线程程序中最关键的线程间的同步控制问题。
多线程编程非常灵活,涉及的系统调用多,内容也较复杂。
用户级多线程是通过线程库libthread来实现的,线程库支持信号,为运行的程序安排队列、并负责同时操作多任务。
以下是线程编程简单事例:
#include
#include
#include
intmyvariable;
pthreadmutextmymutex=PTHREADMUTEXINITIALIZER;
void*threadfunction(void*arg)
{
inti,j;
for(i=0;i<20;i++){
pthreadmutexlock(&mymutex);
j=myvariable;j=j+1;printf(d.d);
fflush(stdout);
sleep
(1);
myvariable=j;
pthreadmutexunlock(&mymutex);
}
returnNULL;
}
intmain()
{
pthreadtmythread;
inti;
if(pthreadcreate(&mythread,NULL,threadfunction,NULL)){
printf(derrorcreatingthread.d);
abort();
}
for(i=0;i<20;i++){
pthreadmutexlock(&mymutex);
myvariable=myvariable+1;
pthreadmutexunlock(&mymutex);
printf(dod);
fflush(stdout);
sleep
(1);
}
if(pthreadjoin(mythread,NULL)){
printf(derrorjoiningthread.d);
abort();
}
printf(d\nmyvariableequals%d\nd,myvariable);
exit(0);
}
虽然我们通过pthreadcreate()只创建了一个线程,但主程序也是一个线程,因此两个线程各自独立地对变量myvariable递加,直到pthreadjoin()将两个线程合并为一个线程。
程序运行中,在pthreadfunction()结束很久之前,主线程如果就已经调用了pthreadjoin(),此时主线程将中断(转向睡眠)然后等待pthreadfunction()完成;当pthreadfunction()完成后,pthreadjoin()将返回,这样程序又只有一个主线程。
pthreadmutexlock()和pthreadmutexunlock()系统调用执行了不可缺少的功能(互斥)来保护数据结构。
如果没有它们,pthreadfunction()线程将覆盖主线程对myvariable变量的修改,使程序得不到我们设想的正确值。
有兴趣的读者可以通过运行程序比较一下。
此外,线程的活动也可以使用条件变量、信号量来协调,其功能与上述互斥锁类似[4]。
在编写多线程应用程序时,最重要的是控制好线程间的同步资源访问,以确保线程的安全运行。
4.线程的实现
为了支持用户进程内的多线程,有!
种典型的线程实现方式,即用户线程和系统线程(核心级线程)。
在同一系统中,有的使用纯用户级线程,有的使用纯核心级线程,例如WINDOWSNT和OS/2就是这样的系统;有的则混合使用用户级线程和核心级线程,例如Solaris操作系统。
4.1用户级线程实现
用户级线程是对线程进行全面管理,操作系统内核只对进程进行管理。
为了对用户级线程进行管理,操作系统提供在用户空间执行的线程库,该线程库提供创建、调度、撤消线程功能。
同时该线程库也提供线程间的通信、线程的执行及存储线程上下文的功能。
用户级线程只使用用户堆栈和分配给所属进程的用户寄存器。
当一个线程被派生时,线程库为其生成相应的线程控制块)23等数据结构,并为)23中的参数赋值和把该线程置于就绪状态。
其处理过程与进程创建大致相似,其特点如下:
1).为用户提供一个简明的同步并行编程环境,加入原文线程库将用户的同步请求转化成对操作系统的异步请求。
2).用户级线程的调度算法和调度过程全部由用户自行选择和确定,由用户级线程库实现,与操作系统内核无关,因而不需操作系统内核的特殊支持。
3).用户级线程的调度算法只进行线程上下文切换而不进行处理机切换,且其线程上下文切换是在内核不参与的情况下进行的,即线程上下文切换只是在用户栈、用户寄存器等之间进行切换,不涉及处理机的状态,无运行模式的切换开销。
新线程通过程序调用指针的变化使得程序计数器变化而得以执行,因而系统开销小。
4).因为用户级线程的上下文切换与内核无关,所以可能出现如下情况:
即当一个进程由于I/O中断或时间片用完等原因造成该进程退出处理机时,而属于该进程的执行中线程仍处于执行状态。
也就是说,尽管相关进程的状态是阻塞(或等待)的,但所属线程状态却是执行的,因而不能转到其他线程执行。
5)。
不能实现进程内线程在多处理机上真正并行运行。
如果系统拥有多个处理机而操作系统的调度单位是进程,无法感知进程内多线程存在,因而无法使用户进程在多处理机上同时运行。
图2.由传统进程支持实现用户级多线程示意图
从图2的示意图可以看出,用户级线程的所有管理控制全部由多线库承担,所有线程的管理控制用表格都存放于进程的用户空间,操作系统只感觉到进程的存在,除在进程创建及安排初始程序执行时操作系统过问外,进程以后在各线程的切换,产生及结束线程,操作系统完全不知,操作系统进程调度安排进程占用处理机,而不管多线程对进程的占用。
4.2核心级线程实现
核心级线程由操作系统内核进行管理,负责线程在处理机上的调度与切换,操作系统内核给应用程序提供相应的系统调用和应用程序接口API,以使用户程序可以创建、执行和撤消线程。
操作系统内核必须为每个线程保存一系列描述信息,线程被用作处理机的执行单位,操作系统对处理机分配改为以线程为对象。
因此核心级线程可以完全并行地在系统的不同处理机上运行,操作系统可以支持核心级线程与物理处理机之间的捆绑,让用户干预核心级线程选定处理机运行。
当核心级线程从用户程序转操作系统核心程序运行后,等某事件发生引起线程阻塞或有更高优先级线程可以运行,操作系统调度程序会作线程切换处理,现场保护和恢复均在线程相关的数据结构之中进行。
核心级线程实现有如下特点:
(1)可以支持进程内多线程在多处理机上真正并行执行;
(2)核心级线程技术也可用于内核程序自身,从而提高操作系统内核程序的执行效率;(3)核心级线程不会出现进程处于阻塞或等待状态,而线程处于执行状态的情况;(4)核心级线程比用户级线程开销大一些,因为核心级线程的管理都由内核程序进行,需要运行模式的切换。
表1给出了在SPARC工作站上用户级线程、核心级线程及进程进行上下文切换时各自的时间开销。
表1SPARC工作站上下文切换所需时间
图3给出了NT的线程状态,准备态是指已被选中下一个在一个特定处理器上运行,如果准备态线程的优先级足够高,则可以从正在运行的线程手中抢占该处理器.过渡态是指一个线程完成等待后准备运行,但这时资源不可用.当资源可用时,过渡态线程进入就绪态.
图3NT的线程状态
4.3混合实现
有些操作系统同时提供了用户级线程和核心级线程,线程创建是完全在用户空间做的,单个应用的多个用户级线程映射成一些核心级线程.程序员可按应用和处理器数调整核心级线程数目,以达到较好的并行效果.
Solaris便是这样一个混合系统其线程实现分为2个层次:
用户层在用户线程库中实现;核心层在操作系统内核中实现.Solaris采用了4个分离的与线程有关的概念:
(1)进程(process):
通常的UNIX进程,它包含用户的地址空间和PCB.
(2)用户级线程(ULT):
通过线程库在用户地址空间中实现.用户可以在每个进程中创建多个ULT,而不必占用核心资源.一个进程中的多个ULT共享用户空间,ULT的切换仅是数据结构的切换,其时间开销远低于两个KLT间的切换时间.
(3)轻量级进程(LWP):
LWP可看做是ULT和KLT之间的映射.一个进程可以设计为一个或多个LWP,每个LWP支持一个或多个ULT,LWP与ULT一样共享进程的资源.KLT和LWP是一一对应的,LWP是核心调度单位,它可以在多个处理器上并行执行.
(4)内核线程(KLT):
它们是能被调度和指派到系统处理器上去运行的基本实体。
图4Solaris的线程状态
图4简单说明了ULT和LWP的状态.用户级线程可能处于4个状态之一:
可运行、活跃、睡眠和停止.处在活跃态的ULT目前分配到LWP上,并且在对应内核线程执行时,它被执行.图4还显示了LWP的状态转换图,可以把它看做是处于活跃态的ULT的详尽描述,一个活跃态的ULT只能捆绑到一个LWP上,只有当LWP处于运行态时,一个处于活跃态的ULT才真正执行.当活跃态的ULT执行一个阻塞的系统调用时,LWP进入阻塞态,这个ULT将继续处于活跃态并继续与相应的LWP绑定,直到线程库显式地做出变动.
混合式策略包括2个层次的多线程接口,ULT接口的切换代价较小,适用于解决逻辑并行性问题;而KLT接口则适用于那些需要在多个处理器进行并行计算的问题.如果设计得当的话,混合应用两种接口可以带来更大的灵活性和优越性.如:
当应用不需要并发运行时,可以利用单线程进程结构;当程序设计时要表示并发而不真正需要多线程并行执行时,可以建立多个ULT,所有ULT对应于一个LWP,由单个内核线程支撑;当应用需要全面并行时,可以建立多个ULT,每个ULT对应于一个LWP,从而使内核并行机制完全对应用可见。
5.结束语
线程是多线程编程的主要接口,用户级的线程在用户之间操作,从而避免与内核之间的互相切换。
为了控制线程(如更多地控制进程调度策略),应用程序应当绑定线程。
多线程技术可以广泛地应用于解决各种逻辑并发性问题和物理并行性问题,大大提高了系统处理的效率。
当一个应用程序把线程的所有执行资源绑定后,线程就变成了内核资源。
在使用多线程时要谨慎,因为操作系统要跟踪和确定线程的进度,因此线程的系统开销会比较大,由于必须为每个线程分配内存,太多的线程将会令整个系统的性能受到影响,这样也不是在应用的任何地方都创建新的线程。
不论是单机、CPS结构、BPS结构还是分布式结构的程序设计,多进程、多线程的应用都很广泛,单线程应用程序重新编写成多线程应用程序的策略和结果不是一成不变。
参考文献:
【1】汤小丹,梁红兵等.计算机操作系统(第四版).2014
【2】骆斌,费翔林.多线程技术的研究与应用[J].计算机研究与发展,2000,37(4):
407-412.
【3】肖竟华.操作系统线程实现技术及特性[J].武汉理工大学学报(信息与管理工程版),2001,23(4).
【4】罗宇,商临锋.操作系统多线程实现技术研究[J].小型微型计算机系统,2000,21(5):
500-503.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- zhh 操作系统