1. 程式人生 > >2017/05/08學習筆記

2017/05/08學習筆記

信號量 存儲器 運行時 程序代碼 數據位 內容 提高 加載 數據區

我們將處理器的指令集架構和處理器的微體系結構區分開來:指令集架構描述的是每條機器代碼效果,而微體系結構描述的是處理器實際上是如何實現的。

運行程序

當我們在鍵盤上輸入字符串./hello後,shell程序將字符逐一讀入寄存器,再把它放到內存中。
利用直接存儲器存取技術,數據可以不通過處理器而直接從磁盤到達內存。

一旦目標文件hello中的代碼和數據被加載到主存,處理器就開始執行hello程序的main程序中的機器語言指令。這些指令將"hello,world\n"字符串中的字節從主存復制到寄存器文件,再從寄存器文件中復制到顯示設備適配器,最終顯示在屏幕上.

根據機械原理,較大的存儲設備要比較小的存儲設備運行的慢,而快速設備的造價遠高於同類的低速設備。比如說,一個典型系統上磁盤可能要比內存大1000倍,但是對處理器而言,從磁盤上取一個字的時間開銷要比從內存中讀取的開銷大1000萬倍。
類似的,一個典型的寄存器文件只存儲幾百字節的信息,而主存可存放幾十億的字節,然而,處理器從寄存器中讀數據比內存中幾乎要快100倍。
存儲器層次結構的思想是上一層的存儲器作為低一層存儲器的高速緩存。因此寄存器是一級緩存的高速緩存,一級緩存是二級緩存的高速緩存,二級緩存是三級緩存的高速緩存,三級緩存是內存的高速緩存,而內存又是磁盤的高速緩存。

所有應用程序對硬件的操作嘗試都必須通過操作系統。

操作系統有兩個基本的功能

1.防止硬件被失控的程序濫用
2.向應用程序提供簡單一致的機制來控制復雜而又通常大不相同的低級硬件設備。
操作系統通過幾個基本的抽象來實現這兩個功能
文件是對IO設備的抽象,虛擬內存是對主存和IO設備的抽象,進程剛是對處理器 主存和IO設備的抽象。
像hello這樣的程序在現代系統上運行時,操作系統會提供一種抽象,就好像系統上只有這個程序在運行。程序看上去是獨立的使用處理器主存和IO設備。
處理器看上去就像在不間斷地一條接一條的執行程序的指令,即該程序的代碼和數據是系統內存中唯一的對象。這些假象是通過進行的概念來實現的,進程是計算機科學中最重要和最成功的概念之一。
進行是操作系統對一個正在運行程序的一種抽象。在一個系統上可以同時運行多個進程,而每個進程都好像獨占使用硬件。
無論是單核還是多核,一個CPU看上去都像是在並發的執行多個程序,這個通過處理器在進程間切換來實現的。操作系統實現這種交錯的機制稱為上下文切換。

虛擬內存

虛擬內存是一個抽象概念,它為每個進程提供了一個假象,即每個進程都在獨占的使用主存。每個程序看到的內存都是一致的,稱為虛擬地址空間。
在Linux中,地址空間最上面的區域是保留給操作系統中的代碼和數據的,這對所有進程來說都是一樣的。地址空間的底部區域存放用戶進程中定義的代碼和數據。請註意地址是從下往上增長的。
程序代碼和數據 :對所有的進程來說,代碼是從同一固定地址開始,緊接著的是和Car全局變量對應的數據位置。代碼區和數據區是直接按照可執行目標文件的內容初始化的。
代碼和數據區後緊接著的是運行時堆。代碼和數據區在進程一開始運行時就被指定了大小,與此不同,當調用malloc和free這樣的C標準庫函數時,可以在運行時動態的擴展和收縮。
共享庫

大約在地址空間中間部分是一塊用來存放像C標準庫和數學庫這樣的共享庫的代碼和數據的區域。共享庫的概念非常強大,也相當難懂。
位於用戶虛擬地址空間頂部的是用戶棧,編譯器用它來實現函數的調用。和堆一樣,用戶棧在程序執行期間可以動態地擴展和收縮。特別地

信號量

進化版的互斥鎖
由於互斥鎖的粒度比較大,如果我們希望在多個線程間對某一對象的部分數據進行共享,
使用互斥鎖是沒有辦法實現的,只能將整個數據對象鎖住。這樣雖然達到了多線程操作共享數據時保證數據準確性的目的,卻無形中導致線程的並發性下降。線程從並行處理變成了串行處理。與直接使用單進程無異。
信號量是相對折中的一種處理方式,既能保證同步,數據不混亂,有可以提高線程並發.

信號和信號量完全沒關系

2017/05/08學習筆記