進(jìn)程###
進(jìn)程基本知識(shí):
進(jìn)程結(jié)構(gòu)、進(jìn)程調(diào)度、進(jìn)程狀態(tài)
http://www.jellythink.com/archives/900
- 進(jìn)程的結(jié)構(gòu)
子進(jìn)程復(fù)制了父進(jìn)程的什么
http://www.cnblogs.com/zhangchaoyang/articles/2317420.html
fork()會(huì)產(chǎn)生一個(gè)和父進(jìn)程完全相同的子進(jìn)程州藕,但子進(jìn)程在此后多會(huì)exec系統(tǒng)調(diào)用授药,出于效率考慮庄撮,linux中引入了讀時(shí)共享,寫時(shí)復(fù)制技術(shù)癌刽,也就是只有進(jìn)程空間的各段的內(nèi)容要發(fā)生變化時(shí),才會(huì)將父進(jìn)程的內(nèi)容復(fù)制一份給子進(jìn)程尝丐。
在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ì)分配單獨(dú)的物理空間。
fork之后內(nèi)核會(huì)通過(guò)將子進(jìn)程放在隊(duì)列的前面玄呛,以讓子進(jìn)程先執(zhí)行阅懦,以免父進(jìn)程執(zhí)行導(dǎo)致寫時(shí)復(fù)制,而后子進(jìn)程執(zhí)行exec系統(tǒng)調(diào)用把鉴,因無(wú)意義的復(fù)制而造成效率的下降故黑。
fork時(shí)子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的復(fù)制庭砍,所以變量的地址(當(dāng)然是虛擬地址)也是一樣的场晶。
每個(gè)進(jìn)程都有自己的虛擬地址空間,不同進(jìn)程的相同的虛擬地址顯然可以對(duì)應(yīng)不同的物理地址怠缸。因此地址相同(虛擬地址)而值不同沒(méi)什么奇怪诗轻。
具體過(guò)程是這樣的:fork子進(jìn)程完全復(fù)制父進(jìn)程的棧空間揭北,也復(fù)制了頁(yè)表扳炬,但沒(méi)有復(fù)制物理頁(yè)面吏颖,所以這時(shí)虛擬地址相同,物理地址也相同恨樟,但是會(huì)把父子共享的頁(yè)面標(biāo)記為“只讀”(類似mmap的private的方式)半醉,如果父子進(jìn)程一直對(duì)這個(gè)頁(yè)面是同一個(gè)頁(yè)面,知道其中任何一個(gè)進(jìn)程要對(duì)共享的頁(yè)面“寫操作”劝术,這時(shí)內(nèi)核會(huì)復(fù)制一個(gè)物理頁(yè)面給這個(gè)進(jìn)程使用缩多,同時(shí)修改頁(yè)表。而把原來(lái)的只讀頁(yè)面標(biāo)記為“可寫”养晋,留給另外一個(gè)進(jìn)程使用衬吆。這就是所謂的“寫時(shí)復(fù)制”。
正因?yàn)閒ork采用了這種寫時(shí)復(fù)制的機(jī)制绳泉,所以fork出來(lái)子進(jìn)程之后逊抡,父子進(jìn)程哪個(gè)先調(diào)度呢??jī)?nèi)核一般會(huì)先調(diào)度子進(jìn)程零酪,因?yàn)楹芏嗲闆r下子進(jìn)程是要馬上執(zhí)行exec冒嫡,會(huì)清空棧、堆蛾娶。灯谣。這些和父進(jìn)程共享的空間,加載新的代碼段蛔琅。胎许。。罗售,這就避免了“寫時(shí)復(fù)制”拷貝共享頁(yè)面的機(jī)會(huì)辜窑。如果父進(jìn)程先調(diào)度很可能寫共享頁(yè)面,會(huì)產(chǎn)生“寫時(shí)復(fù)制”的無(wú)用功寨躁。所以穆碎,一般是子進(jìn)程先調(diào)度滴。進(jìn)程調(diào)度
在單個(gè)處理器上职恳,同一時(shí)間只能有一個(gè)進(jìn)程可以運(yùn)行所禀,其它進(jìn)程都處于等待運(yùn)行狀態(tài)。但是放钦,我們實(shí)際的感覺(jué)是同一時(shí)刻有多個(gè)進(jìn)程在“同時(shí)”進(jìn)行運(yùn)行色徘,這是為什么呢?
操作系統(tǒng)會(huì)分給每個(gè)進(jìn)程一定的運(yùn)行時(shí)間操禀,叫做“時(shí)間片”褂策。進(jìn)程在這個(gè)“時(shí)間片”內(nèi)運(yùn)行,由于“時(shí)間片”非常的短,這樣就給人一種多個(gè)程序在同時(shí)運(yùn)行的假象斤寂。操作系統(tǒng)是如何調(diào)度進(jìn)程的呢耿焊?進(jìn)程調(diào)度的規(guī)則有很多,比如根據(jù)優(yōu)先級(jí)進(jìn)行調(diào)度算法遍搞,先進(jìn)先出調(diào)度算法等罗侯。
Linux內(nèi)核進(jìn)程調(diào)度器是根據(jù)進(jìn)程的優(yōu)先級(jí)來(lái)進(jìn)行進(jìn)程調(diào)度的。優(yōu)先級(jí)高的進(jìn)程運(yùn)行得更為頻繁尾抑。
進(jìn)程間通信###
參考文章####
- 各種進(jìn)程間通信方法都講了
講的比較好的歇父,缺socket
http://read.pudn.com/downloads113/ebook/470525/linux%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1.pdf
總結(jié)了一波,各種進(jìn)程間通信方法優(yōu)缺點(diǎn)
https://www.ibm.com/developerworks/cn/linux/l-ipc/
講的可以參考
https://segmentfault.com/a/1190000004629793
各種進(jìn)程間通信方法實(shí)踐
https://github.com/clpsz/linux-ipcs
管道####
參考文章
講環(huán)形緩沖區(qū)很細(xì)致
http://blog.csdn.net/yangwen123/article/details/14118733
四種情況講的很細(xì)致
http://zxtong.blog.51cto.com/10697148/1763104
管道和fifo
http://blog.csdn.net/anonymalias/article/details/9391743管道的局限性(匿名管道)
管道的主要局限性正體現(xiàn)在它的特點(diǎn)上:只支持單向數(shù)據(jù)流再愈;(pipe單向通信,因?yàn)楦缸舆M(jìn)程共享同一個(gè)file結(jié)構(gòu)體)
只能用于具有親緣關(guān)系的進(jìn)程之間护戳;
沒(méi)有名字翎冲;
管道的緩沖區(qū)是有限的(管道只存在于內(nèi)核空間中,在管道創(chuàng)建時(shí)媳荒,為緩沖區(qū)分配一個(gè)頁(yè)面大锌购贰);
管道所傳送的是無(wú)格式字節(jié)流钳枕,這就要求管道的讀出方和寫入方必須事先約定好數(shù)據(jù)的格式缴渊,比如多少字節(jié)算作一個(gè)消息(或命令、或記錄)等等
FIFO(First In First Out)鱼炒,又稱為有名管道衔沼,彌補(bǔ)了管道只能用于有共同祖先的進(jìn)程間通信的不足,相對(duì)于pipe昔瞧,fifo主要有以下幾個(gè)優(yōu)點(diǎn):
可以用于任意進(jìn)程之間通信
可以有多個(gè)讀/寫進(jìn)程同時(shí)對(duì)管道進(jìn)行操作
可以像變通文件一樣管理管道的權(quán)限
可以使用標(biāo)準(zhǔn)文件讀寫方式來(lái)操作管道(打開指蚁,讀/寫,關(guān)閉)
信號(hào)量####
自晰。凝化。。酬荞。搓劫。
unix domain socket####
這個(gè)文章里有例子
http://www.reibang.com/p/431aeca69b07
進(jìn)程的同步與互斥###
這篇文章講的很好:
http://www.cnblogs.com/CareySon/archive/2012/04/14/Process-SynAndmutex.html
上文總結(jié)出的同步和互斥:
-
臨界資源
在操作系統(tǒng)中,進(jìn)程是占有資源的最小單位(線程可以訪問(wèn)其所在進(jìn)程內(nèi)的所有資源混巧,但線程本身并不占有資源或僅僅占有一點(diǎn)必須資源)枪向。但對(duì)于某些資源來(lái)說(shuō),其在同一時(shí)間只能被一個(gè)進(jìn)程所占用牲剃。這些一次只能被一個(gè)進(jìn)程所占用的資源就是所謂的臨界資源遣疯。典型的臨界資源比如物理上的打印機(jī),或是存在硬盤或內(nèi)存中被多個(gè)進(jìn)程所共享的一些變量和數(shù)據(jù)等(如果這類資源不被看成臨界資源加以保護(hù),那么很有可能造成丟數(shù)據(jù)的問(wèn)題)缠犀。對(duì)于臨界資源的訪問(wèn)数苫,必須是互訴進(jìn)行。也就是當(dāng)臨界資源被占用時(shí)辨液,另一個(gè)申請(qǐng)臨界資源的進(jìn)程會(huì)被阻塞虐急,直到其所申請(qǐng)的臨界資源被釋放。而進(jìn)程內(nèi)訪問(wèn)臨界資源的代碼被成為臨界區(qū)滔迈。
對(duì)于臨界區(qū)的訪問(wèn)過(guò)程分為四個(gè)部分:
1.進(jìn)入?yún)^(qū):查看臨界區(qū)是否可訪問(wèn)止吁,如果可以訪問(wèn),則轉(zhuǎn)到步驟二燎悍,否則進(jìn)程會(huì)被阻塞
2.臨界區(qū):在臨界區(qū)做操作
3.退出區(qū):清除臨界區(qū)被占用的標(biāo)志
4.剩余區(qū):進(jìn)程與臨界區(qū)不相關(guān)部分的代碼
-
進(jìn)程同步
進(jìn)程同步也是進(jìn)程之間直接的制約關(guān)系敬惦,是為完成某種任務(wù)而建立的兩個(gè)或多個(gè)線程,這個(gè)線程需要在某些位置上協(xié)調(diào)他們的工作次序而等待谈山、傳遞信息所產(chǎn)生的制約關(guān)系俄删。進(jìn)程間的直接制約關(guān)系來(lái)源于他們之間的合作。
比如說(shuō)進(jìn)程A需要從緩沖區(qū)讀取進(jìn)程B產(chǎn)生的信息奏路,當(dāng)緩沖區(qū)為空時(shí)畴椰,進(jìn)程B因?yàn)樽x取不到信息而被阻塞。而當(dāng)進(jìn)程A產(chǎn)生信息放入緩沖區(qū)時(shí)鸽粉,進(jìn)程B才會(huì)被喚醒斜脂。
-
進(jìn)程互斥
進(jìn)程互斥是進(jìn)程之間的間接制約關(guān)系。當(dāng)一個(gè)進(jìn)程進(jìn)入臨界區(qū)使用臨界資源時(shí)触机,另一個(gè)進(jìn)程必須等待帚戳。只有當(dāng)使用臨界資源的進(jìn)程退出臨界區(qū)后,這個(gè)進(jìn)程才會(huì)解除阻塞狀態(tài)威兜。
比如進(jìn)程B需要訪問(wèn)打印機(jī)销斟,但此時(shí)進(jìn)程A占有了打印機(jī),進(jìn)程B會(huì)被阻塞椒舵,直到進(jìn)程A釋放了打印機(jī)資源,進(jìn)程B才可以繼續(xù)執(zhí)行蚂踊。
-
實(shí)現(xiàn)臨界區(qū)互斥的基本方法
硬件實(shí)現(xiàn)方法(以前不知道)
通過(guò)硬件實(shí)現(xiàn)臨界區(qū)最簡(jiǎn)單的辦法就是關(guān)CPU的中斷。從計(jì)算機(jī)原理我們知道笔宿,CPU進(jìn)行進(jìn)程切換是需要通過(guò)中斷來(lái)進(jìn)行犁钟。如果屏蔽了中斷那么就可以保證當(dāng)前進(jìn)程順利的將臨界區(qū)代碼執(zhí)行完,從而實(shí)現(xiàn)了互斥泼橘。這個(gè)辦法的步驟就是:屏蔽中斷--執(zhí)行臨界區(qū)--開中斷涝动。但這樣做并不好,這大大限制了處理器交替執(zhí)行任務(wù)的能力炬灭。并且將關(guān)中斷的權(quán)限交給用戶代碼醋粟,那么如果用戶代碼屏蔽了中斷后不再開,那系統(tǒng)豈不是跪了?
還有硬件的指令實(shí)現(xiàn)方式米愿,這個(gè)方式和接下來(lái)要說(shuō)的信號(hào)量方式如出一轍厦凤。但是通過(guò)硬件來(lái)實(shí)現(xiàn),這里就不細(xì)說(shuō)了育苟。
信號(hào)量實(shí)現(xiàn)方式
這也是我們比較熟悉P V操作较鼓。通過(guò)設(shè)置一個(gè)表示資源個(gè)數(shù)的信號(hào)量S,通過(guò)對(duì)信號(hào)量S的P和V操作來(lái)實(shí)現(xiàn)進(jìn)程的的互斥违柏。
P和V操作分別來(lái)自荷蘭語(yǔ)Passeren和Vrijgeven博烂,分別表示占有和釋放。P V操作是操作系統(tǒng)的原語(yǔ)漱竖,意味著具有原子性禽篱。P操作首先減少信號(hào)量,表示有一個(gè)進(jìn)程將占用或等待資源闲孤,然后檢測(cè)S是否小于0,如果小于0則阻塞谆级,如果大于0則占有資源進(jìn)行執(zhí)行。
V操作是和P操作相反的操作讼积,首先增加信號(hào)量,表示占用或等待資源的進(jìn)程減少了1個(gè)脚仔。然后檢測(cè)S是否小于0勤众,如果小于0則喚醒等待使用S資源的其它進(jìn)程。
linux線程同步和進(jìn)程同步的區(qū)別###
http://blog.csdn.net/daiyudong2020/article/details/51707823
和進(jìn)程相比鲤脏,使用線程的理由###
進(jìn)程和線程
進(jìn)程是程序執(zhí)行時(shí)的一個(gè)實(shí)例们颜,即它是程序已經(jīng)執(zhí)行到何種程度的數(shù)據(jù)結(jié)構(gòu)的匯集。從內(nèi)核的觀點(diǎn)看猎醇,進(jìn)程的目的就是擔(dān)當(dāng)分配系統(tǒng)資源(CPU時(shí)間窥突、內(nèi)存等)的基本單位。
線程是進(jìn)程的一個(gè)執(zhí)行流硫嘶,是CPU調(diào)度和分派的基本單位阻问,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。一個(gè)進(jìn)程由幾個(gè)線程組成(擁有很多相對(duì)獨(dú)立的執(zhí)行流的用戶程序共享應(yīng)用程序的大部分?jǐn)?shù)據(jù)結(jié)構(gòu))沦疾,線程與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源称近。
"進(jìn)程——資源分配的最小單位,線程——程序執(zhí)行的最小單位"
進(jìn)程有獨(dú)立的地址空間哮塞,線程沒(méi)有單獨(dú)的地址空間(同一進(jìn)程內(nèi)的線程共享進(jìn)程的地址空間)
進(jìn)程有獨(dú)立的地址空間刨秆,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響忆畅,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑衡未。線程有自己的堆棧和局部變量,但線程沒(méi)有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉缓醋,所以多進(jìn)程的程序要比多線程的程序健壯如失,但在進(jìn)程切換時(shí),耗費(fèi)資源較大改衩,效率要差一些岖常。但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程葫督,不能用進(jìn)程竭鞍。
使用線程的理由
- 使用多線程的理由之一是和進(jìn)程相比,它是一種非常"節(jié)儉"的多任務(wù)操作方式橄镜。
我們知道偎快,在Linux系統(tǒng)下,啟動(dòng)一個(gè)新的進(jìn)程必須分配給它獨(dú)立的地址空間洽胶,建立眾多的數(shù)據(jù)表來(lái)維護(hù)它的代碼段晒夹、堆棧段和數(shù)據(jù)段,這是一種"昂貴"的多任務(wù)工作方式姊氓。而運(yùn)行于一個(gè)進(jìn)程中的多個(gè)線程丐怯,它們彼此之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù)翔横,啟動(dòng)一個(gè)線程所花費(fèi)的空間遠(yuǎn)遠(yuǎn)小于啟動(dòng)一個(gè)進(jìn)程所花費(fèi)的空間读跷,而且,線程間彼此切換所需的時(shí)間也遠(yuǎn)遠(yuǎn)小于進(jìn)程間切換所需要的時(shí)間禾唁。據(jù)統(tǒng)計(jì)效览,總的說(shuō)來(lái),一個(gè)進(jìn)程的開銷大約是一個(gè)線程開銷的30倍左右荡短,當(dāng)然丐枉,在具體的系統(tǒng)上,這個(gè)數(shù)據(jù)可能會(huì)有較大的區(qū)別掘托。 - 使用多線程的理由之二是線程間方便的通信機(jī)制瘦锹。
對(duì)不同進(jìn)程來(lái)說(shuō),它們具有獨(dú)立的數(shù)據(jù)空間烫映,要進(jìn)行數(shù)據(jù)的傳遞只能通過(guò)通信的方式進(jìn)行沼本,這種方式不僅費(fèi)時(shí),而且很不方便锭沟。線程則不然抽兆,由于同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個(gè)線程的數(shù)據(jù)可以直接為其它線程所用族淮,這不僅快捷辫红,而且方便凭涂。當(dāng)然,數(shù)據(jù)的共享也帶來(lái)其他一些問(wèn)題贴妻,有的變量不能同時(shí)被兩個(gè)線程所修改切油,有的子程序中聲明為static的數(shù)據(jù)更有可能給多線程程序帶來(lái)災(zāi)難性的打擊,這些正是編寫多線程程序時(shí)最需要注意的地方名惩。 - 除了以上所說(shuō)的優(yōu)點(diǎn)外澎胡,不和進(jìn)程比較,多線程程序作為一種多任務(wù)娩鹉、并發(fā)的工作方式攻谁,當(dāng)然有以下的優(yōu)點(diǎn):
- 提高應(yīng)用程序響應(yīng)。這對(duì)圖形界面的程序尤其有意義弯予,當(dāng)一個(gè)操作耗時(shí)很長(zhǎng)時(shí)戚宦,整個(gè)系統(tǒng)都會(huì)等待這個(gè)操作,此時(shí)程序不會(huì)響應(yīng)鍵盤锈嫩、鼠標(biāo)受楼、菜單的操作,而使用多線程技術(shù)呼寸,將耗時(shí)長(zhǎng)的操作(time consuming)置于一個(gè)新的線程艳汽,可以避免這種尷尬的情況。
- 使多CPU系統(tǒng)更加有效对雪。操作系統(tǒng)會(huì)保證當(dāng)線程數(shù)不大于CPU數(shù)目時(shí)骚灸,不同的線程運(yùn)行于不同的CPU上。
- 改善程序結(jié)構(gòu)慌植。一個(gè)既長(zhǎng)又復(fù)雜的進(jìn)程可以考慮分為多個(gè)線程,成為幾個(gè)獨(dú)立或半獨(dú)立的運(yùn)行部分义郑,這樣的程序會(huì)利于理解和修改蝶柿。
線程同步###
線程同步,同步的是什么非驮?它同步的是對(duì)共享資源(內(nèi)存區(qū)域交汤,公共變量等)或者臨界區(qū)域的訪問(wèn)。有的時(shí)候劫笙,這些共享資源和臨界區(qū)域芙扎,就只能容忍一個(gè)線程對(duì)它進(jìn)行操作(讀或者寫,讀操作一般不控制填大,主要是寫操作)戒洼,這個(gè)時(shí)候,我們必須要對(duì)這些共享資源或者臨界區(qū)域進(jìn)行同步允华,那么如何對(duì)它們進(jìn)行線程同步呢圈浇?
-
進(jìn)程和線程之間的關(guān)系
-
線程共享的資源
-
線程之間非共享的資源
-
線程為什么要同步
1.共享資源寥掐,多個(gè)線程都可對(duì)共享資源操作
2.線程操作共享資源的先后順序不確定
3.處理器對(duì)存儲(chǔ)器的操作一般不是原子操作(如加法分了三步) - 線程同步方法:
-
互斥量
http://www.jellythink.com/archives/818 -
讀寫鎖
- 讀共享,寫?yīng)氄?/li>
- 通常用在讀的次數(shù)遠(yuǎn)遠(yuǎn)多于寫的次數(shù)的情況
- 用互斥量也可以實(shí)現(xiàn)磷蜀,但是性能不好召耘,讀的時(shí)候也會(huì)加鎖、阻塞等待拿鎖褐隆,那么等待的時(shí)間明顯長(zhǎng)于用讀寫鎖
- 如果要請(qǐng)求寫鎖污它,必須等讀鎖都釋放了才會(huì)請(qǐng)求到
即讀寫鎖不是各加各的趾娃。加讀鎖缨历,也要等寫鎖釋放了
- 條件變量
如果說(shuō)互斥鎖是用于同步線程對(duì)共享數(shù)據(jù)的訪問(wèn)的話,那么條件變量則是用于在線程之間同步共享數(shù)據(jù)的值终议。
條件變量提供了一種線程間的通知機(jī)制:當(dāng)某個(gè)共享數(shù)據(jù)達(dá)到某個(gè)值得時(shí)候虫埂,喚醒等待這個(gè)共享數(shù)據(jù)的線程祥山。
和互斥鎖配合一起使用,適用于典型的生產(chǎn)者消費(fèi)者模型掉伏。
一個(gè)線程把必須先干一件事情缝呕,然后才能干接下來(lái)的事情:發(fā)信號(hào)給等待隊(duì)列上的所有線程-
信號(hào)量(semaphore)
http://www.jellythink.com/archives/814- 可以用于線程,也可用于進(jìn)程
互斥鎖的升級(jí)版 - 互斥鎖只有0/1兩種狀態(tài)斧散,即只有一把鎖可以用
信號(hào)量的話0/n供常,可以有n把鎖可用
- 可以用于線程,也可用于進(jìn)程
進(jìn)程間通信###
同線程間同步的方法,如下:
- 互斥量
- 讀寫鎖
- 條件變量
- 信號(hào)量(semaphore)
此外還有:
- 記錄鎖(record locking)
- 記錄鎖機(jī)制的功能是:一個(gè)進(jìn)程正在讀或修改文件的某個(gè)部分時(shí)鸡捐,可以阻止其它進(jìn)程修改同一文件區(qū)栈暇。對(duì)于Unix,記錄這個(gè)定語(yǔ)也是誤用箍镜,因?yàn)閁nix系 統(tǒng)核根本沒(méi)有使用文件記錄這種概念源祈。一個(gè)更適合的術(shù)語(yǔ)可能是區(qū)域鎖,因?yàn)樗i定的只是文件的一個(gè)區(qū)域(也可能是整個(gè)文件)色迂。
Linux內(nèi)核沒(méi)有文件內(nèi)的記錄這一概念香缺。任何關(guān)于記錄的接收都是由讀寫文件的應(yīng)用來(lái)進(jìn)行的。然而linux內(nèi)核提供的上鎖特性卻用記錄上鎖(record locking)這一術(shù)語(yǔ)描述歇僧。不過(guò)應(yīng)用會(huì)指定文件中待上鎖或解鎖部分的字節(jié)范圍图张,因?yàn)橛涗涙i鎖定的只是文件中的一個(gè)區(qū)域。
記錄鎖是讀寫鎖的一種拓展诈悍,可用于親緣或非親緣關(guān)系的進(jìn)程間共享某個(gè)文件的讀寫祸轮。被鎖住的文件通過(guò)其描述符訪問(wèn),執(zhí)行上鎖操作的函數(shù)是fcntl侥钳。這類鎖通常維護(hù)在內(nèi)核中适袜,其屬主是由屬主的進(jìn)程ID來(lái)標(biāo)識(shí)的。這意味著這些鎖用于不同進(jìn)程間的上鎖慕趴,不適用于同一進(jìn)程不同線程間上鎖痪蝇。
- 參考文章
講的比較詳細(xì)
http://www.cnblogs.com/nufangrensheng/p/3554168.html