計算機組成原理、操作系統、數據結構和計算機網絡融會貫通

原文地址:
原文個人主頁:計算機組成原理、操作系統、數據結構和計算機網絡融會貫通

計算機組成原理

這門學科告訴你什麼是計算機。

首先,我們可以把計算機分解成最原始的部件——晶體管。晶體管是一種半導體材料,其最重要的作用就是半導:可以通過電流的變化,實現電路的切換。比如計算機最基礎的與或非運算,都可以通過晶體管組成的電子元件實現。而通過晶體管的電位差不同,就可以體現"二進制數據",即0和1。再加上電容和電阻,就能把這種二進制數據臨時保存起來。

綜合這些特性,大牛們發現把晶體管用作精密的數學計算,可以極大的提高運算的效率。比如我有2個電容,分別是充滿電和沒有電,對他們同時釋放電信號,電容就會把其中的電子放出來,經過特定的邏輯電路,如與門,得到了0的結果。要計算1+1,實際上也是類似的原理。我先設計一個加法電路,把若干電容組合成的"數字"流過這個電路,把結果存入目標電容,就得到了結果。大規模的複雜運算以此類推。

最早期的計算機真的就是用許多結晶體管實現的複雜電路結構,通過控制輸入電流得到希望的輸出結果。後來人們發現,這種計算可以用某些形式抽象成多種指令,不用針對每次計算設計複雜的電路,只要調用指令就可以實現任何一種計算組合,於是誕生了cpu。只有cpu,每次都要自己配置輸入信號,實在太痛苦,就做了紙帶輸入給計算機。後來又發現紙帶還是很麻煩,於是發明了輸入終端和對應的存儲設備。後來又發現很多數據要臨時保存起來,供連續計算使用,於是發明了內存。再後來pc的發展經歷了無數次的變革,讓計算機一步步到了今天的地步,也就是你現在看到的這樣。

其中的歷程非常曲折,也許有機構能夠把他們全部組織成一本漫長的歷史,但個人肯定是無能爲力的。

操作系統

綜上所述,計算機發展到一定程度,什麼東西都靠人工也未免太累了。比如:

通過輸入設備組織指令給cpu去計算,你希望能夠找一個快速的輸入設備(比如鍵盤)
在能看到結果的地方輸入(比如屏幕)
然後再用很方便的方式提交給cpu(比如按鍵或者指令)
讓cpu去算好了,再把結果展示出來(比如屏幕)

理想很美好,但是這麼複雜的流程,人工管理起來不還是很麻煩嗎?除非我構造一個設備,把這些所有設備都管理起來,於是主板就誕生了。

現在主板解決了我們大量的問題,但是我發覺我的需求還遠遠不夠!

我希望我寫過的程序能在任何一臺機上運行。
我希望我能邊聽音樂邊幹活——即同一時間可以運行多個程序。
我希望別人寫的傻×東西不要影響到我的工作——即多任務控制。
我希望計算機裏面的各種資源都能得到良好的組織,更快的訪問。
我希望我的用戶界面更好看,使用更方便,功能更強大!我是個小白用戶,啥都不懂,別跟我扯這些有的沒的,我就像隨便操作兩下就能達到我想要的!

如果這些需求全部都做在主板bios裏面,那將是一場災難!除非bios經過極大的調整和改動,劃分出一大塊區域存放操作系統,並且完成複雜的體系結構改革。計算機發展到這種程度,早就已經有很多的機構和廠商介入其中,試圖從中漁利。他們當然不會求着計算機標準委員會和主板生產廠商去做所謂的主板改革,而是編寫自己的程序——操作系統,來解決這些所有的問題。

而操作系統問世之後,

  • 一方面接管了主板對於系統資源的管理,加入了自己的中間層——驅動程序
  • 另一方面又充分發揮了人機交互的接口——gui界面,成爲了計算機必不可少的組成部分

操作系統通過bios引導,即作爲應用程序開始運行。我們知道程序的本質上就是在cpu上運行種種指令,比如操作系統需要把硬盤上的模塊放入內存,實際上就是運行了一系列複雜的cpu指令

  1. cpu指令通過主板bus(實際上就是傳遞指令的電路)發送指令給硬盤(比如從哪個扇區偏移多少讀多少數據)
  2. 硬盤再通過芯片組轉動磁頭,把數據讀到緩存中,完成後給cpu發送一個信號(即中斷)
  3. cpu收到這個信號,就在寄存器中尋址該信號對應的地址(即我們說的中斷向量表),運行該地址中的指令
  4. 發現該指令是發送拷貝指令給主板芯片組,主板就會在cpu的指導下不斷的發送信號,告訴硬盤緩存放電,再把接收的電信號存到指定的內存位置去
  5. 如此反覆,直到完成cpu的一系列指令爲止。

操作系統說白了,就是這樣通過種種cpu指令,實現自身的所有功能。當然這些指令也不是一條條寫進去的,而是通過編程語言完成人類較容易識別的邏輯,然後再通過編譯器把這些邏輯翻譯成cpu指令,這就涉及編譯原理的東西了。

既然操作系統對硬件的訪問都是通過cpu指令來完成的,那爲什麼大家都感覺是操作掌管了硬件呢?這就涉及操作系統最本質的功能之一:對系統資源的管控了。

我們運行的所有程序,實際上都是操作系統幫我們運行的。操作系統背後進行了很多的工作,如

  • 虛擬地址空間的分配
  • cpu分時調度
  • 硬件中斷信號的響應等

這樣對於硬件資源的訪問,也是通過操作系統安排的。比如操作系統會通過把短時間內硬盤讀寫合併成順序的方式,以提高磁頭的利用率,降低磁頭轉向的時間。再比如對內存地址的訪問也是由操作系統管控的,某個程序中的內存地址具體落到內存條的哪個位置,還是硬盤中的虛擬內存,就看操作系統的心情了。

至此,操作系統和硬件的交互也介紹的差不多了,更詳細的東西建議參考操作系統相關的書籍吧,比如

  • 《深入理解計算機系統》
  • 《linux內核設計與實現》
  • 《unix環境高級編程》之類的

在這裏插入圖片描述

數據結構

數據結構的作用,就是爲了提高硬件利用率。比如操作系統需要查找用戶應用程序"office"在硬盤的哪個位置,盲目的搜索一遍硬盤肯定是低效的,這時候搞個b+樹作爲索引,搜索office這個單詞就很快,然後就能很快的定位office這個應用程序的文件信息,再找到文件信息中對應的磁盤位置了。

數據結構可以看看這些

  • 《算法導論》
  • 《數據結構與算法分析》之類的

計算機網絡

計算機網絡分爲3塊:

1. 硬件

網卡,網線,交換機這些,用來處理數據的。

2. 協議

數據在網絡中通信如何組織?如何識別?如何保證數據的正確性?這2塊我就不多說了。

3. 操作系統

這就是如何把計算機網絡和操作系統結合起來的問題了。

對於操作系統來說,網卡也是一種硬件資源。但是網絡不單只是一種硬件,而是一種媒體入口。比如操作系統管理硬盤,當然不是簡單的記一下硬盤有多大,然後一切操作都交給硬盤芯片去做,更多的需要組織硬盤的扇區,分區,記錄文件和扇區/偏移的關係等等。

操作系統對於網絡來說也是如此,要記錄自身在網絡的標識(ip),可被他人訪問的入口(port),以及對方的信息(remote ip/port)。連接,斷開,數據確認等操作也是由協議控制。

傳遞自身消息給對方,類似訪問硬盤一樣把內存中的數據傳遞給網卡緩存,再發消息給網卡讓網卡去傳數據,而是否發送成功這些保證不再由硬件中斷信號反饋,而是通過網絡協議完成。接收對方消息,也是接收到網卡中斷,再把數據從網卡緩存移動到內存中,再通過協議給予對方反饋。

簡單來說就是這樣,網絡方面的書籍就推薦:

  • 《tcp/ip詳解》
  • 《uinx網絡高級編程》

本文內容來自與知乎大牛問答:
作者:Raynor
鏈接:https://www.zhihu.com/question/22017267/answer/26468016

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章