当前位置:文档之家› 利用信号量机制解决进程同步和互斥问题

利用信号量机制解决进程同步和互斥问题

利用信号量机制解决进程同步和互斥问题
利用信号量机制解决进程同步和互斥问题

利用信号量机制解决进程同步和互斥问题

在讨论如何用信号量机制解决这个问题之前,我们应该先了解进程同步和互斥间的一些概念。

首先是进程间的两种关系:同步和互斥。所谓同步就是把异步环境下的一组并发进程,因直接制约而互相发送消息二进行互相合作、互相等待,使得各进程按一定的速度执行的过程。互斥是指不允许两个以上的共享该资源的并发进程同时进入临界区。其中直接制约是指一组在异步环境下的并发进程,各自的执行结果互为对方的执行条件,从而限制各进程的执行速度的过程。由于共享某一共有资源而引起的在临界区内不允许并发进程交叉执行的现象,由共享共有资源而造成的对并发进程执行速度的间接制约简称为间接制约。受间接制约的类中各程序段在执行顺序上是任意的。我们将不允许多个并发进程交叉执行的一段程序称为临界区。临界区是由属于不同并发进程的程序段共享公用数据或公用数据变量而引起的。

进程互斥是进程之间发生的一种间接性作用,由两个或两个以上的进程需要同时访问某个共享变量,因竞争共有资源而引起的间接制约带来的。两个进程不能同时进入临界区,否则就会导致数据的不一致,产生与时间有关的错误。进程的同步则是程序共享私有资源造成直接制约。所以为了增强计算机系统的处理能力和提高资源利用率所采取一种同时操作技术,即程序的并发执行。并发的实质是一个处理

器在几个进程之间的多路复用,并发是对有限的物理资源强制行使多用户共享,并且充分发挥硬件的并行性,以提高系统资源的利用率。进程的并发性可以调度多个多道程序增加资源的利用率,同时给用户信息的及时响应。

如何实现并发进程的互斥?一种可能的办法是对临界区加锁以实现互斥。当某个进程进入临界区之后,它将锁上临界区,直到它退出临界区时为止。不过这种实现方法不能够保证并发进程互斥执行所要求的忙则等待的原则。

信号量是一种软件资源,是最早出现的用来解决进程同步与互斥问题的机制,包括一个称为信号量的变量及对它进行的两个原语操作,每个信号量至少须记录两个信息:信号量的值和等待该信号量的进程队列。

信号量机制的原理。在操作系统中,信号量sem是一整数。在sem大于等于零时代表可供并发进程使用的资源实体数,但sem小于零时则表示正在等待使用临界区的进程数。显然,用于互斥的信号量sem初值应该大于零。信号量数值仅能由P,V原语操作改变。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S 的值加1;若S=0,表示有某些进程正在等待该资源,因此要唤醒一

个等待状态的进程,使之运行下去。P,V原语成对出现,在互斥操作时,他们处于同一个进程,但在同步操作时,他们不处于一个进程内。私有信号量是指只与制约进程有关而不是与整组并发进程有关的信号量。利用P,V原语实现进程同步的方法分为三步:首先为各并发进程设置私用信号量,然后为私用信号量赋初值,最后利用P,V原语和使用信号量规定各进程的执行顺序。

解决同步与互斥问题的一些案例:一个吃水果问题。

问题描述:桌上有一只盘子,每次只能放一个水果,爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘里的桔子,女儿专等吃盘里的苹果。只要盘子空,则爸爸或妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,那么四人之间的同步关系是什么?如何实现四人正确活动的程序?

解:四人之间的关系:

1爸爸,妈妈都要使用盘子,所以两者是互斥关系;

2爸爸放的苹果,女儿吃,所以两者是同步关系;

3妈妈放的桔子,儿子吃,所以两者也是同步关系。

struct semaphore s,sp,so=1,0,0;

cobegin

void father (void)

{

while(TRUE){

have an apple;

P(s);

put an apple;

V(sp);} }

void mother (void)

{

while(TRUE){

have an orange; P(s);

put an orange;

V(so);} }

void son (void)

{

while(TRUE){

P(sp);

get an orange;

V(s);

eat an orange;} }

void daught (void)

{

while(TRUE){

P(sp);

get an apple;

V(s);

eat an apple;} }

coend

信号量机制的总结。信号量机制的优点是:PV操作能够实现对

临界区的管理要求;实现简单;允许使用它的代码休眠,持有锁的时

间可相对较长。但它的缺点也同样明显:一个信号量只能置一次初值,

以后只能对之进行p操作或v操作。由此也可以看到,信号量机制必

须有公共内存,不能用于分布式操作系统。

用信号量实现线程同步与互斥

用信号量实现线程同步与互斥 一、相关Win32 API函数 1、创建线程 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId); 函数作用:在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄。 各参数含义: ?lpThreadAttributes:指向一个SECURITY_ATTRIBUTES 结构的指针,该结构决定了线程的安全属性,一般置为NULL; ?dwStackSize:指定了线程的堆栈深度,一般都设置为0; ?lpStartAddress:表示新线程开始执行时代码所在函数的地址,即线程的起始地址。 一般情况为(LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc 是线程函数 名;函数名称没有限制,但是必须以下列形式声明:DWORD WINAPI ThreadProc (PVOID pParam) ; ?lpParameter:指定了线程执行时传送给线程的32位参数,即线程函数的参数; ?dwCreationFlags:控制线程创建的附加标志,可以取两种值。如果该参数为0,线程在被创建后就会立即开始执行;如果该参数为CREATE_SUSPENDED,则系统产 生线程后,该线程处于挂起状态,并不马上执行,直至函数ResumeThread被调用; ?lpThreadId:该参数返回所创建线程的ID。 如果创建成功则返回线程的句柄,否则返回NULL。 例如: for (int i=0;i

1-3章习题(附答案)

OS 1-3章习题 3.操作系统是一种(A),它负责为用户和用户程序完成所有(B)的工作,(C)不是操作系统关心的主要问题。 A:(1)应用软件;(2)系统软件;(3)通用软件;(4)软件包。 B:(1)与硬件无关并与应用无关;(2)与硬件相关而与应用无关;(3)与硬件无关而与应用相关;(4)与硬件相关并与应用相关。 C:(1)管理计算机裸机;(2)设计、提供用户程序与计算机硬件系统的接口;(3)管理计算机中的信息资源;(4)高级程序设计语言的编译。 4.在OS总采用多道程序设计技术,能有效地提高CPU、内存和I/O设备的(A)。为实现多道程序设计需要有(B)。 A:(1)灵活性;(2)可靠性;(3)兼容性;(4)利用率。 B:(1)更大的内存;(2)更快的CPU;(3)更快的外部设备;(4)更先进的终端。 5.推动批处理系统形成和发展的主要动力是(A),推动分时系统形成和发展的主要动力是(B),推动微机OS发展的主要动力是(C)。 A,B:(1)提高计算机系统的功能;(2)提高系统资源利用率-A;(3)方便用户-B;(4)提高系统的运行速度。 C:(1)方便用户;(2)计算机硬件的不断更新换代;(3)便于微机联网;(4)提高资源的利用率。 6.在设计分时操作系统时,首先要考虑的是(A);在设计批处理操作系统时,首先要考虑的是(B);在设计实时操作系统时,首先要考虑的是(C)。 A,B,C:(1)灵活性和可适应性;(2)交互性和响应时间-A;(3)周转时间和系统吞吐量-B;(4)实时性和可靠性-C。 7.在多道批处理系统中,为了充分利用各种资源,系统总是优先选择(A)多个作业投入运行;为了提高吞吐量,系统总是想方设法缩短用户作业的(B)。 A:(1)适应于内存容量的;(2)计算量大的;(3)I/O量大的;(4)计算型和I/O型均衡的。 B:(1)周转时间;(2)运行时间;(3)提交时间;(4)阻塞时间。

进程同步机制与互斥-生产者消费者问题

学习中心: 专业: 年级:年春/秋季 学号: 学生: 题目:进程同步与互斥生产者-消费者问题 1.谈谈你对本课程学习过程中的心得体会与建议? 转眼间,学习了一个学期的计算机操作系统课程即将结束。在这个学期中,通过老师的悉心教导,让我深切地体会到了计算机操作系统的一些原理和具体操作过程。在学习操作系统之前,我只是很肤浅地认为操作系统只是单纯地讲一些关于计算机方面的操作应用,并不了解其中的具体操作过程 1.1设计思路 在这次设计中定义的多个缓冲区不是环形循环的,并且不需要按序访问。其中生产者可以把产品放到某一个空缓冲区中,消费者只能消费被指定生产者生产的产品。本设计在测试用例文件中指定了所有生产和消费的需求,并规定当共享缓冲区的数据满足了所有有关它的消费需求后,此共享才可以作为空闲空间允许新的生产者使用。

本设计在为生产者分配缓冲区时各生产者之间必须互斥,此后各个生产者的具体生产活动可以并发。而消费者之间只有在对同一个产品进行消费时才需要互斥,它们在消费过程结束时需要判断该消费者对象是否已经消费完毕并释放缓冲区的空间。 1.2程序流程图 1.3基本内容 在设计程序时主要有三个主体部分、三个辅助函数和一个数据结构。 其中主体部分为一个主函数main(),用于初始化缓冲区和各个同步对象,并完成线程信息的读入,最后根据该组的线程记录启动模拟线程,并等待所有线程的运 Y

行结束后退出程序; 生产者函数Produce()和消费者函数Consume(),生产者和消费者函数运行于线程中完成对缓冲区的读、写动作,根据此处生产消费的模型的特点,生产者和消费者之间通过使用同步对象实现了生产和消费的同步与互斥,是本实验的核心所在。 另外三个辅助性函数被生产者和消费者函数调用,是上述生产和消费函数中对缓冲区进行的一系列处理。 3)在实现本程序的消费生产模型时,具体的通过如下同步对象实现互斥: ①设一个互斥量h_mutex,以实现生产者在查询和保留缓冲区内的下一个位置时进行互斥。 ②每一个生产者用一个信号量与其消费者同步,通过设置h_Semaphore[MAX_THREAD_NUM]信号量 ③数组实现,该组信号量用于相应的产品已产生。同时用一个表示空缓冲区

信号量互斥题目

试用用信号量机制描述两人下象棋的过程。 两人下象棋的过程可以概括为:一开始只能是“红先黑后”,以后两人要循环轮流走子,直至某一方获胜或双方和棋为

止。? 这是个只有一个生产者和一个消费者的生产者——消费者问题,是个典型的“你等我,我也等你”的问题。红方是总的前趋任务——生产者进程,黑方是总的后继任务——消费者进程,但由于下棋过程必须轮流走子,所以红黑双方的生产者消费者身份会轮流改变。棋盘则是生产者与消费者共享的缓冲。?要求:只描述对弈过程,对棋盘的访问不做描述。二人对弈过程是个纯粹的同步过程 ①所用信号量设臵如下: Ⅰ)同步信号量hei,初值为1,表示黑方已走子,开始时可使红方先行不受阻。 Ⅱ)同步信号量hong,初值为0,表示红方尚未走子,开始时可使黑方先行受阻。 用信号量机制描述的二人下象棋过程如下

有一个阅览室,共有100个座位,读者进入时必须先在一张登记表上登记,该表为每一座位列一表目,包括座号和读者姓名等,读者离开时要消掉登记的信息,试问: (1)为描述读者的动作,应编写几个程序,设臵几个进程?(2)试用P、V操作描述读者进程之间的同步关系。分析:?读者的动作都是一样的:登记进入阅览室,阅读, 撤消登记离开阅览室,因此可写一个程序,设n个进程。 ?读者共享的资源有阅览室的座位和登记表,因此诸 个读者进程之间有两种互斥制约关系,需设2个信号量来实现:? seat:用于实现诸读者对阅览室的空闲座位的互斥 竞争,初值为100; ? mutex:用于实现诸读者对登记表的互斥访问,初值 为1

(1)可写一个程序,设n个进程 (2)读者进程readeri(i=1,2,3,……)描述如下: P(seat); /*申请空座位*/ P(mutex); /*申请登记*/ 登记; V(mutex) /*允许其他读者登记*/ 阅读; P(mutex); /*申请撤消登记*/ 撤消登记; V(mutex); /*允许其他读者撤消登记*/ V(seat); /*释放座位,允许他人进入*/

进程间的同步和互斥-

实验报告 1、实验名称 进程间的互斥和同步 2、小组成员:姓名+学号 3、实验目的 Linux命名信号量实现进程间的互斥和同步 4、实验背景知识 进程同步也是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系来源于他们之间的合作。比如说进程A需要从缓冲区读取进程B产生的信息,当缓冲区为空时,进程B因为读取不到信息而被阻塞。而当进程A产生信息放入缓冲区时,进程B才会被唤醒。 进程互斥是进程之间的间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待。只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。比如进程B需要访问打印机,但此时进程A占有了打印机,进程B会被阻塞,直到进程A释放了打印机资源,进程B才可以继续执行。 5、实验步骤演示 大概步骤: 先进行单次同步,把信号量先初始化为0,创建一个命名信号量,设置信号捕捉处理代码,安装捕捉信号;其次使用信号量进行同步和互斥的操作。 详细步骤: 1.创建一个命名信号量,sem = sem_open(SEM_NAME, OPEN_FLAG, OPEN_MODE, INIT_V); 2.创建子进程,pid = fork(); 3.V操作,sem_post(sem); 4.P操作,sem_wait(sem); 5.等待子进程结束,wait(&status); 6.删掉在系统创建的信号量,sem_unlink(SEM_NAME); 7.彻底销毁打开的信号量,sem_close(sem);

8.信号捕捉处理,static void myhandler(void); 9.迭代同步,两个信号量,开始时一个为1,一个为0,一个进程执行完换另一个执行; 10.安装捕捉信号,signal(SIGINT,(void *)myhandler ); 11.创建一个命名信号量:sem1 = sem_open(SEM_NAME1, OPEN_FLAG, OPEN_MODE, 1);sem2 = sem_open(SEM_NAME2, OPEN_FLAG, OPEN_MODE, 0); 12.创建子进程,pid = fork(); 13.if(0 == pid) P操作:sem_wait(sem1); V操作:sem_post(sem2); 14.if(0 < pid) P操作:sem_wait(sem2); V操作:sem_post(sem1); 15.static void mysem(char *str) { int i = 0; //P操作 sem_wait(sem); while('\0' != str[i]) { printf("%c\n", str[i++]); sleep(1); } //V操作 sem_post(sem); } 进程排斥,在临界区设置PV操作 16.创建一个命名信号量,sem = sem_open(SEM_NAME, OPEN_FLAG, OPEN_MODE, INIT_V); 17.if(0 == pid) { mysem("abcd"); } 18.if(0 < pid) { mysem("1234"); //等待子进程结束 wait(&status); //删掉在系统创建的信号量 sem_unlink(SEM_NAME); //彻底销毁打开的信号量 sem_close(sem); } 说明: 命名信号量不带内存共享,编译时要带库文件-lpthread或-lrt

进程同步与通信作业习题与答案

第三章 一.选择题(50题) 1.以下_B__操作系统中的技术是用来解决进程同步的。 A.管道 B.管程 C.通道 2.以下_B__不是操作系统的进程通信手段。 A.管道 B.原语 C.套接字 D.文件映射 3.如果有3个进程共享同一程序段,而且每次最多允许两个进程进入该程序段,则信号量的初值应设置为_B__。 4.设有4个进程共享一个资源,如果每次只允许一个进程使用该资源,则用P、V操作管理时信号量S的可能取值是_C__。 ,2,1,0,-1 ,1,0,-1,-2 C. 1,0,-1,-2,-3 ,3,2,1,0 5.下面有关进程的描述,是正确的__A__。 A.进程执行的相对速度不能由进程自己来控制 B.进程利用信号量的P、V 操作可以交换大量的信息 C.并发进程在访问共享资源时,不可能出现与时间有关的错误 、V操作不是原语操作 6.信号灯可以用来实现进程之间的_B__。 A.调度 B.同步与互斥 C.同步 D.互斥 7.对于两个并发进程都想进入临界区,设互斥信号量为S,若某时S=0,表示_B__。 A.没有进程进入临界区 B.有1个进程进入了临界区 C. 有2个进程进入了临界区 D. 有1个进程进入了临界区并且另一个进程正等待进入 8. 信箱通信是一种_B__方式 A.直接通信 B.间接通信 C.低级通信 D.信号量 9.以下关于临界区的说法,是正确的_C__。

A.对于临界区,最重要的是判断哪个进程先进入 B.若进程A已进入临界区,而进程B的优先级高于进程A,则进程B可以 打断进程A而自己进入临界区 C. 信号量的初值非负,在其上只能做PV操作 D.两个互斥进程在临界区内,对共享变量的操作是相同的 10. 并发是指_C__。 A.可平行执行的进程 B.可先后执行的进程 C.可同时执行的进程 D.不可中断的进程 11. 临界区是_C__。 A.一个缓冲区 B.一段数据区 C.一段程序 D.栈 12.进程在处理机上执行,它们的关系是_C__。 A.进程之间无关,系统是封闭的 B.进程之间相互依赖相互制约 C.进程之间可能有关,也可能无关 D.以上都不对 13. 在消息缓冲通信中,消息队列是一种__A__资源。 A.临界 B.共享 C.永久 D.可剥夺 14. 以下关于P、V操作的描述正确的是__D_。 A.机器指令 B. 系统调用 C.高级通信原语 D.低级通信原语 15.当对信号量进行V源语操作之后,_C__。 A.当S<0,进程继续执行 B.当S>0,要唤醒一个就绪进程 C. 当S<= 0,要唤醒一个阻塞进程 D. 当S<=0,要唤醒一个就绪 16.对临界区的正确论述是__D_。 A.临界区是指进程中用于实现进程互斥的那段代码 B. 临界区是指进程中用于实现进程同步的那段代码 C. 临界区是指进程中用于实现进程通信的那段代码 D. 临界区是指进程中访问临界资源的那段代码 17. __A__不是进程之间的通信方式。 A.过程调用 B.消息传递 C.共享存储器 D.信箱通信 18. 同步是指进程之间逻辑上的__A__关系。

1互斥信号量:

1.互斥信号量: 互斥互斥,意思就是我用了你就不能用,你用了我就不能用。永远都只有一个人独占这个东西~!举个例子:比如说打印机。 我任务1现在让他打印《静夜思》,那么在我还没打印完之前,别的任务就不能命令打印机去打印别的东西。否则如果任务2让他打印《春晓》,那最后打印出来的会是什么~????反正肯定不是任务1想要的,肯定也不是任务2想要的。 上面讲的比较通俗。打印机就是共享资源,谁都可以访问他~!但是同一时间,肯定要保证只有1个任务再操作打印机。那样才能得到大家想要的结果。也就是要独占共享资源的访问权~! ucos2中通过互斥信号量来解决这个问题。简单说就是任务1开始访问打印机的时候,先去查询这个互斥信号量是否有效,有效,说明没人在访问打印机,这时任务1就把这个互斥信号量置无效,然后开始操作打印机。这样,每个任务再操作打印机前都要去查询这个互斥信号量时候有效。无效就等,等到有效才可以访问,或者等到不耐烦了(术语叫等待超时)就不等了~!任务一直到用完了打印机后才把信号量置有效,这时其他任务才有可能去访问,操作打印机。 这里又有一个问题:再任务1操作打印机器件,可能有多个任务申请打印机的所有权。那么再任务1结束后,我应该给谁用呢~~??也许我们马上就反应过来了~废话~!!当然是排队了~~谁先到的谁用啊~~~。没错,这是一种机制,谁最先等待共享资源,就给谁用。但是~!再ucos里面2.52版本还不支持这种方式。他用的另外一种方法!如果你和你BOSS都再等着用打印机,你先到的,这个时候任务1结束了对打印机的操作。你说你敢先用么~???(除非你第二天不想干了~~)你肯定先让老板先用,这就是ucos的实现方式,基于优先级,任务1结束对打印机的操作后,ucos再等待队列中看那个等待任务优先级最高,就先给他用~!即使他是最晚才等待的~!!(这就是BOSS的威力~!) 关于事件等待列表,有兴趣的可以去看看事件控制块ECB的内容,不在本文讨论。当然,ucos中的互斥信号量还有许多要素,比如说他的继承优先级之类的。本文旨在说明它是干嘛用的,至于其他请参考相关书籍。 下面的图解释了互斥信号量的基本用法:(简单的两个任务,没有包含多任务等待的情况)

实验八 uCOS-II的互斥信号量

实验八uCOS的互斥信号量 一:实验目的: 1.理解互斥型信号量。 2.学会使用互斥型信号量实现对共享资源的独占式处理。 3.解决任务在使用独占式资源出现的优先级反转问题。 二:实验内容: 完成教材5-7实验,使用互斥型信号量实现对共享资源的独占式处理。实验中要求要创建互斥型信号量,请求互斥型信号量,发送互斥型信号量,删除互斥型信号量。 三:程序代码: #include "includes.h" #define TASK_STK_SIZE 512 OS_STK StartTaskStk[TASK_STK_SIZE]; OS_STK MyTaskStk[TASK_STK_SIZE]; OS_STK YouTaskStk[TASK_STK_SIZE]; OS_STK HerTaskStk[TASK_STK_SIZE]; INT16S key; char *s1="MyTask running--yangkun"; char *s2="YouTask running--yangkun"; char *s3="HerTask running--yangkun"; char *s4="MyTask pend_Semp"; char *s5="HerTask pend_Semp"; INT8U err; INT8U y=0; INT32U Times=0; OS_EVENT *Semp; void StartTask(void *pdata); void MyTask(void *pdata); void YouTask(void *pdata); void HerTask(void *pdata); void main (void) { OSInit();

操作系统实验-进程同步与互斥

实验四:进程的管道通信 实验题目 进程的管道通信 实验目的 加深对进程概念的理解,明确进程和程序的区别。学习进程创建的过程,进一步认识进程并发执行的实质。分析进程争用资源的现象,学习解决进程互斥的方法。学习解决进程同步的方法。掌握Linux系统中进程间通过管道通信的具体实现 实验内容 使用系统调用pipe()建立一条管道,系统调用fork()分别创建两个子进程,它们分别向管道写一句话,如: Child process1 is sending a message! Child process2 is sending a message! 父进程分别从管道读出来自两个子进程的信息,显示在屏幕上。 当然,仅仅通过屏幕上输出这两句话还不能说明实现了进程的管道通信,为了能够更好的证明和显示出进程的同步互斥和通信,在其中要加入必要的跟踪条件,如一定的输出语句等,来反映程序的并发执行情况 实验要求 这是一个设计型实验,要求自行、独立编制程序。两个子进程要并发执行。实现管道的互斥使用。当一个子进程正在对管道进行写操

作时,另一个欲写入管道的子进程必须等待。使用系统调用lockf(fd[1],1,0)实现对管道的加锁操作,用lockf(fd[1],0,0)解除对管道的锁定。实现父子进程的同步,当父进程试图从一空管道中读取数据时,便进入等待状态,直到子进程将数据写入管道返回后,才将其唤醒。 为了清楚的反应进程的同步,在子进程完成相应的操作后,调用sleep()函数睡眠一段时间(程序中定为3s)。父进程先执行wait()函数,当有子进程执行完毕后,会得到子进程的返回结果并清理子进程。若子进程没执行完,父进程一直执行wait()进行监听,知道有一个子进程执行完成为僵尸进程。 程序中用到的系统调用 因为程序时在linux系统上进行编写的,所以其中要利用到相关的linux提供的系统调用。 所用到的系统调用包含在如下头文件中。 #include #include #include #include #include #include fork() 用于创一个子进程。 格式:int fork();

计算机操作系统_进程间互斥与同步

进程间互斥与同步 实验内容: 编写算法,实现进程间对临界资源的互斥访问以及进程间的同步关系。 实验要求: 1、要求进程互斥使用文本文件; 2、假定文本文件txt1最大可写入30个字符; 3、写满后复制进程将文本文件的内容复制到另一个文本文件txt2中(无长度限制)。 4、复制进程复制完毕写入进程可再重新写入,重复执行3,4,直到给出停止命令。 5、实现进程间的同步和互斥。 代码: #include #include//stdio.h #include//函数库 #include//linux/unix的系统调用 #include//信号量 #include using namespace std; typedef union _semnu{ int val; struct semid_ds *buf; ushort *array; }semun; //v操作 void v(int &sem_id) { struct sembuf sem_b;

sem_b.sem_num=0; sem_b.sem_op=1; sem_b.sem_flg=SEM_UNDO; if(semop(sem_id,&sem_b,1)==-1) { cout<<"error"<

进程同步与互斥汇总

进程同步与互斥

进程的PV操作 在操作系统中,P、V操作是进程管理中的难点。这是1968年荷兰人Dijkstra 给出的一种解决并发进程间互斥和同步关系的通用方法。 1. P、V操作的意义 定义了信号量及其上的P操作和V操作,来实现并发进程间的同步和互斥,甚至可以用来管理资源的分配。P、V操作因交换的信息量少,属于进程的低级通信。 2. 什么是信号量? 信号量(semaphore)是由一个值和一个指针构成的数据结构。值为整型变

量,表示信息量的值;指针指向进程控制块(PCB)队列的队头,表示等待该信号量的下一个进程。如下图所示。 信号量的一般结构及PCB队列 信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的初值不能为负,且其值只能由P、V操作来改变。 3. P、V操作的含义 P、V操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量S进行操作,具体定义如下: P(S): ①将信号量S的值减1,即S=S-1; ②如果S≥0,则该进程继续执行;否则该进程状态置为阻塞状态,进程PCB 排入信号量PCB队列末尾,放弃CPU,等待V操作的执行。 V(S): ①将信号量S的值加1,即S=S+1; ②如果S≤0,释放信号量队列中第一个PCB所对应的进程,将进程状态由阻塞态改为就绪态。执行V操作的进程继续执行。 一般来说,信号量S≥0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S≤0,表示有某些进程正在等待该资源,因此要唤醒一个阻塞状态的进程,使之成为就绪状态。 4. 利用信号量和P、V操作实现进程互斥 一般地,n个进程利用信号量和P、V操作实现进程互斥的一般模型如下: 进程P 1进程P 2 ……进程Pn …… …… …… P(S); P(S); P(S); 临界区;临界区;临界区; V(S); V(S); V(S); …… …… …… …… 其中S是互斥信号量,初值为1。 使用P、V操作实现进程互斥时应该注意的问题是: (1)每个程序中,用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查P、V操作的成对性。 (2)P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。 (3)互斥信号量的初值一般为1。 由于用于互斥的信号量sem与所有的并发进程有关,所以称之为公有信号量。公有信号量的值反映了公有资源的数量。只要把临界区置于P(sem)和V(sem)

uCOS-II互斥信号量

μCOS-II互斥信号量 Application Note AN-1002 Jean J. Labrosse https://www.doczj.com/doc/8114198354.html,brosse@https://www.doczj.com/doc/8114198354.html, https://www.doczj.com/doc/8114198354.html, 概述: 使用互斥信号(Mutual Exclusion Semaphores)或者简单的互斥(mutexes)实现对资源的独占访问,互斥信号本身是一种二进制信号,具有超出μCOS-II提供的一般信号机制的特性。本手册描述了C/OS-II V2.04增加的mutex一系列服务。 简介: 在应用程序中使用互斥信号是为了减少优先级翻转问题(priority inversion problem),如μC/OS-II, The Real-Time kernel (ISBN 0-87930-543-6), section 2.16, page 47中描述的。 当一个高优先级的任务需要的资源被一个低优先级的任务使用是,就会发生优先级翻转问题。为了减少优先级翻转问题,内核可以提高低优先级任务的优先级,先于高优先级的任务运行,释放占用的资源。 为了实现互斥,实时内核需要具有支持在同一优先级具有多个任务的能力。不幸的是,μC/OS-II不允许在相同的优先级有多个任务,必须只有一个任务。但是我们有另外的方法解决这个问题。可以把需要资源的高优先级任务上面的一个任务使用Mutex保留,允许提高低优先级任务的优先级。 举一个mutexes信号工作的例子,如listing1所示。 Listing 1中有三个任务可以使用共同的资源,为了访问这个资源,每个任务必须在互斥信号ResourceMutex上等待(pend),任务#1有最高优先级10,任务#2优先级为15,任务#3优先级为20,一个没有使用的正好在最高优先级之上的优先级#9用来作为优先级继承优先级(Priority Inheritance Priority-PIP)。如main()所示,L1(1)进行μC/OS-II初始化,并通过调用OSMutexCreate() L1(2)创建了一个互斥信号。需要注意的是,OSMutexCreate()函数使用PIP最为参数。然后创建三个任务L1(3),启动μC/OS-II L1(4). 假设任务运行了一段时间,在某个时间点,任务#3最先访问了共同的资源,并得到了互斥信号,任务#3运行了一段时间后被任务#1抢占。任务#1需要使用这个资源,并通过调用OSMutexPend()企图获得互斥信号,这种情况下,OSMutexPend()会发现一个高优先级的任务需要这个资源,就会把任务#3的优先级提高到9,同时强迫进行上下文切换退回到任务#3执行。任务#3可以继续执行然后释放占用的共同资源。任务#3通过调用OSMutexPost()释放占用的mutex信号,OSMutexPost()会发现mutex被一个优先级提升的低优先级的任务占有,就会把任务#3的优先级返回到20。把资源释放给任务#1使用,执行上下文切换到任务#1

操作系统信号量PV操作题若干

(一)图书馆有100个座位,每位进入图书馆的读者要在登记表上登记,退出时要在登记表上注销。要几个程序?有多少个进程?(答:一个程序;为每个读者设一个进程) (1)当图书馆中没有座位时,后到的读者在图书馆为等待(阻塞) (2)当图书馆中没有座位时,后到的读者不等待,立即回家。 设信号量S=200;MUTEX=1; P(S) P(MUTEX) 登记 V(MUTEX) 阅读 P(MUTEX) 注销 V(MUTEX) V(S) (2) 设信号量MUTEX=1; 整型变量S=200; P(MUTEX) IF(S==0) { V(MUTEX) RETURN } ELSE{ COUNT=COUNT-1; 登记 V(MUTEX) 阅读 P(MUTEX) COUNT=COUNT+1; 注销 V(MUTEX) RETURN }

解(1 ) 设信号量:S=100; MUTEX=1 P(S) P(MUTEX) 登记 V(MUTEX) 阅读 P(MUTEX) 注销 V(MUTEX) V(S) 解(2) 设整型变量COUNT=100; 信号量:MUTEX=1; P(MUTEX); IF (COUNT==0) { V(MUTEX); RETURN; } COUNT=COUNT-1; 登记 V(MUTEX); 阅读 P(MUTEX); COUNT=COUNT+1; V(MUTEX); RETURN;

(二)有一座东西方向的独木桥;用P,V操作实现: (1)每次只允许一个人过桥; (2)当独木桥上有行人时,同方向的行人可以同时过桥,相反方向的人必须等待。(3)当独木桥上有自东向西的行人时,同方向的行人可以同时过桥,从西向东的方向,只允许一个人单独过桥。(此问题和读者与写者问题相同,东向西的为读者,西向东的为写者)。 (1) 设信号量S=1 P(S) 过桥 V(S) (2) 设信号量S=1 EW=1;(东向西互斥计数量) WE=1;(西向东互斥计数量) 整型变量 CE =0;(东向西桥上人数) CW=0;(西向东桥上人数) 东向西: P(EW) IF(CE==0) { P(S) } CE++; V(EW) 过桥 P(EW) CD--; IF(CD==0){ V(S) } V(EW)

临界区,互斥量,信号量,事件的区别

四种进程或线程同步互斥的控制方法 1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 3、信号量:为控制一个具有有限数量用户资源而设计。 4、事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 临界区(Critical Section) 保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。 临界区包含两个操作原语: EnterCriticalSection()进入临界区 LeaveCriticalSection()离开临界区 EnterCriticalSection()语句执行后代码将进入临界区以后无论发生什么,必须确保与之匹配的LeaveCriticalSection()都能够被执行到。否则临界区保护的共享资源将永远不会被释放。虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。 MFC提供了很多功能完备的类,我用MFC实现了临界区。MFC为临界区提供有一个CCriticalSection类,使用该类进行线程同步处理是非常简单的。只需在线程函数中用CCriticalSection类成员函数Lock()和UnLock()标定出被保护代码片段即可。Lock()后代码用到的资源自动被视为临界区内的资源被保护。UnLock后别的线程才能访问这些资源。 互斥量(Mutex) 互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。 互斥量包含的几个操作原语: CreateMutex()创建一个互斥量 OpenMutex()打开一个互斥量 ReleaseMutex()释放互斥量 WaitForMultipleObjects()等待互斥量对象 同样MFC为互斥量提供有一个CMutex类。使用CMutex类实现互斥量操作非常简单,但是要特别注意对CMutex的构造函数的调用 CMutex( BOOL bInitiallyOwn = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL) 不用的参数不能乱填,乱填会出现一些意想不到的运行结果。 信号量(Semaphores)

经典PV操作讲解和练习题

在计算机操作系统中,PV操作是进程管理中的难点。 首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的值减1,即S=S-1; ②如果S30,则该进程继续执行;否则该进程置为等待状态,排入等待队列。 V(S):①将信号量S的值加1,即S=S+1; ②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。 PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信。 什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。 一般来说,信号量S30时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S 的值加1;若S£0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。 利用信号量和PV操作实现进程互斥的一般模型是: 进程P1 进程P2 ……进程Pn ……………… P(S); P(S); P(S); 临界区;临界区;临界区; V(S); V(S); V(S); …………………… 其中信号量S用于互斥,初值为1。 使用PV操作实现进程互斥时应该注意的是: (1)每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。 (2)P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。(3)互斥信号量的初值一般为1。 利用信号量和PV操作实现进程同步 PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。 使用PV操作实现进程同步时应该注意的是: (1)分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量。

Windows下进程同步与互斥

实验进程同步与互斥 一、实验目的 1.掌握基本的同步与互斥算法,理解生产者消费者模型。 2.学习使用Windows 2000/XP中基本的同步对象,掌握相关API的使用方法。 3.了解Windows 2000/XP中多线程的并发执行机制,实现进程的同步与互斥。 二、实验内容及要求 1.实验内容 以生产者/消费者模型为依据,在Windows 2000环境下创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。 2.实验要求 ●学习并理解生产者/消费者模型及其同步/互斥规则; ●学习了解Windows同步对象及其特性; ●熟悉实验环境,掌握相关API的使用方法; ●设计程序,实现生产者/消费者进程(线程)的同步与互斥; ●提交实验报告。 三、相关知识介绍 1.同步对象 同步对象是指Windows中用于实现同步与互斥的实体,包括信号量(Semaphore)、互斥量(Mutex)、临界区(Critical Section)和事件(Events)等。本实验中使用到信号量、互斥量和临界区三个同步对象。 同步对象的使用步骤: ●创建/初始化同步对象。 ●请求同步对象,进入临界区(互斥量上锁)。 ●释放同步对象(互斥量解锁)。 这些对象在一个线程中创建,在其他线程中都可以使用,实现同步与互斥。 2.相关API的功能及使用 我们利用Windows SDK提供的API编程实现实验题目要求,而VC中包含有Windows SDK的所有工具和定义。要使用这些API,需要包含堆这些函数进行说明的SDK头文件——最常见的是Windows.h(特殊的API调用还需要包含其他头文件)。 下面给出的是本实验使用到的API的功能和使用方法简单介绍。 (1) CreateThread ●功能——创建一个在调用进程的地址空间中执行的线程 ●格式 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress,

同步和互斥的区别_

同步和互斥的区别

信号量互斥量条件变量 同步和互斥 一、信号量:用于进程间通信(linux中用于线程) 独立于进程在两个进程中都要初始化,若一个已创建,则另一个获取可以执行多次v操作,然后再执行p操作 信号量的一些概念: 以下是信号灯(量)的一些概念: 信号灯与互斥锁和条件变量的主要不同在于”灯”的概念,灯亮则意味着资源可用,灯灭则意味着不可用。如果说后两中同步方式侧重于”等待”操作,即资源不可用的话,信号灯机制则侧重于点灯,即告知资源可用;没有等待线程的解锁或激发条件都是没有意义的,而没有等待灯亮的线程的点灯操作则有效,且能保持灯亮状态。当然,这样的操作原语也意味着更多的开销。 信号灯的应用除了灯亮/灯灭这种二元灯以外,也可以采用大于1的灯数,以表示资源数大于1,这时可以称之为多元灯。 二、互斥量:(用于在线程间的通信) 1、在一个进程中创建 三、信号量与互斥量的区别 1. 互斥量用于线程的互斥,信号量用于线程的同步。 这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源 以上区别是主要想记住的。 note:信号量可以用来实现互斥量的功能 2. 互斥量值只能为0/1,信号量值可以为非负整数。 也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。3、互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。 4、作用域 信号量: 进程间或线程间(linux仅线程间) 互斥锁: 线程间 5、上锁时 信号量: 只要信号量的value大于0,其他线程就可以sem_wait(p操作-1)成功,成功后信号量的value减一。若value值不大于0,则

操作系统-进程同步-信号量练习题

1【单选题】用P、V操作管理临界区时,互斥信号量的初值应定义为( A)。 ?A,1 ?B,0 ?C,-1 ?D,任意值 2【单选题】在操作系统中,对信号量S的P原语操作定义中,使进程进入相应等待队列等待的条件是( )。 ?A,S>0 ?B,S = 0 ?C,S<0 ?D,S<>0 我的答案:C 3【单选题】信号量S的初值为8,在S上执行了10次wait 操作,6次signal操作后,S的值为(D )。 ?A,10 ?B,8 ?C,6 ?D,4 P操作每执行一次,信号量减1;V操作每执行一次,信号量加1.所以答案为8-10+6 = 4

4【单选题】用V操作唤醒一个等待进程时,被唤醒进程的状态应变成( B)状态。 ?A,执行 ?B,就绪 ?C,阻塞 ?D,挂起 被唤醒的进程由等待状态变为就绪状态。 5【单选题】利用Wait和signal操作可以( )。 ?A,实现进程互斥和同步 ?B,检测死锁 ?C,解除死锁 ?D,防止死锁 我的答案:A 6【单选题】两个并发进程,设互斥信号量mutex(初值为1),若信号量=0;则(B ) ?A,表示没有进程进入临界区 ?B,表示有一个进程进入临界区 ?C,表示有一个进程进入临界区,另一个进程等待进入 ?D,表示两个进程进入临界区 临界区不允许两个进程同时进入,D选项明显错误。mutex初值为1,表示允许一个进程进入临界区,当有一个进程进入临界区且没有进程等待进入时,mutex值减1,变为0。

7【单选题】V操作是对信号量执行加1操作,意味着释放一个单位资源,加1后如果信号量的值等于零,则从等待队列中唤醒一个进程,现进程变为等待状态,否则现进程继续进行。?A,对 ?B,错 我的答案:B 8【单选题】有3个进程,两台打印机,用wait和sigual操作来实现互斥访问打印机,则信号量S的取值范围是( ) ?A,2,1,0,-1 ?B,3,2,1,0 ?C,2,1,0,-1,-2 ?D,1,0,-1,-2 我的答案:如果n个进程共享两个打印机,信号量取值范围:-(n-2)~2; 9【单选题】设与某资源相关的资源信号量K,初值为3,当前值为1,则可用资源个数为( ),等待资源的进程数为( )。 ?A,0,1 ?B,1,0 ?C,1,2 ?D,2,0 我的答案:B

相关主题
文本预览
相关文档 最新文档