久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

fork和vfork那些事

 studydoer 2020-09-01

fork和vfork那些事

vfork:

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

int data = 10;
int child_process(){
    printf("Child process %d, data1 %d\n",getpid(),data);
    data = 20;
    printf("Child process %d, data2 %d\n",getpid(),data);
    _exit(0);
}
int main(int argc, char* argv[]){
    if(vfork()==0) {
        child_process();
    }else{
        sleep(1);
        printf("Parent process %d, data3 %d\n",getpid(), data);
    }
}

你知道上述data1、data2和data3分別是多少嗎,?先自己思考下,后文一起解密,。

fork:

#include <sched.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int data = 10;
int child_process(){
    printf("Child process %d, data4 %d\n",getpid(),data);
    data = 20;
    printf("Child process %d, data5 %d\n",getpid(),data);
    _exit(0);
}
int main(int argc, char* argv[]){
    int pid;
    pid = fork();
    if(pid==0) {
        child_process();
    }else{
        sleep(1);                           printf("Parent process %d, data6 %d\n",getpid(), data);
        exit(0);
    }
}

上述代碼改動了一個地方,就是把vfork換成了fork,,你知道data4,、data5和data6的結(jié)果嗎?我們先來分析下vfork和fork的區(qū)別,,然后再公布答案,。

先說fork吧。fork創(chuàng)建出子進程后,,子進程復制了父進程的資源,,諸如文件系統(tǒng),打開的文件,,信號等,但是內(nèi)存空間卻是用了寫時拷貝機制(Copy On Write),,簡單介紹下寫時拷貝機制,就是子進程拷貝父進程的頁表,,并將父進程中具有寫權(quán)限的物理頁對應的頁表項置為只讀,,也就是說,此時父子進程具有相同的頁表,,虛擬地址對應的物理地址也一樣,,只是物理地址都是只讀的,當子進程或父進程其中的一個寫物理內(nèi)存時,由于是只讀的,,所以會發(fā)生pagefault,,此時才給執(zhí)行寫操作的進程分配物理頁,并將新分配的物理頁連接到執(zhí)行寫操作的進程的頁表中,,最后把舊物理頁對應的在沒執(zhí)行寫操作的進程的頁表項改為可寫,。這樣一來,父子進程相同的虛擬地址就對應了不同的物理地址,??赐晟鲜龅姆治觯敲磀ata4,、data5和data6分別是10,、20和10.你答對了嗎?

再說vfork,。vfork創(chuàng)建出子進程后,,子進程復制了父進程的文件系統(tǒng)、打開的文件,、信號等資源,,但是內(nèi)存空間卻是與父進程共享的,且父進程會阻塞,,直到子進程執(zhí)行exit(0)或執(zhí)行exec,。由于共享內(nèi)存,所以data1,、data2和data3的值就是10,、20和20.

最后在說一點,我們從分析中也可看出,,fork是依賴Copy On Write機制的,,而寫時拷貝機制依賴MMU,所以在沒有MMU的CPU上,,就沒有fork,,但是可以有vfork。

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多