總覽程序員
電腦看似複雜,其實硬件無非四種:CPU,內存,磁盤,輸入輸出設備,重要性依次遞減。硬件之上,操做系統是一層,應用程序又一層。算法
一通電,CPU就會開始運行,從磁盤中將操做系統讀取到內存中,CPU按時間順序從內存中的操做系統裏,讀取指令執行之。緩存
操做系統使CPU迅速地在許多進程中切換,以形成進程們在併發運行的假象。網絡
進程的誕生是,將程序從磁盤載入內存,並分配內存空間用於儲存數據,這裝載程序的內存和儲存數據的內存構成了進程的載體,等分配了CPU,進程即開始運行。數據結構
CPU的分配以優先級和時間片爲準,讓重要程度不一樣的各個進程併發運行。併發
用戶的操做經過輸入設備(或定時器)產生中斷,操做系統的主循環會發現中斷,並分配給適當的響應中斷的程序。數據結構和算法
程序的執行結果,體如今硬件的變化上,如輸出設備給出畫面或聲音,讓用戶看到或聽到。函數
操做系統學習
操做系統位於「底層硬件」和「應用程序」之間,向下管理硬件資源,向上提供高級接口。操作系統
在CPU的計算能力之上,操做系統提供了調度的能力,來運行進程、顯示圖畫、響應事件。
進程
在物理實現上,每一個進程都是內存中的一個局部,這個局部既放了程序代碼,又提供了儲存狀態的場所。
這些局部被CPU輪流訪問,造成併發的假象。這「輪流」並不是讓各進程盲目地平攤CPU時間,而是有主次之分。在CPU的輪流訪問期間,進程也於是在建立、就緒、運行、阻塞、終止這五種狀態間切換。
CPU的輪流訪問根據「優先級」和「時間片」,優先級是每一個程序有的一個數字,數字大小關係決定了優先級高低關係,優先級低的進程要把CPU讓給優先級高的,時間片指一小段時間,當一個進程用完一個時間片,CPU就從新選擇下個時間片該運行誰。
由於CPU的程序計數器和各類寄存器都只有一份,當CPU切換到另外一個進程時,上一個進程就須要把「我執行到哪了」保存下來,存到本身的「進程上下文」中,下次CPU切換回來時,把狀態裝回給CPU,繼續運行,就好像什麼都沒發生過。
在任務管理器裏查看進程列表,咱們最關心的是內存佔用和CPU佔用,正說明了進程是「內存的片斷」與「CPU的分配」的結合體。
進程多是無限循環,也可能不是。若是不是,則處理完事務即中止,若是是,則不斷監聽事件以響應。
內存管理
若是內存有限,程序須要的內存超過實際內存,則須要虛擬內存:將磁盤的一部分用做「虛擬內存」,把內存中暫時不執行的程序外放到「虛擬內存」中,騰出來地方來運行須要執行的程序,當外放的程序須要執行時再換回到內存中。
分給某個程序的內存局部,在物理上未必是連續的,而是將真實內存分爲固定大小的頁,程序使用其中的若干頁。這樣能更靈活地使用。
文件
只有磁盤能斷電存儲,CPU和內存都不行,並且磁盤存儲空間遠大於CPU和內存,所以所有程序和數據都保存在磁盤上。保存的方式就是文件。
文件的本質是磁盤上的局部。磁盤分配方式與內存相似,也是劃分爲若干大小相等的小單元,文件按需使用其中一些小單元。
把磁盤看作輸入輸出設備也無妨,畢竟它相對於CPU和內存,是「外人」,內存從磁盤讀,屬於「輸入」,內存向磁盤寫,屬於「輸出」。
反過來,把輸入輸出設備,看作文件,也無妨,反正內存都是要向它們讀和寫的,只是看待它們的視角的差異。
輸入輸出設備
電腦想有用,就要跟用戶有交互,跟用戶的交互,全靠輸入輸出設備。用戶給電腦信息,就是輸入,電腦給用戶信息,就是輸出。
你對顯示器、鍵盤、鼠標,確定比對CPU、內存、磁盤更熟悉,對吧?由於顯示器它們是「在一線面向用戶」的。
引伸,像計算機同樣高效地使用大腦
人在同一時間只能作一件事,一心多用都是僞併發,切換上下文有成本。
應該把多而不重要的知識存到「磁盤」裏,即筆記本、收藏夾等處,待用時方載入「內存」即大腦裏便可,以減輕記憶負擔。
最經常使用的知識才有必要記住在「內存」裏,這取用方便,減小每次都從「磁盤」載入的成本,這是緩存的價值所在。
寫在後面
這一個月天天都在讀《30天自制操做系統》,同時使用大學時教材《計算機組成原理》《計算機三級教程PC技術》《現代操做系統》作參考,來進行對計算機底層硬件、操做系統的學習和鞏固。
做爲應用程序員,編寫的代碼都處於過高層,以致於以爲技術含量太差,久了對本身就不滿意。一直都想好好複習下基礎,但總因辛苦而堅持不下來。
後來終於想明白,基礎的鞏固和複習,應該是一個很是長期的工做,一蹴而就的想法很是不現實。因而決定用四個月時間,分別鞏固計算機組成原理、操做系統、網絡、算法的知識。這第一個月,作的是學習計算機組成原理的工做,還順帶看了操做系統。
機箱一拆開,電路板和連線怪複雜神祕的,嚇人,其實那都不重要。最重要的三樣東西,CPU,內存,磁盤,體積都有限,形狀也規整,第四重要的就是機箱外面的顯示器、鍵盤、鼠標這些總稱爲輸入輸出設備的東西了。
CPU是「原動力」,就像四驅車上的電機,嗚嗚轉着,很蠢很機械。但能動起來就是萬歲。人們開動腦筋,經過齒輪、皮帶等零件,讓電機旋轉的單調動做轉爲更有意義的動做。對CPU也是同樣,既然它能讀取指令,並忠實地執行之,那就好辦了,只要咱們把指令寫出花來,電腦的功能就會豐富錦簇。就像劉邦和張良,既然張良說什麼劉邦都言聽計從,那雖然劉邦能力有限,但只要張良智計百出,一切就都有可能了。
固然,在地位上,張良是劉邦的下級。在計算機體系中,操做系統是硬件的上層,其實計算機體系裏,越上層權限越小,上層能作的,下層全能作,下層能作的,上層能不能作?那要看下層高不高興暴露出調用的接口。因此,最上層的應用程序員,實際上是被勒定在一個很是逼仄侷促的空間裏跳舞,在某個「平臺」之上,利用平臺好心提供的API,來使出渾身解數實現功能。API越簡潔好用,應用程序員越顯得無腦,其實未必是程序員蠢,而是飯已經熟了,再巧的媳婦也只能作作把它盛到碗裏這種沒有技術含量的工做,這跟「巧婦難爲無米之炊」剛好是反的,比如「一鍵刷機」,程序給力到這個程度,只負責按一下按鈕的人,即便有很高水平,也顯不出來了。
不過,越上層當然離硬件越遠,但抽象層次越高,離具體業務是越近的。搭積木搭得好,未必就不如造積木造得好那我的光榮。畢竟,用戶要的,仍是一個完成品,好比用戶要一個城堡,那光造出來積木仍是不行,須要有人搭起來。這搭積木,就須要不少造積木的人用不到的知識,例如空間想象力、圖紙繪製能力、讓城堡穩固不倒的力學知識、色彩搭配知識等等。每一個層次,都有每一個層次須要的專業技能,但人的認知老是有侷限的,傾向重視本身的技能,輕視別人的技能,來達到滿意本身、鄙視他人的心理訴求,其實這仍是「成績單的思惟」,是不必的。
但有些知識是不管造積木,仍是搭積木的人都須要的,這就是所謂「通用知識」,例如數學知識、英語知識等等,固然計算機基礎知識也是,這樣看來計算機考研的課程都頗有意義,比想象中的合理多了。不過如今學習資源這麼豐富,書籍、視頻、官網等等,即便不考研也能夠自學,差異仍是在肯不願用功上。
話題回到劉邦張良,力量固然都在劉邦手上,但由於劉邦對張良言聽計從,張良指哪裏,劉邦的力量就打向哪裏,這跟力量都在張良手上也沒什麼區別了。硬件和操做系統的關係也正像如此,雖然操做系統是「被動的」,只負責定義指令,執行權在CPU手裏,但CPU這麼聽話,當作操做系統實際掌了權也就能夠了:明明只有內存、磁盤的「容器」,卻能無中生有地給抽象出「進程」「地址空間」「文件」這些可用性極強的概念來,操做系統真是把CPU內存和硬盤玩出了花來。
不過,同一份操做系統要賣給全世界,全世界各類用戶須要的功能,這操做系統不可能全都包含了,因此操做系統索性也放權,操做系統提供出來API,世界各地程序員能夠利用這API開發本身的程序,操做系統就負責把這些程序載入內存裏做爲進程來跑,當用戶有操做時,操做系統負責把這操做事件交給適當的進程來響應。應用程序員能立足的基本點,其實就是操做系統提供的API們,固然,操做系統提供的API仍是很豐富的,只要用好了各類程序都能開發出來,不然這操做系統也賣不出去呀。
對計算機的理解,最終就是到這裏,CPU提供主循環,操做系統在這主循環中運行,提供次級主循環,應用程序的進程又在次級主循環中運行,提供三級主循環,當用戶有操做了,CPU把操做交給操做系統,操做系統再交給應用程序進程,應用程序進程的三級主循環得知了事件的到來,再把它分發給響應事件的函數來處理,這個函數來作具體該作的事,好比把數據寫向某個地方,或者在界面上顯示某些東西,這顯示某些東西,在本質上,其實也是向顯卡內存中寫些東西。
計算機組成原理和操做系統的學習,就先到這裏(之後會慢慢修正和補充),下個月來複習數據結構和算法的知識,感受仍是這好玩,我都等不及了,至於計算機網絡,下下個月再學,對這知識實在不很感興趣。那對算法感興趣的朋友,下個月我們再見。