实验一 进程同步和互斥.docx
《实验一 进程同步和互斥.docx》由会员分享,可在线阅读,更多相关《实验一 进程同步和互斥.docx(38页珍藏版)》请在课桌文档上搜索。
1、实验一进程同步和互斥(建议4学时)一、实验目的1 .掌握临界资源、临界区概念及并发进程互斥、同步访问原理。2 .学会使用高级语言进行多线程编程的方法。3 .掌握利用VC或JaVa语言线程库实现线程的互斥、条件竞争,并编码实现P、V操作,利用P、V操作实现两个并发线程对有界临界区的同步访问。4 .通过该实验,学生可在源代码级完成进程同步互斥方案的分析、功能设计、编程实现,控制进程间的同步、互斥关系。二、实验要求1 .知识基础:学生应在完成进程和线程及调度等章节的学习后进行。2 .开发环境与工具:硬件平台一一个人计算机。软件平台-WindOWS操作系统,vc语言或JaVa语言开发环境。3 .运用高
2、级语言VC或JaVa语言线程库及多线程编程技术进行设计实现。三、实验内容1 .实现临界资源、临界区、进程或线程的定义与创建。2 .利用两个并发运行的进程,实现互斥算法和有界缓冲区同步算法。四、实验方案指导该实验方案由以下几个关键设计项目组成:1 .并发访问出错。即设计一个共享资源,创建两个并发线程,二者并发访问该共享资源。当没有采用同步算法设计时,线程所要完成的某些操作会丢失。2 .互斥锁。并发线程使用线程库提供的互斥锁,对共享资源进行访问。3 .软件方法。设计并编程实现计数信号量、P操作函数、V操作函数,并发线程通过调用P,V操作函数实现线程的互斥。4 .同步访问多缓冲区。利用上面的软件方法
3、完成P,V操作,可实现两个线程对多缓冲区的同步访问。五、实验方案实现范例以下是对该项目中包含的部分设计功能的实现方法、实现过程、技术手段的描述,供师生参考。1 .模拟线程并发运行。假设我们使用POSix线程库,而POSIX并没有真正提供线程间的并发运行需求。我们设计的系统应支持符合RR调度策略的并发线程,每个线程运行一段时间后自动挂起,另一个线程开始运行。这样一个进程内所有线程以不确定的速度并发执行。2 .模拟一个竞争条件一一全局变量。创建两个线程tl和t2,父线程主函数main。定义两个全局变量accntl和accnt2,每个变量表示一个银行账户,初始化为0。每个线程模拟一个银行事务:将一定
4、数额的资金从一个账户转到另一个账户。每个线程读入一个随机值,代表资金数额,在一个账户上做减法,在另一个账户上做加法,用两个变量记录两个账户的收支情况。良性情况下收支应平衡,即两个全局变量之和应为0。下面是每个线程的代码:Counter=O;dotmpl=accntl;tmp2=accnt2;r=random();accntl=tmplr;accnt2=tmp2-r;counter;while(accntlaccnt2=0);printf(,%dv,counter);两个线程运行的代码相同,只要各自代码不被交叉执行,两个收支余额之和就应一直为如果线程被交叉执行,某个线程可能会读入一个旧的accn
5、tl值和一个新的accnt2值,或反,这样会导致某个值的丢失。当这种情况出现时,线程停止运行,并把出现情况的位置COImter的值)打印出来。3 .模拟一个竞争条件一一共享文件。主线程创建两个共享文件fl和f2,每个文件包含一个当前银行账户。线程使用随机数对文件进行读/写,方式同上。注意:文件在读/写过程中不要加互斥访问锁,以免不会出现交叉访问的情况。4 .测试出现一个竞争条件的时间。我们的编程环境中,一般无法支持线程的RR调度,必须编程实现两个线程间在两个赋值语句之间插入以下代码:在指定区间(比如O到1)生成一个随机数,小于一个极限值(如0.1),调用线程自动挂起函数jield(),自动放弃
6、CPU,另一运行,于是导致一个数据更新的丢失。5 .互斥锁。POSIX线程库提供一个二值信号量,称为MUTEX,它可以加锁或解锁。如果已被另一个线程加上锁的MUTEX加锁,就会引发该线程被阻塞,MUTEX解锁时唤醒它。使用这些原语,很容易实现互斥进入CS(临界区)。进入CS区时加锁,离开CS区时解锁。系统负责阻塞或唤醒线程。6 .用软件方法实现互斥访问临界区。用标准编程语言设置变量的值,用线程“忙等待”实现互斥访问CS。设计两线分代码如下:intcl=0,c2=0,will_wait;pl:while(l)cl=l;will_wait=l;while(c2&(will_wait=1);*忙等待
7、*/csl;cl=O;programi;)p2:while(l)c2=l;will_wait=2;while(cl&(will_wait=2);*忙等待*/cs2;c2=0;program2;该软件方法使用三个变量cl,c2,will_wait,解决两个线程的同步问题。两个线程分别将Cl和c2设置为1,表示自己试图进入临界区,并将WilLWait分别设置为1和2,以消除任何竞争条件。通过“忙等待”循环实现线程的阻塞。当线程退出CS区时,分别将变量Cl和c2设置为0。我们可以比较互斥锁和软件方法这两种解决方法的效率。可以通过重复相同的循环次数,测量各自的执行时间,尽量减少可能的外部干扰,重复测试
8、几次,并计算平均值。Sincludeiostreamusingnamespacestd;Sincludewindows.hDWORDWINAPIThreadProcl(LPVOIDIpParameter);DWORDWINAPIThreadProc2(LPVOIDIpParameter);HANDLEhMutex;intcounter=0,accntl=0,accnt2=0,tmpl,tmp2,r;voidmain()(Printf(开始服务:n);HANDLEhandleI=CreateThread(NULL0,ThreadProcl,NULL,0,NULL);HANDLEhandle2=C
9、reateThread(NULL,O,ThreadProc2,NULL,0,NULL);CloseHandle(handlei);CloseIIandle(handle2);HMutex=CreateMutex(NULL,FALSE,NULL);*控制主进程运行时间*/Sleep(5000);Printf(服务结束n);/getchar();/VS2008)DWORDWINAPIThreadProcl(LPVOIDIpParameter)(while(accntlaccnt2=0)WaitForSingleObject(hMutex,INFINITE);tmpl=accntl;tmp2zzac
10、cnt2;r=rand();accntl=tmplr;accnt2=tmp2-r;counter;Printf(账户A完成转账一%d,z,counter);Sleep(100);ReleaseMutex(hMutex);)Printf(第%d次转账发生错误,counter);return0;DWORDWINAPIThreadProc2(LPVOIDIpParameter)while(accntlaccnt2=0)WaitForSingleObject(hMutex,INFINITE);tmpl=accntl;tmp2=accnt2;r=rand();accntl=tmplr;accnt2=tm
11、p2-r;counter;Printf(账户B完成转账一%d,z,counter);Sleep(100);ReleaseMutex(hMutex);)Printf(第%d次转账发生错误,counter);return0;实验二进程及其资源管理(建议4学时)一、实验目的1 .理解资源共享与互斥特性,以及操作系统管理资源的基本方法。2 .学会使用高级语言进行多线程编程的方法。3 .掌握利用VC或JaVa线程库实现一个管理器,用来实现操作系统对进程及其资源的管理功能。4 .通过该实验,学生可在源代码级完成进程及其资源管理方案的分析、功能设计、编程实现,控制进程间的同步、互斥关系。二、实验要求1 .知
12、识基础:学生应在完成对进程和线程、调度、死锁等章节的学习后进行。2 .开发环境与工具:硬件平台一一个人计算机。软件平台一一WindoWS操作系统,根据需要,任选安装VC语言、java语言或C语言开发环境。三、实验内容1 .开发一个函数,建立进程控制块和资源控制块结构,并实现相关数据结构的初始化。2 .开发一系列操作,由进程调用这些操作,达到控制进程申请或释放各种资源的目的。四、实验方案指导该实验方案由以下几个关键设计项目组成:1 .进程数据结构表示。2 .资源数据结构表示。3 .进程对资源的操作。4 .调度程序。5 .用户功能Shell界面。五、实验方案实现范例以下是对该项目中包含的设计功能的
13、实现方法、实现过程、技术手段的描述,供师生参考。1 .进程数据结构表示。使用结构类型设计实现进程PCB表,它包含以下成员:进程ID进程的唯一标识,供其他进程引用该进程;内存一一是一个指针链表,它在创建进程时已申请完毕,可用链表实现;其他资源一一表示除去内存之外的所有资源;进程状态一一包括两个数据类型,一个是状态码,另一个是状态队列链表指针;生成树一一包括两个数据类型,本进程的父进程和本进程的子进程;优先级一一供进程调度程序使用,用来确定下一个运行进程,可以设定为静态整数。2 .资源数据结构。每个资源都用一个称为资源控制块的数据结构表示。使用结构类型设计实现资源控制块RCB0资源控制块包括以下字
14、段成员:RID-资源的唯一标识,由进程引用;资源状态一一空闲/已分配;等待队列一一是被本资源阻塞的进程链表,本资源正被其他所有资源都设定为静态数据,系统启动时初始化。3 .进程管理及进程对资源的操作。进程操作及进程状态转换归纳如下:进程创建一一(无)f就绪;申请行一阻塞;资源释放一一阻塞一就绪;删除进程一一(任何状态)一(无);就绪f运行或运行f就绪。具体实现步骤如下:(1)根据上述数据结构,用高级语言设计相应函数,分别实现创建进程、删除进程、挂起进程、唤醒进程等功能。(2)设计一个函数,实现调度程序,在每个进程操作执行完毕后,自动调用执行。(3)实现两个资源操作:申请资源和释放资源。相关参考
15、算法如下:/*分配给调/*插入一个RCB/*资源不/*记录阻塞/*指向所/*插入资源request(RID)*申请资源算法*/r=get_RCB(RID);*获取资源控制块首地址*/if(r-status=free,)/*资源可用*/r-status=,allocated,;用进程,*/insert(self-other_resources,r);指针指向进程资源链表;*/else(可用*/self-status.type=blocked,;*/self-status.list=r;请求资源的RCB*/,remove(RL,self);/*将进程从就绪队列中删除*/insert(r-waiti
16、ng_list,self);)等待队列*/scheduler();*调度程序运行选择下一个运行进程*/release(RID)/*释放资源算法*/r=get_RCB(RID);/*获取资源控制块首地址*/remove(self-other_resource,r);/*从进程资源链表中删除该资源*/if(waiting_list=NULL)r-status=,free,;*等待队列为空,置资源状态为空闲*/else/*等待队列不为空*/remove(r-waiting_list,q);/*从等待队列中移出一个进程q*/q-status.type=,ready,;*将进程q的状态设为就绪*/*进q
17、-status.Iist=RL;程q的状态指针指向就绪队列*/*insert(RL,q);进程q插入就绪队列*/scheduler();*调度程序运行选择下一个运行进程*/4 .调度程序。调度策略采用固定优先级和可剥夺优先级调度算法。即调度程序必须维护n个不同优先级的就绪队列,各就绪队列可为空,也可包含多个进程。O级进程优先级最低,nT级进程优先级最高。创建进程时就赋予了固定的优先级,并在进程的生存期内保持不变。当新进程创建或阻塞进程被唤醒时,它就被插入同级的就绪队列中。调度程序按“先来先服务”和优先级“从高到低”的方式处理就绪队列。即从最高优先级的非空就绪队列的队首选择一个进程进入运行态。这
18、样的调度策略很容易导致饥饿,进程出现。因为对进程q来说,只有当优先级高于自己的所有进程都运行完毕,或都进入阻塞状态时,它才能得到运行权。为了简化调度程序,我们假定系统中至少有一个进程处于就绪态。为确保这一点,设计一个特殊进程init,该进程在系统初始化时自动创建,并赋予最低优先级O级。init进程有两个作用:充当闲逛进程,该进程运行时不申请任何资源,以免被阻塞;作为第一个被创建的进程,它没有父进程,可创建比自己优先级高的其他进程。所以init进程是进程生成树的根进程。采用优先级策略的调度程序的常见结构知下所示:scheduler()(找出最高优先级进程p;If(self-prioritypri
19、ority)self-status.type!=,running,self=nil)preempt(p,self);*调度进程p,替换当前进程self*/每当任一进程的操作执行完毕,必须执行进程调度程序,它是当前运行进程的一部分。进程调用该函数,后者决定该进程是继续执行还是被其他进程剥夺运行权。作出判断的依据是:是否存在高优先级进程P,如果存在,P将剥夺Self的运行权。当前进程的运行权被剥夺的情况有以下两种:当前进程刚刚完成release(操作,由此被唤醒进程的优先级可能高于当前进程。当前进程刚刚完成Create()操作,新创建进程的优先级可能高于当前进程。在以下两种情况下,新挑选的进程必须
20、剥夺当前进程的运行权:当前进程刚刚完成reques()操作,并且申请的资源timeout则当前进程的状态就改为“阻塞”;或者由于分时运行进程的需要,调度程序被一个timeout操作调用运行。在timeout操作中当前进程的状态改为“就绪”。在上述情况中,当前进程的状态都不是“运行”。所以当前进程必须停止运行,此时就绪队列中最高优先级的进程P得到执行。当进程刚刚完成destroy操作,进程自己删除自身,它的PCB表不再存在。此时调度程序被执行,从就绪队列中选出最高优先级的进程P,并令其执行。剥夺操作包括以下工作:将选中的最高优先级进程P的状态改为“运行。如果当前进程依然存在且没CPU,则将其状态
21、改为“就绪”,以便随后能得到执行。最后,进行上下文切换,保留当前CPU的各个寄存器值,放入PCB表。装入中选进程P的寄存器值。本实现方案没有对实际的CPU进行访问来保存或恢复寄存器的值,因此上下文切换的任务只是将正在运行进程的名字显示在终端屏幕上。从这一点可以认为,用户终端屏幕开始扮演当前运行进程功能的角色。5 .用户shell界面。为RCB试和演示管理器的CPU能,本方案设计开发一个shell界面,它可以重复接受终端输入的命令,唤醒管理器执行相应的功能,并在屏幕上显示结果。使用上述系统,终端就能展示当前进程。只要输入一个命令,就中断当前进程序的执行,ShelI界面调用进程资源管理器中的函数F
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验一 进程同步和互斥 实验 进程 同步
链接地址:https://www.desk33.com/p-422036.html