久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

fork函數(shù)的寫時(shí)拷貝

作者:公平   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年03月14日   【字體:
fork函數(shù)用于創(chuàng)建子進(jìn)程,典型的調(diào)用一次,返回兩次的函數(shù),其中返回子進(jìn)程的PID和0,其中調(diào)用進(jìn)程返回了子進(jìn)程的PID,而子進(jìn)程則返回了0,這是一個(gè)比較有意思的函數(shù),但是兩個(gè)進(jìn)程的執(zhí)行順序是不定的。fork 函數(shù)調(diào)用完成以后父進(jìn)程的虛擬存儲(chǔ)空間被拷貝給了子進(jìn)程的虛擬存儲(chǔ)空間,因此也就實(shí)現(xiàn)了共享文件等操作。但是虛擬的存儲(chǔ)空間映射到物理存儲(chǔ)空間的過程中采用了寫時(shí)拷貝技術(shù)(具體的操作大小是按著頁控制的),該技術(shù)主要是將多進(jìn)程中同樣的對(duì)象(數(shù)據(jù))在物理存儲(chǔ)其中只有一個(gè)物理存儲(chǔ)空間,而當(dāng)其中的某一個(gè)進(jìn)程試圖對(duì)該區(qū)域進(jìn)行寫操作時(shí),內(nèi)核就會(huì)在物理存儲(chǔ)器中開辟一個(gè)新的物理頁面,將需要寫的區(qū)域內(nèi)容復(fù)制到新的物理頁面中,然后對(duì)新的物理頁面進(jìn)行寫操作。這時(shí)就是實(shí)現(xiàn)了對(duì)不同進(jìn)程的操作而不會(huì)產(chǎn)生影響其他的進(jìn)程,同時(shí)也節(jié)省了很多的物理存儲(chǔ)器。

 
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>

 

 
int main()
{
        char p = 'g';
        int number = 11;

        if(fork()==0)      /*子進(jìn)程*/
        {
                p = 'c';      /*子進(jìn)程對(duì)數(shù)據(jù)的修改*/

                printf("p = %c , number = %d \n ",p,number);

                exit(0);
        }
       /*父進(jìn)程*/
        number = 14;  /*父進(jìn)程對(duì)數(shù)據(jù)修改*/
        printf("p = %c , number = %d \n ",p,number);
        exit(0);
}

 
編譯調(diào)試:
[gong@Gong-Computer cprogram]$ gcc -g TestWriteCopyTech.c -o TestWriteCopyTech
[gong@Gong-Computer cprogram]$ ./TestWriteCopyTech 
p = g , number = 14    -----父進(jìn)程打印內(nèi)容
 [gong@Gong-Computer cprogram]$ p = c , number = 11    -----子進(jìn)程打印內(nèi)容 

原因分析:
由于存在企圖進(jìn)行寫操作的部分,因此會(huì)發(fā)生寫時(shí)拷貝過程,子進(jìn)程中對(duì)數(shù)據(jù)的修改,內(nèi)核就會(huì)創(chuàng)建一個(gè)新的物理內(nèi)存空間。然后再次將數(shù)據(jù)寫入到新的物理內(nèi)存空間中。可知,對(duì)新的區(qū)域的修改不會(huì)改變原有的區(qū)域,這樣不同的空間就區(qū)分開來。但是沒有修改的區(qū)域仍然是多個(gè)進(jìn)程之間共享。
fork函數(shù)的代碼段基本是只讀類型的,而且在運(yùn)行階段也只是復(fù)制,并不會(huì)對(duì)內(nèi)容進(jìn)行修改,因此父子進(jìn)程是共享代碼段,而數(shù)據(jù)段、Bss段、堆棧段等會(huì)在運(yùn)行的過程中發(fā)生寫過程,這樣就導(dǎo)致了不同的段發(fā)生相應(yīng)的寫時(shí)拷貝過程,實(shí)現(xiàn)了不同進(jìn)程的獨(dú)立空間。
但是需要注意的是文件操作,由于文件的操作是通過文件描述符表、文件表、v-node表三個(gè)聯(lián)系起來控制的,其中文件表、v-node表是所有的進(jìn)程共享,而每個(gè)進(jìn)程都存在一個(gè)獨(dú)立的文件描述符表。父子進(jìn)程虛擬存儲(chǔ)空間的內(nèi)容是大致相同的,父子進(jìn)程是通過同一個(gè)物理區(qū)域存儲(chǔ)文件描述符表,但如果修改文件描述符表,也會(huì)發(fā)生寫時(shí)拷貝操作,只有這樣才能保證子進(jìn)程中對(duì)文件描述符的修改,不會(huì)影響到父進(jìn)程的文件描述符表。例如close操作,因?yàn)閏lose會(huì)導(dǎo)致文件的描述符的值發(fā)生變化,相當(dāng)于發(fā)生了寫操作,這是產(chǎn)生了寫時(shí)拷貝過程,實(shí)現(xiàn)新的物理空間,然后再次發(fā)生close操作,這樣就不會(huì)產(chǎn)生子進(jìn)程中文件描述符的關(guān)閉而導(dǎo)致父進(jìn)程不能訪問文件。

 
測試函數(shù):
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/wait.h>

 
int main()
{
        int fd;
        char c[3];

 
        char *s = "TestFs";

        fd = open("foobar.txt",O_RDWR,0);

        if(fork()==0)   //子進(jìn)程
        {
                fd = 1;//stdout
                write(fd,s,7);
                exit(0);
        }
       //父進(jìn)程
        read(fd,c,2);
        c[2]='\0';
        printf("c = %s\n",c);
        exit(0);
}

 
[gong@Gong-Computer cprogram]$ gcc -g fileshare2.c -o fileshare2
[gong@Gong-Computer cprogram]$ ./fileshare2
c = fo    ----foobar.txt中的內(nèi)容
[gong@Gong-Computer cprogram]$ TestFs   ---標(biāo)準(zhǔn)輸出 

原因分析:由于父子進(jìn)程的文件描述符表是相同的,但是在子進(jìn)程中對(duì)fd(文件描述符表中的項(xiàng))進(jìn)行了修改,這時(shí)會(huì)發(fā)生寫時(shí)拷貝過程,內(nèi)核在物理內(nèi)存中分配一個(gè)新的頁面存儲(chǔ)子進(jìn)程原文件描述符fd存在頁面的內(nèi)容,然后再進(jìn)修寫操作,實(shí)現(xiàn)將fd修改為1,也就是標(biāo)準(zhǔn)輸出。但是父進(jìn)程的fd并沒有發(fā)生改變,還是與其他的子進(jìn)程共享文件描述符表,因此仍然是對(duì)文件foobar.txt進(jìn)行操作。

因此需要主要fork函數(shù)實(shí)質(zhì)上是按著寫時(shí)拷貝的方式實(shí)現(xiàn)文件的映射,并不是共享,寫時(shí)拷貝操作使得內(nèi)存的需求量大大的減少了,具體的寫時(shí)拷貝實(shí)現(xiàn),請參看非常經(jīng)典的“深入理解計(jì)算機(jī)系統(tǒng)”的第622頁。
關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 91大神在线资源观看无广告 | h片在线观看网站 | 亚洲啊v在线 | 成年人黄色免费视频 | 操久久| 久热国产在线 | 中文字幕亚洲精品 | 欧产日产国产精品99 | 毛片99 | 成人免费视频一区二区 | 亚洲成人www | 中文字幕亚洲一区 | 狠狠天天 | 九九九视频在线观看 | 又黑又粗又长的欧美一区 | 亚洲午夜精品一区二区三区他趣 | 亚洲成人三区 | 国精产品一品二品国精在线观看 | 日日爱视频 | 日韩爱爱网站 | 中文字幕欧美一区 | 国产精品久久久久无码av | www国产亚洲精品久久网站 | av天天澡天天爽天天av | 成人免费观看男女羞羞视频 | 成人免费视频在线观看 | 国产精品揄拍一区二区久久国内亚洲精 | 国产在线一区二区三区 | 欧美日韩中文字幕在线 | 欧美综合一区二区三区 | 一区亚洲 | 日本三级视频 | 国产一级在线 | 免费一看一级毛片 | 欧美日韩在线播放 | 亚洲中午字幕 | 国产精品一区二区三区99 | 黄色在线观看国产 | 国产日韩欧美二区 | 成人久久| 亚洲欧美中文字幕 |