深入理解计算机操作系统(一)
目錄
1.1 信息就是位加上下文
1.2 程序被其他程序翻譯成不同的格式
1.3 了解編譯系統如何工作是大有益處的
1.4 處理器讀并解釋儲存在內存中的指令
1.4.1系統的硬件組成
1.4.2 運行hello程序
1.5 高速緩存至關重要?
1.6 存儲設備形成層次結構
1.7 操作系統管理硬件
1.7.1 進程
1.7.2 線程
1.7.3 虛擬內存
1.7.4 文件
1.8 系統之間利用網絡通信
1.9 重要主題
1.1 信息就是位加上下文
計算機系統是由硬件和軟件組成的,它們共同工作來運行應用程序
源程序實際上就是一個由0和1組成的位(又稱為比特),8個位被組織成一組,稱為字節.每個字節表示程序中的某些文本字符.
大部分的現代計算機系統都使用ASCLL標準來表示文本字符
hello.c是以字節序列的方式存儲在文件中,每個字節都有一個整數值,對應于某些字符.
系統中所有的信息包括磁盤文件,內存中的程序,內存中存放的用戶數據以及網絡上傳送的數據,都是由一串比特表示的.
區分不同數據對象的唯一方法是我們讀到這些數據對象時的上下文.比如,在不同的上下文中,一個同樣的字節序列可能表示一個整數,浮點數,字符串或者機器指令.
C標準庫就是ISO定義C語言和一系列函數庫
1.2 程序被其他程序翻譯成不同的格式
這些指令按照一種稱為可執行目標程序的格式打好包,并以二進制磁盤文件的形式存放起來.
目標程序也稱為可執行目標文件
在Unix系統上,從源文件到目標文件的轉化是由編譯器驅動程序完成的
linux>gcc -o hello hello.c在這里,gcc編譯器驅動程序讀取源程序文件hello.c分為以下4個階段
?預處理階段 ?預處理器(cpp)根據以字符#開頭的命令,修改原始的C程序。
比如hello.c中第一行#include <stdio.h>命令告訴預處理器讀取系統頭文件stdio.h的內容,并把它直接插入到程序文本中。結果就得到另一個C程序,通常以.i作為文件擴展名。
?編譯階段 ?編譯器(ccl)將文本文件hello.i翻譯成文本文件hello.s,它包含一個匯編語言程序。匯編語言程序中的每條語句都以標準的文本格式確切地描述了一條低級機器語言指令。匯編語言為不同高級語言的不同編譯器提供了通用的輸出語言。
?匯編階段 ?接下來,匯編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成一種可重定位目標程序(relocatable object program)的格式,并將結果保存在目標文件hello.o中。
hello.o是一個二進制文件,它的字節編碼是機器語言指令而不是字符。如果我們在文本編輯器中打開hello.o文件,看到的是亂碼。
?鏈接階段 ?hello程序在這里調用了printf函數,這是每個C編譯器都會提供的標準C庫中的一個函數。printf函數存在于一個名為printf.o的單獨的預編譯好了的目標文件中,而這個文件必須以某種方式合并到我們的hello.o程序中。鏈接器(ld)就負責處理這種合并。結果就得到hello文件,它是一個可執行目標文件,可以被加載到內存中,由系統執行。
1.3 了解編譯系統如何工作是大有益處的
- 優化程序性能
- 理解鏈接時出現的錯誤
- 避免安全漏洞(緩沖溢出錯誤)
1.4 處理器讀并解釋儲存在內存中的指令
linux>./hellohello,worldlinux>shell是一個命令行解釋器(也是應用程序)
如果該命令行的第一個單詞不是一個內置的shell命令,那么shell就會假設這是有一個可執行文件的命令
1.4.1系統的硬件組成
1.總線
總線就是貫穿整個系統的一組電子管道,她攜帶信息字節并負責在各個部件間傳遞
字就是定長的字節塊? ? ? 通??偩€被設計成傳送定長的字節塊
字長就是自重的字節數
2.I/O設備
I/O設備是系統與外部世界的聯系通道.例如鍵盤鼠標顯示器和磁盤驅動器(磁盤)
每個I/O設備都通過一個控制器或者適配器與I/O總線相連
控制器和適配器之間的區別主要在于他們的封裝方式
控制器是I/O設備本身或者系統的主印制電路板(通常稱作主板)上的芯片組
適配器則是一塊插在主板插槽上的卡?
無論如何,它們的功能都是在I/O總線和I/O設備之間傳遞信息
3.主存
主存就是用來存放程序和程序處理數據
從物理上說,主存是由一組動態隨機存取存儲器(DRAM)芯片組成
從邏輯上說,存儲器是一個線性的字節數組,每個字都有其唯一的地址(數組索引),這些地址是從零開始的
4.處理器
中央處理單元(CPU)簡稱處理器,是解釋(或者執行)存儲在主存中指令的引擎,
處理器的核心是一個大小為一個字的存儲設備(或寄存器),稱為程序計數器(PC)
在任何時刻,PC都指向主存中的某條機器語言指令(既含有該條指令的地址)
從系統通電開始,直到系統斷電,處理器一直在不斷的執行程序計數器指向的指令,再更新程序計數器,使其執行下一條指令
處理器是按照一個指令執行模型來操作的,這個模型是由指令集架構決定的
處理器從程序計數器指向的內存處讀取指令,解釋指令中的位,執行該指令指示的簡單操作,然后更新PC,使其指向下一條指令,而這條指令并不一定和內存中剛剛執行的指令相鄰
寄存器文件是一個小的存儲設備,由一些單個字長的寄存器組成,每個寄存器都有唯一的名字
指令集架構是每條機器代碼指令的效果
微體系接收是處理器世紀上是如何實現的
寄存器是中央處理器內的組成部分。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數據和地址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計數器(PC)
1.4.2 運行hello程序
?
當我們在鍵盤上輸入字符串“./hello"后,shell程序將字符逐一讀入寄存器,再把它存放到存儲器中。
當我們在鍵盤上敲回車時,shell程序就知道我們結束了命令的輸入。然后shell執行一系列指令來加載可執行的hello文件,將hello目標文件中的代碼和數據從磁盤復制到主存。數據包括最終會被輸出的字符串”hello world\n"。
?
一旦目標文件hello中的代碼和數據被加載到主存,處理器就開始執行hello程序的main程序中的機器語言指令。這些指令將“hello,world\n"字符串中的字節從主存復制到寄存器文件,再從寄存器文件中復制到顯示設備,最終顯示在屏幕上。
1.5 高速緩存至關重要?
處理器從寄存器文件讀取數據比從主存中讀取的開銷快100倍,針對這種處理器和主存之間的差異,系統設計者采用了更小更快的存儲設備,稱為高速緩存存儲器(cache memory 簡稱cache或高速緩存),作為展示的集結區域,存放處理器近期可能需要的信息
1.6 存儲設備形成層次結構
1.7 操作系統管理硬件
操作系統可以看成是應用程序和硬件之間插入的一層軟件
操作系統有兩個基本功能
?
文件是對I/O設備的抽象表示;虛擬內存是對主存和磁盤I/O設備的抽象表示;進程則是對處理器,主存和I/O設備的抽象表示
1.7.1 進程
進程是操作系統對一個正在運行的程序的一種抽象.
無論實在單核還是多核系統中,一個CPU看上去都像是在并發的執行多個進程,這是通過處理器在進程間切換來實現的,操作系統實現這種交錯執行的機制稱為上下文切換
操作系統保持跟蹤進程運行所需的所有狀態信息.這種狀態,也就是上下文,包括許多信息,比如PC和寄存器文件的當前值,以及主存的內容
在任何時刻,單處理器系統都只能執行一個進程的代碼
從一個進程到另一個進程的轉換是由操作系統內核管理的,內核是操作系統代碼常駐主存的部分
注意,內核不是一個獨立的進程.相反,他是系統管理全部進程所用代碼和數據結構的集合
1.7.2 線程
在現代系統中,一個進程實際上可以由多個稱為線程的執行單元組成,每個線程都運行在進程的上下文中,并享有同樣的代碼和全局數據.
多線程比多進程更容易共享數據
1.7.3 虛擬內存
虛擬內存是一個抽象的概念,它為每個進程提供了一個假象,即每個進程都在獨占的使用主存
每個進程看到的內存都是一致的,稱為虛擬地址空間
?
在Linux中,地址空間最上面的區域是為操作系統中的代碼和數據保留的,對于所有進程來說都一樣。地址空間的底部區域存放用戶進程定義的代碼和數據。圖中的地址是從下往上增大的。
每個進程看到的虛擬地址空間由大量準確定義的區構成,每個區都有專門的功能。
1.程序代碼和數據
?對于所有進程來說,代碼是從同一固定地址開始,緊接著的是C全局變量相對應的數據位置。代碼和數據區是直接按照可執行目標文件的內容初始化的,在示例中就是可執行文件hello。
2.堆
代碼和數據區后緊隨著的是運行時堆。代碼和數據區是在進程一開始運行時就被規定了大小,與此不同,當調用如malloc和free這樣的C標準庫函數時,堆可以在運行時動態地擴張和收縮。
3.共享庫
大約在地址空間的中間部分是一塊用來存放像C標準庫和數學庫這樣共享庫的代碼和數據的區域。
4.棧
位于用戶虛擬地址空間頂部的是用戶棧,編譯器用它來實現函數調用。和堆一樣,用戶棧在程序執行期間可以動態地擴展和收縮。特別是每次我們調用一個函數時,棧就會增長;從一個函數返回時,棧就會收縮。
5.內核虛擬存儲器
內核總是駐留在內存中,是操作系統的一部分。地址空間頂部的區域是為內核保留的,不允許應用程序讀寫這個區域的內容或者直接調用內核代碼定義的函數。
1.7.4 文件
文件就是字節序列,僅此而已.每個I/O設備,包括磁盤,鍵盤,顯示器,甚至網絡都可以看成是文件
1.8 系統之間利用網絡通信
當系統從主存復制一串字節到網絡適配器是,數據流經過網絡到達另一臺機器,而不是比如說到達本地磁盤驅動器
當我們在tenlnet客戶端鍵入"hello"字符串并敲下回車鍵后,客戶端軟件就會將這個字符串發送到telnet的服務器.
tenlent服務器從網絡上接收到這個字符串后,會把他傳遞給遠程shell程序
遠程shell運行hello程序,并將輸出行返回給telnet服務器
最后,telnet服務器通過網絡把輸出串轉發給telnet客戶端,客戶端就將輸出串輸出到我們的本地終端上
1.9 重要主題
系統是硬件和系統軟件相互交織的集合體,它們必須共同協作以達到運行應用程序的最終目的
1.9.1 Amdahl定律
Amdahl定律的主要思想是當我們對系統的某個部分加速時,其對系統整體性能的影響取決于該部分的重要性和加速程度
若系統執行某應用程序需要的時間為Told.假設系統某部分所需執行的時間與該時間的比例為a,,而該部分性能提升比例為k
加速比S = Told/Tnew
? ? ? ? ? ? ? ? S = 1/( (1-a) + (a/k))
用后綴"X"表示比例,因此"2.2X讀作"2.2倍"
1.9.2 并發和并行
并發是指一個同時具有多個活動的系統
并行是指用并發來使一個系統運行的更快
超線程,有時稱為同時多線程,是一項允許一個CPU執行多個控制流的技術
1.9.3 計算機系統中抽象的重要性
程序員無需了解它內部的工作便可以使用這些代碼
機器代碼程序表現的就好像運行在一個一次只執行一條指令的處理器上
虛擬機,它提供對整個計算機的抽象
1.10 小結
計算機系統是由硬件和系統軟件組成的,它們共同協作以運行應用程序。
計算機內部的信息被表示為一組組的位,它們依據上下文有不同的解釋方式。
程序被其他程序翻譯成不同的形式,開始時是ASCII文本,然后被編譯器和鏈接器翻譯成二進制可執行文件。 處理器讀取并解釋存在主存里的二進制指令。
?
因為計算機花費了大量的時間在內存、I/O設備和CPU寄存器之間復制數據,所以將系統中的存儲設備劃分層次結構——CPU寄存器在頂部,接著是多層硬件的告訴緩存存儲器,DRAM主存和磁盤存儲器。
在層次模型中,位于更高層的存儲設備比低層的存儲設備要更快,單位比特造價也更高。層次結構中較高層次的存儲設備可以作為較低層次設備的告訴緩存。通過理解和運用這種存儲層次結構的知識,程序員可以優化C程序性能。
操作系統內核是應用程序和硬件之間的媒介,他提供三個基本的抽象:1)文件是對I/O設備的抽象;2)虛擬內存是對主存和磁盤的抽象;3)進程是處理器、主存和I/O設備的抽象。
?
最后,網絡提供了計算機系統之間通信的手段,從特殊系統的角度來看,網絡就是一種I/O設備。 -
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的深入理解计算机操作系统(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信第三方登录
- 下一篇: ThinkPHP调用连连支付