計算機系統漫遊
計算機脫胎於圖靈機的構想,簡單來說,就是能夠執行有限邏輯數學過程的計算模型。
圖靈機中最重要的兩個『物理』硬件是紙帶和讀寫頭(這裏的『物理』指的是相對於圖靈機其他部分而言)。這種抽象非常簡單明了,但是很容易給人一種錯誤印象,即由圖靈機發展而來的現代計算機,就是執行程序的機器而已。
計算機學科的發展,與其說是眾人拾柴火焰高,不如說是天才引導的歷程。真正奠定現代計算機基礎的則是馮諾依曼,1945 年發表的 101 頁報告,不但提出了二進制的構想,更將計算機分成五大組件(存儲器、控制器、運算器、輸入、輸出),我們現在使用的大部分計算機都符合馮諾依曼架構,『計算機之父』之名絕不為過。和圖靈機相比,這種架構最重要的突破就是增加的存儲器,這使得程序和數據的存儲成為可能,也因此衍生出來了數據傳輸(即 IO)的概念,再加上六十年代末出現的計算機網絡,計算機要完成的工作,遠不止執行程序這麽簡單。
1.1系統的硬件組成
總線:貫穿整個系統的一組電子管道,攜帶信息字節負責在各個部件之間傳遞。總線被設計為傳送定長的字節塊(字word),字中的字節數是一個基本的系統參數,現在的大多數機器字長要麽是4個字節(32位),要麽是8個字長(64位)。
IO設備(輸入/輸出):系統與外接設備聯系的通道。用戶輸入的鼠標和鍵盤、顯示屏、保存數據的磁盤、其他網絡類設備。
主存:一個臨時存儲設備,在處理器執行程序是用來存放程序和程序處理的數據。從物理上講主存一組動態隨機存儲存儲器(DRAM)芯片組成,從邏輯上講是一個線性的字節數組,每個字節都有唯一的地址(數組索引)。
處理器:包括運算器和控制器,解釋執行保存在主存中指令的引擎。
CPU在指令的下可能會執行的操作
- 加載:從主存復制到寄存器
- 存儲:從寄存器復制到主存的某個位置,更新原來的內容。
- 操作:把寄存器的內容復制到ALU(算數邏輯單元)進行算數運算。
- 跳轉:執行指令更新指令寄存器的內容。
1.1.1運行hello.c程序
我最近在學習Linux因為進度有點慢所以看看計算機基礎在轉戰Linux,我的操作系統是ubuntu16.04LTS。
shell是一個命令行解釋器,它等待你的輸入,如果輸入的第一個單詞不是內置shell命令,shell會認為它是一個可執行文件。
當我們敲回車時,shell執行一系列命令加載可執行程序hello,把代碼和數據從磁盤復制到主存。
執行hello程序的main函數裏面的機器語言指令,把“hello world”從主存復制到寄存器,從寄存器復制到顯示設備。
這個示例揭示了一個重要的問題,系統花費了大量的時間進行了信息的傳遞。
hello程序最初在磁盤上,當程序加載時復制到主存,程序執行時指令要復制到處理器。相似的字符串“hello world”開始在磁盤,然後被復制到主存,最後從主存復制到顯示設備。從程序員的角度看,這些復制就是開銷,系統設計這的主要目的就是使這些復制盡可能快的完成。針對這種差異,系統設計者采用了更小更快的存儲設備,稱為高速緩存存儲器(簡稱為cache或者高速緩存)。
1.2操作系統
操作系統看成是應用程序與硬件之間插入的一層軟件。
兩大基本功能:
- 防止硬件被失控的應用程序濫用。
- 向應用程序提供簡單一致的機制來控制復雜的低級硬件設備。
操作系統通過幾個基本的抽象(進程、虛擬內存、文件)來完成實現這兩個功能。
進程:對處理器、主存和IO設備的抽象表示。
虛擬內存:對主存和磁盤和IO設備的抽象。
文件:對IO設備的抽象表示。
1.2.1進程
進程是操作系統對一個正在運行的程序的一種抽象。
並發執行:一個進程的指令和另一個進程的指令交替執行。
一個CPU並發的地執行多個進程,這是通過處理器在進程間切換實現的。操作系統這種交錯執行的機制稱謂“上下文切換”。
進程運行的所有狀態信息稱為“上下文”,單處理器只能處理一個進程,當操作系統進行進程轉換時,它會保存當前進程的上下文,並恢復新進程的上下文,然後將控制權交給新進程。
hello程序執行時的上下文切換
最開始shell程序在執行,等待命令行輸入。 shell通過一個系統調用執行我們的請求,系統調用將控制權傳遞給操作系統。操作系統保存shell的上下文,創建一個新的hello進程及其上下文,將控制權傳給hello進程,hello進程結束後,操作系統恢復shell進程的上下文,並將控制權傳遞給它。
進程之間的上下文切換是由操作系統的內核管理的,內核是常住內存的操作系統代碼部分。當應用程序需要操作系統的某些操作時,比如讀寫文件,他會執行特殊的系統調用命令,將控制權傳遞給內核,然後內核執行請求的操作並返回應用程序。內核不是一個獨立的進程。它是系統管理全部進程所用代碼和數據結構的集合。
1.2.1.1線程
線程:是操作系統能夠進行運算調度的最小單位。是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。同一進程中的多條線程將共享該進程中的全部系統資源,如虛擬地址空間等等。但同一進程中的多個線程有各自的調用棧,自己的寄存器環境,自己的線程本地存儲。多線程之間較多進程之間更容易共享數據。
1.2.1.2並發與並行
如果某個系統支持兩個或者多個動作(Action)同時存在,那麽這個系統就是一個並發系統。如果某個系統支持兩個或者多個動作同時執行,那麽這個系統就是一個並行系統。並發系統與並行系統這兩個定義之間的關鍵差異在於“存在”這個詞。
在並發程序中可以同時擁有兩個或者多個線程。這意味著,如果程序在單核處理器上運行,那麽這兩個線程將交替地換入或者換出內存。這些線程是同時“存在”的——每個線程都處於執行過程中的某個狀態。如果程序能夠並行執行,那麽就一定是運行在多核處理器上。此時,程序中的每個線程都將分配到一個獨立的處理器核上,因此可以同時運行。
我相信你已經能夠得出結論——“並行”概念是“並發”概念的一個子集。也就是說,你可以編寫一個擁有多個線程或者進程的並發程序,但如果沒有多核處理器來執行這個程序,那麽就不能以並行方式來運行代碼。因此,凡是在求解單個問題時涉及多個執行流程的編程模式或者執行行為,都屬於並發編程的範疇。
摘自:《並發的藝術》 — 〔美〕布雷謝斯1.2.2虛擬內存
虛擬內存是計算機系統內存管理的一種技術,它為每個進程提供了一個假象,即每個進程都是獨立的使用內存,將內存視為一個非常大的字節數組。
其實每個進程看到的主存都是一樣的,並且被分隔成多個物理內存碎片。虛擬內存技術是經過特殊的處理將內存(DRAM)、閃存、磁盤存儲器、特殊硬件、操作系統軟件結合起來,為程序提供一個看上去統一的字節數組。
1.2.3文件
文件就是字節序列的容器,僅此而已。每一個IO設備,包括磁盤、鍵盤、顯示器、甚至是網絡,都可以看成是文件。系統中的所有輸入輸出都是通過使用一小組稱為Unix I/O的系統函數調用讀寫文件來實現的。
計算機系統漫遊