【Linux學習筆記】初識馮諾依曼體系和進程PCB
🔥個人主頁:大白的編程日記
🔥專欄:Linux學習筆記
文章目錄
- 【Linux學習筆記】初識馮諾依曼體系和進程PCB
- 前言
- 一. 馮諾依曼體系結構
- 1.1 關于馮諾依曼體系的要點:
- 二. 操作系統(Operating System)
- 2.1 概念
- 2.2 設計OS的目的
- 2.3 核心功能
- 2.4 如何理解“管理”
- 2.5 系統調用和庫函數概念
- 三. 進程
- 3.1 基本概念與基本操作
- 3.1.2 描述進程 - PCB
- 3.1.3 task_struct
- 3.1.5 查看進程
- 3.1.6 通過系統調用獲取進程標識符
- 3.1.7 通過系統調用創建進程 - `fork`初識
- 后言
前言
哈嘍,各位小伙伴大家好!上期我們講了gdb和cgdb 今天我們講的是初識馮諾依曼體系和進程PCB。話不多說,我們進入正題!向大廠沖鋒!
一. 馮諾依曼體系結構
我們常見的計算機,如筆記本,以及不常見的計算機,如服務器,大部分都遵守馮諾依曼體系。計算機由以下硬件組件組成:
- 輸入單元:包括鍵盤、鼠標、掃描儀、寫字板等
- 中央處理器(CPU):含有運算器和控制器等
- 輸出單元:顯示器、打印機等
1.1 關于馮諾依曼體系的要點:
- 存儲器指的是內存
- CPU只能對內存進行讀寫,不能直接訪問外設(輸入或輸出設備)
- 外設要輸入或輸出數據,只能通過內存進行交互
- 所有設備都只能直接和內存打交道
關于馮諾依曼,必須強調幾點:
- 這里的存儲器指的是內存
- 不考慮緩存情況,這里的CPU能且只能對內存進行讀寫,不能訪問外設(輸入或輸出設備)
- 外設(輸入或輸出設備)要輸入或者輸出數據,也只能寫入內存或者從內存中讀取。
- 一句話,所有設備都只能直接和內存打交道。
📌 注意:
對馮諾依曼的理解,不能停留在概念上,要深入到對軟件數據流理解上,請解釋,從你登錄上qq開始和某位朋友聊天開始,數據的流動過程。從你打開窗口,開始給他發消息,到他的消息之后的數據流動過程。如果是在qq上發送文件呢?
二. 操作系統(Operating System)
2.1 概念
操作系統(OS)是計算機系統中一個基本的程序集合,包括:
- 內核(進程管理、內存管理、文件管理、驅動管理)
- 其他程序(如函數庫、shell程序等)
2.2 設計OS的目的
- 對下:與硬件交互,管理所有軟硬件資源
- 對上:為用戶程序(應用程序)提供良好的執行環境
2.3 核心功能
操作系統在整個計算機軟硬件架構中的定位是:一款存正“搞管理”的軟件
。
2.4 如何理解“管理”
- 管理的例子:學生、輔導員、校長
- 描述被管理對象
- 組織被管理對象
總結
計算機管理硬件: - 1.描述起來,用struct結構體
- 2.組織起來,用鏈表或其他高效的數據結構
2.5 系統調用和庫函數概念
- 在開發角度,操作系統對外會表現為一個整體,但是會暴露自己的部分接口,供上層開發使用,這部分由操作系統提供的接口,叫做系統調用。
- 系統調用在使用上,功能比較基礎,對用戶的要求相對也比較高,所以,有心的開發者可以對部分系統調用進行適度封裝,從而形成庫,有了庫,就很有利于更上層用戶或者開發者進行二次開發。
承上啟下
那在還沒有學習進程之前,就問大家,操作系統是怎么管理進行進程管理的呢?很簡單,先把進程描述起來,再把進程組織起來!
三. 進程
3.1 基本概念與基本操作
- 課本概念:程序的一個執行實例,正在執行的程序等
- 內核觀點:擔當分配系統資源(CPU時間、內存)的實體
3.1.2 描述進程 - PCB
- 基本概念
- 進程信息被放在一個叫做進程控制塊(PCB)的數據結構中,是進程屬性的集合
- 課本上稱之為PCB(processcontrolblock),在Linux操作系統下的PCB是:task_struct。
- task_struct-PCB的一種
- 在Linux中描述進程的結構體叫做
task_struct
。 - task_struct是Linux內核的一種數據結構,它會被裝載到RAM(內存)里并且包含著進程的信息。
3.1.3 task_struct
- 內容分類:
- 標示符:描述本進程的唯一標示符,用來區別其他進程。
- 狀態:任務狀態,退出代碼,退出信號等。
- 優先級:相對于其他進程的優先級。
- 程序計數器:程序中即將被執行的下一條指令的地址。
- 內存指針:包括程序代碼和進程相關數據的指針,還有和其他進程共享的內存塊的指針
- 上下文數據:進程執行時處理器的寄存器中的數據[休學例子,要加圖CPU,寄存器]。
- I/0狀態信息:包括顯示的I/O請求,分配給進程的I/0設備和被進程使用的文件列表。
- 記賬信息:可能包括處理器時間總和,使用的時鐘數總和,時間限制,記賬號等。
- 其他信息
- 具體詳細信息后續會介紹
- 組織進程
所有運行在系統里的進程都以task_struct
鏈表的形式存在于內核中。
3.1.5 查看進程
- 進程信息可以通過
/proc
系統文件夾查看。例如,獲取PID為1的進程信息,查看/proc/1
文件夾。 - 大多數進程信息也可以通過
top
和ps
等用戶級工具獲取。
3.1.6 通過系統調用獲取進程標識符
- 進程id(PID)
- 父進程id(PPID)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{printf("pid: %d\n", getpid());printf("ppid: %d\n", getppid());return 0;
}
3.1.7 通過系統調用創建進程 - fork
初識
- 運行
man fork
認識fork fork
有兩個返回值:
- 父進程返回值為子進程的PID
- 子進程返回值為0
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{int ret = fork();printf("hello proc : %d!, ret: %d\n", getpid(), ret);sleep(1);return 0;
}
- fork之后通常使用if分流
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{int ret = fork();if(ret < 0){perror("fork");return 1;}else if(ret == 0){ // childprintf("I am child : %d!, ret: %d\n", getpid(), ret);}else{ // fatherprintf("I am father : %d!, ret: %d\n", getpid(), ret);}sleep(1);return 0;
}
后言
這就是初識馮諾依曼體系和進程PCB。大家自己好好消化!今天就分享到這! 感謝各位的耐心垂閱!咱們下期見!拜拜~