一、硬件支持系統 ,系統管理硬件
- 操作系統核心功能可以分為:
- 守護者:對硬件和軟件資源的管理
- 協調者:通過機制,將各種各樣的硬件資源適配給軟件使用。
- 所以為了更好的管理硬件,操作系統引進了軟件。其中3大核心部分是:
- 文件【我們需要知道怎么用文件來訪問磁盤和I/O設備】
- 虛擬內存【虛擬內存是虛擬的,為應用程序提供遠大于物理內存限制的虛擬地址空間。】
- 進程【真正用來訪問資源的部分】
二、進程(process)
1、理解
進程就是一個正在執行的程序實例。
進程的結構
- 每個進程里都有一個
獨立的地址空間
。
- 這個空間一開始是0 ,不斷的運行,就成了連續的存儲空間。在這個空間,不僅程序能運行起來,還能調用各種數據,等等。
- 每個進程都有相關的
資源
- 這些資源有PS , PC寄存器等等。
簡而言之:進程就是一個被封裝的容器,它有運行資源的一切信息。
-
如果 我開了QQ,又開了微信。那我的進程就有2個,它要如何合理地獲得CPU資源?
- 操作系統通過時間片輪轉等調度策略,周期性地掛起一個進程并啟動另一個,確保所有進程都能公平地獲得CPU資源。
- 當進程被暫時掛起,就必須保存狀態了。以便未來某個時候可以繼續使用。狀態下的信息【比如寄存器,地址空間,上下文等等】都會被存儲在
進程表
中。進程表
用于跟蹤系統中所有進程的狀態信息。
-
shell和進程
- 用戶可以使用shell來控制進程。讓一個進程產生更多進程(這些由進程產生的進程就是
子進程
)【可能有些抽象,可以這樣理解,如下:】。- 我在shell使用
ls
命令,這個命令展現了當前路徑有的文件件。我本來是在運行shell的linux環境虛擬機【當前一個主進程】,我想看文件夾,我為了看文件夾,使用了ls命令,在執行這個ls命令的過程就是子進程
。
- 所以進程就有樹的樣子了-----
進程樹
。
- 用戶可以使用shell來控制進程。讓一個進程產生更多進程(這些由進程產生的進程就是
-
進程該如何通信?
- 當進程間協同工作完后,使用機制來交換信息,也就是
進程間通信(IPC)
機制。 - 除了
進程間通信(IPC)
外,操作系統還使用一系列的系統調用
來管理進程資源。
- 當進程間協同工作完后,使用機制來交換信息,也就是
-
進程接收信息,如果信息經常不能準時到達?
- 為了確保可靠傳輸,進程會采用
定時器
。【這種行為也就是異步】- 比如:進程在外部信息發送出去的第4秒還沒有接收到。就發一個通知提醒,就可能重新發送了。
- 為了確保可靠傳輸,進程會采用
異步行為【分為軟件異步、硬件異步】:
異步行為是指任務可以并發執行,不需要等待前一個任務完成。異步操作不會阻塞當前線程,任務完成后通過回調、Promise 或事件通知。
- 那么事件1發生什么事情?
- 事件1作用:保護現場。
- 保護的內容有
- PC值----由CPU保護
- PSW寄存器—操作系統軟件保護
- 基礎寄存器—操作系統軟件保護
- 不過在現代有可以都用CPU保護的了。CortexM芯片等等。
- 事件2發生什么事情?
- 事件2作用:確定中斷入口在哪里
- 硬件CPU來準備—操作系統OS和CPU都能來提供
中斷向量表【中斷處理函數的數組空間】
。
- 事件3發生什么事情?
- 事件3作用:中斷處理函數
- 操作系統來準備。
- 事件4發生什么事情?
- 事件4作用:中斷返回【普通函數返回】
- 軟件實現,編譯器來實現。
- 特定的匯編寫,不能c語言。
- 普通函數
- PC值—>硬件保護
- PSW寄存器—>不需要保護。
- 基礎寄存器—>編譯器保護
- 普通函數
同步行為
同步行為是指任務按順序執行,前一個任務完成后,才能開始下一個任務。同步操作會阻塞當前線程,直到任務完成。
三、虛擬內存
從下往上看,分為進程代碼和數據區、堆數據區、共享庫區、堆棧區、內核內存區。
這部分的基礎先了解這個圖片就行了。
常駐內存是指一直都在,不能刪掉。
四、并發和并行
- 并發是指多個任務在同一時間段內交替執行,但在任意時刻可能只有一個任務在運行。并發通過任務切換(上下文切換)實現,給人一種多個任務同時運行的錯覺。
- 如圖:同一時間段內
時間軸: |----任務A----|----任務B----|----任務A----|----任務B----|
- 并行是指多個任務在同一時刻同時執行。并行需要多核 CPU 或多個處理器,每個任務運行在不同的核心上。
- 如圖:同一時刻內
時間軸: |----任務A----||----任務B----||----任務C----|
五、系統調用【超重點】
通過上圖能明白,硬件不能直接讓用戶使用它。
所以提出了系統調用
。
-
系統調用
- 定義:系統調用是操作系統內核(Kernel)為應用程序提供的一組接口,允許用戶程序(運行在用戶態)請求內核(運行在內核態)代為執行特權操作(如文件讀寫、進程創建等)。
- 系統調用依賴硬件和OS(操作系統)。
-
系統調用的工作原理
-
(1) 調用流程
- 用戶程序觸發調用
- 通過特定函數(如C標準庫中的 printf() → 底層調用 write())或直接代碼觸發。
- 用戶態 → 內核態切換
- 通過軟中斷(如 int 0x80)或專用指令(如 syscall)進入內核態。
- 執行內核服務
- 內核根據系統調用號(如 Linux 的 read 對應 0 號)調用對應的內核函數。
- 返回結果
- 內核將結果傳遞給用戶程序,回到用戶態繼續執行。
- 用戶程序觸發調用
-
(2) 系統調用號(syscall number)
- 每個系統調用對應唯一編號,通過寄存器傳遞(如 x86-64 Linux 中,rax 存放系統調用號)。
- 示例:Linux 的 sys_write 在 x86-64 中的調用號是 1,可通過命令 grep __NR_write /usr/include/asm/unistd_64.h 查看。
-
(3) 參數傳遞
- 寄存器傳遞參數:參數按順序放入 rdi, rsi, rdx, r10, r8, r9(x86-64 架構)。
- 寄存器傳遞參數:參數按順序放入 rdi, rsi, rdx, r10, r8, r9(x86-64 架構)。