CSAPP-C1:計算機系統漫遊 keynote

計算機系統漫遊

信息就是位+上下文

hello.c的表示方法說明了一個基本思想:系統中全部的信息-包括磁盤文件、內存中的程序、內存中存放的用戶數據以及網絡上傳送的數據,都是由比特流表示的。區分不一樣數據對象的惟一方法是咱們讀到這些數據的上下文。(由於不一樣的上下文中,一個通嚴格字節順序可能表示一個整數、浮點數、字符串或者機器指令)shell

被翻譯成不一樣格式的程序

GCC將hello.c翻譯成一個可執行文件hello。這個過程劃分爲4個階段:編程

  1. 預處理 -> hello.i 修改了的源程序緩存

  2. 編譯器 -> hello.s 彙編程序安全

  3. 彙編器 -> hello.o 可重定位目標程序網絡

  4. 連接器 -> hello 可執行文件數據結構

瞭解編譯器如何工做的裨益

  1. 優化程序性能; 2. 可以理解連接時出現的錯誤;3. 避免安全漏洞併發

處理器讀取並解釋儲存在內存中的指令

系統的硬件組成

總線

貫穿整個系統的十一組電子管道,稱做總線,它攜帶信息字節並負責在各個部件間傳遞。傳送定長的字節塊,也就是字(word)。32位4Bytes,64Bytes。函數

I/O設備

I/O設備是系統與外部世界的聯繫通道。性能

主存

主存是一個臨時的存儲設備,在處理器執行程序時候,用來存放程序和程序處理的數據。優化

處理器

CPU的操做有加載、存儲、操做、跳轉

運行hello程序

在執行./hello後,shell將全部的字符逐一①讀入寄存器,再把它②放到內存中。利用DMA技術可讓數據不經過CPU直接到達主存。
一旦目標文件的代碼和數據被加載到主存,CPU就開始執行hello程序中的main程序中的機器語言指令。這些指令①將「hello worldn」字符串從主存複製到寄存器文件,②再從寄存器文件複製到顯示設備,最終顯示在屏幕上。

高速緩存相當重要

速度量級比:寄存器:內存:磁盤 = 1:100:100000
由於CPU與主存處理速度差別,更小更快的存儲設備-->高速緩存存儲器cache memory應運而生,主要用來存放CPU近期可能用到的數據
通常CPU芯片上的L1高速緩存`容量能夠達到數萬字節。
容量爲數十萬到數百萬字節的L2高速緩存經過一條特殊的總線鏈接到CPU。
速度比上L2高速緩存是L1高速緩存的5倍。
實現L1/L2高速緩存的技術叫作靜態隨機訪問存儲器SRAM硬件技術實現的。

存儲設備造成層次結構

圖片描述

操做系統管理硬件

操做系統兩個基本功能:

  1. 放置硬件被失控的應用程序濫用;

  2. 嚮應用程序提供簡單一致的機制來控制複雜而又一般大不相同的低級硬件設備。

爲了保障上面兩個功能實現,操做系統提供了幾個基本的抽象概念:

  1. 文件是對I/O設備的抽象表示

  2. 虛擬內存是對主存和磁盤I/O設備的抽象表示

  3. 進程是對處理器、主存和I/O設備的抽象表示

進程

操做系統提供一種假象:系統上有這個程序在運行。程序上看上去是獨立的使用CPU、主存和I/O設備。CPU看上去好像在不間斷執行程序中的指令,就好像程序的代碼和數據是系統內存中惟一的對象。固然這些假象只是系統經過進程的概念來進行封裝。進程是計算機科學中嘴成功的概念之一。

一個CPU併發執行多個程序是經過CPU進程間切換技術實現的,這種切換叫作上下文切換
上下文的定義:操做系統保持跟蹤進程運行所需的全部狀態信息
進程之間的切換的指揮官是系統內核kernel。內核的本質是操做系統代碼常駐主存的部分。當應用程序須要操做系統的某些操做時候,好比讀寫文件,這時候須要執行系統調用system call來將控制權丟給內核。內核執行相關請求後並返回結果給應用程序。
內核不是一個進程而是管理全部進程所用代碼和數據結構的集合

線程

一個進程實際上能夠由多個稱爲線程的執行單元組成,每一個線程都運行在進程的上下文中,以共享的形式持有這代碼和全局數據。
線程對比進程的優點在於:線程間共享數據效率遠高於進程間

虛擬內存

定義:虛擬內存是一個抽象概念,它爲每個進程提供一個假象,即每個進程都在獨佔地使用主存。每一個進程看到的內存都是一致的,成爲虛擬地址空間

地址空間組成:

  • 最上面的區域是留給操做系統的代碼和數據,對任何進程來講是一致的,用戶(APP層開發者)不可見。

  • 地址空間底部區域存放用戶進程定義的代碼和數據。

虛擬地址空間每一個區的做用
程序代碼和數據

對全部的進程來講,代碼是從同一個固定的地址開始,緊接着是和C全局變量對應的數據位置。代碼和數據區是直接按照可執行目標文件的內容初始化的,舉個栗子如上面提到的hello

代碼和數據區緊接着是運行時候的堆。代碼和數據區在進程一開始運行時候就被指定了大小,可是調用malloc或者free類的API的時候能夠在代碼運行時進行動態的擴展或者收縮內存。

共享庫

大約在地址空間中間部分是一塊存放C標準庫和數學庫這樣的共享庫的代碼和數據區域。

位於用戶虛擬地址空間頂部的是用戶棧,編譯器用它來實現函數調用(函數棧)。和堆同樣,用戶站在程序執行期間能夠動態的擴展和收縮。

內核虛擬內存

不容許讀寫或直接調用

總結:虛擬內存的運做需喲啊硬件和操做系統之間精密複雜的交互,包括對處理器生成的每一個地址的硬件翻譯。基本思想是把一個進程虛擬內存的內容存儲在磁盤上,而後用主存做爲硬盤的高速緩存。

圖片描述

文件

定義:文件就是字節序列

系統之間的網絡通訊

網絡簡單能夠當作機器間的數據拷貝...
圖片描述

相關文章
相關標籤/搜索