簡 述: 對於 Linux
學習過程中,有一些基本的知識點、關於系統,以下均是以 32 位系統上的爲例的知識點:
-
虛擬地址空間
-
pcb 和文件描述符 表
-
C 庫 I/O 函數工作流程
-
標準 c 庫函數和 linux 系統函數的區別
編程環境:
💻: uos20
📎 gcc/g++ 8.3
📎 gdb8.0
虛擬地址空間:
Linux 每一個運行的程序(進程)操作系統都會爲其分配一個 0~4G 的地址空間(虛擬地址空間)。
進程:正在運行的程序。
Linux 程序運行理解圖:
- env 查看系統的環境變量
- static int a = 0; 變量 a 仍然是放在 .bss 區域(其值爲0)
- 棧(局域變量): 從高位 到 低位 生長
- 堆(new ): 從低位 到 高位 生長
- MMU(內存管理單元):將 虛擬地址空間(硬盤)的地址, 映射 到 物理內存 裏面進行管理和操作。
- 沒有必要研究,大致知道其原理即可。
pcb 和文件描述符表:
-
進程控制塊(PCB): 進程在操作系統中都有一個戶口,用於表示這個進程。這個戶口操作系統被稱爲PCB(進程控制塊),在 linux 中具體實現是 task_struct 數據結構。
-
進程就是一個運行當中的程序。 我們在編輯器或 IDE 上寫了十幾個的.cpp 文本文件,它們組合起來就是一個工程。程序本來是存儲在磁盤的,當我們需要執行它的時候,先把他讀取到內存當中,再然後放入到寄存器中,最後讓cpu執行程序,這個時候程序就變成了一個進程。
-
每個進程運行的時候都會拿到最多 4G 的虛擬內存。其中 3G 是交給用戶的,然後剩下的 1G 內存存儲內核的東西了。
-
文件描述符 表,系統最多可以打開 1024 個文件,其中 0、1、2 依次被 stdin、stdout、stderr 這個給使用了;且這個三個文件描述符所指向的對象都是當前終端,當前終端也可以被看爲一個文件
/dev/tty
(Linux 下一切皆文件); 其餘每打開一個文件,就會申請一個空的、最小的 文件描述符。其就是一個 int 型的數值。eg:此時使用系統 open() 函數打開一個 .txt 文件,printf() 打印其的返回值,會顯示是 4。
C 庫 I/O 函數工作流程:
-
由這個圖可以思考一個問題🤔?那麼是不是使用系統的讀寫函數,一定比使用 c 庫的函數的效率一定高呢❓❓❓
當然不是;這個的看實際情況的。使用系統的讀寫函數,就是直接和硬件,直接在磁盤上面讀寫操作,速度肯定比直接在內存上面讀寫要慢的多。所以就引發內存塊上有緩衝區的機制,內存上面寫入多次之後,緩衝區滿了後,再一次都寫入到磁盤上面的文件。
C 庫函數與系統函數的關係:
- 當調用標準的 C 庫函數時候(
# include <stdio.h>
)的printf()
時候,它會在裏面調用應用層的weite()
函數,然後應用層實際又是調用 系統的sys_write()
,其系統層實際又是調用驅動層的寫函數,而驅動層的函數當然是可以直接操作硬件的(比如顯示器🖥)。最後就終端裏面看到了一句輸出語句函數。
下載地址:
https://github.com/xmuli/linuxExample
歡迎 star 和 fork 這個系列的 linux 學習,附學習由淺入深的目錄。