互斥信号量问题
互斥信号量初值不同情况分析

互斥信号量初值不同情况分析作者:李洁来源:《电脑知识与技术》2022年第20期摘要:进程的同步互斥关系是进程管理中的核心内容,进程互斥关系描述中,关键的一步是设定同步互斥信号量并说明其含义和初值。
互斥信号量一般遵循一定的规律,有固定的初值,文章通过具体实例分析了互斥信号量初值的两种情况,从而说明如何使用信号量机制描述进程互斥活动。
关键词:互斥;信号量;初值中图分类号:TP316 文献标识码:A文章编号:1009-3044(2022)20-0052-02进程中存在两种制约关系,一种为直接制约关系即同步,主要是由于执行时序上的限制而形成的相互合作的制约关系;另一种为间接制约关系即互斥,主要是由于共享资源而形成的关系,这种共享的资源其特殊性在于一次仅允许一个进程使用,称为临界资源,访问临界资源的程序代码称为临界区。
在进程互斥关系中,信号量初值一般为1,含义为使用的临界资源的数量为1个,一次仅允许一个进程使用,但也存在特殊情况其初值不为1,下面就来讨论下互斥信号量的不同取值情况。
1 互斥描述多个程序在并发执行时,由于共享系统资源,如CPU、I/O设备等会形成相互制约的间接关系,这种间接制约关系称之为互斥。
为了保证这些进程能有序地运行,对于系统中的这类共享资源,必须由系统实施统一分配,即用户在要使用这些资源之前应先提出申请,而不能直接使用[1],使用结束后要释放资源。
1.1 信号量机制信號量机制指两个或两个以上进程利用彼此之间收发的简单信号来实现并发执行,是一种卓有成效的进程同步机制,被广泛应用于各种系统[2]。
信号量被定义为含有整型数据项的结构变量,其数据结构定义如下:typedef struct semaphore{int value;PCB *pointer;};其中value是信号量的值,pointer是信号量的等待队列指针。
其值大于等于零表示可供并发进程使用的某类资源数量,其值小于零表示该类资源已分配完,请求该资源的进程被阻塞,其绝对值表示等待该资源的进程数。
互斥锁 条件变量 信号量 区别

互斥锁条件变量信号量区别
一、根本的区别
互斥:
锁的本质是一种同步技术,其原理是阻止多个线程同时访问某个资源,保证其他线程在某一时刻只有一个线程可以访问此资源。
通常情况下,互斥锁可以同步一个复杂的数据结构或某一个固定的资源,它可以使一个进程在完成特定操作之前锁住共享资源,其它进程或线程只能等待该进程释放锁后才能访问该资源,这种机制称为互斥。
条件变量:
条件变量能够控制哪些线程被挂起和唤醒,而不是去控制线程本身操作资源的依次,他提供一种机制,当某个特定时刻,特定需求满足时,就唤醒其它等待线程,减少线程等待时间。
信号量:
信号量也是一种线程同步技术,其本质是一个计数器,用来统计可以访问的资源的个数,其可以实现资源的限制,比如一次最多只有5个线程可以访问某个资源,其它线程需要等待。
二、各自的特点
互斥锁:
互斥量的特点是,只有当资源上没有线程使用时,才能进行访问,所有,它用于控制多个进程对共享数据的访问。
条件变量:
条件变量能够控制哪些线程被挂起和唤醒,而不是去控制线程本身操作资源的依次,他提供一种机制,当某个特定时刻,特定需求满足时,就唤醒其它等待线程,减少线程等待时间。
信号量:
信号量能够控制进程在某个资源有多少个可用,一旦可用资源耗尽,就可以使其他进程等待,直到有更多的可用资源,以保证有序的访问。
互斥量和信号量

互斥量和信号量1. 什么是互斥量和信号量?1.1 互斥量(Mutex)互斥量是一种同步原语,用于控制对共享资源的访问。
它允许多个线程或进程并发执行,但是只有一个线程或进程可以同时访问共享资源。
当一个线程或进程要访问共享资源时,它必须先获得互斥量的所有权,其他线程或进程必须等待。
互斥量有两种状态:锁定和解锁。
当一个线程或进程获得互斥量的所有权时,它将互斥量锁定,并且其他线程或进程无法获得该互斥量的所有权。
只有当持有互斥量的线程或进程释放了该互斥量后,其他线程或进程才能获取到该互斥量的所有权。
1.2 信号量(Semaphore)信号量也是一种同步原语,用于控制对共享资源的访问。
与互斥量不同的是,信号量可以允许多个线程或进程同时访问共享资源。
信号量有一个计数器和一个等待队列。
当一个线程或进程要访问共享资源时,它必须先尝试获取信号量的所有权。
如果信号量的计数器大于零,线程或进程将获得信号量的所有权并继续执行。
如果信号量的计数器等于零,线程或进程将被阻塞并加入到等待队列中。
当持有信号量的线程或进程释放了该信号量后,等待队列中的一个线程或进程将被唤醒,并获得信号量的所有权。
这样就实现了多个线程或进程同时访问共享资源的控制。
2. 互斥量和信号量的应用场景2.1 互斥量的应用场景互斥量常用于以下情况:•多个线程需要访问共享资源,但是只能有一个线程能够访问。
•防止竞态条件(Race Condition)发生,保证共享资源在同一时间只被一个线程访问。
•在多线程编程中实现临界区(Critical Section)。
2.2 信号量的应用场景信号量常用于以下情况:•控制对有限资源(如数据库连接、文件句柄等)的并发访问。
•控制对共享数据结构(如缓冲区、队列等)的并发操作。
•控制对临界区(Critical Section)的并发访问。
3. 互斥量和信号量的实现方式3.1 互斥量的实现方式互斥量的实现方式有多种,常见的有以下几种:•基于硬件指令:一些处理器提供了硬件级别的原子操作指令,可以用来实现互斥量。
信号量机制解决互斥问题实验报告

信号量机制解决互斥问题实验报告一、实验目的本实验旨在通过实际操作,深入理解信号量机制在解决互斥问题中的应用,并掌握其实现原理。
通过实验,我们将观察信号量如何确保对共享资源的互斥访问,从而提高多线程程序的安全性和稳定性。
二、实验环境操作系统:Linux编程语言:C语言开发工具:gcc编译器、终端三、实验原理信号量机制是一种常用的同步原语,用于解决多线程或多进程间的互斥问题。
信号量是一个整数值,通常用于表示资源的数量。
在解决互斥问题时,信号量通过维护一个非负的整数值来确保对共享资源的互斥访问。
四、实验步骤创建两个线程,它们需要访问共享资源。
使用信号量来同步这两个线程,确保它们不会同时访问共享资源。
在访问共享资源之前,线程必须获取信号量。
如果信号量的值为0,线程将被阻塞,直到信号量的值变为正值。
当线程完成对共享资源的访问后,释放信号量,使其值加1。
重复上述步骤,直到完成所有线程的同步操作。
五、实验代码实现以下是一个简单的C语言示例代码,演示了如何使用信号量解决互斥问题:#include <stdio.h>#include <pthread.h>// 定义共享资源数和线程数#define RESOURCE_COUNT 5#define THREAD_COUNT 2// 定义信号量变量pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;int semaphore = RESOURCE_COUNT; // 初始化为可用资源数void *thread_func(void *arg) {int i;for (i = 0; i < RESOURCE_COUNT; i++) {pthread_mutex_lock(&mutex); // 获取互斥锁,保护临界区代码printf("Thread %ld is accessing resource %d\n",pthread_self(), i);semaphore--; // 占用一个资源pthread_mutex_unlock(&mutex); // 释放互斥锁,允许其他线程进入临界区代码sleep(1); // 模拟耗时操作}pthread_exit(NULL);}int main() {pthread_t threads[THREAD_COUNT];int i;for (i = 0; i < THREAD_COUNT; i++) {pthread_create(&threads[i], NULL, thread_func, NULL); // 创建线程并执行函数thread_func()}for (i = 0; i < THREAD_COUNT; i++) {pthread_join(threads[i], NULL); // 等待所有线程执行完毕}return 0;}六、实验结果与分析通过运行上述代码,我们可以观察到以下实验结果:在多线程环境下,当一个线程正在访问共享资源时,其他线程将被阻塞,直到资源被释放。
操作系统信号量例题

操作系统信号量例题信号量是操作系统中用于同步和互斥的一种机制。
它可以用于进程间的通信和资源的管理。
下面我将从多个角度来回答关于操作系统信号量的例题。
1. 什么是信号量?信号量是一个整数变量,用于控制对共享资源的访问。
它可以是二进制信号量(取值为0或1)或计数信号量(取值大于等于0)。
二进制信号量用于互斥访问共享资源,计数信号量用于控制资源的数量。
2. 信号量的基本操作有哪些?常见的信号量操作有P操作(等待操作)和V操作(发送操作)。
P操作用于申请资源,如果资源不可用,则进程将被阻塞。
V操作用于释放资源,使得其他等待资源的进程可以继续执行。
3. 请举个例子说明信号量的使用场景。
假设有一个共享资源,比如打印机,多个进程需要使用它。
为了避免冲突,可以使用信号量来进行控制。
当一个进程要使用打印机时,它需要执行P操作来申请打印机资源,如果打印机正在被其他进程使用,则该进程将被阻塞。
当打印机空闲时,进程执行V操作释放打印机资源,其他等待资源的进程可以继续执行。
4. 信号量如何实现互斥?互斥是指只允许一个进程访问共享资源。
可以使用二进制信号量来实现互斥。
当一个进程要访问共享资源时,它执行P操作申请资源,如果资源已经被其他进程占用(信号量的值为0),则该进程被阻塞。
当资源被释放时,执行V操作使得等待资源的进程可以继续执行。
5. 信号量如何实现同步?同步是指多个进程按照一定的顺序执行。
可以使用计数信号量来实现同步。
例如,有两个进程A和B,进程A需要等待进程B完成某个操作后才能继续执行。
可以使用一个计数信号量来控制,初始值为0。
进程A执行P操作等待信号量,进程B完成操作后执行V 操作释放信号量,进程A才能继续执行。
6. 信号量的优缺点是什么?信号量的优点是可以实现进程间的同步和互斥,避免竞态条件和资源冲突。
它是一种简单而有效的机制。
然而,信号量也存在一些缺点。
例如,信号量的使用需要谨慎,如果使用不当可能导致死锁或活锁的发生。
信号量 p、v操作,利用信号量实现互斥的方法-概述说明以及解释

信号量p、v操作,利用信号量实现互斥的方法-概述说明以及解释1.引言1.1 概述信号量(Semaphore)是一种重要的同步工具,在并发编程中起到了关键的作用。
它是由荷兰计算机科学家艾兹赫尔·迪科斯彻兹于1965年提出的。
信号量可以用于控制对共享资源的访问,实现进程或线程之间的互斥和同步。
在计算机系统中,多个进程或线程可能需要同时访问某个共享资源,这时就会引发竞争条件(Race Condition)问题。
竞争条件会导致数据不一致性和程序错误,为了解决这个问题,需要引入互斥机制来保证共享资源在任意时刻只能被一个进程或线程访问。
信号量的引入能够有效地解决互斥问题。
它通过一个计数器来控制对共享资源的访问。
这个计数器被称为信号量的值,其可以是一个非负整数。
当信号量的值大于等于0时,表示共享资源可用,进程可以继续访问。
当信号量的值小于0时,表示共享资源不可用,进程需要等待其他进程释放该资源后才能继续访问。
信号量的实现依赖于两个操作:P(Proberen)和V(Verhogen)。
P操作用于申请共享资源,即进程想要对共享资源进行访问时,必须先进行P操作。
如果信号量的值大于等于1,即资源可用,那么P操作会将信号量的值减1,并允许进程继续访问共享资源。
如果信号量的值小于1,即资源不可用,那么进程就需要等待。
V操作用于释放共享资源,即进程访问完共享资源后,必须进行V操作,将信号量的值加1,以便其他进程可以访问该资源。
利用信号量实现互斥的方法,就是通过对共享资源进行P和V操作,来控制对资源的访问。
在访问共享资源之前,进程需要先执行P操作锁定资源,访问完毕后再执行V操作释放资源。
这样就能够保证在任意时刻只有一个进程能够访问共享资源,实现了互斥。
总结起来,信号量是一种重要的同步工具,通过P和V操作可以实现对共享资源的互斥访问。
利用信号量实现互斥的方法可以有效地解决竞争条件问题,保证数据的一致性和程序的正确性。
详解UCOS中的互斥信号量

详解UCOS中的互斥信号量二值信号量主要用于进行共享资源的独占式访问,比如我们用一个变量来标志一个资源是否可用,当这个变量为1的时候表示资源可用,当这个资源为0的时候表示资源不可用,但是二值信号量容易产生优先级反转,影响系统的实时性。
互斥信号量一般用于降解优先级反转,优先级反转就是高优先级的任务的优先级被拉低了。
具体如下:我们有三个任务Task1,Task2,Task3,三个任务的优先级依次降低。
void Task1(){while(1){OSSemPend();//获取信号量......OSSemPost();//释放信号量}}void Task2(){while(1){//注意任务2不需要信号量}}void Task3(){while(1){OSSemPend();//获取信号量OSSemPost();//释放信号量}}void main(){OSInit();CreateTask(Task1);//1最高CreateTask(Task2);//2CreateTask(Task3);OSStart();}如上图所示:在任务2获得信号量的时候,任务1恢复就绪态之后因为没有获得信号量而挂起,所以任务3继续执行,直到任务3执行完毕之后,任务1才开始执行。
虽然任务1的优先级最高,但是因为信号量的原因而是任务1的优先级降到任务3的优先级水平。
而且任务2加重了优先级反转的程度。
当我们使用了互斥信号量之后,就可以在某种程度上缓解优先级反转的问题了。
当高优先级的任务请求互斥信号量时,如果低优先级的任务占有该信号量,则先提升低优先级任务的优先级,使之尽快执行完以释放互斥信号量,这样高优先级的任务也能尽快执行,在某种程度上缓解了优先级反转问题。
使用了互斥信号量之后的运行图如下:如图所示,在任务3执行的过程中,任务1请求互斥信号量,提升任务3的优先级到最高,使任务3尽快执行完,任务3执行完后释放信号量,任务1开始执行。
学生在理解信号量实现进程同步与互斥时常见问题

学生在理解信号量实现进程同步与互斥时常见问题作者:李畅来源:《科技视界》2014年第36期【摘要】在计算机教学过程中,利用信号量实现进程同步与互斥既是重点也是难点。
本文重点讨论在教学过程中发现学生用信号量时的常见问题并给出这些问题的解决方法。
【关键词】进程互斥;进程同步;信号量0 引言操作系统作为计算机专业学生的必修课程,是非常重要的一门核心课程。
笔者在操作系统教学过程中发现在所有的章节中,进程的互斥与同步是学生最难掌握的部分。
本文详细分析了学生在进程互斥与同步学习过程中遇到的常见问题,并提出解决方法。
1 进程互斥与同步概念现代操作系统的三个主要特征是并发性、资源共享和异步性。
所谓并发性是指两个或多个活动在同一时间间隔内发生,在多道程序环境下是指在一段时间内可有多道程序同时运行。
正是由于并发机制才导致了程序的执行不可预测,并发性又是系统能够实现资源共享的必要条件。
系统中的多个并发进程之间因为共享资源而形成两种相互制约关系:间接制约关系——互斥,直接制约关系——同步。
[5]1.1 进程互斥是进程间的一种间接制约关系,他们并不知道其他进程的存在。
例如,在批处理系统中,系统分别为各个作业建立了进程;在分时系统中,系统分别为每个用户建立了一个进程。
这些进程同处于一个系统中,必然存在资源共享的关系。
由于某些资源的属性要求一次只能有一个进程访问,我们称这样的资源为临界资源。
[3]由于系统不能允许多个进程同时访问临界资源,所以进程间必然产生对资源的竞争。
因此,互斥直观理解就是一种竞争关系。
例如一个学生宿舍房间内的洗漱间使用问题;显然,洗漱间在没有人使用时(可以看成初始状态),对于任何一个同学都是可用的,其洗漱间的信号量初值应当为1(表达一种状态,也可以看成资源的数目,不过作为一种状态更恰当),见图1。
(谁的速度快的问题)。
图1 互斥的事例图2 同步的事例1.2 进程同步多个进程知道彼此的存在,更多的表现出一种合作关系。
用信号量机制来解决进程的同步与互斥:PV操作

用信号量机制来解决进程的同步与互斥:PV操作首先确定进程间的关系,然后确定信号量及其值。
判断进程间是否互斥的关键:看进程间是否共享某一公有资源,一个公有资源与一个信号量相对应。
确定信号量的值是一个关键点,它代表了可用资源实体数。
举例:票大厅容纳的人数限制为20人,少于20人时购票者可以进入,否则要在厅外等候。
进程间是同步时:是否存在合作关系,是否需要互通消息首先判断进程间的关系为同步的,且为各并发进程设置私有信号量,然后为私有信号量赋初值,最后利用PV原语和私有信号量规定各进程的执行顺序。
举例:公交车上司机与售票员的行为,司机到站停车后,售票员方可开门,售票员关门后,司机方可开车。
进程同步应用示例讲解:1桌上有一个盘子,可以存放一个水果。
父亲总是把苹果放在盘子中,母亲总是把香蕉放在盘子中;一个儿子专等吃盘中的香蕉,一个女儿专等吃盘中的苹果。
1)系统要设几个进程来完成这个任务?各自的工作是什么?2)这些进程间有什么样的相互制约关系?3)用P,V操作写出这些进程的同步算法(注:标明信号量的含义)。
1)需要四个进程进程描述:Father:父亲放置苹果的进程;Mother:母亲放置香蕉的进程;Son:儿子吃香蕉的进程;Daughter:女儿吃苹果的进程。
分析:四人公用一个盘子;盘子每次只能放一个水果,当盘子为空时,父母均可尝试放水果,但一次只能有一人成功;盘中是香蕉,儿子吃,女儿等;盘中是苹果,女儿吃,儿子等。
2)进程之间既有互斥又有同步关系。
Father进程和Mother进程要互斥的向盘中放水果,应设置一互斥信号量dish,初值为1,表示盘子为空;Father进程要设置同步信号量apple,用于给Daughter进程传送消息,初值为0,表示还没有消息产生,即没有放苹果;相应Daughter进程也要向父、母进程传送盘子为空的消息。
Mother进程要设置同步信号量banana,用于给Son进程传送消息,初值为0,表示还没有消息产生,即没有放香蕉。
临界区,互斥量,信号量,事件的区别

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

进程的同步
例1:请用信号量机制描述下列并发进程的同步关系。 请用信号量机制描述下列并发进程的同步关系。
S P1
P2
P3
P4 F
进程的同步
解法一:信号量表示进程能否开始。 解法一:信号量表示进程能否开始。 设信号量m1、m2、m3、m4分别表示进程 、P2、 分别表示进程P1 设信号量m1、m2、m3、m4分别表示进程P1、P2、 P3、P4能否开始执行,其初值m1为1,其余均为0。 P3、P4能否开始执行 其初值m1为 其余均为0 能否开始执行,
思考: 思考: 哪个信号量可以省略? 哪个信号量可以省略?
m1 p4() {
P(m3) ; 执行p3; 执行p3; V(m4) ;
P(m4) ; P(m4); P(m4); 执行p4; 执行p4;
}
}
}
}
进程的同步
解法二:信号量表示进程是否结束。 解法二:信号量表示进程是否结束。 设信号量m1、m2、m3、m4分别表示进程 、P2、 分别表示进程P1 设信号量m1、m2、m3、m4分别表示进程P1、P2、 P3、P4是否结束,其初值均为0。 P3、P4是否结束 其初值均为0 是否结束,
进程的同步
例3-2:吃水果。 吃水果。 父亲 父亲 { 洗水果; 洗水果; 放水果; 放水果; } } P1 0 桔子 苹果 女儿 儿子 { 取桔子; 取桔子; 吃桔子; 吃桔子; } P2 女儿 P3 while(true) { 取苹果; 取苹果; 吃苹果; 吃苹果; 儿子
while (true)
p3() { while(1) { P(m3) ; 取苹果; 取苹果; V(m1); V(m1); 吃苹果; 吃苹果; } }
进程的同步
第2章信号量概念和互斥

• signal(s) signal(semaphore *s) { s.value ++; 操作描述:
}
if (s.value<=0) wakeup(s.list);
signal原语的操作主要动作是: (1) s.value加1; (2) 若s.value加1后,结果大于零,进程继续执行; (3) 若s.value加1,结果小于或等于零,则从该信号的 等待队列中唤醒一等待进程,然后再返回原进程继 续执行或转进程调度。
wait(mutex) 临界区(CS) signal(mutex) 剩余区 进程互斥 模型
}
mxh
用信号量实现进程互斥
利用信号量能方便地解决临界区问题。 设有n个进程,用数组P(i)表示,设与n个进程共享的临界 资源对应的互斥信号量为s。信号量初始化为1,表示初始状 态时共享资源是空闲的。只需把各个进程临界区的程序段置 于wait(s)和signal(s)之间即可实现n个进程的互斥。 进程P(1) …
6 )s +1 =2 释放资源
signal(s)
signal(s)
4 ) s +1 =0
5 )s +1 =1
释放资源
临界区
唤醒P3
mxh
2. 利用信号量实现前趋关系 P1 () { …. S1; //语句S1 …. }
P2 () { …. S2; //语句2 …. }
希望 S1 S2,只需使进程P1和P2共享一个公用信号量S=0, 将signal(S)放在语句S1后,将wait(S)放在语句S2前。
mxh
• 互斥问题中
–对信号量mutex必须设置一次初值,初值必
须为1。
–wait、signal 原语操作应该分别紧靠临界区的头 部和尾部。 –wait、signal 原语操作必须成对出现,而且它们 同处于同一个进程中。
线程同步(信号量,互斥,条件变量)

线程同步(信号量,互斥,条件变量)收藏进行多线程编程,最头疼的就是那些共享的数据。
因为你无法知道哪个线程会在哪个时候对它进行操作,你也无法得知那个线程会先运行,哪个线程会后运行。
下面介绍一些技术,通过他们,你会合理安排你的线程之间对资源的竞争。
l 互斥量Mutexl 信号灯Semophorel 条件变量Conditions先说一下互斥量。
什么时候会用上互斥量了?比如你现在有一全局链表,你有几个工作线程。
每一个线程从该链表中取出头节点,然后对该头节点进行处理。
比如现在线程1正在取出头节点,他的操作如下:Item * p =queue_list;Queue_list=queue_list->next;Process_job(p);Free(p);当线程1处理完第一步,也就是Item *p=queue_list后,这时候系统停止线程1的运行,改而运行线程2。
线程2照样取出头节点,然后进行处理,最后释放了该节点。
过了段时间,线程1重新得到运行。
而这个时候,其实p所指向的节点已经被线程2释放掉,而线程1对此毫无知晓。
他会接着运行process_job(p)。
而这将导致无法预料的后果!对于这种情况,系统给我们提供了互斥量。
你在取出头节点前必须要等待互斥量,如果此时有其他线程已经获得该互斥量,那么线程将会阻塞在这个地方。
只有等到其他线程释放掉该互斥量后,你的线程才有可能得到该互斥量。
为什么是可能了?因为可能此时有不止你一个线程在等候该互斥量,而系统无法保证你的线程将会优先运行。
互斥量的类型为pthread_mutex_t。
你可以声明多个互斥量。
在声明该变量后,你需要调用pthread_mutex_init()来创建该变量。
pthread_mutex_init的格式如下:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex-attr_t *mutexattr);第一个参数,mutext,也就是你之前声明的那个互斥量,第二个参数为该互斥量的属性。
操作系统应用题答案

1、解:因为打印机是一种临界资源,所以这三个进程只能互斥使用这台打印机,即一个用户的计算结果打印完之后,另一个用户再打印。
设三个进程分别为A、B和C。
设一个互斥信号量mutex,其初值为1。
A进程 B进程 C进程P(mutex) P(mutex) P(mutex)使用打印机使用打印机使用打印机V(mutex) V(mutex) V(mutex)2、解:①这个算法不对。
因为A、B两进程共用一个缓冲区Q,假如A先运行,且信息数量足够多,那么缓冲区Q中的信息就会发生后面的冲掉前面的,造成信息丧失,B就不能从Q中读出完好的信息。
改正:A、B两进程要同步使用缓冲区Q。
为此,设立两个信号量:empty表示缓冲区Q为空,初值为1;full表示缓冲区Q为满,初值为0。
算法框图如图1所示。
②这个算法不对。
因为A、B两个进程是并发的,它们共享一个临界资源,所以二者应互斥地使用该临界资源,在进入临界区时不存在A先B后的时序关系,而是哪个进程先到一步就先进入自己的临界区。
改正:A、B两个进程应互斥地进入临界区。
为此,设立一个信号量:互斥信号量mutex,其初值为1。
算法框图如图2所示。
A进程 B进程 A进程 B进程代码CSbV(full) V(empty) V(mutex)V(mutex)图1 图 23、解:①系统可设三个进程来完成这个任务:R进程负责从卡片输入机上读入卡片信息,输入到缓冲区B1中;C进程负责从缓冲区B1中取出信息,进展加工处理,之后将结果送到缓冲区B2中;P进程负责从缓冲区B2中取出信息,并在打印机上印出。
②R进程受C进程影响,B1放满信息后R进程要等待——等C进程将其中信息全部取走,才能继续读入信息;C进程受R进程和P进程的约束:B1中信息放满后C进程才可从中取出它们,且B2被取空后C进程才可将加工结果送入其中;P进程受C进程的约束:B2中信息放满后P进程才可从中取出它们,进展打印。
③信号量含义及初值:B1full——缓冲区B1满,初值为0;B1empty——缓冲区B1空,初值为0;B2full——缓冲区B2满,初值为0;B2empty——缓冲区B2空,初值为0;4、解:作业周转时间等待时间JOB1 7 3JOB2 5 3JOB3 4 2所有作业的平均周转时间5.335、解:(1) 非抢占式优先级算法作业1 作业3 作业2| | | | t10 13 17(2)6、解:480K+154。
临界区,互斥量,信号量,事件的区别

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

信号量与互斥锁信号量与普通整型变量的区别:①信号量(semaphore)是非负整型变量,除了初始化之外,它只能通过两个标准原子操作:wait(semap) , signal(semap) ; 来进行访问;②操作也被成为PV原语(P来源于Dutch proberen"测试",V来源于Dutch verhogen"增加"),而普通整型变量则可以在任何语句块中被访问;信号量与互斥锁之间的区别:1. 互斥量用于线程的互斥,信号线用于线程的同步。
这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。
但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。
在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。
少数情况是指可以允许多个访问者同时访问资源2. 互斥量值只能为0/1,信号量值可以为非负整数。
也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。
信号量可以实现多个同类资源的多线程互斥和同步。
当信号量为单值信号量是,也可以完成一个资源的互斥访问。
3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。
信号量信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。
信号量可以分为几类:²二进制信号量(binary semaphore):只允许信号量取0或1值,其同时只能被一个线程获取。
²整型信号量(integer semaphore):信号量取值是整数,它可以被多个线程同时获得,直到信号量的值变为0。
²记录型信号量(record semaphore):每个信号量s除一个整数值value(计数)外,还有一个等待队列List,其中是阻塞在该信号量的各个线程的标识。
用信号量机制实现进程互斥、同步、前驱关系

信号量机制实现进程互斥
分析问题,确定临界区
设置互斥信号量,初值为1
临界区之前对信号量执行P操作
临界区之后对信号量执行V操作
前P后V
实现进程同步
分析问题, 找出哪里需要实现“一前一后”的同步关系
设置同步信号量, 初始值为0
在“前操作”之后执行V操作
在“后操作”之前执行P操作
前V后P
实现进程的前驱关系
什么是前驱关系: 当某段代码执行之后,另一段代码才可以执行。
分析问题, 画出前驱图, 把每一对前驱关系看作同步关系
为每一对前驱关系设置同步信号量, 初值为0
在每个“前操作”之后执行V操作
在每个“后操作”之前执行P操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
parend
end
哲学家进餐问题1. 利用记录型信号量解决哲学家进餐问题
放在桌子上的筷子是临界资源,在一段时间内只允许一个哲学家使用。为实现对筷子的互斥使用,用一个信号量表示一只筷子,五个信号量构成信号量数组。
Var chopstick: array [0, …, 4] of semaphore;
所有信号量均被初始化为1。第i 位哲学家的活动可描述为:
repeat
wait(chopstick[ i ]);
wait(chopstick[ ( i +1) mod 5] );
s=1:无进程进入临界区;
s=0:有一个进程进入临界区;
s=-1: 有一个进程在临界区,另一个进程等待进入临界区。
对于n个并发进程,信号量S可取值的范围是: 1~ -(n-1),当S<0时,表示有一个进程已进入临界区,而且还有|S|个进程正在等待进入临界区,它们处于等待队列中。
consume the item in nexc;
until false;
end
perform write operation;
signal(wmutex);
until false;
until false;
end
Writer : begin
repeat
wait(wmutex);
end
consumer : begin
repeat
Swait(full, mutex);
begin
parbegin
Reader : begin
repeat
wait(rmutex);
if Readcount=0 then wait(wmutex);
Readcount :=Readcount +1;
signal(rmutex);
Process i
repeat
think;
Swait(chopstick[ ( i +1) mod 5] , chopstick[ i ] );
eat;
Ssignal(chopstick[ ( i +1) mod 5] , chopstick[ i ] );
…
eat;
…
signal(chopstick[ i ]);
signal(chopstick[ ( i +1) mod 5] );
…
think;
until false;
解决方法:
至多只允许有四位哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕后释放出他用过的两只筷子,从而使更多的哲学家能够进餐。---限制并发执行的进程数
读时,Reader才需要执行Wait(Wmutex)操作。若Wait(Wmutex)操作成功,Reader进程便可去读x, wmutex :semaphore :=1, 1;
Readcount :integer :=0;
in:=(in+1) mod n;
Ssignal(mutex, full);
until false;
until false;
关于信号量的进一步说明:1记录型信号量可以用于两个进程,也可以用于多个进程,既可以用于互斥,也可以用于同步。当互斥与同步共存时,一般来说,用于互斥的信号量上的Wait操作总是在后执行。2如果用于互斥,常称为互斥(或公用)信号量,其初值为1。对于两个并发进程,S只有1、0、-1三个取值:
控开关。
产者——消费者问题
Var mutex, empty, full: semaphore :=1, n, 0;
buffer: array [ 0, …, n-1] of item;
in, out: integer :=0, 0;
begin
parend
end
读者——写者问题:一个数据文件或记录可被多个进程共享。
只要求读文件的进程称为“Reader进程”,其它进程则称为“Writer进程”。
允许多个进程同时读一个共享对象,但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对
parbegin
producer : begin
repeat
…
produce an item in nexp;
对于互斥信号量,每一进程均可对其进行Wait、Signal操作。
如果用于同步,多采用私用信号量,也称为资源信号量,其初值视资源数而定。它联系一组并发进程,只允许拥有它的进程对其实施Wait操作。
作为资源信号量,当S>0时,其值表示可用资源的数量,执行一次Wait操作意味着请求分配一个单位的资源;若S<=0,表示已无资源,申请资源的进程被阻塞,并排入信号量S的等待队列中,执行一次Signal操作,意味着释放一个单位的资源。
…
perform read operation;
…
wait(rmutex);
Readcount :=Readcount -1;
if Readcount=0 then signal(wmutex);
signal(rmutex);
象。
“读者——写者问题”是保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题。为实现Reader
与Writer进程间在读或写时的互斥而设置了一个互斥信号量Wmutex。设置整型变量Readcount表示正在读的进程
数目。
由于只要有一个Reader进程在读,便不允许Writer进程去写。因此,仅当Readcount=0,表示尚无Reader进程在
2010年01月10日 星期日 下午 05:53信号量机制一般信号量集的几种特殊情况:
Swait(S, d, d),只有一个信号量S,允许每次申请d个资源,若现有资源数少于d,不予分配。
Swait(S, 1, 1),蜕化为一般的记录型信号量(S>1时)或互斥信号量(S=1时)。
Swait(S, 1, 0),当S>=1时,允许多个进程进入某特定区,当S变为0后,阻止任何进程进入特定区,相当于可
nextc:=buffer(out);
out:=(out+1) mod n;
Ssignal(mutex, empty);
…
Swait(empty, mutex);
buffer(in):=nexp;
仅当哲学家的左右两只筷子均可用时,才允许他拿起筷子进餐。---采用信号量集
规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子;偶数号哲学家则相反。---保证总会有一个哲学家能同时获得两只筷子而进餐2. 利用AND信号量机制解决哲学家进餐问题
Var chopstick: array [0, …, 4] of semaphore:=(1, 1, 1, 1, 1);