操作系统中的信号量(sema)与互斥(mutex)

原创 2016年08月28日 15:37:45

信号量:那是多线程同步用的,一个线程完成了某一个动作就通过信号告诉别的线程,别的线程再进行某些动作。

互斥量:这是多线程互斥用的,比如说,一个线程占用了某一个资源,那么别的线程就无法访问,知道这个线程离开,其他的线程才开始可以利用这个资源。

 

信号量与普通整型变量的区别:

信号量(semaphore)是非负整型变量,除了初始化之外,它只能通过两个标准原子操作:wait(semap), signal(semap) ; 来进行访问;原子操作操作也被成为PV原语(P来源于Dutchproberen"测试",V来源于Dutchverhogen"增加"),而普通整型变量则可以在任何语句块中被访问; 

 

信号量与互斥量之间的区别:

1. 互斥量用于线程的互斥,信号线用于线程的同步。  这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。  

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。  

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源  

 

2. 互斥量值只能为0/1,信号量值可以为非负整数。  

也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。  

 

3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

 

【附】信号量与互斥量详细分析

信号量(Semaphore)

信号量,有时也称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。 

信号量可以分为几类:  

二进制信号量(binarysemaphore):只允许信号量取0或1值,其同时只能被一个线程获取。  

整型信号量(integersemaphore):信号量取值是整数,它可以被多个线程同时获得,直到信号量的值变为0。  

记录型信号量(recordsemaphore):每个信号量s除一个整数值value(计数)外,还有一个等待队列List,其中是阻塞在该信号量的各个线程的标识。当信号量被释放一个,值被加一后,系统自动从等待队列中唤醒一个等待中的线程,让其获得信号量,同时信号量再减一。  

信号量通过一个计数器控制对共享资源的访问,信号量的值是一个非负整数,所有通过它的线程都会将该整数减一。如果计数器大于0,则访问被允许,计数器减1;如果为0,则访问被禁止,所有试图通过它的线程都将处于等待状态。  

计数器计算的结果是允许访问共享资源的通行证。因此,为了访问共享资源,线程必须从信号量得到通行证, 如果该信号量的计数大于0,则此线程获得一个通行证,这将导致信号量的计数递减,否则,此线程将阻塞直到获得一个通行证为止。当此线程不再需要访问共享资源时,它释放该通行证,这导致信号量的计数递增,如果另一个线程等待通行证,则那个线程将在那时获得通行证。  

Semaphore可以被抽象为五个操作:  

-创建Create  

-等待 Wait: 线程等待信号量,如果值大于0,则获得,值减一;如果只等于0,则一直线程进入睡眠状态,知道信号量值大于0或者超时。  

-释放 Post:执行释放信号量,则值加一;如果此时有正在等待的线程,则唤醒该线程。  

-试图等待TryWait:如果调用TryWait,线程并不真正的去获得信号量,还是检查信号量是否能够被获得,如果信号量值大于0,则TryWait返回成功;否则返回失败。  

-销毁Destroy  

 

互斥量(Mutex)  

互斥量表现互斥现象的数据结构,也被当作二元信号灯。一个互斥基本上是一个多任务敏感的二元信号,它能用作同步多任务的行为,它常用作保护从中断来的临界段代码并且在共享同步使用的资源。  

Mutex本质上说就是一把锁,提供对资源的独占访问,所以Mutex主要的作用是用于互斥。Mutex对象的值,只有0和1两个值。这两个值也分别代表了Mutex的两种状态。值为0, 表示锁定状态,当前对象被锁定,用户进程/线程如果试图Lock临界资源,则进入排队等待;值为1,表示空闲状态,当前对象为空闲,用户进程/线程可以Lock临界资源,之后Mutex值减1变为0。  

Mutex可以被抽象为四个操作:

-创建Create

-加锁 Lock

-解锁Unlock

-销毁Destroy  

Mutex被创建时可以有初始值,表示Mutex被创建后,是锁定状态还是空闲状态。在同一个线程中,为了防止死锁,系统不允许连续两次对Mutex加锁(系统一般会在第二次调用立刻返回)。也就是说,加锁和解锁这两个对应的操作,需要在同一个线程中完成。  

相关文章推荐

操作系统的信号量 进程互斥 同步等概念

摘 要: 本文针对目前操作系统中利用信号量解决进程间的同步和互斥的问题,系统地总结了解决问题的一般性规律。首先介绍了信号量的定义及在信号量上可以执行的两个操作,并分别详细说明了如何利用信号量实现进程...

哈工大操作系统试验4 信号量的实现和应用

这次试验,涉及前几次实验的综合运用,比较难,明天问老师之后,会逐步完善。 //======================================实验报告==================...

操作系统的信号量和管程

信号量 semaphore 信号量是操作系统提供的一种协调共享资源访问的方法 软件同步是平等线程间的一种同步协商机制 OS是管理者,地位高于进程 用信号量表示系统资源的数量由一个整形 ...
  • TH_NUM
  • TH_NUM
  • 2016年05月20日 19:06
  • 2007

互斥量与临界区的区别

上个星期去绿盟科技面试C++开发实习生,期中被问到互斥量与临界区的区别,当时睁着我水汪汪的大眼睛不知如何是好。我没有准备好,孙鑫的MFC视频也没看通透。所以答不出来。毕竟是去练一下胆量和走一下流程。现...
  • ajioy
  • ajioy
  • 2012年05月31日 17:39
  • 8960

操作系统如何实现mutex

参考 《linux c编程一站式学习》 Mutex的两个基本操作lock和unlock是如何实现的呢?假设Mutex变量的值为1表示互斥锁空闲,这时某个进程调用lock可以获得锁,而Mutex的值为0...

Linux系统编程——线程同步与互斥:互斥锁

在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在此刻使用打印机打印东西,如果不做任何处理的话...

信号量与互斥量的区别

多任务间同步的方式包括关中断,调度器上锁, 互斥量(mutex),信号量,消息队列几种, 其中互斥量和信号量使用使用方式相近,连概念和实现都有些近似, 所以没有扎实操作系统背景知识的同学常常分不清出他...
  • tugouxp
  • tugouxp
  • 2017年04月02日 12:46
  • 527

操作系统初探-同步中的互斥问题

同步中的互斥标签(空格分隔): 操作系统系统运行过程中总会存在这样的问题:两个不同的进程可能需要“同时”访问同一资源区域。这叫同步中的互斥问题。(比如火车卖票系统卖出一张票就需要修改票的数目,然而同一...

【读书笔记】usOS-II——互斥型信号量(mutex)

2008-11-23 互斥型信号量(mutex) 互斥信号量功能: 1)  实现对资源的独占式访问(二值信号量)。 2)  降解优先级反转。 优先级反转: 使用实时内核,优...

深层次探讨mutex与semaphore之间的区别

转自点击打开链接 (上) 看过Linux内核的同学都知道,Linux内核中除了有semaphore之外,还有一个mutex lock。前者我们的操作系统教科书称之为信号量,后者不知道教科...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:操作系统中的信号量(sema)与互斥(mutex)
举报原因:
原因补充:

(最多只允许输入30个字)