{eval=Array;=+count(Array);}

国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

問答專欄Q & A COLUMN

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

reclayreclay 回答0 收藏1
收藏問題

2條回答

mist14

mist14

回答于2022-06-28 10:13

linux的進程

Linux 內核在系統啟動的最后階段會啟動 init 進程。Linux 系統的進程之間存在著明顯的繼承關系,所有的進程都是 pid 為 1 的 init 進程的后代。

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

linux創建進程的資源

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

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

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

實例

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

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

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

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

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


這就是“寫時拷貝”了。

評論0 贊同0
  •  加載中...
iamyoung001

iamyoung001

回答于2022-06-28 10:13

寫入緩存

評論0 贊同0
  •  加載中...

相關問題

最新活動

您已邀請0人回答 查看邀請

我的邀請列表

  • 擅長該話題
  • 回答過該話題
  • 我關注的人
向幫助了您的網友說句感謝的話吧!
付費偷看金額在0.1-10元之間
<