卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

Linux的寫時拷貝所指的“寫入”,具體是指什么?

網(wǎng)友解答: linux的進程Linux 內(nèi)核在系統(tǒng)啟動的最后階段會啟動 init 進程。Linux 系統(tǒng)的進程之間存在著明顯的繼承關(guān)系,所有的進程都是 pid 為 1 的 init 進程

網(wǎng)友解答:

linux的進程

Linux 內(nèi)核在系統(tǒng)啟動的最后階段會啟動 init 進程。Linux 系統(tǒng)的進程之間存在著明顯的繼承關(guān)系,所有的進程都是 pid 為 1 的 init 進程的后代。

其他一些操作系統(tǒng)在創(chuàng)建進程時,首先在地址空間里創(chuàng)建進程,讀入可執(zhí)行文件,最后開始執(zhí)行。Linux 是類 Unix 的操作系統(tǒng),關(guān)于進程創(chuàng)建,它不同于前面那些操作系統(tǒng),而是定義了 fork() 和 exec() 兩組函數(shù)。這里以 fork() 函數(shù)為例介紹題主所說的“寫時拷貝”。

linux創(chuàng)建進程的資源

fork() 函數(shù)通過拷貝父進程創(chuàng)建子進程,子進程與父進程的區(qū)別僅僅在于 pid,ppid 和一些資源的統(tǒng)計量,比如掛起的信號等。在早期,fork() 函數(shù)會將父進程的所有其他資源都復(fù)制給子進程。這種設(shè)計過于簡單粗暴,因為子進程也許并不需要父進程的資源,如果子進程被創(chuàng)建后,轉(zhuǎn)而執(zhí)行和之前毫不相關(guān)的工作,那之前拷貝資源的開銷就浪費了,一點意義也沒有。

為了解決上面提到的可能會出現(xiàn)浪費的問題,“寫時拷貝”的概念就被提出了。寫時拷貝是一種可以推遲甚至免去拷貝數(shù)據(jù)的技術(shù)。子進程被創(chuàng)建后,系統(tǒng)將父進程的資源以只讀的方式共享給子進程,這樣子進程能夠使用原本應(yīng)該拷貝給子進程的數(shù)據(jù),而同時又不會“污染”父進程。

這樣一來,如果子進程只需要讀取父進程數(shù)據(jù),或者不需要使用父進程的數(shù)據(jù),那么拷貝就免去了。如果子進程需要寫這部分?jǐn)?shù)據(jù),則為了保證進程之間的數(shù)據(jù)獨立性,系統(tǒng)才會將父進程的資源拷貝給子進程。

實例

結(jié)合上面這兩點,就是“寫時拷貝”的含義了,下面給出 demo:

char *buf = (char*)malloc(100*1024*1024);int pid = fork();if(pid==0){ printf("child exitn"); free(buf); exit(0);}else{ wait(&status); free(buf); exit(0);}

對于上面這種情況,因為子進程沒有用到父進程的 buf,所以系統(tǒng)就免去了拷貝 buf 100MB 的開銷,提升了效率。

char *buf = (char*)malloc(100*1024*1024);int pid = fork();if(pid==0){ buf[0] = 1; printf("child exitn"); free(buf); exit(0);}else{ wait(&status); free(buf); exit(0);}

而對于上面這種情況,因為子進程需要寫 buf,系統(tǒng)就不可避免的要把父進程的資源拷貝給子進程了。

這就是“寫時拷貝”了。

網(wǎng)友解答:

寫入緩存

標(biāo)簽: