天天看點

【CSAPP】閱讀:第一章 計算機系統漫遊

【CSAPP】閱讀:第一章 計算機系統漫遊

    • 前言
    • 1.7 作業系統管理硬體
      • 1.7.1 程序
      • 1.7.2 線程
      • 1.7.3 虛拟記憶體
      • 1.7.4 檔案
    • 1.8 系統之間利用網絡通信
      • 1.9.2 并發和并行
        • 1.線程級并發
        • 2.指令級并行
        • 3.單指令,多資料并行
      • 1.9.3 計算機系統中抽象的重要性
    • 1.10 小結

前言

本系列分享了閱讀深入了解計算機系統閱讀中自認為重要的地方。通過語音識别到word文檔,然後分享在CSDN。

1.7 作業系統管理硬體

作業系統保持跟蹤程序運作所需的所有狀态資訊,這種狀态也就是上下文包括許多資訊,比如PC和寄存器檔案的目前值以及儲存的内容,在任何一個時刻,單處理器系統都隻能執行一個程序的代碼,當作業系統決定要把控制權從目前程序轉移到某個新程序時,就會進行上下文切換,即儲存目前程序的上下文,恢複新程序的上下文,然後将控制權傳遞到新程序,新程序就會從它上次停止的地方開始。

1.7.1 程序

從一個程序到另一個程序的轉換,是由作業系統核心管理的核心是作業系統代碼,常駐記憶體的部分,當應用程式需要作業系統的某些操作時,比如讀寫檔案,它就執行一條特殊的系統調用指令,将控制權傳遞給核心,然後核心執行被請求的操作并傳回給應用程式,注意核心不是一個獨立的程序,相反,它是系統管理全部程序所用代碼和資料結構的集合。

1.7.2 線程

現在系統中一個程序實際上可以由多個稱為線程的執行單元組成,每個線程都運作在程序的上下文中,并共享同樣的代碼和全局資料,由于網絡伺服器中對并行處理的要求,縣城成為越來越重要的程式設計模型,因為多線程之間比多程序之間更容易共享資料,也因為縣城一般來說都比程序更高校,當有多處理器可用的時候多線程也是一種可以使得程式可以運作得更快的方法。

1.7.3 虛拟記憶體

虛拟記憶體是一個抽象的概念,它為每個程序提供了一個假象,其每個程序都在獨占的使用主存,每個程序看到的記憶體都是一緻的,稱為虛拟位址空間。在Linux中位址空間最上面的區域是保留給作業系統的代碼和資料的,對所有程序來說都是一樣的位址,空間的底部區域存放使用者程序定義的代碼和資料請注意,圖中的位址是自下往上增大的。

每個程序看到的虛拟位址空間由大量準确定義的區構成,每個區都有專門的功能。我們從最低的位址開始,逐漸向上介紹。

  • 程式代碼和資料。對所有的程序來說,代碼是從同一固定位址開始,緊接着的是和C全局變量相對應的資料位置。代碼和資料區是直接按照可執行目标檔案的内容初始化的,在示例中就是可執行檔案,hello。
  • 堆。代碼和資料區後緊随着的是運作時堆。代碼和資料區在程序一開始運作時就被定置定了,大小與此不同,當調用像malloc和free這樣的C标準庫函數時,均可以在運作時動态的擴充和收縮。
  • 共享庫。大約在地質空間的中間部分是一塊,用來存放像C标準庫和數學庫,這樣的共享庫的代碼和資料的區域共享庫的概念,非常強大,也相當難懂。
  • 棧。位于使用者虛拟位址空間頂部的是使用者棧,編譯器用它來實作函數調用。和堆一樣,使用者棧在用執行程式期間可以動态的擴充和收縮。特别的每次我們調用一個函數時棧就會增長,從一個函數傳回時,棧就會收縮。
  • 核心虛拟記憶體。位址空間頂部的區域是為核心保留的,他不允許應用程式讀寫這個區域的内容或者直接調用核心代碼定義的函數,相反他們必須調用核心來執行這些操作。

    虛拟記憶體的運作需要硬體和作業系統軟體之間精密複雜的互動,包括對處理器生成的每個位址的硬體翻譯.基本思想是把一個程序虛拟記憶體的内容存儲在磁盤上,然後用記憶體作為磁盤的高速緩存。

1.7.4 檔案

檔案就是位元組序列,僅此而已,每個io裝置包括磁盤,鍵盤,顯示器,甚至網絡都可以看成是檔案系統中所有輸入輸出都是通過使用一小組成為Unix i/o的系統函數調用讀寫檔案來實作的。

1.8 系統之間利用網絡通信

從一個單獨的系統來看網絡可視為一個io裝置。由拓展槽接入網絡擴充卡接入到網絡。當系統從儲存複制一串位元組到網絡擴充卡時,資料流經過網絡到達另一台機器,而不是比如說到達本地磁盤驅動器。相似的系統可以讀取從其他機器發來的資料,并且把資料複制到自己的主存。

1.9.2 并發和并行

并發是一個通用的概念,指一個同時具有多個活動的系統,而并行指的是用并發來使一個系統運作的更快。

1.線程級并發

建構在程序這個抽象之上,我們能夠設計出同時有多個程式執行的系統,這就導緻了變化,使用線程,我們甚至能夠在一個程序中執行多個控制流。傳統意義上,這種并發執行隻是模拟出來的,是通過使一台電腦在它正在執行的程序間快速切換來實作的。這種并發形式允許多個使用者同時與系統互動,在以前,即使處理器必須在多個任務之間切換,大多數實際的計算也都是由一個處理器來完成的,這種配置稱為單處理器系統。

當建構一個由單作業系統核心控制的多處理器組成的系統時,我們就得到了一個多處理器系統,但是直到最近随着多核處理器和超線程的出現,這種系統才變得常見。

多核處理器是将多個CPU成為核內建到一個內建電路晶片上,如圖描述的是一個典型多核處理器的組織結構,其中微處理器晶片有4個CPU核。每個核都有自己的L1和L2高速緩存,其中的L1高速緩存分為兩個部分,一個儲存最近取到的指令,另一個存放資料,這些和共享更高層次的高速緩存,以及到主存的接口,工業界的專家預言他們能夠将幾十個最終會是上百個核做到一個晶片上。

超線程有時稱為同時多線程,是一項允許一個CPU執行,多個控制流的技術,它涉及CPU某些硬體有多個備份,比如程式計數器和寄存器檔案,而其他的硬體部分隻有一份,比如執行浮點運算的單元。

多處理器的使用可以從兩方面提高系統性能,首先它減少了在執行多任務時模拟并發的需要,正如前面提到的,即使是隻有一個使用者使用的個人計算機,也需要并發的執行多個活動,其次它可以使應用程式運作得更快,當然這必須要求程式是以多線程方式來書寫的,這些線程可以并行的高校執行。

2.指令級并行

在較低的抽象層次上,現在處理器可以同時執行,多條指令的屬性稱為指令級并行。早期處理器,如1978年的英特爾8086,需要多個通常是3~10個時鐘周期來執行一條指令最近的處理器,可以保持每個時鐘周期兩條4條指令的執行效率,其實每條指令從開始到結束需要長得多的時間,大約20個或者更多周期,但是處理器使用了非常多的聰明技巧來同時處理多達100條指令。在流水線中将執行的一條指令所需要的活動劃分成不同的步驟,将處理器的硬體組成一系列的階段,每個階段執行一個步驟,這些階段可以并行的操作用來處理不同指令的不同部分,我們會看到一個相當簡單的硬體設計,它能夠達到接近于一個時鐘周期,一條指令的執行速率。

如果處理器可以達到比一個周期一條指令更快的執行速率,就稱之為超标量處理器。

3.單指令,多資料并行

在最低層次上,許多信貸處理器擁有特殊的硬體允許,一條指令産生多個可以并行執行的操作,這種方式稱為單指令多資料。即si MD并行。

提供這些SIM的指令,都是為了提高處理影像聲音和視訊資料應用的執行速度,雖然有些編譯器試圖從C程式中自動抽取SIMD并行性,但是更好的方法是使用編譯器支援的特殊的相量資料類型來寫程式,比如gcc就支援相應資料類型。

1.9.3 計算機系統中抽象的重要性

抽象的使用是計算機科學中最為重要的概念之一。不同的程式設計語言提供不同形式和等級的抽象支援,例如Java類的聲明和C語言的函數原型。

在處理器裡指令集架構提供了對實際處理器硬體的抽象使用,這個抽象機器代碼程式表現的就好像運作在一個一次隻執行一條指令的處理器上。底層的硬體遠比抽象描述的要複雜精細,它并行的執行多條指令,但又總是與那個簡單有序的模型保持一緻,隻要執行模型一樣,不同的處理器實作也能執行同樣的機器代碼,而又提供不同的開銷和性能。

在學習作業系統時,我們介紹了三個抽象:檔案是對io裝置的抽象,虛拟記憶體是對程式存儲器( Io裝置和主存)的抽象,而程序是對一個正在運作的程式的抽象。我們再增加一個新的抽象虛拟機,它提供對整個計算機的抽象,包括作業系統,處理器和程式。

1.10 小結

計算機系統是由硬體和系統軟體組成的,他們共同寫作以運作應用程式計算機内部的資訊被表示為一組組的位,他們依據上下文有不同的解釋方式,程式被其他程式翻譯成不同的形式,開始時是ASCII文本,後來被編譯器和連結其翻譯成二進制可執行檔案。

處理器讀取并解釋存放在儲存裡的二進制指令,因為計算機花費了大量時間在主記憶體io裝置和CPU電腦之間複制資料,是以将系統的儲存設備劃分成層次結構,CPU寄存器在頂部,接着的是多層的硬體高速緩存存儲器,DRAM儲存和磁盤存儲器,在層次模型中位于更高層的儲存設備,比低層的儲存設備要更快,機關比特造價也更高,層次結構中,較高層次的儲存設備可以作為較低層次裝置的高速緩存,通過了解和運用這種緩存存儲層次結構的知識,程式員可以優化C語言程式的性能。

作業系統核心是應用程式和硬體之間的媒介,它提供三個基本的抽象:檔案是對io裝置的抽象,虛拟記憶體是對儲存和磁盤的抽象 程序是處理器,主存和io裝置的抽象。

最後網絡提供了計算機系統之間通信的手段,從特殊系統的角度來看,網絡就是一種io裝置。

繼續閱讀