信号量机制与互斥的加锁实现的优缺点比较

信号量机制与互斥的加锁实现的优缺点比较
信号量机制与互斥的加锁实现的优缺点比较

互斥的加锁实现与信号量机制的优缺点对比

(一)互斥的加锁实现

当某个进程进入临界区之后,临界区将被上锁,直到它退出临界区为止。并发进程在申请进入临界区之前,首先测试该临界区是否是上锁的。如果是上锁的,则要等到开锁以后才有可能活的临界区。

设临界区类名为S,锁定位key【S】。

加锁后临界区程序描述如下:

Lock(key【S】)

<临界区>

Unlock(key【S】)

设key【S】=1时表示该临界区可用,key【S】=0时表示该临界区不可用。则unlock(key 【S】)只用一条语句即可实现。即:

Key【S】<—1

不过由于lock(key【S】)必须满足key【S】=0时,不允许任何进程进入临界区,而key 【S】=1时仅允许一个进程进入临界区的准则,因而实现起来较为困难。仍存在一些影响系统可靠性和执行效率的问题,例如循环测试定位将消耗较多的cpu计算时间等等。还会导致一些不公平现象。每个进程能否进入临界区是依靠自己的测试判断。这样,没有获得执行机会的进程当然没法判断,从而产生某进程处于永久饥饿状态。

(二)信号量机制

信号量sem是一整数。在sem大于等于零时代表可供并发进程使用的资源实体数,但sem小于零时则表示正在等待实用临界区的进程数。显然,对于互斥的信号量sem初值应该大于零。

P,V原语操作能改变信号量的数值,信号量(sem)可代表管理相应临界区公共资源的实体。而一次P操作使得sem减1,一次V操作使得sem加1。

P,V操作中进程不需要象加锁时要不断的测试,而是在队列里等待其他进程执行V操作时,就可以进入临界区了。这样P,V操作比加锁更简单,且表达能力强,但P,V相对来说不安全,会出现死锁,遇到复杂的同步互斥问题时会更复杂。

若此时有a和b两个进程,加锁实现是:a先获得锁,然后b也要获得锁,而因为a已经占有锁了,所以b会进入休眠。当a释放锁后,会去唤醒在等待队列上的进程,按正常逻辑此时应该是b被唤醒而获得锁。但是现在却是,a在释放锁之后,又重新获得锁,a会在调度b之前先将计数值减1,然后才调度进程b,b会因为判断计数值不成功而重新进入休眠。而信号量却不是这样的,信号量是在a释放这个信号之后,唤醒等待队列上的进程,此时会马上调度b,使b获得信号量,若a又要重新获得信号量,会因为信号量的计数值小于等于0而进入休眠。

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

用信号量实现线程同步与互斥 一、相关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)阻塞时间。

第3章部分习题测验答案

第3章部分习题答案 3.2. 为什么进程在进入临界区之前,应先执行"进入区"代码,在退出临界区后又执行"退出区"代码? 为了实现多个进程对临界资源的互斥访问,必须在临界区前面增加一段用于检查欲访问的临界资源是否正被访问的代码,如果未被访问,该进程便可进入临界区对资源进行访问,并设置正被访问标志,如果正被访问,则本进程不能进入临界区,实现这一功能的代码成为"进入区"代码;在退出临界区后,必须执行"退出区"代码,用于恢复未被访问标志. 3.3 同步机构应遵循哪些基本准则?为什么? a. 空闲让进. b. 忙则等待. c. 有限等待. d. 让权等待. 3.6你认为整型信号量机制和记录型信号量机制,是否完全遵循了同步机构的四条准则? a. 在整型信号量机制中,未遵循"让权等待"的准则. b. 记录型信号量机制完全遵循了同步机构的"空闲让进,忙则等待,有限等待,让权等待"四条准则. 3.9在生产者-消费者问题中,如果缺少了signal(full)或signal(empty),对执行结果会有何影响? 生产者-消费者问题可描述如下: var mutex,empty,full: semaphore:=1,n,0; buffer: array[0,...,n-1] of item; in,out: integer:=0,0; begin parbegin producer: begin repeat . . produce an item in nextp; . . wait(empty); wait(mutex); buffer(in):=nextp; in:=(in+1) mod n; signal(mutex); /* ************** */ signal(full); /* ************** */ until false; end consumer: begin repeat wait(full); wait(mutex); nextc:=buffer(out); out:=(out+1) mod n; signal(mutex); /* ************** */

信号量互斥题目

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

止。? 这是个只有一个生产者和一个消费者的生产者——消费者问题,是个典型的“你等我,我也等你”的问题。红方是总的前趋任务——生产者进程,黑方是总的后继任务——消费者进程,但由于下棋过程必须轮流走子,所以红黑双方的生产者消费者身份会轮流改变。棋盘则是生产者与消费者共享的缓冲。?要求:只描述对弈过程,对棋盘的访问不做描述。二人对弈过程是个纯粹的同步过程 ①所用信号量设臵如下: Ⅰ)同步信号量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); /*释放座位,允许他人进入*/

机制习题解答(DOC)

第1章习题及解答略 第2&6章习题及解答 1.判断正误 (1)凡频谱是离散的信号必然是周期信号。( ×)准周期信号 (2)任何周期信号都由频率不同,但成整倍数比的离散的谐波叠加而成。( ×) (3)周期信号的频谱是离散的,非周期信号的频谱也是离散的。( ×) (4)周期单位脉冲序列的频谱仍为周期单位脉冲序列。( √) (5)非周期变化的信号就是随机信号。( ×)准周期信号 (6)非周期信号的幅值谱表示的是其幅值谱密度与时间的函数关系。( ×) (7)信号在时域上波形有所变化,必然引起频谱的相应变化。( ×) (8)各态历经随机过程是平稳随机过程。( √) (9)平稳随机过程的时间平均统计特征等于该过程的集合平均统计特征。( √) (10)非周期信号的频谱都是连续的。( ×) 准周期信号 (11)单位脉冲信号的频谱是无限带宽谱(√) (12)直流信号的频谱是冲击谱(√) 2.选择正确答案填空 (1)描述周期信号的数学工具是(B )。 A.相关函数 B. 傅里叶级数 C. 拉普拉斯变换 D. 傅里叶变换 (2)描述非周期信号的数学工具是( C)。 A.三角函数 B. 拉普拉斯变换 C. 傅里叶变换 D. 傅里叶级数

(3) 将时域信号进行时移,则频域信号将会( D ) A.扩展 B. 压缩 C. 不变 D. 仅有相移 (4) 瞬变信号的傅里叶变换的模的平方的意义为( C ) A.信号的一个频率分量的能量 B. 在f 处的微笑频宽内,频率分量的能量与频宽之比 C. 在f 处单位频宽中所具有的功率 (5) 概率密度函数是在(C )域,相关函数是在(A )域,功率谱密度函数是 在( D )域描述随机信号。 A.时间 B. 空间 C. 幅值 D. 频率 (6) 白噪声信号的自相关函数是(C ) A.相关函数 B. 奇函数 C. 偶函数 D. 不存在 6.4已知被测模拟量最大输出幅值为±5V ,要求AD 转换输出最大误差不大于5mv ,应选用多少位的AD 转换器? 解:量化误差5mv=±0.5LSB=125*5.012* 5.0-±=-±n n V FS 解得n=9 6.6 模拟信号DFT ,请问采样时间间隔Δt 、采样点数N 、频率分辨率Δf 三者之间的关系?并回答如下问题: (1) 为什么采样频率Δf 必须至少为被分析信号中最高频率成分的2倍才能避免混淆? (2) 当采样频率确定后,频谱中应该出现的最高频率是多少? (3) 频谱中的谱线根数是否与时域中的采样点数相同?对于频谱分析来说有用的谱线根数是多少?

进程间的同步和互斥-

实验报告 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

1互斥信号量:

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

计算机操作系统典型例题解析之三

计算机操作系统典型例题解析之三 【例1】分配到必要的资源并获得处理机时的进程状态是(B )。A、就绪状态B、执行状态 C、阻塞状态D、新状态 分析:进程有三种基本状态:就绪状态、执行状态和阻塞状态。当进程已分配到除CPU以外的所有必要的资源后,只要能再获得处理机便可立即执行,这时的状态称为就绪状态;处于就绪状态的进程如果获得了处理机,其状态转换为执行状态;进程因发生某种事件(如I/O请求、申请缓冲空间等)而暂停执行时的状态,亦即进程的执行受到阻塞,故称这种状态为阻塞状态;而新状态是指创建了进程但尚未把它插入到就绪队列前的状态。所以本题的答案是B。 【例2】挂起的进程被激活,应该使用(C)原语。 A、Create B、Suspend C、Active D、Wakeup 分析:在不少系统中,进程除了三种基本状态外,又增加了一些新的状态,其中最重要的是挂起状态。“挂起”的实质是使进程不能继续执行,即使挂起后的进程处于就绪状态,它也不能参加对CPU的竞争,进程的挂起调用Suspend()原语。因此,被挂起的进程处于静止状态,相反,没有挂起的进程则处于活动状态。而且,处于静止状态的进程,只有通过“激活”动作,调用Active()原语,才能转换成活动状态,调入内存。所以本题的答案是C。 【例3】任何时刻总是让具有最高优先数的进程占用处理器,此时采用的进程调度算法是(D)。A非抢占式的优先数调度算法B、时间片轮转调度算法C、先来先服务调度算法D、抢占式的优先

数调度算法 分析:“让具有最高优先数的进程占用处理器”,我们可以知道,采用的进程调度算法是优先数调度算法,但是我们还要进一步分析是抢占式的还是非抢占式的。“任何时刻总让”,通过这句话我们知道采用的是抢占式的,所以本题的答案是D。 【例4】若P、V操作的信号量S初值为2,当前值为-1,则表示有(B)等待进程。A、0个B、1个C、2个D、3个分析:信号量的初始值表示系统中资源的数目,每次的Wait操作意味着进程请求一个单位的资源,信号量进行减1的操作,当信号量小于0时,表示资源已分配完毕,进程自我阻塞。因此,如果信号量小于0,那么信号量的绝对值就代表当前阻塞进程的个数。所以本题的答案是B。 【例5】发生死锁的必要条件有四个,要预防死锁的发生,可以破坏这四个必要条件,但破坏(A)条件是不太实际的。 A、互斥 B、请求和保 C、不剥夺 D、环路等待 分析:预防死锁是指通过破坏死锁的某个必要条件来防止死锁的发生。四个必要条件中,后三个条件都可以被破坏,而第一个条件,即“互斥”条件,对某些像打印机这样的设备,可通过SPOOLing技术予以破坏,但其他资源,因受它们的固有特性的限制,该条件不仅不能被破坏,反而应加以保证。所以本题的答案是A。 【例6】有m个进程共享同一临界资源,若使用信号量机制实现对临界资源的互斥访问,则信号量值的变化范围是1 至1-m。

进程同步互斥1

进程的同步互斥实验 实验目的 1、进一步认识并发执行的实质 2、分析进程竞争资源的现象,学习解决进程同步互斥的方法 实验内容 1、编写程序,使用相关函数实现父子进程对共享文件的同步互斥访问。 2、修改程序,观察对临界资源访问的互斥控制的作用。 实验基础 一、临界资源的互斥访问 为了实现多进程对临界资源的互斥访问,一个进程访问临界资源的典型程序段类似如下形式: { ………. 进入区 临界区; 退出区 其余代码; ………} 其中,进入区中判断资源是否可用,如果可用,则资源数量减1,进程进入临界区;否则进程阻塞等待。退出区中资源数量加1,唤醒阻塞等待该资源的进程。进入区和退出区都是原子操作。 操作系统中,通常用信号量来实现进入区和退出区,即P操作和V操作。为了实现用户程序中对某些资源的同步互斥访问,操作系统也提供了一些函数接口,功能类似于对特定临界区的进入区和退出区功能。 二、相关的系统调用 (1)lockf(files,function,size) :用作锁定文件的某些段或者整个文件。 函数原型: #include int lockf(int files,int function;long size) 其中:files是文件描述符;参数function可以取以下值:F_LOCK:锁定一个区域。F_ULOCK:解除锁定。参数size指明了从文件当前位置开始的一段连续锁定区域的长度,当size为0时,锁定记录将由当前位置一直扩展到文件尾。 如果lockf的参数function取值为F_LOCK,而指定文件的对应区域已被其他进程锁定,

那么lockf的调用进程将被阻塞直到该区域解锁。 通过使用lockf函数,可实现多进程对共享文件进行互斥访问。进程的实现中,必须使得每个进程在使用文件前对文件加锁,使用文件后解锁。 (2)open:打开一个文件 函数原型:#include #include #include int open(char *path,int flags,mode_t mode); 其中:参数path 是指向所要打开的文件的路径名指针。 参数falgs 规定如何打开该文件,它必须包含以下值之一:O_RDONL Y,只读打开;O_WRONL Y,只写打开;O_RDWR,读/写打开;O_CREAT,当文件不存在时创建文件,需参数mode;O_APPEND,不论当前文件位置在何处,将文件指针移至文件尾,为write添加数据到文件;O_TRUNC,当以可写的方式成功打开普通文件时,截断该文件的长度为0。 参数mode 规定对该文件的访问权限。 open系统调用可以只使用前面介绍的这两个参数,省略第三个参数mode。第三个参数是在用O_CREAT创建文件时使用,指出新建文件的存取许可权。由这个参数指出的存取许可权还要和umask进行运算后才得到新建文件的真正存取许可权。该运算是由umask按位取反,再按位与上第三个参数给出的数取或(~umask&mode)。例如:umask为022,mode为0770,则新建文件的存取许可权为0750即-rwxr-x---。 (3)read:读文件 函数原型:#include int read(int fd,void *buf,size_t nbytes) 该系统调用从文件描述符fd所代表的文件中读取nbytes 个字节,到buf指定的缓冲区内。所读取的内容从当前的读/写指针所指示的位置开始,这个位置由相应的打开文件描述中的偏移值(off_set)给出,调用成功后文件读写指针增加实际读取的字节数。 使用read 系统调用时,应注意设置的数据缓冲区充分大,能够存放所要求的数据字节,因为内核只复制数据,不进行检查。 返回:-1:错误;0:文件偏移值是在文件结束处;整数:从该文件复制到规定的缓冲区中的字节数。通常这个字节数与所请求的字节数相同。除非请求的字节数超过剩余的字节数,这时将返回一个小于请求的字节数的数字。 (4)write:写文件 函数原型:#include int write(int fd,void *buf,size_t nbytes) 该调用从buf所指的缓冲区中将nbytes 个字节写到描述符fd所指的文件中。 (5)lseek:定位一个已打开文件。 函数原型:#include int lseek(int fildes,off_t offset,int whence); 系统调用根据whence指定的位置将文件描述符fildes指向文件的文件指针偏移offset

实验八 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的信号量通信机制研究与实现

系统软件与软件工程本栏目责任编辑:谢媛媛Computer Knowledge and Technology 电脑知识与技术第6卷第12期(2010年4月)基于Linux 的信号量通信机制研究与实现 袁玉锦,周群 (邯郸学院网络中心,河北邯郸056005) 摘要:该文以信号量通信理论为基础,通过对Linux 信号量相关系统调用的分析,着重讨论了内核级和用户级的信号量通信、同一进程内线程之间的通信、多用户的进程间的通信等问题,并采用ANSI C 编写了信号量通信的具体实例。 关键词:信号量;Linux ;多进程通信;线程通信 中图分类号:TP316文献标识码:A 文章编号:1009-3044(2010)12-3279-03 1信号量通信理论 操作系统原理中利用信号量来解决多进程互斥访问临界资源的问题,还可来描述多进程之间的前趋关系,即同步问题。 信号量的概念由荷兰学者E.W.Dijkstra 于1965年提出。信号量实际是一个整数,进程(也可以是线程)在信号量上的操作分2种,一种称为P 操作,另一种称为V 操作。P 操作是让信号量的值减1,V 操作是让信号量的值加1。在进行实际的操作之前,进程首先检查信号量的当前值,如果当前值大于0,则可以执行P 操作,否则进程休眠,等待其他进程在该信号量上的V 操作,因为其他进程的V 操作将让信号量的值增加,从而它的P 操作可以成功完成。某信号量在经过某个进程的成功操作之后,其他休眠在该信号量上的进程就有可能成功完成自己的操作,这时系统负责检查休眠进程是否可以完成自己的操作。 在操作系统中,信号量最简单的形式也是最初被提出时定义的形式是一个整数,多个进程可检查并设置信号量的值。这种检查并设置(Test-and-Set)操作是不可中断的,也称为“原子”操作。检查并设置操作的结果是信号量的当前值和设置值相加的结果,该设置值可以是正值,也可以是负值。根据检查并设置操作的结果,进行操作的进程可能会进入休眠状态,而当其他进程完成自己的检查并设置操作后,由系统检查前一个休眠进程是否可以在新信号量值的条件下完成相应的检查并设置操作。这样,通过信号量,就可以协调多个进程的操作,实现多进程之间通信。 操作系统原理中通常把信号、信号量通信称为低级通信,而把管道、消息队列、共享存储区通信称为高级通信。信号量分为有名、无名两种,进程间通信用有名信号量,同一进程内部通信一般用无名信号量。 2Linux 中的信号量 从意义和实现机理上,Unix System V 或Linux 的信号量与以上所述的常规信号量没有什么区别,但System V 提供的信号量机制要复杂得多,并且分为两种不同系统调用类型:一种是用内核级的信号量,有关系统调用在/usr/include/semaphore.h 中包含,一般可用于内核级的进程通信和内核级的线程通信;另一种是用户级信号量,有关系统调用在/usr/include/sys/sem.h 中包含,一般可用于多用户进程之间通信。 2.1内核级的信号量相关系统调用 int sem_init (sem_t *sem ,int pshared ,unsigned int value) 作用:为单个信号量设置初值,第一参数*sem 为指定的信号量对象;第二参数pshared 为共享标志,如值为0表示私有信号量,非0表示可以与其他进程共享的信号量;第三参数value 为要为信号量设置的初值。 相关数据结构如下: struct{struct{long int status ; int spin_lock ;}sem_lock ; int sem_value ; pthread_descr sem_waiting ; }sem_t int sem_wait (sem_t *sem); 作用:对指定的信号量进行P 操作。 Int sem_post (sem_t *sem); 作用:对指定的信号量进行V 操作。 总结:以上是内核级信号量通信常用到的三个系统调用,使用方式较为简单,但主要适用于内核级多线程之间通信,后面将给出多线程通信的具体实例。 收稿日期:2010-02-21 作者简介:袁玉锦(1980-),女,河北曲周人,邯郸学院网络中心,助教,学士,研究方向为计算机网络;周群(1981-),女,河北武安 人,助教,学士,主要研究方向为计算机网络。 ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.6,No.12,April 2010,pp.3279-3281E-mail:xsjl@https://www.360docs.net/doc/8e1238542.html, https://www.360docs.net/doc/8e1238542.html, Tel:+86-551-569096356909643279

uCOS-II互斥信号量

μCOS-II互斥信号量 Application Note AN-1002 Jean J. Labrosse https://www.360docs.net/doc/8e1238542.html,brosse@https://www.360docs.net/doc/8e1238542.html, https://www.360docs.net/doc/8e1238542.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、假定文本文件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"<

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

四种进程或线程同步互斥的控制方法 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)分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量。

相关文档
最新文档