源程式是由值0和1組成的位(位元)序列。
8個位是乙個位元組。
每個位元組表示程式中的文字字元。(ascii)
ascii碼用唯一的單位元組大小的整數值賴表示每個字元。2^8=256個字元。
基本思想:系統種的所有資訊,包括磁碟檔案、記憶體中的程式、記憶體中存放的使用者資料以及網路上傳送的資料,都是由一串位元表示的。
區分不同資料物件的唯一方法就是讀取這些資料物件時的上下文。在不同的上下文中,同樣的位元組序列可能表示乙個整數、浮點數、字串或者機器指令。
1969-1973:c語言-貝爾實驗室
iso定義了c語言和函式庫的標準,即c標準庫。
c語言成功的原因:
1.c與unix作業系統關係密切。
2.c語言小而簡單。
3.c語言是為實踐目的設計的。c語言是設計用來實現unix作業系統的。
c語言是系統級語言的首選。
linux> gcc -o hello hello.c
gcc編譯器驅動程式讀取hello.c,翻譯成乙個可執行目標檔案hello。
源程式---修改後的源程式--匯程式設計序--可重定位目標程式--可執行程式
hello.c---hello.i ------------hello.s-------hello.o---------------hello
預處理階段:cpp將include命令引入的標頭檔案內容插入程式文字中。
編譯階段:ccl將c**翻譯成彙編**。
彙編階段:as將彙編**翻譯成機器語言指令,並打包成可重定位目標程式,儲存在hello.o檔案中。
可執行檔案:可被載入到記憶體中,由系統執行。
gnu專案:有大量的工具。
程式設計師為什麼要知道編譯系統工作原理?
1.優化程式效能。
2.理解鏈結時出現的錯誤。
3.避免安全漏洞。
shell是乙個命令列直譯器,它輸出乙個提示符,等待輸入的命令列,然後執行這個命令。
如果命令列第乙個單詞不是內建的shell命令,那麼shell就會假設是乙個可執行檔案的名字,將載入並執行這個檔案。
載入和執行的過程是怎麼實現的?
系統的硬體組成:
1.匯流排:貫穿整個系統的一組電子管道,稱為匯流排。它攜帶資訊位元組,並負責在各個部件間傳遞。
通常匯流排被設計成傳送定長的位元組塊(字:word)。
word中的位元組數叫字長,不同系統中代表的機器字長不同,可能是4位元組32位,也可能是8位元組64位
2.i/o裝置:使用者輸入裝置(滑鼠和鍵盤),輸出裝置(顯示器,印表機),儲存裝置(磁碟)。每個i/o裝置都通過控制器或者介面卡與i/o匯流排相連。
控制器和介面卡區別在於封裝方式。控制器是封裝在裝置本身或者系統主機板上的晶元組,而介面卡是插在主機板插槽上的外接卡。功能都是在i/o匯流排和i/o裝置之間傳遞資訊。
4處理器:cpu,是解釋或執行儲存在主存中指令的引擎。處理器的核心是乙個大小為乙個字的暫存器,稱為程式計數器(pc)。pc在任何時刻都指向主存中的某條機器語言指令,即pc中存的是記憶體位址。
指令集架構---處理器的微體系結構
指令集架構:描述每條機器**指令的效果。
微體系結構:描述的是處理器實際上是如何實現的。
cpu指令的簡單操作:
載入:從主存複製乙個位元組或者字到暫存器,以覆蓋暫存器原來的內容。
儲存:從暫存器複製乙個位元組或乙個字到主存的某個位置,覆蓋位置上原來內容。
操作:把兩個暫存器的內容複製到alu,alu對這兩個字做算術運算,並將結果存放到乙個暫存器中。覆蓋原來的內容。
直接儲存器訪問技術(dma):資料可以不通過處理器直接從磁碟到主存。
shell指令執行hello程式的過程:
hello可執行檔案從磁碟到記憶體,helloword字串的位元組從記憶體到暫存器,又從暫存器到顯示器,顯示器的gpu將位元組資訊翻譯成字元顯示到螢幕上。
快取記憶體:
hello執行過程的示例展現了乙個重要問題,即系統花費了大量的時間把資訊從乙個地方挪到另乙個地方。hello程式的機器指令最初是存放在磁碟上,當程式載入時,複製到主存;處理器執行時,從主存複製到處理器;最終將要展示的內容從主存上覆制到暫存器,又從暫存器複製到顯示器。
快取記憶體儲存器(cache memory):簡稱為cache或快取記憶體,作為暫時的集結區域。存放處理器近期可能會需要的資訊。
l1快取記憶體 --數萬位元組
l2快取記憶體--數百萬位元組
l1,l2快取記憶體是用靜態隨機訪問儲存器(sram)的硬體技術實現的。
系統可以利用快取記憶體的區域性性原理,即程式具有訪問區域性區域裡的資料和**的趨勢。通過讓快取記憶體裡存放可能經常訪問的資料,大部分記憶體操作都能在快速的快取記憶體中完成。
儲存裝置形成層次結構:
結構中:裝置訪問速度越來越慢,容量越來越大,造價越來越便宜。
儲存器層次結構的主要思想是上一層儲存器作為低一層儲存器的快取記憶體
暫存器l1快取記憶體
l2快取記憶體
l3快取記憶體
主存本地二級儲存
遠端二級儲存
作業系統管理硬體:
作業系統是應用程式和硬體之間插入的一層軟體。所有應用程式對硬體的操作嘗試都必須通過作業系統。
作業系統又兩個基本功能:
1.防止硬體被失控的應用程式濫用。
2.向應用程式提供簡單一致的機制來控制複雜而又通常大不相同的低階硬體裝置。
作業系統通過幾個基本的抽象概念:程序、虛擬記憶體和檔案。
檔案是對i/o裝置的抽象表示。
虛擬記憶體是對主存和磁碟i/o裝置的抽象表示。
程序則是對處理器、主存、i/o裝置的抽象表示。
程序是對作業系統執行程式的一種抽象。乙個系統上同時可執行多個程式,每個程式都像獨佔計算機資源,稱為併發執行。實際上多個程序的指令是交錯執行的,這種交錯執行的機制叫做上下文切換。
執行緒:乙個程序中有多個執行緒執行在它的上下文中。共享同樣的**和資料。
1.程式**和資料。對所有程序來說,**都是從同一固定位址開始。接著是和c全域性變數相對應的資料位置。程式一開始執行就指定了大小。
2.堆:**和資料區後緊隨著的是執行時堆。執行時動態擴充套件和收縮。
5.核心虛擬記憶體:位址空間頂部區域是核心保留區。不允許應用程式讀寫核心內容或直接呼叫核心**定義的函式。
檔案:檔案就是位元組序列。每個i/o裝置都可以看成檔案。
系統之間的網路通訊:
將網路看做乙個i/o裝置。系統可以從主存複製一串位元組到網路介面卡,資料流通過網路到達另一台機器。
小結:系統不僅僅是硬體,而是硬體和系統軟體互相交織的集合體。它們需要協同操作以達到執行應用程式的最終目的。
1.amdahl定律:我們對系統的某個部分優化時,其對系統整體效能的影響取決於該部分的重要性和優化程度。想要明顯加速整個系統,必須提公升全系統中大部分的速度。
併發:同時具有多個活動的系統。
並行:指用併發來使乙個系統執行的更快。
1.執行緒級併發。多核和超執行緒。超執行緒是核心中有pc和暫存器備份。
2.指令級並行。指令流水線。如果處理器可以達到乙個週期一條指令更快的執行速率,就稱之為超標量處理器。
計算機世界中抽象的重要性:
檔案是對i/o裝置的抽象。
虛擬記憶體是對程式儲存器的抽象。
程序是對乙個正在執行的程式的抽象。
虛擬機器是對整個計算機的抽象,包括作業系統、處理器、程式。
計算機系統讀書筆記三
程式的機器級表示 計算機執行機器 用位元組序列編碼低階的操作,包括處理資料 管理記憶體 讀寫儲存裝置上的資料 利用網路通訊。編譯器將源 轉譯成機器 需要基於 程式語言的規則 目標機器的指令集 作業系統遵循的慣例。彙編 是機器 的文字表示。逆向工程 通過研究系統和逆向工作,來試圖了解系統的建立過程。c...
讀書筆記 深入計算機系統
第一章 1.典型系統的硬體組成結構 2.計算機儲存器層次模型 3.程序虛擬位址空間模型 4.作業系統的倆個功能 防止硬體被失控的程序濫用 提供廣泛的不同的低階硬體的統一訪問入口。5.檔案就是位元組序列,每個io裝置 包括磁碟 鍵盤 顯示器 甚至是網路都可以被看成檔案。處理磁碟檔案內容的程式設計師不需...
讀書筆記之計算機系統 6
文 件 管 理 1.對於通常的unix 檔案目錄,其每個目錄項中含有乙個ascii 碼的檔名和乙個索引結點號,後者指向乙個索引結點。當有重複檔案時,乙個目錄項可由乙個檔名和若干個索引結點號組成,每個索引結點號都是指向各自的索引結。2.共享鎖與互斥鎖的區別在於 互斥鎖僅允許乙個事務對相應物件執行讀或寫...