﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Thinking World-随笔分类-OS</title><link>http://www.cppblog.com/willcao/category/6883.html</link><description>非澹泊无以明志,非宁静无以致远</description><language>zh-cn</language><lastBuildDate>Wed, 17 Nov 2010 08:30:06 GMT</lastBuildDate><pubDate>Wed, 17 Nov 2010 08:30:06 GMT</pubDate><ttl>60</ttl><item><title>关于自旋锁和信号量的纠正</title><link>http://www.cppblog.com/willcao/archive/2008/12/10/69103.html</link><dc:creator>WillCao</dc:creator><author>WillCao</author><pubDate>Wed, 10 Dec 2008 12:49:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2008/12/10/69103.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/69103.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2008/12/10/69103.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/69103.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/69103.html</trackback:ping><description><![CDATA[&nbsp; 这个是在是应该纠正一下.因为以前什么都不知道.恩,看完linux 0.11的源代码后,顺便又看了Robert Love写的Linux Development,这里还是先推荐一下这本书吧.首先作者是大牛.不信的话,打开linux的2.6内核源代码,然后找sche.c.我想应该就能发现他的大名了.实在是令我崇拜阿.然后内容写的,整体来说还不错.尤其是前面那一部分.对于内核调度以及中断之类的分析.写的很好.后面的话,恩,个人觉得就有点不如前面的,思考的少了一点,应用多了一点.对于内核讲的就少了.而如何写驱动之类就多了.但不管怎么样,这本书真的是一本很不错的书.有看过linux 0.11源代码并且喜欢内核的可以看看.<br>&nbsp; 废话不多说了.首先从自旋锁的来源来看吧.说到这个就要说SMP,linux 在2.2的内核之后就加入了SMP的支持.一直到2.6越来越好.有SMP就有多个cpu的队列.每一个cpu都有一个自己的调度队列.这样在有些时候就需要平衡这些队列.这个时候就要用到锁,让其他cpu什么也不做.让一个cpu来更新这些队列.这个时候肯定是不能用信号量的(?).这样就出现了自旋锁.当然自旋锁的用途不止这里.比如说在中断中,进入临界区.信号量也是不能用的(?).这个时候就要用自旋锁,其他方面的话,我再回去看看.这样的话应该就很清楚了.信号量只是在进程中使用的.一般来说,应用级程序,你根本不用考虑自旋锁.没有SMP,也不用考虑了.因为代码编译以后只是禁止了内核抢占.这也就是说,这段代码不会被抢占,sleep什么的根本没用.如果是开发驱动方面的话,这个在必要的时候还是应该考虑一下.什么是必要的时候呢?就是上面我说的,进入中断临界区且有多个cpu.<br>&nbsp; <br><br>  <img src ="http://www.cppblog.com/willcao/aggbug/69103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">WillCao</a> 2008-12-10 20:49 <a href="http://www.cppblog.com/willcao/archive/2008/12/10/69103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于子进程和父进程--fork函数</title><link>http://www.cppblog.com/willcao/archive/2008/07/06/55490.html</link><dc:creator>WillCao</dc:creator><author>WillCao</author><pubDate>Sun, 06 Jul 2008 15:40:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2008/07/06/55490.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/55490.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2008/07/06/55490.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/55490.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/55490.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我总算有点眉目了.原来在fork()之后系统就有两个一样的进程了.以前一直晕,两个一样的进程?那有什么用啊?其实是fork()这个函数会返回两次而已.对于子进程,得到的是0,而对于父进程,得到却是子进程的pid,这样根据得到不同的pid,然后两个进程就可以进行不一样的运行了.并且子进程继承了父进程的数据段,代码段,这个也就是说变量阿还是有的,代码阿还是会运行的.
<br>&nbsp;&nbsp;&nbsp; 贴点代码稍稍解释一下:<br>
<div id="" style="border: 1px solid #100000; color: #70afff;">#include &lt;stdio.h&gt;<br>#include &lt;unistd.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;errno.h&gt;<br><br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pid_t pid=fork();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pid==0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;10;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("child: %d\n",j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (pid&gt;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;10;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("parent: %d\n",i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"can't fork ,error %d\n",errno);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("This is the end !");<br>}<br></div>
&nbsp;&nbsp;&nbsp; 运行了这段代码,我想应该所有人都应该了解fork了吧.运行的时候可以查看进程(ps -aux),会发现有两个一样的进程,运行结束后最后一句printf会运行两次,因为每个进程都会运行一次.中间的交替就是进程的调度了.我也是刚刚明白,还有很多东西要深刻理解.总算有点眉目了.很爽.<br><br> <img src ="http://www.cppblog.com/willcao/aggbug/55490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">WillCao</a> 2008-07-06 23:40 <a href="http://www.cppblog.com/willcao/archive/2008/07/06/55490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用代码来思考自旋锁和信号量</title><link>http://www.cppblog.com/willcao/archive/2008/04/30/48527.html</link><dc:creator>WillCao</dc:creator><author>WillCao</author><pubDate>Wed, 30 Apr 2008 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2008/04/30/48527.html</guid><wfw:comment>http://www.cppblog.com/willcao/comments/48527.html</wfw:comment><comments>http://www.cppblog.com/willcao/archive/2008/04/30/48527.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/willcao/comments/commentRss/48527.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/willcao/services/trackbacks/48527.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 觉得昨天的思考似乎还是不怎么过瘾,有些问题还不是很清楚.到底应用方面两个有什么区别呢?<br>自己学着别人小小的动了下手.<br>先贴信号量的代码.
<div id="" style="border: 1px solid #666666; color: #789aff;">#include&lt;pthread.h&gt;<br>#include&lt;stdio.h&gt;<br>#include&lt;sys/time.h&gt;<br><br>#define MAX 10<br>pthread_t thread[2];<br>pthread_mutex_t mut;<br>int number=0,i;<br><br>void * thread1()<br>{<br>&nbsp;&nbsp; &nbsp;printf("thread1: I'm thread 1 \n");<br>&nbsp;&nbsp; &nbsp;for(i =0;i&lt;MAX ;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("thread 1: number=%d \n",number);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_mutex_lock(&amp;mut);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;number++;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_mutex_unlock(&amp;mut);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;sleep(2);<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;printf("thread1: 主函数在等我完成任务吗？\n");<br>&nbsp;&nbsp; &nbsp;pthread_exit(NULL);<br>}<br>void *&nbsp; thread2()<br>{<br>&nbsp;&nbsp; &nbsp;printf("thread2: I'm thread 2 \n");<br>&nbsp;&nbsp; &nbsp;for(i =0; i&lt;MAX;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("thread2 : number=%d\n",number);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_mutex_lock(&amp;mut);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;number++;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_mutex_unlock(&amp;mut);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;sleep(3);<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;printf("thread2 : 主函数在等我完成任务么？\n");<br>&nbsp;&nbsp; &nbsp;pthread_exit(NULL);<br><br>}<br><br>void thread_create(void)<br>{<br>&nbsp;&nbsp; &nbsp;/*创建线程*/<br>&nbsp;&nbsp; &nbsp;pthread_create(&amp;thread[0],NULL,thread1,NULL);<br>&nbsp;&nbsp; &nbsp;printf("线程1被创建！\n");<br>&nbsp;&nbsp; &nbsp;pthread_create(&amp;thread[1],NULL,thread2,NULL);<br>&nbsp;&nbsp; &nbsp;printf("线程2被创建！\n");<br>}<br>void thread_wait(void)<br>{<br>&nbsp;&nbsp; &nbsp;/*等待线程结束*/<br>&nbsp;&nbsp; &nbsp;pthread_join(thread[0],NULL);<br>&nbsp;&nbsp; &nbsp;printf("线程1已经结束！\n");<br>&nbsp;&nbsp; &nbsp;pthread_join(thread[1],NULL);<br>&nbsp;&nbsp; &nbsp;printf("线程2已经结束!\n");<br>}<br>int main()<br>{<br>&nbsp;&nbsp; &nbsp;/*用默认属性初始化互斥锁*/<br>&nbsp;&nbsp; &nbsp;pthread_mutex_init(&amp;mut,NULL);<br>&nbsp;&nbsp; &nbsp;printf("我是主函数，我正在创建线程！\n");<br>&nbsp;&nbsp; &nbsp;thread_create();<br>&nbsp;&nbsp; &nbsp;printf("我是主函数，我正在等待线程完成任务！\n");<br>&nbsp;&nbsp; &nbsp;thread_wait();<br>}
<br></div>
<br>执行的结果是:<br>
<div id="" style="border: 1px solid #666666; color: #7880ff;">我是主函数，我正在创建线程！<br>thread1: I'm thread 1 <br>thread 1: number=0 <br>线程1被创建！<br>thread2: I'm thread 2 <br>thread2 : number=1<br>线程2被创建！<br>我是主函数，我正在等待线程完成任务！<br>thread 1: number=2 <br>thread2 : number=3<br>thread 1: number=4 <br>thread 1: number=5 <br>thread2 : number=6<br>thread 1: number=7 <br>thread2 : number=8<br>thread 1: number=9 <br>thread2 : number=10<br>thread1: 主函数在等我完成任务吗？<br>线程1已经结束！<br>thread2 : 主函数在等我完成任务么？<br>线程2已经结束!<br><br></div>
&nbsp;<span style="color: #20ff2d;">重要:<span style="color: #000200;">这个执行的过程大概要10秒!!!!!!<br>而我们用自旋锁,代码:<br>
<div id="" style="border: 1px solid #666666; color: #7880f0;">/*<br>&nbsp;* time :2008.4.30<br>&nbsp;* author:will cao<br>&nbsp;* Email:sei_michael@126.com<br>&nbsp;* 探索自旋锁与信号量的区别<br>&nbsp;*/<br>#include&lt;pthread.h&gt;<br>#include&lt;stdio.h&gt;<br><br>pthread_t thread[2];<br>pthread_spinlock_t lock ;<br><br>#define MAX 10 <br><br>int number=0,i;<br><br>void * thread1()<br>{<br>&nbsp;&nbsp; &nbsp;printf ("thread 1 :I began to run !");<br>&nbsp;&nbsp; &nbsp;for(i=0;i&lt;MAX;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("thread 1 :number=%d \n",number);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_spin_lock(&amp;lock);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;number++;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_spin_unlock(&amp;lock);<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;printf("ok ,I am over !\n");<br>&nbsp;&nbsp; &nbsp;pthread_exit(NULL);<br>}<br>void * thread2 ()<br>{<br>&nbsp;&nbsp; &nbsp;printf("thread2 : I start !!!\n");<br>&nbsp;&nbsp; &nbsp;for(i=0;i&lt;MAX;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("thread2 : number = %d \n",number);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_spin_lock(&amp;lock);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;number++;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pthread_spin_unlock(&amp;lock);<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;printf("thread 2: I am over!!!");<br>&nbsp;&nbsp; &nbsp;pthread_exit(NULL);<br>}<br><br>void thread_create(void)<br>{<br>&nbsp;&nbsp; &nbsp;/*create the threads */<br>&nbsp;&nbsp; &nbsp;pthread_create(&amp;thread[0],NULL,thread1,NULL);<br>&nbsp;&nbsp; &nbsp;printf("create the thread 1\n ");<br>&nbsp;&nbsp; &nbsp;pthread_create(&amp;thread[1],NULL,thread2,NULL);<br>&nbsp;&nbsp; &nbsp;printf("create the thread 2 \n");<br>}<br>void thread_wait(void )<br>{<br>&nbsp;&nbsp; &nbsp;/*wait for the thread to be over */<br>&nbsp;&nbsp; &nbsp;pthread_join(thread[0],NULL);<br>&nbsp;&nbsp; &nbsp;printf("the thread 1 is over !\n");<br>&nbsp;&nbsp; &nbsp;pthread_join(thread[1],NULL);<br>&nbsp;&nbsp; &nbsp;printf("the thread 2 is over ! \n");<br>}<br>int main()<br>{<br>&nbsp;&nbsp; &nbsp;/* init the spin lock */<br>&nbsp;&nbsp; &nbsp;pthread_spin_init(&amp;lock,0);<br>&nbsp;&nbsp; &nbsp;printf("i am the main,and I am creating the threads ");<br>&nbsp;&nbsp; &nbsp;thread_create();<br>&nbsp;&nbsp; &nbsp;printf("i am the main,and I am wait for the thread to be over!");<br>&nbsp;&nbsp; &nbsp;thread_wait();<br>}
<br></div>
&nbsp;执行结果为:<br>
<div id="" style="border: 1px solid #666666; color: #7880f0;">i am the main,and I am creating the threads thread 1 :I began to run !thread 1 :number=0 <br>thread 1 :number=1 <br>thread 1 :number=2 <br>thread 1 :number=3 <br>thread 1 :number=4 <br>thread 1 :number=5 <br>thread 1 :number=6 <br>thread 1 :number=7 <br>thread 1 :number=8 <br>thread 1 :number=9 <br>ok ,I am over !<br>create the thread 1<br>&nbsp;thread2 : I start !!!<br>create the thread 2 <br>i am the main,and I am wait for the thread to be over!thread2 : number = 10 <br>thread2 : number = 11 <br>thread2 : number = 12 <br>thread2 : number = 13 <br>thread2 : number = 14 <br>thread2 : number = 15 <br>thread2 : number = 16 <br>thread2 : number = 17 <br>thread2 : number = 18 <br>thread2 : number = 19 <br>thread 2: I am over!!!the thread 1 is over !<br>the thread 2 is over ! <br></div>
&nbsp;&nbsp; 执行时间:我没用系统调用,但肯定是用不了0.1秒的...<br>总结:从表面上来看,很明显的区别是当我们用的是信号量的时候,这个时候是有调度的.因为从运行结果上来看,主线程在创建其他两个线程后,其他线程开始运行.并且主线程也在运行.但怎么运行这个是无法确定的,这是一个并发的过程.<br>&nbsp;&nbsp;&nbsp;  当使用自旋锁后,这个就不一样了.当运行到临界区的时候,它是直接的过去,不是会产生一个等待,或者一个调度.<br>不知道编译器是怎么编译的.很想知道编译后二进制代码有什么区别.但这个好像有点太难....不过我觉得从运行结果上来看这么多,应该差不多了.<br></span></span><br><br><img src ="http://www.cppblog.com/willcao/aggbug/48527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">WillCao</a> 2008-04-30 16:45 <a href="http://www.cppblog.com/willcao/archive/2008/04/30/48527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>信号量与自旋锁</title><link>http://www.cppblog.com/willcao/archive/2008/04/30/48496.html</link><dc:creator>WillCao</dc:creator><author>WillCao</author><pubDate>Tue, 29 Apr 2008 17:32:00 GMT</pubDate><guid>http://www.cppblog.com/willcao/archive/2008/04/30/48496.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;刚刚开始想这个问题的时候,觉得好像这个根本就不是一个问题.学操作系统的进程间的通信时,就是先说用互斥锁解决两个进程同时访问临界区的方法.但是后来Dijkstra对于哲学家进餐的问题的解答使用了信号量,于是我们接受了信号量.在看pthread的时候,发现还有个自旋锁.于是有点晕,这两个不都是控制对临界区的访问的么?怎么都上来了?他们之间有什么区别,他们又都是怎么实现的?<br>&nbsp;&nbsp;&nbsp;首先说自旋锁.这个实现基本上是和TSL相同.TSL指令,首先是要共享一个lock,当进入临界区时,首先将lock复制到寄存器,然后将lock置为1,接下来看寄存器中的值是否为0,为0进入.不为0返回.而最重要的是它能保证指令执行的不可分割性,也就是说在这条指令结束之前,其他指令不允许访问内存.实现的是方式是在指令执行之前将内存总线禁止.结束后在打开内存总线.而自旋锁实现就是这个样子.只不过多循环了几次.为了更好的让cpu调度,在尝试一定次数后返回.因为他是一直在那边循环所以叫做自旋锁.可见这种锁很耗资源.但是速度上来说很快.一旦锁释放,立刻可以得到资源.<br>&nbsp;&nbsp;&nbsp;再来看看信号量,信号量的实现就不这般精准了.如果使用一个信号量来控制一个临界区的话.就会有很多情况,首先最明显的是读者-写者问题.可以有多个读者,写者只可以有一个.并且信号量的实现也和自旋锁有者一定的区别.当一个信号量不能访问后.进程不会在那里循环,会被睡眠掉.当信号量可以使用的时候,调度器会从可以调度的进程选择一个.<br>&nbsp;&nbsp;&nbsp;基本上就这个样子.
<img src ="http://www.cppblog.com/willcao/aggbug/48496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/willcao/" target="_blank">WillCao</a> 2008-04-30 01:32 <a href="http://www.cppblog.com/willcao/archive/2008/04/30/48496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>