<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          有用的"Copy-On-write",寫(xiě)時(shí)復(fù)制

          共 2438字,需瀏覽 5分鐘

           ·

          2020-11-15 06:51


          寫(xiě)時(shí)復(fù)制和寫(xiě)時(shí)拷貝是一個(gè)意思


          寫(xiě)時(shí)復(fù)制是一種策略,并不是Linux獨(dú)有的,如果你正在設(shè)計(jì)某個(gè)系統(tǒng)架構(gòu),也可以參考這種思想。


          寫(xiě)時(shí)復(fù)制的英文解釋如下


          Copy-on-write (sometimes referred to as "COW") is an optimization strategy used in computer programming.?


          寫(xiě)時(shí)復(fù)制是計(jì)算機(jī)的一種優(yōu)化策略,也可以說(shuō)是優(yōu)化機(jī)制,是計(jì)算機(jī)的優(yōu)化策略并沒(méi)有錯(cuò),但是這種策略是人想出來(lái)的。


          The fundamental idea is that if multiple callers ask for resources which are initially indistinguishable, you can give them pointers to the same resource.?


          它的基本思想是,如果有多個(gè)調(diào)用「callers」,也可以說(shuō)是多個(gè)進(jìn)程,多個(gè)線(xiàn)程,Linux里面只關(guān)心任務(wù)就好了」請(qǐng)求同一個(gè)難以區(qū)分的資源,你可以讓他們指向同一個(gè)資源指針。


          This function can be maintained until a caller tries to modify its "copy" of the resource, at which point a true private copy is created to prevent the changes becoming visible to everyone else.All of this happens transparently to the callers.?


          直到有其中一個(gè)調(diào)用者,試圖更改這個(gè)兩個(gè)進(jìn)程都指向的資源,系統(tǒng)才會(huì)分配一個(gè)真正的資源「可以認(rèn)為是物理地址」給這個(gè)調(diào)用者。這個(gè)過(guò)程對(duì)所有人可見(jiàn)


          The primary advantage is that if a caller never makes any modifications, no private copy need ever be created.


          如果調(diào)用方,也就是擁有相同資源指針的兩個(gè)進(jìn)程,都不對(duì)資源進(jìn)行修改,那么就不需要生產(chǎn)一個(gè)副本資源。


          寫(xiě)時(shí)復(fù)制的縮寫(xiě)是「COW,奶牛」,但是實(shí)際上它跟奶牛沒(méi)有任何關(guān)系。


          舉個(gè)例子說(shuō)明


          假設(shè)你是一個(gè)酒店老板,馬云和任正非在你們酒店訂了2020年11月20號(hào)的房間,你當(dāng)時(shí)看到酒店還沒(méi)有住滿(mǎn),所以就給他們下發(fā)了一個(gè)訂購(gòu)成功的返回值。


          如果是程序,在內(nèi)存充分的情況下,創(chuàng)建進(jìn)程也就成功了。


          然后,你其實(shí)不需要馬上給馬云和任正非安排具體的房間,因?yàn)樗麄儌z都還沒(méi)有到酒店開(kāi)房。


          假設(shè)晚上他們過(guò)來(lái)開(kāi)房了,你就需要給他們開(kāi)辟這個(gè)房間「也可以認(rèn)為是資源」,給他們晚上做他們想做的事情。


          如果他們一直都不來(lái),那你就不用給他們開(kāi)房,也就不實(shí)際占用你的房間。



          fork()函數(shù)和寫(xiě)時(shí)復(fù)制


          fork()函數(shù)是一個(gè)神奇的函數(shù),調(diào)用一次,會(huì)返回兩次,在這個(gè)過(guò)程中子進(jìn)程和父進(jìn)程是共享一個(gè)內(nèi)存空間的。


          #include?
          #include?

          int?main()
          {
          ?int?pid?=?fork();
          ?if(pid?==?-1){
          ??return?(-1);
          ?}

          ?if(pid?>?0){
          ??printf("Hi,Father?Pid:%d\n",getpid());
          ??return?(0);
          ?}?else?{
          ??printf("Hi,Child?Pid:%d\n",getpid());
          ??return?(0);
          ?}
          }



          -- 程序輸出:

          weiqifa@bsp-ubuntu1804:~/linux$?gcc?-o?copy?copy-for-write.c?
          weiqifa@bsp-ubuntu1804:~/linux$?./copy
          Hi,Father?Pid:36320
          Hi,Child?Pid:36321


          -- 然后我加入一個(gè)資源

          #include?
          #include?

          int?main()
          {
          ?char?c?=?'a';

          ?int?pid?=?fork();
          ?if(pid?==?-1){
          ??return?(-1);
          ?}

          ?if(pid?>?0){
          ??c?=?'v';
          ??printf("Hi,Father?Pid:%d?&c:%p?c:%c\n",getpid(),&c,c);
          ??return?(0);
          ?}?else?{
          ??printf("Hi,Child??Pid:%d?&c:%p?c:%c\n",getpid(),&c,c);
          ??return?(0);
          ?}
          }

          -- 程序輸出:

          weiqifa@bsp-ubuntu1804:~/linux$?gcc?-o?copy?copy-for-write.c?&&?./copy
          Hi,Father?Pid:36518?&c:0x7ffc41acae93?c:v
          Hi,Child??Pid:36519?&c:0x7ffc41acae93?c:a


          我們可以看到,父進(jìn)程中我們對(duì)資源 c 進(jìn)行了修改,并打印了資源的地址和值,然后我們?cè)谧舆M(jìn)程中也打印資源的值。


          可以看到,父進(jìn)程先執(zhí)行修改?c 的值,并打印 c 的值 是 v

          子進(jìn)程運(yùn)行,打印 c?的值,c 的值是 原理的初始化值 a


          也就是說(shuō)這個(gè)過(guò)程發(fā)生了寫(xiě)時(shí)復(fù)制,在父進(jìn)程種給 c?分配了物理內(nèi)存區(qū)別于子進(jìn)程。


          創(chuàng)建進(jìn)程沒(méi)有發(fā)生寫(xiě)時(shí)拷貝的情況


          沒(méi)有發(fā)生寫(xiě)時(shí)復(fù)制的情況



          發(fā)生了寫(xiě)時(shí)復(fù)制的情況




          推薦閱讀:
          ? ??專(zhuān)輯|Linux文章匯總
          ? ??專(zhuān)輯|程序人生
          ? ??專(zhuān)輯|C語(yǔ)言

          嵌入式Linux
          微信掃描二維碼,關(guān)注我的公眾號(hào)?
          瀏覽 64
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色精品视频 | 欧美操操操操操操 | 日韩99在线观看 | 色色中文网 | A3级黄色视频 |