• <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è)場(chǎng)景:
            內(nèi)核中把檢測(cè)到的錯(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)程測(cè)試隊(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 閱讀(1562) 評(píng)論(0)  編輯 收藏 引用


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


            国产一区二区精品久久| 人妻精品久久无码区| 久久精品国产亚洲av瑜伽| 91秦先生久久久久久久| 欧美粉嫩小泬久久久久久久| 久久精品国产欧美日韩99热| 亚洲中文字幕无码一久久区| 久久综合九色综合精品| 天天做夜夜做久久做狠狠| 久久久无码人妻精品无码| 国产亚洲精午夜久久久久久| 亚洲日韩中文无码久久| 四虎国产永久免费久久| 亚洲精品午夜国产VA久久成人| 成人精品一区二区久久久| 亚洲精品乱码久久久久久自慰| 久久91精品国产91久久小草| 99久久这里只精品国产免费| 香港aa三级久久三级| 亚洲中文字幕久久精品无码喷水| 精品久久久久中文字幕一区| 久久国产精品99精品国产| 久久精品综合网| 久久久久久精品久久久久| 久久国产视频99电影| 热久久这里只有精品| 精品一区二区久久久久久久网站| 久久婷婷五月综合97色| 亚洲色婷婷综合久久| 色综合久久久久综合体桃花网| 日本WV一本一道久久香蕉| 四虎国产精品成人免费久久| 欧美国产精品久久高清| 久久人搡人人玩人妻精品首页| 天天综合久久久网| 久久伊人五月天论坛| 久久综合久久伊人| 久久天天躁夜夜躁狠狠躁2022| 亚洲人成电影网站久久| 99久久国产宗和精品1上映| 久久精品无码午夜福利理论片|