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

資訊專欄INFORMATION COLUMN

COW奶牛!Copy On Write機(jī)制了解一下

Coding01 / 3216人閱讀

摘要:用于創(chuàng)建子進(jìn)程等同于當(dāng)前進(jìn)程的副本。這個(gè)函數(shù)會(huì)有兩次返回,將子進(jìn)程的返回給父進(jìn)程,返回給子進(jìn)程。當(dāng)父子進(jìn)程中有更改相應(yīng)段的行為發(fā)生時(shí),再為子進(jìn)程相應(yīng)的段分配物理空間。中斷例程中,就會(huì)把觸發(fā)的異常的頁(yè)復(fù)制一份,于是父子進(jìn)程各自持有獨(dú)立的一份。

前言
只有光頭才能變強(qiáng)

在讀《Redis設(shè)計(jì)與實(shí)現(xiàn)》關(guān)于哈希表擴(kuò)容的時(shí)候,發(fā)現(xiàn)這么一段話:

執(zhí)行BGSAVE命令或者BGREWRITEAOF命令的過程中,Redis需要?jiǎng)?chuàng)建當(dāng)前服務(wù)器進(jìn)程的子進(jìn)程,而大多數(shù)操作系統(tǒng)都采用寫時(shí)復(fù)制(copy-on-write)來(lái)優(yōu)化子進(jìn)程的使用效率,所以在子進(jìn)程存在期間,服務(wù)器會(huì)提高負(fù)載因子的閾值,從而避免在子進(jìn)程存在期間進(jìn)行哈希表擴(kuò)展操作,避免不必要的內(nèi)存寫入操作,最大限度地節(jié)約內(nèi)存。

觸及到知識(shí)的盲區(qū)了,于是就去搜了一下copy-on-write寫時(shí)復(fù)制這個(gè)技術(shù)究竟是怎么樣的。發(fā)現(xiàn)涉及的東西蠻多的,也挺難讀懂的。于是就寫下這篇筆記來(lái)記錄一下我學(xué)習(xí)copy-on-write的過程。

本文力求簡(jiǎn)單講清copy-on-write這個(gè)知識(shí)點(diǎn),希望大家看完能有所收獲。

一、Linux下的copy-on-write

在說(shuō)明Linux下的copy-on-write機(jī)制前,我們首先要知道兩個(gè)函數(shù):fork()exec()。需要注意的是exec()并不是一個(gè)特定的函數(shù), 它是一組函數(shù)的統(tǒng)稱, 它包括了execl()、execlp()execv()execle()、execve()、execvp()。

1.1簡(jiǎn)單來(lái)用用fork

首先我們來(lái)看一下fork()函數(shù)是什么鬼:

fork is an operation whereby a process creates a copy of itself.

fork是類Unix操作系統(tǒng)上創(chuàng)建進(jìn)程的主要方法。fork用于創(chuàng)建子進(jìn)程(等同于當(dāng)前進(jìn)程的副本)。

新的進(jìn)程要通過老的進(jìn)程復(fù)制自身得到,這就是fork!

如果接觸過Linux,我們會(huì)知道Linux下init進(jìn)程是所有進(jìn)程的爹(相當(dāng)于Java中的Object對(duì)象)

Linux的進(jìn)程都通過init進(jìn)程或init的子進(jìn)程fork(vfork)出來(lái)的。

下面以例子說(shuō)明一下fork吧:

#include???
#include???
?
int?main?()???
{???
????pid_t?fpid;?//fpid表示fork函數(shù)返回的值??
????int?count=0;
    
    // 調(diào)用fork,創(chuàng)建出子進(jìn)程??
????fpid=fork();

    // 所以下面的代碼有兩個(gè)進(jìn)程執(zhí)行!
????if?(fpid?

得到的結(jié)果輸出為:

我是子進(jìn)程,由父進(jìn)程fork出來(lái)

統(tǒng)計(jì)結(jié)果是: 1

我是父進(jìn)程

統(tǒng)計(jì)結(jié)果是: 1

解釋一下:

fork作為一個(gè)函數(shù)被調(diào)用。這個(gè)函數(shù)會(huì)有兩次返回,將子進(jìn)程的PID返回給父進(jìn)程,0返回給子進(jìn)程。(如果小于0,則說(shuō)明創(chuàng)建子進(jìn)程失敗)。

再次說(shuō)明:當(dāng)前進(jìn)程調(diào)用fork(),會(huì)創(chuàng)建一個(gè)跟當(dāng)前進(jìn)程完全相同的子進(jìn)程(除了pid),所以子進(jìn)程同樣是會(huì)執(zhí)行fork()之后的代碼。

所以說(shuō):

父進(jìn)程在執(zhí)行if代碼塊的時(shí)候,fpid變量的值是子進(jìn)程的pid

子進(jìn)程在執(zhí)行if代碼塊的時(shí)候,fpid變量的值是0

1.2再來(lái)看看exec()函數(shù)

從上面我們已經(jīng)知道了fork會(huì)創(chuàng)建一個(gè)子進(jìn)程。子進(jìn)程的是父進(jìn)程的副本。

exec函數(shù)的作用就是:裝載一個(gè)新的程序(可執(zhí)行映像)覆蓋當(dāng)前進(jìn)程內(nèi)存空間中的映像,從而執(zhí)行不同的任務(wù)。

exec系列函數(shù)在執(zhí)行時(shí)會(huì)直接替換掉當(dāng)前進(jìn)程的地址空間。

我去畫張圖來(lái)理解一下:

參考資料:

程序員必備知識(shí)——fork和exec函數(shù)詳解https://blog.csdn.net/bad_good_man/article/details/49364947

linux中fork()函數(shù)詳解(原創(chuàng)??!實(shí)例講解):https://blog.csdn.net/jason314/article/details/5640969

linux c語(yǔ)言 fork() 和 exec 函數(shù)的簡(jiǎn)介和用法:https://blog.csdn.net/nvd11/article/details/8856278

Linux下Fork與Exec使用:https://www.cnblogs.com/hicjiajia/archive/2011/01/20/1940154.html

Linux 系統(tǒng)調(diào)用 —— fork()內(nèi)核源碼剖析:https://blog.csdn.net/chen892704067/article/details/76596225

1.3回頭來(lái)看Linux下的COW是怎么一回事
fork()會(huì)產(chǎn)生一個(gè)和父進(jìn)程完全相同的子進(jìn)程(除了pid)

如果按傳統(tǒng)的做法,會(huì)直接將父進(jìn)程的數(shù)據(jù)拷貝到子進(jìn)程中,拷貝完之后,父進(jìn)程和子進(jìn)程之間的數(shù)據(jù)段和堆棧是相互獨(dú)立的。

但是,以我們的使用經(jīng)驗(yàn)來(lái)說(shuō):往往子進(jìn)程都會(huì)執(zhí)行exec()來(lái)做自己想要實(shí)現(xiàn)的功能。

所以,如果按照上面的做法的話,創(chuàng)建子進(jìn)程時(shí)復(fù)制過去的數(shù)據(jù)是沒用的(因?yàn)樽舆M(jìn)程執(zhí)行exec(),原有的數(shù)據(jù)會(huì)被清空)

既然很多時(shí)候復(fù)制給子進(jìn)程的數(shù)據(jù)是無(wú)效的,于是就有了Copy On Write這項(xiàng)技術(shù)了,原理也很簡(jiǎn)單:

fork創(chuàng)建出的子進(jìn)程,與父進(jìn)程共享內(nèi)存空間。也就是說(shuō),如果子進(jìn)程不對(duì)內(nèi)存空間進(jìn)行寫入操作的話,內(nèi)存空間中的數(shù)據(jù)并不會(huì)復(fù)制給子進(jìn)程,這樣創(chuàng)建子進(jìn)程的速度就很快了!(不用復(fù)制,直接引用父進(jìn)程的物理空間)。

并且如果在fork函數(shù)返回之后,子進(jìn)程第一時(shí)間exec一個(gè)新的可執(zhí)行映像,那么也不會(huì)浪費(fèi)時(shí)間和內(nèi)存空間了。

另外的表達(dá)方式:

在fork之后exec之前兩個(gè)進(jìn)程用的是相同的物理空間(內(nèi)存區(qū)),子進(jìn)程的代碼段、數(shù)據(jù)段、堆棧都是指向父進(jìn)程的物理空間,也就是說(shuō),兩者的虛擬空間不同,但其對(duì)應(yīng)的物理空間是同一個(gè)。

當(dāng)父子進(jìn)程中有更改相應(yīng)段的行為發(fā)生時(shí),再為子進(jìn)程相應(yīng)的段分配物理空間。

如果不是因?yàn)閑xec,內(nèi)核會(huì)給子進(jìn)程的數(shù)據(jù)段、堆棧段分配相應(yīng)的物理空間(至此兩者有各自的進(jìn)程空間,互不影響),而代碼段繼續(xù)共享父進(jìn)程的物理空間(兩者的代碼完全相同)。
而如果是因?yàn)閑xec,由于兩者執(zhí)行的代碼不同,子進(jìn)程的代碼段也會(huì)分配多帶帶的物理空間。

Copy On Write技術(shù)實(shí)現(xiàn)原理:

fork()之后,kernel把父進(jìn)程中所有的內(nèi)存頁(yè)的權(quán)限都設(shè)為read-only,然后子進(jìn)程的地址空間指向父進(jìn)程。當(dāng)父子進(jìn)程都只讀內(nèi)存時(shí),相安無(wú)事。當(dāng)其中某個(gè)進(jìn)程寫內(nèi)存時(shí),CPU硬件檢測(cè)到內(nèi)存頁(yè)是read-only的,于是觸發(fā)頁(yè)異常中斷(page-fault),陷入kernel的一個(gè)中斷例程。中斷例程中,kernel就會(huì)把觸發(fā)的異常的頁(yè)復(fù)制一份,于是父子進(jìn)程各自持有獨(dú)立的一份。

Copy On Write技術(shù)好處是什么?

COW技術(shù)可減少分配和復(fù)制大量資源時(shí)帶來(lái)的瞬間延時(shí)。

COW技術(shù)可減少不必要的資源分配。比如fork進(jìn)程時(shí),并不是所有的頁(yè)面都需要復(fù)制,父進(jìn)程的代碼段和只讀數(shù)據(jù)段都不被允許修改,所以無(wú)需復(fù)制。

Copy On Write技術(shù)缺點(diǎn)是什么?

如果在fork()之后,父子進(jìn)程都還需要繼續(xù)進(jìn)行寫操作,那么會(huì)產(chǎn)生大量的分頁(yè)錯(cuò)誤(頁(yè)異常中斷page-fault),這樣就得不償失。

幾句話總結(jié)Linux的Copy On Write技術(shù):

fork出的子進(jìn)程共享父進(jìn)程的物理空間,當(dāng)父子進(jìn)程有內(nèi)存寫入操作時(shí),read-only內(nèi)存頁(yè)發(fā)生中斷,將觸發(fā)的異常的內(nèi)存頁(yè)復(fù)制一份(其余的頁(yè)還是共享父進(jìn)程的)。

fork出的子進(jìn)程功能實(shí)現(xiàn)和父進(jìn)程是一樣的。如果有需要,我們會(huì)用exec()把當(dāng)前進(jìn)程映像替換成新的進(jìn)程文件,完成自己想要實(shí)現(xiàn)的功能。

參考資料:

Linux進(jìn)程基礎(chǔ):http://www.cnblogs.com/vamei/archive/2012/09/20/2694466.html

Linux寫時(shí)拷貝技術(shù)(copy-on-write)http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601655.html

當(dāng)你在 Linux 上啟動(dòng)一個(gè)進(jìn)程時(shí)會(huì)發(fā)生什么?https://zhuanlan.zhihu.com/p/33159508

Linux fork()所謂的寫時(shí)復(fù)制(COW)到最后還是要先復(fù)制再寫嗎?https://www.zhihu.com/question/265400460

寫時(shí)拷貝(copy-on-write) COW技術(shù)https://blog.csdn.net/u012333003/article/details/25117457

Copy-On-Write 寫時(shí)復(fù)制原理https://blog.csdn.net/ppppppppp2009/article/details/22750939

二、解釋一下Redis的COW

基于上面的基礎(chǔ),我們應(yīng)該已經(jīng)了解COW這么一項(xiàng)技術(shù)了。

下面我來(lái)說(shuō)一下我對(duì)《Redis設(shè)計(jì)與實(shí)現(xiàn)》那段話的理解:

Redis在持久化時(shí),如果是采用BGSAVE命令或者BGREWRITEAOF的方式,那Redis會(huì)fork出一個(gè)子進(jìn)程來(lái)讀取數(shù)據(jù),從而寫到磁盤中

總體來(lái)看,Redis還是讀操作比較多。如果子進(jìn)程存在期間,發(fā)生了大量的寫操作,那可能就會(huì)出現(xiàn)很多的分頁(yè)錯(cuò)誤(頁(yè)異常中斷page-fault),這樣就得耗費(fèi)不少性能在復(fù)制上。

而在rehash階段上,寫操作是無(wú)法避免的。所以Redis在fork出子進(jìn)程之后,將負(fù)載因子閾值提高,盡量減少寫操作,避免不必要的內(nèi)存寫入操作,最大限度地節(jié)約內(nèi)存。

參考資料:

fork()后copy on write的一些特性:https://zhoujianshi.github.io/articles/2017/fork()%E5%90%8Ecopy%20on%20write%E7%9A%84%E4%B8%80%E4%BA%9B%E7%89%B9%E6%80%A7/index.html%E5%90%8Ecopy%20on%20write%E7%9A%84%E4%B8%80%E4%BA%9B%E7%89%B9%E6%80%A7/index.html)

寫時(shí)復(fù)制:https://miao1007.github.io/gitbook/java/juc/cow/

三、文件系統(tǒng)的COW

下面來(lái)看看文件系統(tǒng)中的COW是啥意思:

Copy-on-write在對(duì)數(shù)據(jù)進(jìn)行修改的時(shí)候,不會(huì)直接在原來(lái)的數(shù)據(jù)位置上進(jìn)行操作,而是重新找個(gè)位置修改,這樣的好處是一旦系統(tǒng)突然斷電,重啟之后不需要做Fsck。好處就是能保證數(shù)據(jù)的完整性,掉電的話容易恢復(fù)

比如說(shuō):要修改數(shù)據(jù)塊A的內(nèi)容,先把A讀出來(lái),寫到B塊里面去。如果這時(shí)候斷電了,原來(lái)A的內(nèi)容還在!

參考資料:

文件系統(tǒng)中的 copy-on-write 模式有什么具體的好處?https://www.zhihu.com/question/19782224/answers/created

新一代 Linux 文件系統(tǒng) btrfs 簡(jiǎn)介:https://www.ibm.com/developerworks/cn/linux/l-cn-btrfs/

最后

最后我們?cè)賮?lái)看一下寫時(shí)復(fù)制的思想(摘錄自維基百科):

寫入時(shí)復(fù)制(英語(yǔ):Copy-on-write,簡(jiǎn)稱COW)是一種計(jì)算機(jī)程序設(shè)計(jì)領(lǐng)域的優(yōu)化策略。其核心思想是,如果有多個(gè)調(diào)用者(callers)同時(shí)請(qǐng)求相同資源(如內(nèi)存或磁盤上的數(shù)據(jù)存儲(chǔ)),他們會(huì)共同獲取相同的指針指向相同的資源,直到某個(gè)調(diào)用者試圖修改資源的內(nèi)容時(shí),系統(tǒng)才會(huì)真正復(fù)制一份專用副本(private copy)給該調(diào)用者,而其他調(diào)用者所見到的最初的資源仍然保持不變。這過程對(duì)其他的調(diào)用者都是透明的(transparently)。此作法主要的優(yōu)點(diǎn)是如果調(diào)用者沒有修改該資源,就不會(huì)有副本(private copy)被建立,因此多個(gè)調(diào)用者只是讀取操作時(shí)可以共享同一份資源。

至少?gòu)谋疚奈覀兛梢钥偨Y(jié)出:

Linux通過Copy On Write技術(shù)極大地減少了Fork的開銷。

文件系統(tǒng)通過Copy On Write技術(shù)一定程度上保證數(shù)據(jù)的完整性

其實(shí)在Java里邊,也有Copy On Write技術(shù)。

這部分留到下一篇來(lái)說(shuō),敬請(qǐng)期待~

如果大家有更好的理解方式或者文章有錯(cuò)誤的地方還請(qǐng)大家不吝在評(píng)論區(qū)留言,大家互相學(xué)習(xí)交流~~~

參考資料:

寫時(shí)復(fù)制,寫時(shí)拷貝,寫時(shí)分裂,Copy on write:https://my.oschina.net/dubenju/blog/815836

不會(huì)產(chǎn)奶的COW(Copy-On-Write)https://www.jianshu.com/p/b2fb2ee5e3a0

一個(gè)堅(jiān)持原創(chuàng)的Java技術(shù)公眾號(hào):Java3y,歡迎大家關(guān)注

3y所有的原創(chuàng)文章:

文章的目錄導(dǎo)航(腦圖+海量視頻資源):https://github.com/ZhongFuCheng3y/3y

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/71957.html

相關(guān)文章

  • 帶你了解集合世界的fail-fast機(jī)制CopyOnWriteArrayList 源碼詳解

    摘要:體現(xiàn)的就是適配器模式。數(shù)組對(duì)象集合世界中的機(jī)制機(jī)制集合世界中比較常見的錯(cuò)誤檢測(cè)機(jī)制,防止在對(duì)集合進(jìn)行遍歷過程當(dāng)中,出現(xiàn)意料之外的修改,會(huì)通過異常暴力的反應(yīng)出來(lái)。而在增強(qiáng)循環(huán)中,集合遍歷是通過進(jìn)行的。 前言 學(xué)習(xí)情況記錄 時(shí)間:week 2 SMART子目標(biāo) :Java 容器 記錄在學(xué)習(xí)Java容器 知識(shí)點(diǎn)中,關(guān)于List的重點(diǎn)知識(shí)點(diǎn)。 知識(shí)點(diǎn)概覽: 容器中的設(shè)計(jì)模式 從Array...

    young.li 評(píng)論0 收藏0
  • Docker鏡像細(xì)節(jié)

    摘要:簡(jiǎn)單來(lái)說(shuō)是鏡像的源碼。例如,的鏡像鏡像,在中是一個(gè)基礎(chǔ)鏡像的鏡像也是鏡像那么鏡像和共享同一個(gè)基礎(chǔ)鏡像層,提高了存儲(chǔ)效率。 前言 只有光頭才能變強(qiáng)。 文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:https://github.com/ZhongFuCheng3y/3y showImg(https://segmentfault.com/img/remote/14600000180560...

    xiaokai 評(píng)論0 收藏0
  • CopyOnWriteArrayList你都不知道,怎么拿offer?

    摘要:今天主要講解的是本文力求簡(jiǎn)單講清每個(gè)知識(shí)點(diǎn),希望大家看完能有所收獲一和回顧線程安全的和我們知道是用于替代的,是線程安全的容器。使用迭代器遍歷時(shí)不需要顯示加鎖,看看與方法的實(shí)現(xiàn)可能就有點(diǎn)眉目了。 前言 只有光頭才能變強(qiáng) showImg(https://segmentfault.com/img/remote/1460000016931828?w=1120&h=640); 前一陣子寫過一篇C...

    noONE 評(píng)論0 收藏0
  • PHP寫時(shí)復(fù)制(Copy On Write

    摘要:只有在真正需要使用資源時(shí)才占用資源,寫時(shí)復(fù)制通常能減少資源的占用?;A(chǔ)方面規(guī)范新特性性能調(diào)優(yōu)垃圾回收機(jī)制安全攻擊原理和防范攻擊原理和防范注入攻擊防范密碼哈希計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議協(xié)議連接過程 從一個(gè)例子說(shuō)起: 很明顯在這段代碼執(zhí)行以后,$var_dup 的值應(yīng)該還是laruence, 那么這又是怎么實(shí)現(xiàn)的呢?這就是 PHP 的 copy on write 機(jī)制: PHP 在修改一個(gè)變量以前,...

    arashicage 評(píng)論0 收藏0
  • 史上最奇葩的5種編程語(yǔ)言,有的甚至模擬奶牛

    摘要:編者按本文作者為,主要介紹世上最怪異最難用的種編程語(yǔ)言。這些語(yǔ)言被稱為極品編程語(yǔ)言。創(chuàng)造它們的原因通常是為了測(cè)試編程語(yǔ)言設(shè)計(jì)的臨界,或者只是一個(gè)玩笑。就是母牛的編程語(yǔ)言設(shè)計(jì)時(shí)充分考慮了母牛的想法。 【編者按】本文作者為 Deepak Karanth,主要介紹世上最怪異、最難用的5種編程語(yǔ)言。文章系國(guó)內(nèi) ITOM 管理平臺(tái) OneAPM 編譯呈現(xiàn)。 最難學(xué)編程語(yǔ)言有哪些?很多人都用過Ja...

    LdhAndroid 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<