




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 本章主要本章主要介紹Linux的發(fā)展歷史,Linux進(jìn)程管理、Linux 存儲(chǔ)管理、Linux 文件管理、Linux 設(shè)備管理的基本原理。第八章Linux內(nèi)核系統(tǒng)結(jié)構(gòu)第1頁,共79頁。本章主要內(nèi)容 8.2Linux進(jìn)程管理 8.1Linux概述8.3Linux進(jìn)程通信 8.6Linux設(shè)備管理 8.5Linux文件系統(tǒng) 8.4Linux存儲(chǔ)管理 第2頁,共79頁。8.1Linux概述 1984年理查德斯塔爾曼(Richard M.Stallman)首先開創(chuàng)了自由軟件體系(GNU),GNU旨在發(fā)展一個(gè)類UNIX的完整操作系統(tǒng),各種使用Linux作為內(nèi)核的GNU操作系統(tǒng)正被廣泛地使用著,實(shí)際上它
2、們更精確的稱呼應(yīng)該是GNU/Linux系統(tǒng)。 通用公共許可GPL(General Public License)是GNU工程所要遵循的規(guī)則,按照這一規(guī)則,自由軟件允許用戶自由拷貝、修改和銷售,但是對(duì)其源代碼的任何修改都必須向所有用戶公開。所有人可以自由地占有自由軟件,所有人為自由軟件所做出的成果必須和其它人共享。 Linux目前在服務(wù)器的工作上具有強(qiáng)大的功能和越來越重要的地位,除此之外,linux還被廣泛的運(yùn)用在嵌入式系統(tǒng)中(這些應(yīng)用包括IBM 的微型 Linux 腕表、手持設(shè)備(PDA 和蜂窩電話、工業(yè)機(jī)器人等)。第3頁,共79頁。 8.1.1 Linux發(fā)展歷程 談到Linux,我們不能不
3、首先提到這個(gè)了不起的名字:Linus Torvalds(李納斯托沃茲)。這個(gè)是一個(gè)與Linux的誕生、發(fā)展緊密聯(lián)系在一起的名字,人們常常稱他為Linux之父。Linus Torvalds李納斯托沃茲第4頁,共79頁。 時(shí)光回溯到1991年初,21歲的Linus Torvalds(生于1969年12月28日)就讀于芬蘭的赫爾辛基大學(xué)(University of Helsinki),當(dāng)時(shí)他正在學(xué)習(xí)操作系統(tǒng)設(shè)計(jì)這門課程,所用教材是Andrew S. Tanenbaum和Albert S. Woodhull編著的Operating Systems::Design and Implementation
4、。 04 八月 20225 Torvalds渴望使用Unix操作系統(tǒng),但學(xué)校服務(wù)器很緊張,Torvalds常常用不上終端,于是他采用分期付款的方式,花了大約3500美元購買了一臺(tái)廉價(jià)的雜牌386計(jì)算機(jī),另外還花了169美元購買了Minix操作系統(tǒng)。由于Minix主要用于教學(xué),因此功能比較簡單,Torvalds對(duì)Minix的一些性能感到很不滿意,其中最大的失望是終端仿真。Torvalds決定自己動(dòng)手開發(fā)終端仿真程序。第5頁,共79頁。 為了有更好的性能,他不想在Minix系統(tǒng)中開發(fā),而是直接在硬件的水平上完成它。 為能直接從硬件啟動(dòng)自己的程序,Torvalds使用了匯編語言和C語言,而且不得不從
5、BIOS引導(dǎo)磁盤啟動(dòng)計(jì)算機(jī)開始編程。 Torvalds可以使用這個(gè)終端仿真程序登錄到學(xué)校的電腦上,收發(fā)、閱讀電子郵件,參加Minix討論組。但是新的問題又來了,他還想下載和上傳資料,也就是說,這個(gè)終端程序必須能讀寫磁盤,這意味著他不得不為自己的終端仿真程序繼續(xù)開發(fā)磁盤設(shè)備驅(qū)動(dòng)程序、文件管理系統(tǒng),這樣才能將下載的內(nèi)容保存成文件,或者查看磁盤里的東西。04 八月 20226第6頁,共79頁。 Torvalds還想把文件保存在Minix文件系統(tǒng)中,這樣,就可以在Minix系統(tǒng)下查看終端仿真程序下載的文件,于是他就讓自己的文件系統(tǒng)可以和Minix文件系統(tǒng)兼容。Torvalds也意識(shí)到了這一點(diǎn),不再把它
6、看成一個(gè)終端仿真程序,而是一個(gè)操作系統(tǒng)。據(jù)Torvalds自己回憶:“這個(gè)轉(zhuǎn)變出現(xiàn)在我馬拉松似的編程過程中的哪個(gè)時(shí)間段,是白天還是晚上,我已經(jīng)想不起來了。也許在這一刻之前,我還穿著破舊的睡袍奮力敲擊著鍵盤,在為終端仿真器增添更多的功能;而轉(zhuǎn)瞬之間我擁有的功能是如此之多,以至于整個(gè)體系已經(jīng)變成了一個(gè)OS。” 7第7頁,共79頁。 為了能更好地開發(fā)這個(gè)操作系統(tǒng),Torvalds決定通過網(wǎng)絡(luò)尋求幫助,于是1991年7月3日他在一個(gè)名為“comp.os.minix”討論組中發(fā)了一個(gè)帖子: Hello everybody out there using minixIm doing a (free) op
7、erating system “各位網(wǎng)友好! 我現(xiàn)在正在Minix系統(tǒng)下做一個(gè)項(xiàng)目,對(duì)POSIX標(biāo)準(zhǔn)很感興趣。有誰能向我提供一個(gè)(最好)是機(jī)器可讀形式的最新的POSIX規(guī)則?能有FTP地址就更好了。” POSIX是Portable Operating System Interface(可移植操作系統(tǒng)接口)的簡稱,POSIX是由IEEE(Institute of Electrical and Electronic Engineers)操作系統(tǒng)開發(fā)標(biāo)準(zhǔn),POSIX為不同平臺(tái)下的應(yīng)用程序提供了相同的API(Application Programming Interface:應(yīng)用編程接口),一個(gè)完全符
8、合POSIX標(biāo)準(zhǔn)的應(yīng)用程序?qū)⒛苓\(yùn)行在不同的符合POSIX標(biāo)準(zhǔn)的操作系統(tǒng) 從這個(gè)帖子中可以看出,Torvalds一開始就打算設(shè)計(jì)一個(gè)符合國際標(biāo)準(zhǔn)的操作系統(tǒng),這是一個(gè)重要的決定,因?yàn)橐粋€(gè)操作系統(tǒng)必須有大量的應(yīng)用程序支持才有生命力,04 八月 20228第8頁,共79頁。 而Torvalds的決定為后來Linux操作系統(tǒng)能有大量應(yīng)用程序移植過來奠定了堅(jiān)實(shí)的技術(shù)基礎(chǔ)。 雖然,Torvalds后來沒有收到別人提供的POSIX標(biāo)準(zhǔn)文檔,但他的帖子也沒有石沉大海。這個(gè)帖子引起了赫爾辛基工學(xué)院的助教Ari Lemke(阿里萊姆克)的注意,Ari Lemke表示愿意在他們學(xué)校的FTP服務(wù)器上為Torvalds提
9、供空間,建一個(gè)子目錄,以便Torvalds可以把他的操作系統(tǒng)發(fā)布上去,讓感興趣的人們下載。 Torvalds全身心地投入到系統(tǒng)的開發(fā)中去,他自己回憶說: “這花費(fèi)了我大量的精力:編程睡覺編程睡覺編程吃飯(餅干)編程睡覺編程洗澡(沖沖了事)編程?!?“那個(gè)夏天我除了伏在電腦面前,其他什么都沒做。這么說一點(diǎn)也不夸張。芬蘭四月到八月的日子是一年中最美好的時(shí)光。人們到布滿小島的海上航船,去海灘上曬日光浴,到夏日小木屋中消閑。但是我卻在沒日沒夜地工作,不知哪一天是周末,哪一天是工作日。黑色窗簾遮蔽了。 04 八月 20229第9頁,共79頁。 幾乎晝夜?fàn)N爛的陽光,也遮蔽了整個(gè)世界。有時(shí)候或許是夜晚?我會(huì)
10、從床上爬起來,直接坐到離床僅幾英尺遠(yuǎn)的電腦旁?!?“毫不夸張地說,我和電腦之外的世界幾乎沒有任何聯(lián)系。當(dāng)然,也許每周有一次,一個(gè)朋友會(huì)敲敲我的窗戶,而我如果沒在搗騰什么重要的編碼時(shí),會(huì)請(qǐng)他進(jìn)來。我們會(huì)喝杯茶,也許還會(huì)擠在窄小的廚房里看一小時(shí)的MTV?!?另一方面,Torvalds仍然通過網(wǎng)絡(luò)上的討論組不斷地征求大家對(duì)新操作系統(tǒng)的要求和意見,不斷的改進(jìn)和完善這個(gè)系統(tǒng)。 1991年9月17日,這是計(jì)算機(jī)發(fā)展史上值得紀(jì)念的一天,Torvalds將自己的開發(fā)的系統(tǒng)源程序完整地上傳到FTP服務(wù)器上,供大家下載測(cè)試。本來,Torvalds想用“Freax”這個(gè)名字,但Ari Lemke更喜歡開發(fā)時(shí)用的代號(hào)
11、“Linux”,根據(jù)Ari Lemke的建議,Torvalds將這個(gè)具有劃時(shí)代意義的操作系統(tǒng)命名為:Linux。由于Torvalds認(rèn)為這個(gè)系統(tǒng)還很不完善,因此謙虛地將其命名為:0.01版。 Linux終于誕生了!雖然當(dāng)天世界上只有幾個(gè)人知道! 04 八月 202210第10頁,共79頁。 8.1.2 Linux的發(fā)展 Linux誕生后的幾個(gè)月里,Torvalds在不斷地聽取試用者的反饋的同時(shí),仍然潛心于不斷地改進(jìn)程序,使其功能更強(qiáng)大、性能更穩(wěn)定。到了1991年底,已經(jīng)陸續(xù)推出了0.02版、0.03版、0.1版、0.11版。 也許由于Torvalds從小深受其祖父(一名統(tǒng)計(jì)學(xué)教授,Torval
12、d少年時(shí)代學(xué)習(xí)的電腦啟蒙者)和信仰共產(chǎn)主義的父親的影響,加上本身淡泊金錢的個(gè)性,所以盡管當(dāng)時(shí)Torvalds已欠了大約五千美元的學(xué)生貨款,但在開始發(fā)布源代碼時(shí),他就制定了這樣的版權(quán)規(guī)則: (1)任何人可以免費(fèi)使用該操作系統(tǒng),但不得將其作為商品出售; (2)任何人可以對(duì)該操作系統(tǒng)進(jìn)行修改,但必須將其修改以源代碼的形式公開; (3)如果不同意以上規(guī)定,任何人無權(quán)對(duì)其進(jìn)行復(fù)制或從事任何行為。 軟件按其分發(fā)方式可以劃分為三種模式,即商業(yè)軟件(Commercial Software)、共享軟件(Share Software)和自由軟件(Free Software)。 04 八月 202211第11頁,共
13、79頁。 商業(yè)軟件的代表是美國微軟公司(Microsoft)的Windows操作系統(tǒng),用戶必須先購買商業(yè)軟件許可證才能使用軟件,并且不能得到軟件的源代碼,也不能對(duì)軟件進(jìn)行任何逆向工程以得到源代碼,即使軟件存在缺陷用戶也無權(quán)對(duì)軟件進(jìn)行任何修改或改進(jìn),否則將被認(rèn)為侵犯版權(quán)。 共享軟件在分發(fā)時(shí),用戶可以先試用后付費(fèi),通常不提供軟件源代碼,如果超過試用期沒有購買而仍使用,將被認(rèn)為侵犯版權(quán),目前許多通過網(wǎng)絡(luò)分發(fā)銷售的軟件都采用這種方式,著名的軟件有代理服務(wù)器軟件WinGate。 自由軟件在分發(fā)時(shí)必須向用戶公開源代碼,通常用戶可以通過某種途徑(如網(wǎng)絡(luò)下載)免費(fèi)得到其分發(fā)版,但用戶如果付費(fèi)的話將得到完善的服
14、務(wù)和文檔。自由軟件的出現(xiàn)給人們帶來很多的好處。首先,免費(fèi)的軟件可給用戶節(jié)省相當(dāng)一筆費(fèi)用。其次,源代碼公開和可自由修改吸引了眾多的開發(fā)者參與軟件的查錯(cuò)與改進(jìn),使自由軟件更加完善,同時(shí)還可以在改進(jìn)自由軟件的基礎(chǔ)上開發(fā)出更符合用戶要求的應(yīng)用軟件。目前人們非常熟悉的一些軟件如Linux、OpenOffice 、Perl、Apache、Gnome、GCC等大量軟件實(shí)際上都是自由軟件的經(jīng)典之作。04 八月 202212第12頁,共79頁。 顯然,Torvalds在Linux誕生時(shí)確定的版權(quán)規(guī)則體現(xiàn)了開放源代碼運(yùn)動(dòng)的基本思想,在Linux誕生的初期有力地促進(jìn)了它的傳播、發(fā)展、完善,吸引網(wǎng)絡(luò)上越來越多的程序高
15、手(這些人常常被稱作黑客)加入到Linux的測(cè)試、開發(fā)中來。但是,由于這里的版權(quán)規(guī)則禁止銷售Linux,實(shí)際上又阻礙了Linux的推廣、傳播,因?yàn)檐浖职l(fā)需要時(shí)間、精力、物質(zhì)、資金的投入,如果一味禁止分發(fā)者獲得回報(bào),必然阻礙Linux的推廣和傳播,使得Linux最終局限在計(jì)算機(jī)軟件愛好者的小范圍內(nèi)傳播,無法到達(dá)普通計(jì)算機(jī)用戶手中。 不久,Linux的機(jī)遇又出現(xiàn)了。Torvalds有機(jī)會(huì)聆聽了自由軟件運(yùn)動(dòng)之父Richard Stallman (理查德斯托曼,生于1953年)的一次演講,促使他考慮轉(zhuǎn)向GUN的GPL。 Richard Stallman是自由軟件運(yùn)動(dòng)的精神領(lǐng)袖、GNU計(jì)劃以及自由軟件
16、基金會(huì)(Free Software Foundation)的創(chuàng)立者、著名黑客。他最大的成就是為自由軟件運(yùn)動(dòng)創(chuàng)立了道德、政治以及法律框架,因而被譽(yù)為當(dāng)今自由軟件的斗士、偉大的理想主義者。GNU計(jì)劃是由Richard Stallman在1983年9月27日公開發(fā)起的,它的目標(biāo)是創(chuàng)建一套完全自由的操作系統(tǒng)。為保證GNU軟件可以自由地“使用、復(fù)制、修改和發(fā)布”,所有GNU軟件必須遵守 04 八月 202213第13頁,共79頁。 GNU通用公共許可證(GNU General Public License,簡稱GNU GPL),GNU GPL創(chuàng)造性地提出了“反版權(quán)”(即Copyleft)的概念,這是一個(gè)
17、不同于商業(yè)軟件的“版權(quán)所有”(即Copyright)的法律概念,GNU GPL并不是為了否認(rèn)版權(quán),也不禁止分發(fā)軟件時(shí)收取費(fèi)用或取得利潤。其核心思想是任何人發(fā)布一個(gè)遵守GNU GPL的軟件時(shí),不管是收費(fèi)的還是免費(fèi)的,都必須將發(fā)布者具有的一切權(quán)利給予軟件的接受者,必須保證軟件接受者能同時(shí)收到或通過其他途徑得到源程序,并且將GNU GPL附加在軟件的版權(quán)聲明中,使軟件接受者知道自己有這樣的權(quán)利。GNU GPL本身也是受法律保護(hù)的版權(quán)聲明。 從0.12版本開始,Torvalds把GNU GPL作為Linux的版權(quán)聲明,把Linux奉獻(xiàn)給了自由軟件,奉獻(xiàn)給了GNU,從而鑄就了包括Linux在內(nèi)的自由軟件
18、今天的輝煌。從此,Linux走上迅速發(fā)展的康莊大道。 Linux誕生于網(wǎng)絡(luò),發(fā)展于網(wǎng)絡(luò),從一開始就吸引了越來越多的開發(fā)人員加入到Linux內(nèi)核開發(fā)社區(qū)中來,請(qǐng)讓我們快速地回顧一下的Linux發(fā)展歷史: 04 八月 202214第14頁,共79頁。 1991年9月17日,Linus Torvalds在新聞組comp.os.minix發(fā)表了Linux V0.01,約有一萬行代碼。 1992年,全世界大約有1000個(gè)左右的人使用Linux,并有不少人提供初期的代碼上載和評(píng)論。 1993年,大約由100多個(gè)程序員參與內(nèi)核代碼修改,內(nèi)核核心由5人組成,V0.99 約有十萬行代碼。 1993 年底, Li
19、nux全球用戶數(shù)約在10萬左右。 1994年3月14日,Linux1.0問世,約有17萬行代碼。 1995年,Linux 全球用戶數(shù)超過50萬, Linux 已可在Intel、 Digital 和Sun SPARC 處理器上運(yùn)行,Linux Journal 雜志已發(fā)行了10萬冊(cè)。內(nèi)核發(fā)展到1.2, 約由25萬行代碼。 1996年6月,Linux 內(nèi)核2.0 發(fā)布,可支持多個(gè)處理器,約由40萬行代碼。Linux 全球用戶數(shù)約在350萬左右。 1997年夏,制作電影泰坦尼克號(hào)所用的160臺(tái)Alpha圖形工作站中,有105臺(tái)采用了Linux操作系統(tǒng)。 04 八月 202215第15頁,共79頁。 今
20、天,Linux經(jīng)歷了12年的風(fēng)風(fēng)雨雨,這位曾經(jīng)被嘲笑為“黑客的玩具”、“軟件小丑”,軟件業(yè)“下等公民”正在重新定義電腦世界的新規(guī)則。 今天,已經(jīng)很少有哪所大學(xué)或大型培訓(xùn)機(jī)構(gòu)的計(jì)算機(jī)專業(yè)沒有Linux課程,已經(jīng)很少有哪家軟件連鎖店不銷售Linux的軟件,已經(jīng)很少有專業(yè)的計(jì)算機(jī)報(bào)刊不談Linux,望著書店里琳瑯滿目的Linux書籍,難怪美國的商業(yè)周刊2003年初曾驚呼:“Linux時(shí)代來臨了!”。再讓我們看看全球計(jì)算機(jī)業(yè)巨頭們對(duì)Linux的態(tài)度或評(píng)論吧! 現(xiàn)在,全球的計(jì)算機(jī)產(chǎn)業(yè)的巨頭們紛紛感受到了Linux的魅力:在IBM、惠普戴爾、Oracle、英特爾這些巨頭的支持下,Linux的應(yīng)用走向了克萊
21、斯勒公司、湯姆-海菲戈、NEC、華爾街證券機(jī)構(gòu)這些全球經(jīng)濟(jì)巨頭。3年前,在服務(wù)器市場(chǎng)Linux幾乎是空白,但是到2003年,在全球509億美元的服務(wù)器市場(chǎng),Linux已經(jīng)占據(jù)了13.7%的份額,據(jù)IDC的數(shù)據(jù),到2006年Linux更是將占據(jù)全球服務(wù)器市場(chǎng)25.5%的份額,將一躍成為全球第二大服務(wù)器操作系統(tǒng)。 另據(jù)2003年12月24日ZDNet報(bào)道:“Linux桌面操作系統(tǒng)從2000年底Linux的占市場(chǎng)份額1.5%升到2.8%,幾乎增長了2倍,到今年年底將超過蘋果的Mac OS(占市場(chǎng)份額的2.9%),成為第二大最流行的操作系統(tǒng)?!?04 八月 202216第16頁,共79頁。 芯片業(yè)巨頭
22、英特爾在設(shè)計(jì)芯片時(shí),也開始為Linux度身定制,這使Linux性能得到更高的發(fā)揮,進(jìn)一步刺激了企業(yè)用戶的需求。 IBM公司更是在幾年前就投入了10億美元,支持linux發(fā)展。它對(duì)Linux傾注了巨大的熱情,從大型主機(jī)到英特爾服務(wù)器,直至手表型計(jì)算機(jī),IBM都采用了Linux系統(tǒng)。2002年第四季度,IBM的Linux服務(wù)器銷售額也突破了1.6億美元。 Linux在消費(fèi)電器領(lǐng)域取得了一席之地。2003年7月,全球消費(fèi)類最電子產(chǎn)品的巨頭索尼、日立、NEC、飛利浦、三星、夏普、三菱電氣和東芝宣布成立消費(fèi)類電子產(chǎn)品Linux論壇,這是一個(gè)修改和改善應(yīng)用在消費(fèi)類電子產(chǎn)品中的操作系統(tǒng)的論壇。2003年12
23、月,三星公司推出一款支持中文、英文的高端Linux智能手機(jī),這款手機(jī)型號(hào)為SCH-i519,如圖1.2所示,該產(chǎn)品首先在中國發(fā)布,支持中國聯(lián)通的CDMA2000 1x網(wǎng)絡(luò)。另外,索尼的PS游戲平臺(tái)和ViVo攝像機(jī)都采用了Linux技術(shù)。 圖8.1Linux智能手機(jī)04 八月 202217第17頁,共79頁。 IBM、惠普、戴爾、Oracle、英特爾對(duì)Linux青睞有加,投入巨資為其提供全方位的支持,這使得企業(yè)用戶猶如吃了定心丸,可以放心使用Linux和開放式軟件而不必冒太大的風(fēng)險(xiǎn)。據(jù)高盛公司最新調(diào)查數(shù)據(jù)顯示,39%的大型企業(yè)公司都采用了Linux技術(shù),預(yù)計(jì)未來幾年內(nèi)還會(huì)保持高速增長。 Linu
24、x技術(shù)應(yīng)用并不是只有西方發(fā)達(dá)國家,包括中國在內(nèi)的亞太地區(qū)正在掀起一股Linux產(chǎn)品應(yīng)用熱潮,這一地區(qū)已成在Linux應(yīng)用方面一馬當(dāng)先。讓我們看看Linux國內(nèi)的應(yīng)用情況。 據(jù)報(bào)道,2002年中國Linux市場(chǎng)的年收入已經(jīng)達(dá)到52億人民幣,比上一年增長了45.6%。經(jīng)過過去3年的發(fā)展,Linux在可靠性和可拓展性方面都已經(jīng)取得了相當(dāng)大的成就,目前在一些主要的產(chǎn)業(yè)上也有了較為成功的應(yīng)用經(jīng)驗(yàn)。國內(nèi)大型企業(yè)應(yīng)用Linux技術(shù)實(shí)例信手可拈,如勝利、新疆等大型油田的高性能計(jì)算均已移植到Linux平臺(tái)上,實(shí)踐證明Linux的高性能運(yùn)算能力是高效穩(wěn)定的。 我國政府對(duì)Linux的支持力度顯著增加,無論是中央政府
25、還是地方政府目前對(duì)Linux在電子政府中的應(yīng)用都非常重視。04 八月 202218第18頁,共79頁。 IBM 11月底宣布,將于明年起開始支持臺(tái)式機(jī)使用Linux。而IBM公司與金山軟件公司在11月5日的簽約也充分證實(shí)了藍(lán)色巨人支持Linux桌面系統(tǒng)的決心。根據(jù)協(xié)議,IBM將與金山攜手向國內(nèi)的企業(yè)用戶提供基于Linux開放標(biāo)準(zhǔn)的解決方案,以滿足國內(nèi)市場(chǎng)日益增長的對(duì)電子商務(wù)解決方案的需求。04 八月 202219第19頁,共79頁。企鵝的來源 1994年發(fā)表 Linux 正式核心 1.0 的時(shí)候,大家要 Linus Torvalds 想一只吉祥物,怪怪的 Torvalds 突然想到小時(shí)候去動(dòng)物
26、園被一只企鵝追著滿地打滾還被咬了一口!既然想不到其它的吉祥物了,干脆就以這支企鵝來當(dāng)吉祥物算了!所以,目前我們常??吹竭@一 只企鵝就是這么來的! 第20頁,共79頁。葛雷格克羅哈曼第21頁,共79頁。linux開發(fā)時(shí)間圖第22頁,共79頁。8.1.3 Linux系統(tǒng)的優(yōu)點(diǎn)和缺點(diǎn) 1Linux的優(yōu)點(diǎn):完全免費(fèi),修改其源代碼;多用戶,多任務(wù);Linux同時(shí)具有字符界面和圖形界面;豐富的網(wǎng)絡(luò)功能;可靠的安全,穩(wěn)定性能;Linux可以支持各種類型的文件系統(tǒng),支持多種硬件平臺(tái)。 2Linux的不足支持Linux的應(yīng)用軟件較Windows少一些;許多硬件設(shè)備面對(duì)Linux的驅(qū)動(dòng)程序也不足。第23頁,共79
27、頁。8.1.4 內(nèi)核結(jié)構(gòu)Linux采用模塊機(jī)制,可以方便地將模塊裝入內(nèi)核或從內(nèi)核中卸下。整個(gè)Linux系統(tǒng)內(nèi)核由許多過程組成,每個(gè)過程可以獨(dú)立編譯,然后用連接程序?qū)⑵溥B接為單獨(dú)的目標(biāo)程序,每個(gè)過程對(duì)其他過程都是可見的,不同的人可參與不同過程的開發(fā)。內(nèi)核是操作系統(tǒng)的靈魂,內(nèi)核負(fù)責(zé)維護(hù)操作系統(tǒng)的核心功能,如圖。虛擬文件系統(tǒng)邏輯文件系統(tǒng)硬件驅(qū)動(dòng)程序進(jìn)程調(diào)度進(jìn)程間通信 內(nèi)存管理 硬件無關(guān) 硬件相關(guān)網(wǎng) 絡(luò)網(wǎng)絡(luò)協(xié)議硬件驅(qū)動(dòng)程序81 Linux內(nèi)核子系統(tǒng)及其之間的關(guān)系第24頁,共79頁。8.2Linux進(jìn)程管理 一、進(jìn)程組成每個(gè)進(jìn)程在創(chuàng)建時(shí)都會(huì)被分配一個(gè)數(shù)據(jù)結(jié)構(gòu),稱為進(jìn)程控制塊(PCB)。Linux中的進(jìn)程
28、控制塊是一個(gè)名叫task_struct的數(shù)據(jù)結(jié)構(gòu),放在include/linux/sched.h中。 task_struct記錄了進(jìn)程ID;程序的讀取上下文,它表示程序讀取執(zhí)行的狀態(tài);程序當(dāng)前執(zhí)行目錄;程序服務(wù)的文件和目錄;程序的訪問權(quán)限;內(nèi)存和其他分配給進(jìn)程的系統(tǒng)資源。 Linux中的進(jìn)程分為普通進(jìn)程和實(shí)時(shí)進(jìn)程兩種,實(shí)時(shí)進(jìn)程必須對(duì)外部事件作出快速反應(yīng),實(shí)時(shí)進(jìn)程的優(yōu)先級(jí)高于普通進(jìn)程。 Linux進(jìn)程符合一般操作系統(tǒng)教科書中的進(jìn)程概念的解釋:即進(jìn)程是一個(gè)程序的一次執(zhí)行的過程,進(jìn)程是系統(tǒng)資源管理的最小單位。程序是靜態(tài)的,它是一些保存在磁盤上的可執(zhí)行的代碼和數(shù)據(jù)集合,進(jìn)程是一個(gè)動(dòng)態(tài)的概念。在Linu
29、x 系統(tǒng)中,進(jìn)程仍是最小的調(diào)度單位。第25頁,共79頁。struct task_struct volatile long state; /* 進(jìn)程的狀態(tài)*/unsigned long flags; /* 進(jìn)程標(biāo)志 */mm_segment_t addr_limit; /* 線性地址空間*/long counter; /* 進(jìn)程的動(dòng)態(tài)優(yōu)先級(jí)*/long nice(priority); /* 進(jìn)程的靜態(tài)優(yōu)先級(jí)*/unsigned long policy; /* 進(jìn)程采用的調(diào)度策略*/struct mm_struct *mm; /* 進(jìn)程屬性中指向內(nèi)存管理的數(shù)據(jù)結(jié)構(gòu)mm_structd的 指針*/s
30、truct task_struct *next_task , *prev_task; /*進(jìn)程通過這兩個(gè)指針組成一個(gè)雙向鏈表*/struct mm_struct *active_mm; /* 指向活動(dòng)地址空間*/ 第26頁,共79頁。/* task state */pid_t pid; /* 進(jìn)程標(biāo)志符, */pid_t pgrp; /* 進(jìn)程組標(biāo)號(hào)*/struct task_struct *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr;/* 這五個(gè)標(biāo)志表示一個(gè)進(jìn)程的在計(jì)算機(jī)中的親屬關(guān)系,分別標(biāo)志祖先進(jìn)程,父進(jìn)程,子進(jìn)程,弟進(jìn)程和兄進(jìn)程,為了在兩個(gè)
31、進(jìn)程之間共享方便而設(shè)立 */struct list_head thread_group;struct task_struct *pidhist_next;struct task_struct *pidhist_pprev; /* 上面兩個(gè)指針是為了在計(jì)算機(jī)中快速查一個(gè)進(jìn)程而設(shè)立*/struct fs_struct *fs; /* 進(jìn)程屬性中指向和文件管理有關(guān)的數(shù)據(jù)結(jié)構(gòu)*/ ;第27頁,共79頁。二、Linux 中的進(jìn)程狀態(tài)及其轉(zhuǎn)換(1)可運(yùn)行狀態(tài)(TASK_RUNNING)。相當(dāng)于進(jìn)程三種基本狀態(tài)中的執(zhí)行狀態(tài)和就緒狀態(tài),所以是正在運(yùn)行或準(zhǔn)備運(yùn)行的進(jìn)程處于這種狀態(tài),處于這種狀態(tài)的進(jìn)程實(shí)際參與進(jìn)程
32、的調(diào)度。(2)可中斷阻塞狀態(tài)(TASK_INTERRUPTIBLE)。處于這種阻塞狀態(tài)中的進(jìn)程,通常只要阻塞的原因解除,比如請(qǐng)求資源未能滿足而阻塞,一旦資源滿足后,就可以被喚醒到就緒狀態(tài),也可以由其他進(jìn)程通過信號(hào)或定時(shí)中斷喚醒,并進(jìn)入就緒隊(duì)列。這種中斷阻塞狀態(tài)類似于一般進(jìn)程的阻塞狀態(tài)。(inter(3)不可中斷阻塞狀態(tài)(TASK_UNINTERRUPTIBLE)。處于這種阻塞狀態(tài)的進(jìn)程,只能由資源請(qǐng)求得到滿足時(shí)喚醒到就緒隊(duì)列,不能通過信號(hào)或定時(shí)中斷喚醒。只有打開設(shè)備文件時(shí)用第28頁,共79頁。(4)僵死狀態(tài)(TASK_ZOMBLE)。處于這種狀態(tài)的進(jìn)程已經(jīng)結(jié)束運(yùn)行,離開CPU,并歸還所占用的資
33、源,只是進(jìn)程控制塊PCB結(jié)構(gòu)還沒有歸還釋放。(5)暫停狀態(tài)(TASK_STOPPED).處于這種狀態(tài)的進(jìn)程被暫停執(zhí)行而阻塞,通過其他進(jìn)程的信號(hào)才能喚醒。導(dǎo)致暫停的原因有兩點(diǎn):一是收到暫停信號(hào)(SIGSTOP、SIGTSTP、SIGTIN、SIGTOU);二是受其他進(jìn)程的系統(tǒng)調(diào)用的控制,而暫時(shí)把CPU交出給控制進(jìn)程,處于暫停狀態(tài)。(6)交換狀態(tài)(TASK_SWAPPING)。處于這種狀態(tài)時(shí),進(jìn)程的頁面可以從內(nèi)存換出。第29頁,共79頁。第30頁,共79頁。Linux內(nèi)核中涉及一個(gè)進(jìn)程狀態(tài)轉(zhuǎn)換的主要內(nèi)核函數(shù)有以下幾個(gè):創(chuàng)建進(jìn)程函數(shù)do_fork();調(diào)試函數(shù)schedule();睡眠函數(shù),這些函數(shù)
34、有:sleep_on()和interruptible_sleep_on()喚醒函數(shù)wake_up()和中斷喚醒函數(shù)wake_up_interruptible().退出函數(shù)do_exit().第31頁,共79頁。三、Linux的進(jìn)程調(diào)度 為了減少os設(shè)計(jì)的復(fù)雜性和提高系統(tǒng)的執(zhí)行效率,只有核心的幾個(gè)位置調(diào)度。 對(duì)于普通進(jìn)程,Linux進(jìn)程調(diào)度采用的是基于時(shí)間片的動(dòng)態(tài)優(yōu)先數(shù)法。 1.調(diào)度的時(shí)機(jī) (1)進(jìn)程自動(dòng)放棄CPU,wait()、sleep()、exit()。 (2) 由核心態(tài)轉(zhuǎn)入用戶態(tài),調(diào)用ret_from_call(),此函數(shù)檢測(cè),調(diào)度標(biāo)志need_resched=1時(shí),啟動(dòng)調(diào)度。(3) 直
35、接執(zhí)行調(diào)度程序 2.調(diào)度標(biāo)識(shí)的設(shè)置(1)新來進(jìn)程優(yōu)先級(jí)高于當(dāng)前進(jìn)程,調(diào)用add_runqueue();(2)時(shí)間片用完,時(shí)鐘中斷設(shè)置;(3)被進(jìn)程喚醒優(yōu)先級(jí)高于當(dāng)前進(jìn)程。第32頁,共79頁。3.調(diào)度算法 Linux 中,內(nèi)核函數(shù)schedule() 進(jìn)行進(jìn)程調(diào)度。它的主要任務(wù)就是從就緒隊(duì)列run_queue中選中一個(gè)進(jìn)程并投入運(yùn)行。 進(jìn)程調(diào)度策略采用的是時(shí)間片輪轉(zhuǎn)法,但同時(shí)又保證高優(yōu)先級(jí)的進(jìn)程及時(shí)運(yùn)行且運(yùn)行時(shí)間較長,分為普通進(jìn)程和實(shí)時(shí)進(jìn)程(高)。用戶可以通過系統(tǒng)調(diào)用sched_setschedule()函數(shù)改變自己的調(diào)度策略。 (1)普通分時(shí)進(jìn)程:調(diào)度策略policy=SCHED-OTHER(
36、默認(rèn))( rt_priority=0)采用的是動(dòng)態(tài)優(yōu)先級(jí)。它的優(yōu)先級(jí)受剩余時(shí)間片counter的影響,是動(dòng)態(tài)變化的。在進(jìn)程創(chuàng)建時(shí)給進(jìn)程優(yōu)先級(jí)priority賦一個(gè)值(默認(rèn))20,這個(gè)值也是counter的值。實(shí)際上priority代表的是分給這個(gè)進(jìn)程的時(shí)間片值,而counter代表的是該進(jìn)程剩余的時(shí)間片,在進(jìn)程的執(zhí)行過程中,counter的值不斷減少,而priority的值是不變的。當(dāng)counter的值減少為0時(shí)(最低時(shí))表示進(jìn)程用完了所分配的時(shí)間片,這時(shí)就要放棄CPU。這時(shí)要再一次重新賦值,只有這樣普遍進(jìn)程才能有重新被調(diào)度的可能。第33頁,共79頁。某進(jìn)程的counter值為0時(shí),會(huì)完全放棄
37、對(duì)CPU的使用,其他進(jìn)程運(yùn)行的機(jī)會(huì)就會(huì)增加,所以稱之為動(dòng)態(tài)優(yōu)先數(shù)法。 Linux中,一個(gè)“時(shí)鐘滴答”為10ms,意味著每秒鐘有100次時(shí)鐘中斷。時(shí)間片的大小就是指“時(shí)鐘滴答”的個(gè)數(shù)。當(dāng) priority為20時(shí),表示分配給該進(jìn)程的時(shí)間片為10ms20=200ms。這個(gè)值的大小可由用戶自己決定,內(nèi)核在新創(chuàng)建進(jìn)程時(shí)分給進(jìn)程的時(shí)間片值默認(rèn)為200ms。 調(diào)度有關(guān)的可控制優(yōu)先級(jí)因子nice(-2019),默認(rèn)值是0,-20任代表最高優(yōu)級(jí),+10表示降低一個(gè)優(yōu)先級(jí)。sys_nice()改變nice的值。顯然增加nice值將降低進(jìn)程的優(yōu)先級(jí),只有超級(jí)用戶才能降低一個(gè)進(jìn)程的nice值,從而提高進(jìn)程的優(yōu)先級(jí)。
38、 一個(gè)進(jìn)程被創(chuàng)建時(shí),父進(jìn)程的counter值加1后被分成兩部分,一半給子進(jìn)程,另一半再被除2后賦給父進(jìn)程,防止用戶通過無限制的創(chuàng)建后代而長期占用CPU。 而進(jìn)程的policy、nice、 rt_priority均從父進(jìn)程處繼承。第34頁,共79頁。 (3) Linux的調(diào)度函數(shù)通過goodness()函數(shù)從就緒進(jìn)程隊(duì)列中確定具有最高優(yōu)先權(quán)的進(jìn)程。 goodness()先計(jì)算隊(duì)列中的每一個(gè)進(jìn)程的優(yōu)先權(quán),并把它賦給變量weight返回,schedule()把weight作為調(diào)度運(yùn)行的依據(jù),值 大優(yōu)先權(quán)高。 a.動(dòng)態(tài)優(yōu)先數(shù)法 運(yùn)行度量函數(shù): weight=counter+priority-nice(
39、或 weight=counter+priority) 重新計(jì)算:counter=counter/2+priority b.輪轉(zhuǎn)法(policy=SCHED_RR)適合長的實(shí)時(shí)進(jìn)程,SCHED_FIFO 適合短的實(shí)時(shí)進(jìn)程。 weight=rt_priority+1000 (3)進(jìn)程切換保存當(dāng)前進(jìn)程上下文,跳轉(zhuǎn)到就緒進(jìn)程的上下文中執(zhí)行。(2)實(shí)時(shí)進(jìn)程:調(diào)度策略policy=SCHED-RR或SCHED-FIFO兩種策略,前者的進(jìn)程之間是輪轉(zhuǎn)調(diào)度的加優(yōu)先級(jí)(rt_priority,099)。每一個(gè)進(jìn)程運(yùn)行也不能超過200ms。當(dāng)進(jìn)程時(shí)間片用完而需要調(diào)度時(shí),移到運(yùn)行隊(duì)列尾,讓其它同等或更高優(yōu)先級(jí)的進(jìn)程
40、運(yùn)行;后者進(jìn)程是“先進(jìn)先出”策略,即前面的進(jìn)程運(yùn)行完了或者睡眠了,后面的進(jìn)程才有機(jī)會(huì)運(yùn)行。第35頁,共79頁。四、Linux的進(jìn)程控制 1. 進(jìn)程建立 0#進(jìn)程引導(dǎo)1#進(jìn)程(init)調(diào)用fork為每個(gè)終端建立終端進(jìn)程。進(jìn)程樹第36頁,共79頁。進(jìn)程的pidhash鏈表 為了快速的找到進(jìn)程的PCB,Linux中引入pidhash散列表,把32位的PID轉(zhuǎn)換成散列表的索引,散列表中還有PCB的指針。 創(chuàng)建的時(shí)機(jī) 通常系統(tǒng)遇到下列服務(wù)時(shí),會(huì)創(chuàng)建一個(gè)進(jìn)程 當(dāng)操作系統(tǒng)從批處理作業(yè)中讀入一個(gè)新作業(yè)時(shí),會(huì)創(chuàng)建一個(gè)進(jìn)程來處理該敘作業(yè);一個(gè)終端用戶登錄到系統(tǒng)時(shí),為其創(chuàng)建一個(gè)新進(jìn)程;如果用戶請(qǐng)求一個(gè)系統(tǒng)服務(wù),如
41、打印一份文件,操作系統(tǒng)可以為其創(chuàng)建一個(gè)打印進(jìn)程;允許一個(gè)進(jìn)程生成另一個(gè)進(jìn)程。2.進(jìn)程的撤銷 Void exit(status )進(jìn)程終止,釋放資源,重新調(diào)度。Status=0正常結(jié)束, Status=!0,程序有錯(cuò)誤。 wait(&status)等待子進(jìn)程結(jié)束, status=0子進(jìn)程正常結(jié)束,非0表示子進(jìn)程出現(xiàn)了問題,由 exit(status )返回。第37頁,共79頁。3.系統(tǒng)調(diào)用fork() 理解:調(diào)用一次返回兩次。 fork()通過調(diào)用內(nèi)核函數(shù)d0_fork()來實(shí)現(xiàn)。主要工作: 建立進(jìn)程控制結(jié)構(gòu)并賦初值:內(nèi)存中分配一個(gè)task_struct數(shù)據(jù)結(jié)構(gòu),把父進(jìn)程PCB中的內(nèi)容復(fù)制給新進(jìn)
42、程,重置子進(jìn)程中和父進(jìn)程值不同的數(shù)據(jù)成員;為新進(jìn)程設(shè)置跟蹤進(jìn)程的相關(guān)內(nèi)核數(shù)據(jù):把新進(jìn)程插入到進(jìn)程鏈表中,插入到pidhash散列表中,通過拷貝父進(jìn)程上下文初始化新進(jìn)程的上下文。啟動(dòng)調(diào)度程序使新進(jìn)程獲得運(yùn)行機(jī)會(huì):置新進(jìn)程的狀態(tài)為TASKRUNNING,然后掛到就緒隊(duì)列,重新啟動(dòng)調(diào)度程序使其運(yùn)行。向父進(jìn)程返回子進(jìn)程的PID,設(shè)置子進(jìn)程從do_fork返回0值。 為使產(chǎn)生的新進(jìn)程能執(zhí)行新的代碼,內(nèi)核中開發(fā)了一個(gè)系統(tǒng)調(diào)用exec(可執(zhí)行文件的路徑)。調(diào)用一次,返回兩次:子進(jìn)程0;父進(jìn)程0的子進(jìn)程的ID;復(fù)制父進(jìn)程上下文的邏輯副本。 exec(char *path,char *argv)函數(shù)簇:將當(dāng)前(
43、調(diào)用)進(jìn)程的代碼替換為exec()中指定(path)的程序代碼。第38頁,共79頁。例 :#include#inlcudeVoid Do_somting(t ) int t; for (i=0;it;i+); main() pid_t pid;/*此時(shí)僅有一個(gè)進(jìn)程*/ pid=fork();/*此時(shí)已經(jīng)有兩個(gè)進(jìn)程在同時(shí)運(yùn)行*/ if(pid0)printf(“error in fork!”); else if(pid=0) printf(“I am the child process, my process ID is %dn”,getpid(); do_somting(10000); els
44、eprintf(I am the parent process, my process ID is %dn,getpid(); do_somting(10000); 第39頁,共79頁。8.3 Linux進(jìn)程通信 Linux提供的進(jìn)程通信方式和原理與UNIX的通信機(jī)制一樣,有管道方式、信號(hào)方式、SYSTEM V的IPC通信機(jī)制,即消息隊(duì)列、信號(hào)量機(jī)制和共享存儲(chǔ)器方式 。一、管道通信 管道通信技術(shù)又分為無名管道和有名管道兩種類型。 無名管道為建立管道的進(jìn)程及其子孫進(jìn)程提供一條以比特流方式傳遞消息的通信管道。該管道在邏輯上被看做管道文件,在物理上則由文件系統(tǒng)的高速緩存區(qū)構(gòu)成。發(fā)送進(jìn)程利用系統(tǒng)調(diào)用w
45、rite(fd1,buf,size)把buf中的長度為size字符的消息送入管道口fd1,接收進(jìn)程則使用系統(tǒng)調(diào)用read(fd0,buf,size)從管道出口 fd0讀出size字符的消息送入buf中。此外,管道按先進(jìn)先出(FIFO)方式傳遞消息,且只能單向傳遞。圖 管道通信示意圖寫入端fd1讀出端fd0第40頁,共79頁。#include main() int x,fd2; char buf50,s50; pipe(fd); while(x=fork()=-1) if (x=0) sprintf(buf,“This is an example of pipen”); write(fd1,bu
46、f,50); exit(0); else wait(0); read(fd0,s,50); printf(“%s”,s); 第41頁,共79頁。 Linux中,管道是通過指向同一個(gè)臨時(shí)VFS的i節(jié)點(diǎn)的兩個(gè)文件file數(shù)據(jù)結(jié)構(gòu)的文件描述符實(shí)現(xiàn)的。VFS中i節(jié)點(diǎn)指向內(nèi)存中的一個(gè)物理頁面,進(jìn)程各自的file結(jié)構(gòu)都有f_op操作項(xiàng),分別指向?qū)懭牍艿篮妥x出管道。當(dāng)寫入過程對(duì)管道進(jìn)行寫入操作時(shí),數(shù)據(jù)被復(fù)制到共享的數(shù)據(jù)頁面中,而讀取進(jìn)程則從管道的共享數(shù)據(jù)頁面中復(fù)制數(shù)據(jù),從而實(shí)現(xiàn)了進(jìn)程之間的數(shù)據(jù)傳遞 。 Linux必須保證對(duì)管道訪問的同步,為此需要使用鎖、等待隊(duì)列和信號(hào)量等同步機(jī)制。只要管道未被讀出進(jìn)程加鎖,
47、系統(tǒng)就為寫入進(jìn)程對(duì)管道加鎖,并將寫入進(jìn)程地址空間中的數(shù)據(jù)復(fù)制到共享數(shù)據(jù)頁面中。 Linux允許進(jìn)程以非阻塞的方式讀出管道的內(nèi)容。此時(shí)如果沒有數(shù)據(jù)可讀或者管道被加鎖,則返回出錯(cuò)信息。阻塞方式則使該進(jìn)程在管道i節(jié)點(diǎn)的等待隊(duì)列上睡眠,直到寫進(jìn)程寫入操作的結(jié)束。當(dāng)兩個(gè)進(jìn)程對(duì)管道的使用結(jié)束后,管道i節(jié)點(diǎn)或共享數(shù)據(jù)頁面同時(shí)被釋放。 Linux還支持有名管道(named pipe),即FIFO管道。這種管道總是按先進(jìn)先出的原則工作,第一個(gè)被寫入的數(shù)據(jù)將首先從管道中讀出。和無名管道不同的是,F(xiàn)IFO管道不是臨時(shí)對(duì)象,而是文件系統(tǒng)中的實(shí)體,并且可以通過mkfifo命令來創(chuàng)建。 第42頁,共79頁。二、信號(hào) 如果
48、想終止正在運(yùn)行的進(jìn)程,按Ctrl+C,進(jìn)程將收到SIGINT信號(hào),內(nèi)核運(yùn)行相應(yīng)的中斷處理程序,完成有關(guān)SIGINT的處理工作。 進(jìn)程可以選擇對(duì)某種信號(hào)所采取的特定操作,這些操作包括(1)忽略信號(hào)。進(jìn)程可忽略產(chǎn)生的信號(hào),但SIGKILL和SIGSTOP信號(hào)不能被忽略;(2)阻塞信號(hào)。進(jìn)程可選擇阻塞某些信號(hào);(3)由進(jìn)程處理該信號(hào)。進(jìn)程本身可在系統(tǒng)中注冊(cè)處理信號(hào)的處理程序地址,當(dāng)發(fā)出該信號(hào)時(shí),由注冊(cè)的處理程序處理信號(hào);(4)由內(nèi)核進(jìn)行默認(rèn)處理。信號(hào)由內(nèi)核的默認(rèn)處理程序處理。大多數(shù)情況下,信號(hào)由內(nèi)核進(jìn)行處理。 用signal(int sig,int(*sig-process)來處理其它進(jìn)程發(fā)來的信號(hào)
49、:捕獲信號(hào)sig,當(dāng)捕捉到該信號(hào)時(shí)后,以函數(shù)sig-process來處理該信號(hào)。Kill(int pid,int sig):給進(jìn)程pid發(fā)送sig信號(hào)。Pause():使進(jìn)程暫停執(zhí)行直到收到信號(hào)為止。第43頁,共79頁。三、IPC機(jī)制(Interprocess communication)msg_permsmsg_firstmsg_lastmsg_nextmsg_spotmsg_stimemsg_tsmessagemsgque(系統(tǒng)所有消息隊(duì)列)msgid_ds(一個(gè)消息隊(duì)列控制結(jié)構(gòu))msg(一個(gè)消息的頭)圖 Linux消息隊(duì)列1.消息隊(duì)列 一個(gè)或多個(gè)進(jìn)程可向消息隊(duì)列寫入消息,而一個(gè)或多個(gè)進(jìn)程
50、可從消息隊(duì)列中讀取消息,這種進(jìn)程間通訊機(jī)制通常使用在客戶/服務(wù)器模型中,客戶向服務(wù)器發(fā)送請(qǐng)求消息,服務(wù)器讀取消息并執(zhí)行相應(yīng)請(qǐng)求。Linux 為系統(tǒng)中所有的消息隊(duì)列維護(hù)一個(gè) msgque 鏈表,該鏈表中的每個(gè)指針指向一個(gè) msgid_ds 結(jié)構(gòu),該結(jié)構(gòu)完整描述一個(gè)消息隊(duì)列。當(dāng)建立一個(gè)消息隊(duì)列時(shí),系統(tǒng)從內(nèi)存中分配一個(gè) msgid_ds 結(jié)構(gòu)并將指針添加到 msgque 鏈表。第44頁,共79頁。 struct msgbuf int mttype /*消息類型*/ char mtex1 /*消息正文*/ ; int msgsnd(int msgid,struct msgbuf *msgp,sixe-
51、t magz,int msgflg)發(fā)送消息; int msgrcv (int msgid,struct msgbuf *msgp,sixe-t magz,int msgflg, int msgtyp)接收消息; int msgid=msgget(key-t key,int msgflg),建立消息隊(duì)列,key通信雙方的約定值, msgflg隊(duì)列訪問控制方式。 第45頁,共79頁。圖 linux信號(hào)量集合arrayof embufproc_nextsem_undo所有信號(hào)量semarysem_permpendings sem_baseundo信號(hào)量semid_ds掛起隊(duì)列sem_queuepr
52、oc_nextsemadjsem_queue 數(shù)組array of semnextnextprev sleeperundosopsnsopsarray of semadj2.信號(hào)量第46頁,共79頁。struct sem intsemval;/* current value */ intsempid;/* pid of last operation */ ;int semid=semget(key-t key,int nsems,int semflg )創(chuàng)建一個(gè)信號(hào)量組,nsems信號(hào)量個(gè)數(shù), semflg信號(hào)量存取權(quán)限。int semop(int semid,struct sembuf *s
53、ops,unsignd nosps)完成對(duì)信號(hào)量的操作。 nosps信號(hào)量操作個(gè)數(shù), struct sembuf unsigned short sem_num;/* semaphore index in array */ shortsem_op;/* semaphore operation */ short sem_flg;/* operation flags */;(P、V) 如果sem_op0,把它的值加到信號(hào)量,這意味著歸還資源。 如果sem_op=0,本次操作要對(duì)信號(hào)量進(jìn)行測(cè)試。若為零正常返回,不為零,進(jìn)程睡眠直到信號(hào)量為0。第47頁,共79頁。 Linux 負(fù)責(zé)將操作實(shí)際應(yīng)用于信號(hào)量
54、隊(duì)列的相應(yīng)元素。 Linux 按如下的規(guī)則判斷是否所有的操作都可以成功:操作值和信號(hào)量的當(dāng)前值相加大于 0,或操作值和當(dāng)前值均為 0,則操作成功。如果系統(tǒng)調(diào)用中指定的所有操作中有一個(gè)操作不能成功時(shí),則 Linux 會(huì)掛起這一進(jìn)程。但是,如果操作標(biāo)志指定這種情況下不能掛起進(jìn)程的話,系統(tǒng)調(diào)用返回并指明信號(hào)量上的操作沒有成功,而進(jìn)程可以繼續(xù)執(zhí)行。如果進(jìn)程被掛起,Linux 必須保存信號(hào)量的操作狀態(tài)并將當(dāng)前進(jìn)程放入等待隊(duì)列。為此,Linux 在堆棧中建立一個(gè) sem_queue 結(jié)構(gòu)并填充該結(jié)構(gòu)。新的 sem_queue 結(jié)構(gòu)添加到信號(hào)量對(duì)象的等待隊(duì)列中(利用 sem_pending 和 sem_pe
55、nding_last 指針)。當(dāng)前進(jìn)程放入 sem_queue 結(jié)構(gòu)的等待隊(duì)列中(sleeper)后調(diào)用調(diào)度程序選擇其他的進(jìn)程運(yùn)行。 Linux 檢查任何等待的或掛起的進(jìn)程,看它們的信號(hào)量操作是否可以成功。如果這些進(jìn)程的信號(hào)量操作可以成功,Linux 就會(huì)將它們從掛起隊(duì)列中移去,并將它們的操作實(shí)際應(yīng)用于信號(hào)量隊(duì)列。如果所有的信號(hào)量操作都成功了,當(dāng)前進(jìn)程可繼續(xù)運(yùn)行 第48頁,共79頁。3.共享內(nèi)存 進(jìn)程的虛擬地址可以映射到任意一處物理地址,這樣,如果兩個(gè)進(jìn)程的虛擬地址映射到同一物理地址,這兩個(gè)進(jìn)程就可以利用這一虛擬地址進(jìn)行通訊。但是,一旦內(nèi)存被共享之后,對(duì)共享內(nèi)存的訪問同步需要由其他 IPC 機(jī)
56、制,例如信號(hào)量來實(shí)現(xiàn)。Linux 中的共享內(nèi)存通過訪問鍵來訪問,并進(jìn)行訪問權(quán)限的檢查。 每個(gè)新創(chuàng)建(int shmit=shmget(key_t key,int size,int shmflg)的共享內(nèi)存區(qū)域由一個(gè)shmid_ds數(shù)據(jù)結(jié)構(gòu)來表示。它們被保存在shm_segs數(shù)組中。shmid_ds數(shù)據(jù)結(jié)構(gòu)描述共享內(nèi)存的大小,進(jìn)程如何使用以及共享內(nèi)存映射到其各自地址空間的方式。由共享內(nèi)存創(chuàng)建者控制(int shmctl(int shmid,struct shmid_ds *buf, int cmd)對(duì)此內(nèi)存的存取權(quán)限以及其鍵是公有還是私有。如果它由足夠權(quán)限,它還可以將此共享內(nèi)存加載)到物理內(nèi)存中
57、。第49頁,共79頁。 每個(gè)使用此共享內(nèi)存的進(jìn)程必須通過系統(tǒng)調(diào)用將其連接到虛擬內(nèi)存上(共享內(nèi)存段地址char *shmat(int shmid,char *shaddr ,int shmflg))。這時(shí)進(jìn)程創(chuàng)建新的vm_area_struct來描述此共享內(nèi)存。進(jìn)程可以決定此共享內(nèi)存在其虛擬地址空間的位置,或者讓Linux選擇一塊足夠大的區(qū)域。新的vm_area_struct結(jié)構(gòu)將被放到由shmid_ds指向的vm_area_struct鏈表中。通過vm_next_shared和vm_prev_shared指針將它們連接起來。虛擬內(nèi)存在連接時(shí)并沒有創(chuàng)建;進(jìn)程訪問它時(shí)才創(chuàng)建 。當(dāng)進(jìn)程不再共享此虛擬
58、內(nèi)存時(shí),進(jìn)程和共享內(nèi)存的連接將被斷開(int shmdt(char shmaddr))。 。如果其它進(jìn)程還在使用這個(gè)內(nèi)存,則此操作只影響當(dāng)前進(jìn)程。其對(duì)應(yīng)的vm_area_struct結(jié)構(gòu)將從shmid_ds結(jié)構(gòu)中刪除并回收。當(dāng)前進(jìn)程對(duì)應(yīng)此共享內(nèi)存地址的頁表入口也將被更新并置為無效。當(dāng)最后一個(gè)進(jìn)程斷開與共享內(nèi)存的連接時(shí),當(dāng)前位于物理內(nèi)存中的共享內(nèi)存頁面將被釋放,同時(shí)釋放的還有此共享內(nèi)存的shmid_ds結(jié)構(gòu)。不同的進(jìn)程可以相同的關(guān)鍵字共享。第50頁,共79頁。shm_segsshm_permshm_pagesattachsshm_dsvm_area_structvm_next_sharedvm_
59、next_sharedvm_area_structarray of pte圖 linux共享內(nèi)存段第51頁,共79頁。一、虛存空間8.4Linux存儲(chǔ)管理 Linux系統(tǒng)采用了虛擬的內(nèi)存管理機(jī)制,就是交換和請(qǐng)求分頁存儲(chǔ)管理技術(shù)。進(jìn)程的虛存空間第52頁,共79頁。圖 進(jìn)程虛存空間的結(jié)構(gòu)第53頁,共79頁。 linux的三級(jí)分頁管理三級(jí)分頁管理把虛擬地址分成四個(gè)位段:頁目錄、頁中間目錄、頁表、頁內(nèi)偏址。系統(tǒng)設(shè)置三級(jí)頁表系列: 頁目錄PGD(PaGe Directory)、 頁中間目錄PMD(Page Middle Directory) 頁表PTE(Page TablE)。二、三級(jí)分頁結(jié)構(gòu)第54頁,
60、共79頁。三、地址映射過程 linux的地址映射第55頁,共79頁。1.內(nèi)存頁面:Linux對(duì)物理內(nèi)存空間按照分頁方式進(jìn)行管理,把物理內(nèi)存劃分成大小相同的物理頁面。Linux設(shè)置了一個(gè)mem_map數(shù)組管理內(nèi)存頁面。 四、物理內(nèi)存的管理 typedef struct page struct page *next;/* 把page結(jié)構(gòu)體鏈接成一個(gè)雙向循環(huán)鏈表 struct page *prev; struct inode *inode;/*有關(guān)文件的inode unsigned long offset;/*在文件中的偏移量 struct page *next_hash;把有關(guān)page結(jié)構(gòu)體連成一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025合同違約責(zé)任的新變化與特點(diǎn)
- 2024年2月化糞池作業(yè)現(xiàn)場(chǎng)衛(wèi)生防護(hù)距離測(cè)量協(xié)議
- 2025年濾紫外石英玻璃燈管項(xiàng)目建議書
- 幼兒園課程評(píng)價(jià)的科學(xué)化探索計(jì)劃
- 綠色水利工程建設(shè)實(shí)踐計(jì)劃
- 降低成本的創(chuàng)新思路計(jì)劃
- 2024年7月招生代理協(xié)議中的多世界詮釋法律聲明
- 加強(qiáng)市場(chǎng)競(jìng)爭力的工作策略計(jì)劃
- 班主任角色定位與工作方法計(jì)劃
- 社交媒體學(xué)校社交媒體社團(tuán)計(jì)劃
- 重癥醫(yī)學(xué)科診療常規(guī)
- 黑龍江省哈爾濱市香坊區(qū)2022年中考一?;瘜W(xué)試題含解析
- 外貿(mào)業(yè)務(wù)員面試試卷
- 老年病老年綜合征及老年綜合評(píng)估培訓(xùn)課件
- DB14T 1925-2019 流通領(lǐng)域供應(yīng)鏈標(biāo)準(zhǔn)體系
- GB∕T 23293-2021 氮化物結(jié)合耐火制品及其配套耐火泥漿
- 東北財(cái)經(jīng)大學(xué)《服務(wù)禮儀X》綜合作業(yè)答卷
- 四川大學(xué)-劉龍飛-畢業(yè)答辯PPT模板
- 5關(guān)于進(jìn)一步規(guī)范建設(shè)工程質(zhì)量檢測(cè)服務(wù)收費(fèi)的通知湘價(jià)服2009186號(hào)
- 致橡樹朗誦ppt(1) 2
- 交通安全設(shè)施擺放圖
評(píng)論
0/150
提交評(píng)論