1. 硬件
①馮諾依曼體系
我們常見的計算機,如筆記本。我們不常見的計算機,如服務器,大部分都遵守馮諾依曼體系。其詳細結構如下圖所示
在這里有幾點要說明
1. 這里的儲存器實際上指的是內存
2. 輸入設備與輸出設備都屬于外設
常見的輸入設備如:鼠標,鍵盤,攝像頭,話筒,磁盤,網卡等
常見的輸出設備如:顯示器,播放器硬件,磁盤,網卡
3. 運算器與控制器都屬于中央控制器(即CPU)
運算器的功能是對我們的數據進行計算任務(算數運算,邏輯運算)
控制器的功能是對我們的計算硬件流程進行一定的控制
值得注意的是
1. 在不考慮緩存情況時,這里的CPU能且只能對內存進行讀寫,不能訪問外設(輸入或輸出設備)
2. 在馮諾依曼體系中每一個部件都是一個獨立個體
3.?外設(輸入或輸出設備)要輸入或者輸出數據,也只能寫入內存或者從內存中讀取
根據上面的情況,我們可以總結出一個結論:所有設備都只能直接和內存打交道?
在了解了馮諾依曼體系后,我們也可以解釋一些之前無法解釋的問題,如:
為什么一個程序要運行,必須要先加載到內存中?
答:因為馮諾依曼體系結構規定了必須這樣做。
在實現進度條小程序時,我們知道默認緩存的數據被儲存了起來,那么這些數據存儲在哪?
答:儲存器中。
②實際舉例
在這里我們舉一個實際例子
我們在使用QQ向朋友發送消息時,數據是如何流動的?
如果發送的是文件時,那么自己的輸入設備和朋友的輸出設備都應該是磁盤,朋友在收到文件后,采取的措施是將文件保存到本地磁盤中。?
2. 軟件
①什么是操作系統
任何計算機系統都包含一個基本的程序集合,稱為操作系統(OS)(operating?system)
內核(進程管理,內存管理,文件管理,驅動管理)
其他程序(例如函數庫,shell程序等等)
簡單來說,操作系統是一個對軟硬件資源進行管理的軟件。
計算機中有如上圖所示的層狀結構,在其中我們可以看到操作系統通過直接管理驅動程序來實現間接管理底層的硬件,在管理好軟硬件資源之后,操作系統為了保證自己數據安全,也為了保證給用戶能夠提供服務,操作系統以接口的方式給用戶提供調用的入口來獲取操作系統內部的數據,這就是系統調用,它是操作系統提供的用C語言實現的,自己內部的函數調用。所有訪問操作系統的行為,都只能通過系統調用來完成。那么操作系統存在的意義是什么呢?為什么我們需要操作系統呢?根據上面對層狀結構的解釋,我們可以有以下理解
1.操作系統幫助用戶,管理好下面的軟硬件資源
2.為了給用戶提供一個良好(穩定,高效,安全)的運行環境
即:操作系統通過管理好底層的軟硬件資源(手段),為用戶提供一個良好的執行環境(目的)?
在C語言中我們經常會調用系統庫,那么這個系統庫與系統調用又有何關系和
②操作系統如何進行管理
那么在知道了操作系統是什么之后,它是如何對軟硬件進行管理的呢?
首先我們要知道一般管理資源都分為決策者,執行者與被管理者,舉幾個例子,在大學中,校長就相當于決策者,輔導員是執行者,各個學生就是被管理者,在公司中,老板就相當于決策者,小組長是執行者,員工就是被管理者。在這些例子中,我們可以發現,管理者和被管理者是不需要見面的,既然如此,那么管理者在不見被管理者的情況下,如何做好的管理呢?——其實,只要能夠得到管理信息,就可以進行管理決策,由此我們也可以看到管理的本質——通過對數據的管理,達到對人的管理。既然管理者和被管理者面都不見,那怎么拿到對應的數據呢?——通過執行者。
管理者在決定好要收集到被管理者的什么數據之后,如:校長需要收集到學生的學院、專業、班級、學號、姓名、性別、身高、體重、籍貫、電話等數據,通知輔導員收集數據之后,再將其反饋到校長處,校長為了能夠更好的管理數據決定描述每一個學生的具體情況,將每個學生視作一個結構體的具體對象,對學生的描述可以如下圖所示
在描述好之后,為了將它們互相聯系起來,可以向Student結構體中添加struct Student* next來銜接下一個學生,這之后每有一個學生便實例化一個對象,并使它們鏈接起來,這樣就將對學生數據的管理轉換成了對鏈表的管理,這種方式就是操作系統管理資源的方式,即:在操作系統中,管理任何對象,最終都可以轉化成為對某種數據結構的增刪查改,這種管理資源的方式我們將其稱為“先描述,后組織”,即對于任何一個要管理的資源,都要先對其進行描寫(有什么屬性),這之后再使用一種數據結構來管理它們
3. 進程
①什么是進程
對于一個已經加載到內存中的程序,叫做進程,通俗一點來說,正在進行的程序,我們將其稱之為進程。
②進程的理解
因為操作系統是需要同時運行多個進程的,那么操作系統要如何管理進程呢?這在之前我們就提到過——先描述,后組織。對于任意一個進程,在磁盤將其加載到內存時,都是加載的代碼與數據進去,而操作系統想要管理它,就要先對一個進程作出相應的描述,為了描述這樣一個進程,操作系統有自己的描述進程的結構體對象,即——PCB(process control block),它是一個進程屬性的集合體,在這個結構體中包含了許多的進程屬性,然后操作系統會根據自己的PCB類型,為傳輸進來的代碼和數據創建相應的PCB對象。
操作系統為了管理這些進程,會將它們轉換為單鏈表方便管理。那么,我們就可以認為進程=操作系統對應的PCB+相應的代碼與數據。
③Linux中的進程
在了解了PCB后,Linux中的進程又是什么樣的呢?在LInux中,操作系統所使用的PCB為task_struct,其包含進程的所有屬性,且LInux是使用雙鏈表的形式來管理進程的。下面就讓我們來創建一個進程,其代碼如下
int main()
{while (1){printf("這是一個進程\n");sleep(1);}return 0;
}
然后我們可以使用
ps ajx | grep code1
來查看我們想要查看的進程屬性,運行有
在這里我們能夠看到除了我們想看到的自己的進程外還有一個auto code1進程,我們要想只顯示自己的進程可以添加一個過濾命令,即
ps ajx | grep code1 | grep -v grep
即
此外為了方便我們更好的了解進程屬性可以打印一個表頭出來,即
ps ajx | head -1 && ps ajx | grep code1 | grep -v grep
運行效果如下