這里總結下Linux進程概念總結??
馮諾依曼:
- CPU???運算器與控制器
- RAM 內存(存儲器)
- Cache 緩存(一種技術)不屬于馮諾依曼體系結構。
- ROM 磁盤(輸入輸出設備)
- 磁盤?既可以從硬盤讀取數據也可以向硬盤寫入數據。
- 馮諾依曼體系結構中數據輸入設備的有鍵盤/磁盤。
- 馮諾依曼體系結構計算機的基本原理 存儲程序和程序控制。
操作系統:
計算機就是為了完成指定的數據處理,而通過指令按指定流程完成指定功能,指令的合集就是一段程序。說白了計算機就是按照指定的指令執行流程完成對指定數據的處理。
操作系統:操作系統的定位就是控制和管理計算機上軟硬件資源讓計算機更加好用
編譯器:對匯編語言,高級語言和甚高級語言程序進行翻譯,將高級語言解釋為機器指令能夠被機器識別執行。這不是操作系統的主要功能,而是一個外部應用的主要功能。
源程序以及數據庫文件都是存儲在磁盤上的,這是操作系統中文件系統管理部分的主要功能。
系統調用:
應用程序通過系統調用將自己需要完成的功能傳遞給內核,進行執行完成。
系統調用的運行過程是在內核態完成的,操作系統并不允許用戶直接訪問內核,也就是說用戶運行態并不滿足訪問內核的權限。(系統調用函數的執行過程應該是不在用戶態)
系統調用就是想上層提供用于完成特定內核服務或功能的。利用系統調用能夠得到操作系統提供的多種服務。
是操作系統提供給編程人員的接口。
系統調用給用戶屏蔽了設備訪問的細節,用戶只需要將自己的請求以及數據通過系統調用接口傳遞給內核,內核中完成對應的設備訪問過程,最終返回結果正確。
系統調用保護了一些只能在內核模式執行的操作指令,系統向上層提供系統調用接口用于訪問內核服務或功能的很大原因也是因為這樣可以最大限度的保護內核的穩定運行。
- 庫函數是用戶對系統調用接口的進一步封裝接口
- printf函數是glibc中封裝的用于實現格式化輸出的接口
- scanf函數是glibc中封裝的用于實現格式化輸入的接口
- fgetc函數是glibc中封裝的用于實現從輸入流中獲取字符的接口
- read是系統提供的用于從輸入設備獲取數據的接口
- print_s以及scan_s這兩個函數不存在,至少在C語言的常見典型的跨平臺移植代碼庫中不存在。
- fgetc是系統調用而不是庫函數
?Linux的進程:
- 僵尸進程指的是進程退出后不會完全釋放資源,會造成系統資源泄漏。
- 孤兒進程的父進程在它之前退出,會被 init 進程接管,不會造成資源浪費。
- 孤兒進程在父進程退出后,父進程成為init進程,進程退出,孤兒進程的資源將被init進程釋放。
- 操作系統通過pcb實現對程序運行調度控制。
- fork系統調用通過復制父進程創建一個子進程,父子進程數據獨有,代碼共享(在數據不發生改變的情況下父子進程資源指向同一塊物理內存空間(調研寫時拷貝技術))
- 子進程如果對資源只是進行讀操作,那么完全和父進程共享物理地址空間。
- 進程是資源管理的最小單位,而線程是程序執行的最小單位。Linux 下的線程本質上用進程實現。
在搶占式多任務處理中,進程被搶占時,哪些運行環境需要被保存下來?
- ?所有cpu寄存器的內容/全局變量/程序計數器
- 所有cpu寄存器的內容 cpu上正在處理的數據
- 全局變量??程序內的數據(并不一定正在被處理)
- 頁表指針 程序切換時會將頁表起始地址加載到寄存器中
- 程序計數器?下一步程序要執行的指令地址
- 一個程序可以同時運行多次,也就有了多個進程。?進程與程序是一一對應的。
- 因為一個作業任務的完成可由多個進程組成,且必須至少由一個進程組成。?進程與作業是一一對應的。
- 進程是靜態的。因為程序是靜態的,而進程是動態的。
- 進程是動態的過程。?
進程PCB
- 進程是操作系統對于程序運行過程的描述,而這個描述學名叫做進程控制塊-PCB,它是操作系統操作系統管理以及調度控制程序運行的唯一實體。
- 進程ID只是進程的標識符,是系統能夠找到特定進程的標識而已。
- 進程管理器只是對大量PCB進行管理的一個程序而已。
- 進程本質上來說沒有名字,它有所調度管理運行的程序的名稱,它的標識是進程ID,可以理解進程ID是它的名字。
- 在系統角度看來,進程就是對于程序運行的描述,就是PCB進程控制塊。
?考察fork創建子進程的過程, 同時理解fork函數的返回值
?要求: 通過父子進程的返回值, 區分父子進程執行的邏輯, 重點:理解子進程為什么從fork函數調用之后開始執行
?🙂感謝大家的閱讀,若有錯誤和不足,歡迎指正。