- 浏览: 1487960 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (525)
- SEO (16)
- JAVA-EE-Hibernate (6)
- JAVA-EE-Struts (29)
- JAVA-EE-Spring (15)
- Linux (37)
- JAVA-SE (29)
- NetWork (1)
- CMS (14)
- Semantic Research (3)
- RIA-Flex (0)
- Ajax-Extjs (4)
- Ajax-Jquery (1)
- www.godaddy.com (0)
- SSH (34)
- JavaScript (6)
- SoftwareEngineer (9)
- CMMI (0)
- IDE-Myeclipse (3)
- PHP (1)
- Algorithm (3)
- C/C++ (18)
- Concept&Items (2)
- Useful WebSite (1)
- ApacheServer (2)
- CodeReading (1)
- Socket (2)
- UML (10)
- PowerDesigner (1)
- Repository (19)
- MySQL (3)
- SqlServer (0)
- Society (1)
- Tomcat (7)
- WebService (5)
- JBoss (1)
- FCKeditor (1)
- PS/DW/CD/FW (0)
- DesignPattern (11)
- WebSite_Security (1)
- WordPress (5)
- WebConstruction (3)
- XML|XSD (7)
- Android (0)
- Project-In-Action (9)
- DatabaseDesign (3)
- taglib (7)
- DIV+CSS (10)
- Silverlight (52)
- JSON (7)
- VC++ (8)
- C# (8)
- LINQ (1)
- WCF&SOA (5)
- .NET (20)
- SOA (1)
- Mashup (2)
- RegEx (6)
- Psychology (5)
- Stock (1)
- Google (2)
- Interview (4)
- HTML5 (1)
- Marketing (4)
- Vaadin (2)
- Agile (2)
- Apache-common (6)
- ANTLR (0)
- REST (1)
- HtmlAnalysis (18)
- csv-export (3)
- Nucth (3)
- Xpath (1)
- Velocity (6)
- ASP.NET (9)
- Product (2)
- CSS (1)
最新评论
-
lt26w:
理解成门面模式应该比较容易明白吧
FacadePattern-Java代码实例讲解 -
lt26w:
看下面的例子比较明白.
FacadePattern-Java代码实例讲解 -
javaloverkehui:
这也叫文档,别逗我行吗,也就自己看看。
HtmlCleaner API -
SE_XiaoFeng:
至少也应该写个注释吧。
HtmlCleaner API -
jfzshandong:
...
org.springframework.web.filter.CharacterEncodingFilter 配置
之前一直没有怎么关注过这个问题,前些日子在面试一家公司的时候,面试官提到了pthread_cond_wait/pthread_cond_signal的实现,当时答的不是很好,回来就查了nptl的代码。前天,水木上又有人问到了信号量和互斥锁的问题,我想还是对它们的区别与实现总结一下
。 首先了解一些信号量和线程互斥锁的语义上的区别: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 援引CU上一篇帖子的内容: 两者之间的区别: 作用域
上锁时
接下来,我们需要分析一下信号量和线程互斥锁的实现机制。 在Linux下,信号量和线程互斥锁的实现都是通过futex系统调用。 futex(快速用户区互斥的简称)是一个在Linux上实现锁定和构建高级抽象锁如信号量和POSIX互斥的基本工具。它们第一次出现在内核开发的2.5.7版;其语义在2.5.40固定下来,然后在2.6.x系列稳定版内核中出现。 Futex 是fast userspace mutex的缩写,意思是快速用户空间互斥体。Linux内核把它们作为快速的用户空间的锁和信号量的预制构件提供给开发者。Futex非常基础,借助其 自身的优异性能,构建更高级别的锁的抽象,如POSIX互斥体。大多数程序员并不需要直接使用Futex,它一般用来实现像NPTL这样的系统库。 Futex 由一块能够被多个进程共享的内存空间(一个对齐后的整型变量)组成;这个整型变量的值能够通过汇编语言调用CPU提供的原子操作指令来增加或减少,并且一 个进程可以等待直到那个值变成正数。Futex 的操作几乎全部在应用程序空间完成;只有当操作结果不一致从而需要仲裁时,才需要进入操作系统内核空间执行。这种机制允许使用 futex 的锁定原语有非常高的执行效率:由于绝大多数的操作并不需要在多个进程之间进行仲裁,所以绝大多数操作都可以在应用程序空间执行,而不需要使用(相对高代 价的)内核系统调用。 ---------------------------------------------------------------- 插播一段关于x86原子操作指令的说明: cmpxchg 比较交换指令,其语义为:
Intel白皮书上的说明如下: (* Accumulator = AL, AX, EAX, or RAX depending on whether a byte, word, doubleword, or quadword comparison is being performed *) IF accumulator = DEST THEN ZF ← 1; DEST ← SRC; ELSE ZF ← 0; accumulator ← DEST; FI; 使用此原子操作可以实现自旋锁,之前有一篇文章中描述了实现:
关于smp下的原子操作的一些说明: 原子操作是不可分割的,在执行完毕不会被任何其它任务或事件中断。在单处理器系统(UniProcessor)中,能够在单条指令中完成的操作都可以认为 是" 原子操作",因为中断只能发生于指令之间。这也是某些CPU指令系统中引入了test_and_set、test_and_clear等指令用于临界资源 互斥的原因。在对称多处理器(Symmetric Multi-Processor)结构中就不同了,由于系统中有多个处理器在独立地运行,即使能在单条指令中完成的操作也有可能受到干扰。 在x86 平台上,CPU提供了在指令执行期间对总线加锁 的手段。CPU芯片上有一条引线#HLOCK pin,如果汇编语言的程序中在一条指令前面加上前缀"LOCK" ,经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的原子性。 当然,并不是所有的指令前面都可以加lock前缀的,只有ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG,DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, 和 XCHG指令前面可以加lock指令,实现原子操作。 ---------------------------------------------------------------- 广告回来了,我们继续。 futex保存在用户空间的共享内存中,并且通过原子操作进行操作。在大部分情况下,资源不存在争用的情况下,进程或者线程可以立刻获得资源成功,实际上就没有必要调用系统调用,陷入内核了。实际上,futex的作用就在于减少系统调用的次数,来提高系统的性能。 线程互斥锁pthread_mutex_t的实现原理:
对 比,pthread_mutex_unlock()和sem_post()的实现,我们发现一个不同点,sem_post()无论如何都会调用 futex_wake(),进行系统调用。但是pthread_mutex_unlock()却符合futex的初衷,只有在需要仲裁的时候才调用 futex_wake()。那么什么是仲裁条件呢? 前面说过信号量和线程互斥锁语义上的区别在于信号量的value>=0,而线程互斥锁的value可以为负数。 对于lock操作,这两个倒是没有多少差别。信号量只要value>0就可以获得资源,线程互斥锁需要value=1。 但 是对于unlock操作,这两个就有一些差别了。信号量和线程互斥锁,都会增加对应的value。如果加1后,value为1,对于线程互斥锁来讲,实际 上表明资源可用,并且之前没有其他的线程在等待这个资源;否则说明还有其他线程在等待这个资源,需要调用futex系统调用唤醒它们。但是对于信号量,由于value必须>=0。那么加1后,即使value为1,也无法判定现在没有其他的进程或线程正在等待资源,所以必须调用futex系统调用。 例如:
感兴趣的同学可以使用strace跟踪一下,进行验证。要注意忽略程序运行初始化的那个futex_wake ;-) 参考: http://www.eetop.cn/blog/html/04/343504-14125.html http://javadino.blog.sohu.com/99256728.html http://javadino.blog.sohu.com/99256835.html http://javadino.blog.sohu.com/99256921.html |
发表评论
-
Linux内核源码包的安装及编译zz
2009-12-15 20:58 4266http://my.donews.com/ecco2005/2 ... -
Linux内核Makefile文件(二)
2009-12-15 19:34 2416=== 6 体系Makefile文 ... -
Linux内核Makefile文件(一)
2009-12-15 19:34 1834本文是/Documentation/kbuild/make ... -
Linux加载模块命令
2009-12-15 19:28 2677安装模块insmod *.ko卸载 ... -
linux内核模块编程
2009-12-15 19:25 3556主题: linux内核模块的程序结构--模块加载函数(必须), ... -
编译linux内核~
2009-12-05 22:04 1396小菜鸟第一次编译linux内核。截图太多 。。不方便上传 = ... -
grub2 基础教程
2009-12-05 18:01 2742grub2基础教程-修订版 ... -
Ubuntu9.10版本没有了menu.lst文件!
2009-12-05 18:00 3114囧~现在都在grub下面配置了。 不过麦斯之前的men ... -
Linux信号量线程控制
2009-11-30 14:31 3654线程中互斥锁的使用,达到对共享资源互斥使用。除了使用互斥锁, ... -
信号量和自旋锁
2009-11-29 21:56 1626内核同步措施 ... -
Linux信号量semaphore编程实例
2009-11-29 21:20 6539本例示范Linux信号量的基本用法。该范例使用了两个线程分别对 ... -
Linux获取当前时间
2009-11-29 21:16 3636Linux获取当前时间 ... -
pthread库学习(2): 线程的同步,使用信号量
2009-11-29 20:55 2453先看下面这段程序,主线程创建了三个线程,每个线程中均有一个打印 ... -
信号量的基本思想
2009-11-29 20:17 1455信号量是1965荷兰Dijkstra 为了解决并发进程问题 ... -
多进程通信方式一:管道(PIPE)
2009-11-27 18:29 9074进程通信(IPC)的几种方式及比较 撰文:黄显国08 ... -
进程的管道通信
2009-11-27 18:12 2981实验四 进程的管道通信 ... -
Linux下线程的挂起和恢复
2009-11-27 15:42 3700POSIX的Linux操作系统没有提供线程挂起和恢复的例程,在 ... -
Linux 编程之生成静态连接库
2009-11-27 15:41 1386静态库及动态库的建立 ... -
LInux高级编程 - 线程(Threads)
2009-11-27 15:40 1854LInux高级编程 - 线程(Threads) ... -
Linux下c开发 之 线程通信
2009-11-27 15:39 19301.Linux“线程” 进程与 ...
相关推荐
互斥锁、条件变量、信号量是系统为实现多线程(多进程)访问共享资源或共同协作的同步机制
多线程 教程 各种锁 半成品的CAS 临界区 信号量 事件 互斥锁 队列
本文实例讲述了Python多线程操作之互斥锁、递归锁、信号量、事件。分享给大家供大家参考,具体如下: 互斥锁: 为什么要有互斥锁:由于多线程是并行的,如果某一线程取出了某一个数据将要进行操作,但它还没有那么...
多个线程共享数据的时候,如果数据不进行保护,那么可能出现数据不一致现象,使用锁,信号量、条件锁 互斥锁 1. 互斥锁,是使用一把锁把代码保护起来,以牺牲性能换取代码的安全性,那么Rlock后 必须要relase 解锁...
主要介绍了Java编程中的互斥锁,信号量和多线程等待机制实例详解,简单介绍了互斥锁和信号量的区别,需要的朋友可以了解下。
Linux多线程编程中互斥锁、条件变量和信号量
VC++MFC多线程同步实例,信号量,互斥锁,事件,临界资源
C++线程模板类,锁模板类,使用非常方便,并且支持windows和linux跨平台使用。
信号量的运用环境与互斥锁一样,但是信号量比互斥锁增加灵活,互斥锁只有两个状态(开锁和解锁),而信号量本质上是一个计数器,它内部有一个变量计数信号值,可以保护一个资源可以同时被1个或者2个或者3个线程同时...
四、条件变量与互斥锁、信号量的区别 55 第六章 共享内存 56 一、什么是共享内存区 56 二、mmap 56 三、posix共享内存函数 60 四、ftruncate和fstat函数 62 五、共享内存区的写入和读出 64 六、程序例子 65
并通过多进程合并排序来显示差异其他两个问题是现实世界中两种不同类型的问题,它们被建模为具有并行处理的计算机程序,需要谨慎使用线程,互斥量,信号量和条件变量。 相关解决方案的README.md中提到了每种解决方案...
使用互斥锁和共享内存实现的非阻塞FIFO,另外代码中有包含信号量的实现。个人测试稳定,有一些注释,一起学习。如有问题,欢迎讨论。
linux任务和信号量的使用详细使用例子
四、条件变量与互斥锁、信号量的区别 55 第六章 共享内存 56 一、什么是共享内存区 56 二、mmap 56 三、posix共享内存函数 60 四、ftruncate和fstat函数 62 五、共享内存区的写入和读出 64 六、程序例子 65
互斥量的实现与进程中的信号量(无名信号量)是类似的,当然,信号量也可以用于线程,区别在于初始化的时候,其本质都是P/V操作。编译时,记得加上-lpthread或-lrt哦。 有关进程间通信(消息队列)见:进程间通信之...
在《秒杀多线程系列》的前十五篇中介绍多线程的相关概念,多线程同步互斥问题《秒杀多线程第四篇一个经典的多线程同步问题》及解决多线程同步互斥的常用方法——关键段、事件、互斥量、信号量、读写锁。为了让大家...
linux多线程编程基础,进程间的通信,进程信号量处理,互斥锁
window下的多线程,信号量、互斥锁、事件和临界区
轻量级跨平台线程/互斥体实现,包括 win32、win8、linux、macOS、iOS、android。 特征 线程。 锁。 递归锁。 条件变量(与锁集成)。 ##Advantages 重量极轻。 仅标头(无编译陷阱)。 跨平台(Windows、任何 POSIX...