• <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ì)互相看到。 
            亚洲人成无码网站久久99热国产 | 久久综合给合综合久久| 久久国产乱子精品免费女| 婷婷久久综合九色综合98| 久久久久久久综合日本| 久久香蕉超碰97国产精品| 久久精品国产99久久丝袜| 亚洲精品高清国产一线久久| 91精品国产高清久久久久久91| 无码人妻久久一区二区三区蜜桃| 九九久久自然熟的香蕉图片| 久久天天躁夜夜躁狠狠| 久久se精品一区精品二区国产| 亚洲中文字幕无码久久综合网| 久久久久久久久久久免费精品| 久久精品国产亚洲AV无码偷窥| 久久久黄色大片| 久久精品中文字幕第23页| 久久久久综合网久久| 久久国产精品77777| 综合人妻久久一区二区精品| 亚洲午夜精品久久久久久app| 99久久免费国产精品| 久久久久久狠狠丁香| www性久久久com| 久久婷婷五月综合97色| 色狠狠久久AV五月综合| 中文国产成人精品久久不卡| 亚洲日本va午夜中文字幕久久| 久久久久噜噜噜亚洲熟女综合| 国内精品伊人久久久久网站| 超级碰久久免费公开视频| 99久久精品免费看国产一区二区三区 | 狠狠综合久久AV一区二区三区| 亚洲午夜无码AV毛片久久| 久久久久久久久久免免费精品| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 日产精品99久久久久久| 精品乱码久久久久久久| 久久夜色精品国产噜噜噜亚洲AV | 久久久久人妻一区精品 |