• <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>
            posts - 200, comments - 8, trackbacks - 0, articles - 0
            今天看到寫時(shí)拷貝這個(gè)概念,當(dāng)時(shí)一下沒(méi)有理解,后來(lái)查看一些網(wǎng)上的資料,找到了這篇文章,里面的那份個(gè)小程序能夠很好的說(shuō)明進(jìn)程創(chuàng)建寫時(shí)拷貝的概念。怕以后找不到就轉(zhuǎn)載了。嘿嘿。
            下面是那篇文章的原文:

            Linux進(jìn)程創(chuàng)建,子進(jìn)程對(duì) 父進(jìn)程資源“寫時(shí)拷貝”的證明     傳統(tǒng)的fork()系統(tǒng)調(diào)用直接把所有的資源復(fù)制給新創(chuàng)建的進(jìn)程。這種實(shí)現(xiàn)過(guò)于簡(jiǎn)單并且效率低下,因?yàn)樗截惖臄?shù)據(jù)或許可以共享(This approach is significantly na?ve and inefficient in that it copies much data that might otherwise be shared.)。更糟糕的是,如果新進(jìn)程打算立即執(zhí)行一個(gè)新的映像,那么所有的拷貝都將前功盡棄。
                Linux的fork()使用寫時(shí)拷貝 (copy- on-write)頁(yè)實(shí)現(xiàn)。寫時(shí)拷貝是一種可以推遲甚至避免拷貝數(shù)據(jù)的技術(shù)。內(nèi)核此 時(shí)并不復(fù)制整個(gè)進(jìn)程的地址空間,而是讓父子進(jìn)程共享同一個(gè)地址空間。只用在需要寫入的時(shí)候才會(huì)復(fù)制地址空間,從而使各個(gè)進(jìn)行擁有各自的地址空間。也就是 說(shuō),資源的復(fù)制是在需要寫入的時(shí)候才會(huì)進(jìn)行,在此之前,只有以只讀方式共享。這種技術(shù)使地址空間上的頁(yè)的拷貝被推遲到實(shí)際發(fā)生寫入的時(shí)候。在頁(yè)根本不會(huì)被 寫入的情況下---例如,fork()后立即執(zhí)行exec(),地址空間就無(wú)需被復(fù)制了。fork()的實(shí)際開(kāi)銷就是復(fù)制父進(jìn)程的頁(yè)表以及給子進(jìn)程創(chuàng)建一 個(gè)進(jìn)程描述符。下列程序可證明寫時(shí)拷貝:

            #include <stdio.h>

            #include <sched.h>

            int data = 10;

            int child_process()
            {
                printf("Child process %d, data %dn",getpid(),data);
                data = 20;
                printf("Child process %d, data %dn",getpid(),data);
                while(1);
            }

            int main(int argc, char* argv[])
            {
                if(fork()==0) {
                  child_process();    
                }else{
                    sleep(1);
                    printf("Parent process %d, data %dn",getpid(), data);
                    while(1);
                }
            }
            運(yùn)行結(jié)果
            Child process 6427, data 10
            Child process 6427, data 20
            Parent process 6426, data 10 

                第1個(gè)Child process 6427, data 10是因?yàn)樽舆M(jìn)程創(chuàng)建時(shí)task_struct的mm直接拷貝自parent的mm;第2個(gè)Child process 6427, data 20是因?yàn)樽舆M(jìn)程進(jìn)行了“寫時(shí)拷貝”,有了自己的dataa;第3個(gè)Parent process 6426, data 10輸出10是因?yàn)樽舆M(jìn)程的data和父進(jìn)程的data不是同一份。
                如果把上述程序改為:

            #include <stdio.h>
            #include <sched.h>
            #include <stdlib.h>

            int data = 10;

            int child_process()
            {
                printf("Child process %d, data %dn",getpid(),data);
                data = 20;
                printf("Child process %d, data %dn",getpid(),data);
                while(1);
            }

            int main(int argc, char* argv[])
            {
                void **child_stack;
                child_stack = (void **) malloc(16384);
                clone(child_process, child_stack, CLONE_VM|CLONE_FILES|CLONE_SIGHAND, NULL);

                sleep(1);
                printf("Parent process %d, data %dn",getpid(), data);
                while(1);
            }

            運(yùn)行結(jié)果將是
            Child process 6443, data 10
            Child process 6443, data 20
            Parent process 6442, data 20

                由于使用了CLONE_VM創(chuàng)建進(jìn)程,子進(jìn)程的mm實(shí)際直接指向父進(jìn)程的mm,所以data是同一份。改變父子進(jìn)程的data都會(huì)互相看到。 
            久久久久久极精品久久久| 狠狠干狠狠久久| 2021国产精品午夜久久| 人妻精品久久无码专区精东影业| 久久久精品国产sm调教网站 | 亚洲&#228;v永久无码精品天堂久久| 国产99久久久久久免费看| 一级A毛片免费观看久久精品| 亚洲狠狠婷婷综合久久久久| 一级做a爱片久久毛片| 久久久久久久免费视频| 久久精品成人国产午夜| 久久精品卫校国产小美女| 99久久精品免费| 99久久精品费精品国产一区二区| 亚洲国产成人久久综合野外| .精品久久久麻豆国产精品| 亚洲精品第一综合99久久| 日本精品久久久中文字幕 | 久久精品亚洲一区二区三区浴池 | 久久精品中文闷骚内射| 久久婷婷是五月综合色狠狠| 久久精品成人免费网站| 久久综合给久久狠狠97色| 中文字幕精品久久久久人妻| 国产高潮久久免费观看| 色综合久久中文综合网| 久久99国产综合精品免费| 精品综合久久久久久97| 波多野结衣久久一区二区| 日本精品久久久久影院日本 | 久久影视综合亚洲| 精品久久久久中文字幕一区| 成人资源影音先锋久久资源网| 精品久久久久中文字幕日本| 国产综合免费精品久久久| 久久综合综合久久综合| 久久se这里只有精品| 久久精品这里热有精品| 久久婷婷国产综合精品| 久久久亚洲AV波多野结衣|