• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            martin

            thinking

            常用鏈接

            統(tǒng)計(jì)

            software

            最新評(píng)論

            unix 類系統(tǒng)中的進(jìn)程同步方式代碼示例

            MP(多CPU)同步原語代碼示例
                               ----引自《現(xiàn)代體系結(jié)構(gòu)上的UNIX系統(tǒng)》

            為了便于對(duì)示例的展開,我們首先假定一個(gè)場景:
            內(nèi)核中把檢測到的錯(cuò)誤信息記錄到一個(gè)磁盤文件中的情形。出錯(cuò)信息通過內(nèi)存中的一個(gè)隊(duì)列來傳遞給日志進(jìn)程(logging process)的。
            當(dāng)出現(xiàn)一個(gè)錯(cuò)誤時(shí),就在隊(duì)列中加入一項(xiàng),并且通過調(diào)用函數(shù)log_error 通知日志進(jìn)程。出錯(cuò)日志進(jìn)程接著把隊(duì)列中的項(xiàng)寫到磁盤上。
            這就使得碰到錯(cuò)誤的進(jìn)程不必等候I/O完成或者或得為了向文件執(zhí)行I/O而可能需要的任何鎖,并且避免了任何可能的上鎖次序問題。

            代碼1, 采用事件計(jì)數(shù)的出錯(cuò)日志通知機(jī)制

                                                            日志進(jìn)程
            log_error(error)                    |
            {                                         |       for(next=1; ; next++) {
                lock(&err_queue);             |           await(&err_event, next);
                把出錯(cuò)信息加入到隊(duì)列           |          lock(&err_queue);
                unlock(&err_queue);          |          從隊(duì)列中刪除項(xiàng)
                advance(&err_event);        |          unlock(&err_queue);
            }                                         |          write error to disk
                                                       |       }

            隊(duì)列本身由一個(gè)自旋鎖來保護(hù)。在本例中,事件計(jì)數(shù)只用于同步的目的,并不提供互斥。
            在試用事件計(jì)數(shù)的時(shí)候,advance操作會(huì)永久性地改變事件計(jì)數(shù)的狀態(tài)。advance和await操作的相對(duì)時(shí)序沒有關(guān)系。

            代碼2, 采用同步變量的出錯(cuò)日志通知機(jī)制
                                                             日志進(jìn)程
            log_error(error)                            |
            {                                                 |        for(;;){
               lock(&err_queue);                      |              lock(&err_queue);
               把出錯(cuò)信息加入到隊(duì)列                    |              if (queue_empty){
               SV_SIGNAL(&err_syncvar, 0);      |                  SV_WAIT(&err_syncvar, PRI, &err_queue);
               unlock(&err_queue);                   |                  lock(&err_queue);
            }                                                 |              }
                                                               |              從隊(duì)列中刪除項(xiàng)
                                                               |              unlock(&err_queue);
                                                               |              把錯(cuò)誤寫入磁盤
                                                               |        }

            因?yàn)橥阶兞孔陨頉]有保留狀態(tài),所以當(dāng)日志進(jìn)程測試隊(duì)列的狀態(tài)并決定是等待一項(xiàng)還是從隊(duì)列中刪除一項(xiàng)的時(shí)候,必須占有自旋鎖。類似地,log_error在
            發(fā)送信號(hào)時(shí)也必須占有自旋鎖。注,SV_WAIT將釋放自旋鎖,并且阻塞日志進(jìn)程,SV_SIGNAL到后從阻塞處繼續(xù)執(zhí)行。

            代碼3, 采用管程的出錯(cuò)日志通知機(jī)制
                                                                             日志進(jìn)程
            log_error(error)                                  |       for(;;){
            {                                                       |           mon_enter(&err_mon);
               mon_enter(&err_mon);                     |           if (queue empty)
               把出錯(cuò)信息加入到隊(duì)列                          |               mon_wait(&err_mon, NEWENTRY);
                                                                     |
               mon_signal(&err_mon, NEWENTRY);  |           從隊(duì)列中刪除項(xiàng)
               mon_exit(&err_mon);                       |           mon_exit(&err_mon);
            }                                                       |           把錯(cuò)誤寫入磁盤
                                                                     |       }
                                                
            代碼4, 采用信號(hào)量的出錯(cuò)日志通知機(jī)制
                                                            日志進(jìn)程
            log_error(error)                      |       for(;;){
            {                                          |           P(&err_sema);
                lock(&err_queue);               |           lock(&err_queue);
                把出錯(cuò)信息加入到隊(duì)列            |           從隊(duì)列中刪除項(xiàng)
                unlock(err_queue);              |           unlock(&err_queue);
                V(&err_sema);                   |           把錯(cuò)誤寫入磁盤
            }                                          |       }

            posted on 2013-06-20 15:02 martin_yahoo 閱讀(1554) 評(píng)論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            色偷偷88欧美精品久久久| 国产精品一区二区久久| 色8激情欧美成人久久综合电| 久久精品三级视频| 欧美日韩久久中文字幕| 久久亚洲中文字幕精品有坂深雪| 国产精品对白刺激久久久| 超级碰久久免费公开视频| 久久精品一区二区三区AV| 久久久久综合网久久| 久久久久av无码免费网| 久久99精品免费一区二区| 久久夜色精品国产噜噜噜亚洲AV| 国内精品免费久久影院| 久久精品国产亚洲av麻豆小说| 狠狠色伊人久久精品综合网 | 久久99亚洲网美利坚合众国| 国内精品久久久久国产盗摄| 久久精品国产99久久久| 亚洲中文字幕伊人久久无码| 狠狠色丁香婷综合久久| 18岁日韩内射颜射午夜久久成人| 国产高潮国产高潮久久久91 | 久久亚洲视频| 99精品久久久久久久婷婷| 久久久久99精品成人片直播| 亚洲欧洲中文日韩久久AV乱码| 99久久综合国产精品二区| 精品久久久久久久久午夜福利| 精品久久久久久国产| 中文成人无码精品久久久不卡| 国产综合成人久久大片91| 成人亚洲欧美久久久久| 91精品婷婷国产综合久久| 日韩亚洲欧美久久久www综合网 | 欧美精品九九99久久在观看| 精品久久久久久无码免费| 大美女久久久久久j久久| 国内精品伊人久久久久影院对白| 久久精品国产亚洲网站| 国产成人久久精品麻豆一区|