亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

線程控制之線程和fork

2024-06-28 13:28:09
字體:
來源:轉載
供稿:網友
線程控制之線程和fork

當線程調用fork時,就為子進程創建了整個進程地址空間的副本?;貞沨ttp://www.CUOXin.com/nufangrensheng/p/3509492.html中討論的寫時復制,子進程與父進程是完全不同的進程,只要兩者都沒有對內存作出改動,父進程和子進程之間還可以共享內存頁的副本。

子進程通過繼承整個地址空間的副本,也從父進程那里繼承了所有互斥量、讀寫鎖和條件變量的狀態。如果父進程包含多個線程,子進程在fork返回以后,如果緊接著不是馬上調用exec的話,就需要清理鎖狀態。

在子進程內部只存在一個線程,它是由父進程中調用fork的線程的副本構成的。如果父進程中的線程占有鎖,子進程同樣占有這些鎖。問題是子進程并不包含占有鎖的線程的副本,所以子進程沒有辦法知道它占有了哪些鎖并且需要釋放哪些鎖。

如果子進程從fork返回以后馬上調用某個exec函數,就可以避免這樣的問題。這種情況下,老的地址空間被丟棄,所以鎖的狀態無關緊要。但如果子進程需要繼續做處理工作的話,這種方法就行不通,還需要使用其他的策略。

要清除鎖狀態,可以通過調用pthread_atfork函數建立fork處理程序。

#include <pthread.h>int pthread_atfork(void (*PRepare)(void), void (*parent)(void), void (*child)(void));返回值:若成功則返回0,否則返回錯誤編號

用pthread_atfork函數最多可以安裝三個幫助清理鎖的函數。prepare fork處理程序由父進程在fork創建子進程前調用,這個fork處理程序的任務是獲取父進程定義的所有鎖。parent fork處理程序是在fork創建了子進程以后,但在fork返回之前在父進程環境中調用的,這個fork處理程序的任務是對prepare fork處理程序獲得的所有鎖進行解鎖。child fork處理程序在fork返回之前在子進程環境中調用,與parent fork處理程序一樣,child fork處理程序也必須釋放prepare fork處理程序獲得的所有鎖。

注意不會出現加鎖一次解鎖兩次的情況,雖然看起來也許會出現。當子進程地址空間創建的時候,它得到了父進程定義的所有鎖的副本。因為prepare fork處理程序獲取所有的鎖,父進程中的內存和子進程中的內存內容在開始的時候是相同的。當父進程和子進程對他們的鎖的副本進行解鎖的時候,新的內存是分配給子進程的,父進程的內存內容被復制到子進程的內存中(寫時復制),所以就會陷入這樣的假象,看起來父進程對它所有的副本進行了加鎖,子進程對它所有的副本進行了加鎖。父進程和子進程對在不同內存位置的重復的鎖都進行了解鎖操作,就好像出現了下列的時間序列:

(1)父進程獲得所有的鎖。

(2)子進程獲得所有的鎖。

(3)父進程釋放它的鎖。

(4)子進程釋放它的鎖。

可以多次調用pthread_atfork函數從而設置多套fork處理程序。如果不需要使用其中某個處理程序,可以給特定的處理程序參數傳入空指針,這樣它們就不會起任何作用。使用多個fork處理程序時,處理程序的調用順序并不相同。parentchild fork處理程序是以它們注冊時的順序進行調用的,而prepare fork處理程序的調用順序與它們注冊時的順序相反。這樣可以允許多個模塊注冊它們自己的fork處理程序,并且保持鎖的層次。

例如,假設模塊A調用模塊B中的函數,而且每個模塊有自己的一套鎖。如果鎖的層次是A在B之前,模塊B必須在模塊A之前設置fork處理程序。當父進程調用fork時,就會執行以下的步驟,假設子進程在父進程之前運行。

(1)調用模塊A的prepare fork處理程序獲取模塊A的所有鎖。

(2)調用模塊B的prepare fork處理程序獲取模塊B的所有鎖。

(3)創建子進程。

(4)調用模塊B中的child fork處理程序釋放子進程中模塊B的所有鎖。

(5)調用模塊A中的child fork處理程序釋放子進程中模塊A的所有鎖。

(6)fork函數返回到子進程。

(7)調用模塊B中的parent fork處理程序釋放父進程中模塊B的所有鎖。

(8)調用模塊A中的parent fork處理程序釋放父進程中模塊A的所有鎖。

(9)fork函數返回到父進程。

如果fork處理程序是為了清理鎖狀態,那么又由誰來負責清理條件變量的狀態呢?在有些操作系統的實現中,條件變量可能并不需要做任何清理。但是有些操作系統實現把鎖作為條件變量實現的一部分,這種情況下的條件變量就需要清理。問題是目前不存在這樣的接口,如果鎖是嵌入到條件變量的數據結構中的,那么在調用fork之后就不能使用條件變量,因為還沒有可移植的方法對其進行狀態清理。另外,如果操作系統的實現是使用全局鎖保護進程中所有的條件變量數據結構,那么操作系統實現本身可以在fork庫例程中做清理鎖的工作,但是應用程序不應該依賴操作系統實現中這樣的細節。

實例

程序清單12-7中的程序描述了如何使用pthread_atfork和fork處理程序。

程序清單12-7 pthread_atfork實例

#include "apue.h"#include <pthread.h>pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;voidprepare(void){    printf("preparing locks.../n");    pthread_mutex_lock(&lock1);    pthread_mutex_lock(&lock2);}void parent(void){    printf("parent unlocking locks.../n");    pthread_mutex_unlock(&lock1);    pthread_mutex_unlock(&lock2);}voidchild(void){    printf("child unlocking locks.../n");    pthread_mutex_unlock(&lock1);    pthread_mutex_unlock(&lock2);}void *thr_fn(void *arg){    printf("thread started.../n");    pause();    return(0);}intmain(void){    int        err;    pid_t        pid;    pthread_t    tid;    #if defined(BSD) || defined(MACOS)    printf("pthread_atfork is unsupported/n");#else    if((err = pthread_atfork(prepare, parent, child)) != 0)        err_exit(err, "can't install fork handlers");    err = pthread_create(&tid, NULL, thr_fn, 0);    if(err != 0)        err_exit(err, "can't create thread");    sleep(2);    printf("parent about to fork.../n");        if((pid = fork()) < 0)        err_quit("fork failed");    else if(pid == 0)    /* child */        printf("child returned from fork/n");    else    /* parent */        printf("parent returned from fork/n");#endif    exit(0);}

程序中定義了兩個互斥量,lock1和lock2,prepare fork處理程序獲取這兩把鎖,child fork處理程序在子進程環境中釋放鎖,parent fork處理程序在父進程中釋放鎖。

運行該程序,得到如下輸出:

未命名

可以看出,prepare fork處理程序在調用fork以后運行,child fork處理程序在fork調用返回到子進程之前運行,parent fork處理程序在fork調用返回給父進程前運行。

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91成人在线观看国产| 成人黄色免费网站在线观看| 91成品人片a无限观看| 久久久久999| 久久99热这里只有精品国产| 国产日产欧美a一级在线| 亚洲精品一区av在线播放| 国产男人精品视频| 国产国产精品人在线视| 欧美一区二区大胆人体摄影专业网站| 91久久精品国产| 日韩美女视频在线观看| 国产精品国产三级国产aⅴ浪潮| www国产亚洲精品久久网站| 亚洲女人天堂视频| 亚洲综合第一页| 亚洲欧美另类国产| 久久精品久久精品亚洲人| 操人视频在线观看欧美| 久久国产精品免费视频| 欧美又大粗又爽又黄大片视频| 国语对白做受69| 色多多国产成人永久免费网站| 亚洲aa在线观看| 亚洲区一区二区| 中文字幕久精品免费视频| 色哟哟网站入口亚洲精品| 国产成人亚洲综合青青| 国产精品丝袜久久久久久不卡| 欧美专区国产专区| 亚洲免费视频在线观看| 美女啪啪无遮挡免费久久网站| 亚洲伊人成综合成人网| 夜色77av精品影院| 姬川优奈aav一区二区| 亚洲天堂av电影| 亚洲国产精品专区久久| 久久精品成人动漫| 狠狠躁夜夜躁久久躁别揉| 国产视频在线一区二区| 亚洲第一av网| 亚洲国产成人精品电影| 成人一区二区电影| 欧美一区二区.| 亚洲图片在线综合| 亚洲成人精品在线| 精品亚洲va在线va天堂资源站| 国产成人jvid在线播放| 日韩成人中文电影| 成人国产精品久久久| 欧美视频在线观看 亚洲欧| 精品久久久久久久久久ntr影视| 深夜福利日韩在线看| 亚洲一级片在线看| 91香蕉国产在线观看| 亚洲成在人线av| 久久精品视频一| 91精品国产乱码久久久久久蜜臀| 大伊人狠狠躁夜夜躁av一区| 国产精品久久网| 日韩精品视频在线观看网址| 中文日韩在线视频| 欧美性生交大片免网| 在线亚洲国产精品网| 7m第一福利500精品视频| 久久91亚洲人成电影网站| 4438全国成人免费| 国产色视频一区| 中文字幕av一区二区| 国产主播欧美精品| 热久久这里只有| 91久久精品日日躁夜夜躁国产| www.日韩.com| 欧美制服第一页| 91麻豆桃色免费看| 91在线看www| 欧美一级电影在线| 亚洲国产欧美一区| 亚洲在线第一页| 国产在线精品成人一区二区三区| 欧美日韩一区二区在线| 午夜精品久久久久久久99黑人| 成人网在线免费观看| 成人一区二区电影| 九九久久久久久久久激情| 久久视频在线直播| 久久视频免费观看| 亚洲精品大尺度| 国产经典一区二区| 欧美日韩在线观看视频小说| 精品久久久久久久久国产字幕| 国产精品一区二区三区久久久| 成人有码在线播放| 欧美成人免费一级人片100| 日本国产精品视频| 国产有码一区二区| 欧美激情一区二区三区成人| 成人精品视频久久久久| 国产精品激情自拍| 九九热r在线视频精品| 影音先锋欧美精品| 欧美精品在线极品| 欧美高清不卡在线| 亚洲成人av片| 欧美精品在线免费观看| 97久久精品人人澡人人爽缅北| 精品欧美激情精品一区| 中文字幕亚洲第一| 中国日韩欧美久久久久久久久| 欧美一性一乱一交一视频| 一本大道香蕉久在线播放29| 98精品国产自产在线观看| 午夜精品久久久久久久99热| www国产亚洲精品久久网站| 欧美在线影院在线视频| 2019中文字幕全在线观看| 在线视频欧美性高潮| 日本精品视频在线观看| 国产视频精品xxxx| 这里只有精品久久| 555www成人网| 久久综合电影一区| 欧美黑人xxx| 色婷婷成人综合| 亚洲理论电影网| 最近2019好看的中文字幕免费| 日韩在线观看视频免费| 国产亚洲成av人片在线观看桃| 精品国产欧美成人夜夜嗨| 欧美极度另类性三渗透| 18久久久久久| 国产精品永久免费视频| 日韩av在线网页| 午夜精品一区二区三区在线视| 国产美女高潮久久白浆| 另类视频在线观看| 日韩欧美成人免费视频| 欧美日韩一区二区三区| 亚洲第一网站免费视频| 国产精品一区二区三区久久久| 国产精品人成电影在线观看| 国产精品网站大全| 97视频色精品| 日韩欧美中文字幕在线播放| 欧美一级成年大片在线观看| 欧美亚洲成人免费| 社区色欧美激情 | 狠狠久久五月精品中文字幕| 庆余年2免费日韩剧观看大牛| 欧美色视频日本版| 日韩资源在线观看| 欧美成人精品在线| 综合网中文字幕| 亚洲综合在线小说| 91色琪琪电影亚洲精品久久| 超薄丝袜一区二区| 91高清免费视频| 亚洲人成在线观| 色噜噜狠狠狠综合曰曰曰88av| 超在线视频97| 日韩精品极品视频免费观看| 亚洲片在线资源| 日韩欧美在线免费观看| 久久人体大胆视频|