Linux中虛擬地址空間、pcb、文件描述符、C庫函數工作流程、標準庫和系統庫函數區別



簡 述: 對於 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 學習,附學習由淺入深的目錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章