總覽
電腦看似復(fù)雜信认,其實(shí)硬件無(wú)非四種:CPU,內(nèi)存均抽,磁盤嫁赏,輸入輸出設(shè)備,重要性依次遞減到忽。硬件之上橄教,操作系統(tǒng)是一層,應(yīng)用程序又一層喘漏。
一通電护蝶,CPU就會(huì)開始運(yùn)行,從磁盤中將操作系統(tǒng)讀取到內(nèi)存中翩迈,CPU按時(shí)間順序從內(nèi)存中的操作系統(tǒng)里持灰,讀取指令執(zhí)行之。
操作系統(tǒng)使CPU迅速地在許多進(jìn)程中切換负饲,以造成進(jìn)程們?cè)诓l(fā)運(yùn)行的假象堤魁。
進(jìn)程的誕生是,將程序從磁盤載入內(nèi)存返十,并分配內(nèi)存空間用于儲(chǔ)存數(shù)據(jù)妥泉,這裝載程序的內(nèi)存和儲(chǔ)存數(shù)據(jù)的內(nèi)存構(gòu)成了進(jìn)程的載體,等分配了CPU洞坑,進(jìn)程即開始運(yùn)行盲链。
CPU的分配以優(yōu)先級(jí)和時(shí)間片為準(zhǔn),讓重要程度不同的各個(gè)進(jìn)程并發(fā)運(yùn)行迟杂。
用戶的操作通過(guò)輸入設(shè)備(或定時(shí)器)產(chǎn)生中斷刽沾,操作系統(tǒng)的主循環(huán)會(huì)發(fā)現(xiàn)中斷,并分配給適當(dāng)?shù)捻憫?yīng)中斷的程序排拷。
程序的執(zhí)行結(jié)果侧漓,體現(xiàn)在硬件的變化上,如輸出設(shè)備給出畫面或聲音监氢,讓用戶看到或聽到布蔗。
操作系統(tǒng)
操作系統(tǒng)位于「底層硬件」和「應(yīng)用程序」之間,向下管理硬件資源浪腐,向上提供高級(jí)接口何鸡。
在CPU的計(jì)算能力之上,操作系統(tǒng)提供了調(diào)度的能力牛欢,來(lái)運(yùn)行進(jìn)程骡男、顯示圖畫、響應(yīng)事件傍睹。
進(jìn)程
在物理實(shí)現(xiàn)上隔盛,每個(gè)進(jìn)程都是內(nèi)存中的一個(gè)局部犹菱,這個(gè)局部既放了程序代碼,又提供了儲(chǔ)存狀態(tài)的場(chǎng)所吮炕。
這些局部被CPU輪流訪問腊脱,形成并發(fā)的假象。這「輪流」并非讓各進(jìn)程盲目地平攤CPU時(shí)間龙亲,而是有主次之分陕凹。在CPU的輪流訪問期間,進(jìn)程也因而在創(chuàng)建鳄炉、就緒杜耙、運(yùn)行、阻塞拂盯、終止這五種狀態(tài)間切換佑女。
CPU的輪流訪問根據(jù)「優(yōu)先級(jí)」和「時(shí)間片」,優(yōu)先級(jí)是每個(gè)程序有的一個(gè)數(shù)字谈竿,數(shù)字大小關(guān)系決定了優(yōu)先級(jí)高低關(guān)系团驱,優(yōu)先級(jí)低的進(jìn)程要把CPU讓給優(yōu)先級(jí)高的朽们,時(shí)間片指一小段時(shí)間川慌,當(dāng)一個(gè)進(jìn)程用完一個(gè)時(shí)間片纱兑,CPU就重新選擇下個(gè)時(shí)間片該運(yùn)行誰(shuí)抑月。
因?yàn)镃PU的程序計(jì)數(shù)器和各種寄存器都只有一份,當(dāng)CPU切換到另一個(gè)進(jìn)程時(shí)挖帘,上一個(gè)進(jìn)程就需要把「我執(zhí)行到哪了」保存下來(lái)分尸,存到自己的「進(jìn)程上下文」中乍楚,下次CPU切換回來(lái)時(shí)两嘴,把狀態(tài)裝回給CPU,繼續(xù)運(yùn)行族壳,就好像什么都沒發(fā)生過(guò)憔辫。
在任務(wù)管理器里查看進(jìn)程列表,我們最關(guān)心的是內(nèi)存占用和CPU占用仿荆,正說(shuō)明了進(jìn)程是「內(nèi)存的片段」與「CPU的分配」的結(jié)合體贰您。
進(jìn)程可能是無(wú)限循環(huán),也可能不是拢操。如果不是锦亦,則處理完事務(wù)即停止,如果是令境,則不斷監(jiān)聽事件以響應(yīng)杠园。
內(nèi)存管理
如果內(nèi)存有限,程序需要的內(nèi)存超過(guò)實(shí)際內(nèi)存舔庶,則需要虛擬內(nèi)存:將磁盤的一部分用作「虛擬內(nèi)存」抛蚁,把內(nèi)存中暫時(shí)不執(zhí)行的程序外放到「虛擬內(nèi)存」中陈醒,騰出來(lái)地方來(lái)運(yùn)行需要執(zhí)行的程序,當(dāng)外放的程序需要執(zhí)行時(shí)再換回到內(nèi)存中瞧甩。
分給某個(gè)程序的內(nèi)存局部钉跷,在物理上未必是連續(xù)的,而是將真實(shí)內(nèi)存分為固定大小的頁(yè)肚逸,程序使用其中的若干頁(yè)爷辙。這樣能更靈活地使用。
文件
只有磁盤能斷電存儲(chǔ)朦促,CPU和內(nèi)存都不行膝晾,而且磁盤存儲(chǔ)空間遠(yuǎn)大于CPU和內(nèi)存,因此全部程序和數(shù)據(jù)都保存在磁盤上思灰。保存的方式就是文件玷犹。
文件的本質(zhì)是磁盤上的局部。磁盤分配方式與內(nèi)存類似洒疚,也是劃分為若干大小相等的小單元歹颓,文件按需使用其中一些小單元。
把磁盤看做輸入輸出設(shè)備也無(wú)妨油湖,畢竟它相對(duì)于CPU和內(nèi)存巍扛,是「外人」,內(nèi)存從磁盤讀乏德,屬于「輸入」撤奸,內(nèi)存向磁盤寫,屬于「輸出」喊括。
反過(guò)來(lái)胧瓜,把輸入輸出設(shè)備,看做文件郑什,也無(wú)妨府喳,反正內(nèi)存都是要向它們讀和寫的,只是看待它們的視角的差別蘑拯。
輸入輸出設(shè)備
電腦想有用钝满,就要跟用戶有交互,跟用戶的交互申窘,全靠輸入輸出設(shè)備弯蚜。用戶給電腦信息,就是輸入剃法,電腦給用戶信息碎捺,就是輸出。
你對(duì)顯示器、鍵盤牵寺、鼠標(biāo)悍引,肯定比對(duì)CPU、內(nèi)存帽氓、磁盤更熟悉趣斤,對(duì)吧?因?yàn)轱@示器它們是「在一線面向用戶」的黎休。
引申浓领,像計(jì)算機(jī)一樣高效地使用大腦
人在同一時(shí)間只能做一件事,一心多用都是偽并發(fā)势腮,切換上下文有成本联贩。
應(yīng)該把多而不重要的知識(shí)存到「磁盤」里,即筆記本捎拯、收藏夾等處泪幌,待用時(shí)方載入「內(nèi)存」即大腦里即可,以減輕記憶負(fù)擔(dān)署照。
最常用的知識(shí)才有必要記住在「內(nèi)存」里祸泪,這取用方便,減少每次都從「磁盤」載入的成本建芙,這是緩存的價(jià)值所在没隘。
寫在后面
這一個(gè)月每天都在讀《30天自制操作系統(tǒng)》,同時(shí)使用大學(xué)時(shí)教材《計(jì)算機(jī)組成原理》《計(jì)算機(jī)三級(jí)教程PC技術(shù)》《現(xiàn)代操作系統(tǒng)》做參考禁荸,來(lái)進(jìn)行對(duì)計(jì)算機(jī)底層硬件右蒲、操作系統(tǒng)的學(xué)習(xí)和鞏固。
作為應(yīng)用程序員赶熟,編寫的代碼都處于太高層瑰妄,以至于覺得技術(shù)含量太差,久了對(duì)自己就不滿意映砖。一直都想好好復(fù)習(xí)下基礎(chǔ)间坐,但總因辛苦而堅(jiān)持不下來(lái)。
后來(lái)終于想明白啊央,基礎(chǔ)的鞏固和復(fù)習(xí)眶诈,應(yīng)該是一個(gè)非常長(zhǎng)期的工作涨醋,一蹴而就的想法非常不現(xiàn)實(shí)瓜饥。于是決定用四個(gè)月時(shí)間,分別鞏固計(jì)算機(jī)組成原理浴骂、操作系統(tǒng)乓土、網(wǎng)絡(luò)、算法的知識(shí)。這第一個(gè)月趣苏,做的是學(xué)習(xí)計(jì)算機(jī)組成原理的工作狡相,還順帶看了操作系統(tǒng)。
機(jī)箱一拆開食磕,電路板和連線怪復(fù)雜神秘的尽棕,嚇人,其實(shí)那都不重要彬伦。最重要的三樣?xùn)|西滔悉,CPU,內(nèi)存单绑,磁盤回官,體積都有限,形狀也規(guī)整搂橙,第四重要的就是機(jī)箱外面的顯示器歉提、鍵盤、鼠標(biāo)這些總稱為輸入輸出設(shè)備的東西了区转。
CPU是「原動(dòng)力」苔巨,就像四驅(qū)車上的電機(jī),嗚嗚轉(zhuǎn)著蜗帜,很蠢很機(jī)械恋拷。但能動(dòng)起來(lái)就是萬(wàn)歲。人們開動(dòng)腦筋厅缺,通過(guò)齒輪蔬顾、皮帶等零件,讓電機(jī)旋轉(zhuǎn)的單調(diào)動(dòng)作轉(zhuǎn)為更有意義的動(dòng)作湘捎。對(duì)CPU也是一樣诀豁,既然它能讀取指令,并忠實(shí)地執(zhí)行之窥妇,那就好辦了舷胜,只要我們把指令寫出花來(lái),電腦的功能就會(huì)豐富錦簇活翩。就像劉邦和張良烹骨,既然張良說(shuō)什么劉邦都言聽計(jì)從,那雖然劉邦能力有限材泄,但只要張良智計(jì)百出沮焕,一切就都有可能了。
當(dāng)然拉宗,在地位上峦树,張良是劉邦的下級(jí)辣辫。在計(jì)算機(jī)體系中,操作系統(tǒng)是硬件的上層魁巩,其實(shí)計(jì)算機(jī)體系里急灭,越上層權(quán)限越小,上層能做的谷遂,下層全能做葬馋,下層能做的,上層能不能做肾扰?那要看下層高不高興暴露出調(diào)用的接口点楼。所以,最上層的應(yīng)用程序員白对,其實(shí)是被勒定在一個(gè)非常逼仄局促的空間里跳舞掠廓,在某個(gè)「平臺(tái)」之上,利用平臺(tái)好心提供的API甩恼,來(lái)使出渾身解數(shù)實(shí)現(xiàn)功能蟀瞧。API越簡(jiǎn)潔好用,應(yīng)用程序員越顯得無(wú)腦条摸,其實(shí)未必是程序員蠢悦污,而是飯已經(jīng)熟了,再巧的媳婦也只能做做把它盛到碗里這種沒有技術(shù)含量的工作钉蒲,這跟「巧婦難為無(wú)米之炊」恰好是反的切端,好比「一鍵刷機(jī)」,程序給力到這個(gè)程度顷啼,只負(fù)責(zé)按一下按鈕的人踏枣,即使有很高水平,也顯不出來(lái)了钙蒙。
不過(guò)茵瀑,越上層固然離硬件越遠(yuǎn),但抽象層次越高躬厌,離具體業(yè)務(wù)是越近的马昨。搭積木搭得好,未必就不如造積木造得好那個(gè)人光榮扛施。畢竟鸿捧,用戶要的,還是一個(gè)完成品疙渣,比如用戶要一個(gè)城堡匙奴,那光造出來(lái)積木還是不行,需要有人搭起來(lái)昌阿。這搭積木饥脑,就需要很多造積木的人用不到的知識(shí),例如空間想象力懦冰、圖紙繪制能力灶轰、讓城堡穩(wěn)固不倒的力學(xué)知識(shí)、色彩搭配知識(shí)等等刷钢。每個(gè)層次笋颤,都有每個(gè)層次需要的專業(yè)技能,但人的認(rèn)知總是有局限的内地,傾向重視自己的技能伴澄,輕視別人的技能,來(lái)達(dá)到滿意自己阱缓、鄙視他人的心理訴求非凌,其實(shí)這還是「成績(jī)單的思維」,是沒必要的荆针。
但有些知識(shí)是無(wú)論造積木敞嗡,還是搭積木的人都需要的,這就是所謂「通用知識(shí)」航背,例如數(shù)學(xué)知識(shí)喉悴、英語(yǔ)知識(shí)等等,當(dāng)然計(jì)算機(jī)基礎(chǔ)知識(shí)也是玖媚,這樣看來(lái)計(jì)算機(jī)考研的課程都很有意義箕肃,比想象中的合理多了。不過(guò)現(xiàn)在學(xué)習(xí)資源這么豐富今魔,書籍勺像、視頻、官網(wǎng)等等错森,即使不考研也可以自學(xué)咏删,差別還是在肯不肯用功上。
話題回到劉邦張良问词,力量當(dāng)然都在劉邦手上督函,但因?yàn)閯顚?duì)張良言聽計(jì)從,張良指哪里激挪,劉邦的力量就打向哪里辰狡,這跟力量都在張良手上也沒什么區(qū)別了。硬件和操作系統(tǒng)的關(guān)系也正像如此垄分,雖然操作系統(tǒng)是「被動(dòng)的」宛篇,只負(fù)責(zé)定義指令,執(zhí)行權(quán)在CPU手里薄湿,但CPU這么聽話叫倍,看成操作系統(tǒng)實(shí)際掌了權(quán)也就可以了:明明只有內(nèi)存偷卧、磁盤的「容器」,卻能無(wú)中生有地給抽象出「進(jìn)程」「地址空間」「文件」這些可用性極強(qiáng)的概念來(lái)吆倦,操作系統(tǒng)真是把CPU內(nèi)存和硬盤玩出了花來(lái)听诸。
不過(guò),同一份操作系統(tǒng)要賣給全世界蚕泽,全世界各種用戶需要的功能晌梨,這操作系統(tǒng)不可能全都包含了,所以操作系統(tǒng)索性也放權(quán)须妻,操作系統(tǒng)提供出來(lái)API仔蝌,世界各地程序員可以利用這API開發(fā)自己的程序,操作系統(tǒng)就負(fù)責(zé)把這些程序載入內(nèi)存里作為進(jìn)程來(lái)跑荒吏,當(dāng)用戶有操作時(shí)敛惊,操作系統(tǒng)負(fù)責(zé)把這操作事件交給適當(dāng)?shù)倪M(jìn)程來(lái)響應(yīng)。應(yīng)用程序員能立足的基本點(diǎn)绰更,其實(shí)就是操作系統(tǒng)提供的API們豆混,當(dāng)然,操作系統(tǒng)提供的API還是很豐富的动知,只要用好了各種程序都能開發(fā)出來(lái)皿伺,否則這操作系統(tǒng)也賣不出去呀。
對(duì)計(jì)算機(jī)的理解盒粮,最終就是到這里鸵鸥,CPU提供主循環(huán),操作系統(tǒng)在這主循環(huán)中運(yùn)行丹皱,提供次級(jí)主循環(huán)妒穴,應(yīng)用程序的進(jìn)程又在次級(jí)主循環(huán)中運(yùn)行,提供三級(jí)主循環(huán)摊崭,當(dāng)用戶有操作了讼油,CPU把操作交給操作系統(tǒng),操作系統(tǒng)再交給應(yīng)用程序進(jìn)程呢簸,應(yīng)用程序進(jìn)程的三級(jí)主循環(huán)得知了事件的到來(lái)矮台,再把它分發(fā)給響應(yīng)事件的函數(shù)來(lái)處理,這個(gè)函數(shù)來(lái)做具體該做的事根时,比如把數(shù)據(jù)寫向某個(gè)地方瘦赫,或者在界面上顯示某些東西,這顯示某些東西蛤迎,在本質(zhì)上确虱,其實(shí)也是向顯卡內(nèi)存中寫些東西。
計(jì)算機(jī)組成原理和操作系統(tǒng)的學(xué)習(xí)替裆,就先到這里(以后會(huì)慢慢修正和補(bǔ)充)校辩,下個(gè)月來(lái)復(fù)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法的知識(shí)窘问,感覺還是這好玩,我都等不及了宜咒,至于計(jì)算機(jī)網(wǎng)絡(luò)惠赫,下下個(gè)月再學(xué),對(duì)這知識(shí)實(shí)在不很感興趣荧呐。那對(duì)算法感興趣的朋友,下個(gè)月咱們?cè)僖姟?/p>