目錄
一、操作系統
概念
設計操作系統的目的
定位
如何理解“管理”
系統調用和庫函數概念
二、進程
概念
描述進程—PCB(process control block)
查看進程
進程狀態
進程優先級
?三、其它的進程概念
一、操作系統
概念
任何計算機系統都包含一個基本的程序集合,稱為操作系統(OS)。簡單的理解,操作系統包括:
- 內核(進程管理、內存管理、文件管理、驅動管理)
- 其他程序(例如函數庫、shell程序等等)
設計操作系統的目的
- 與硬件交互,管理所有的軟硬件資源
- 為用戶程序(應用程序)提供一個良好的執行環境
定位
在整個計算機軟硬件架構中,操作系統的定位是:一款“搞管理”的軟件。
如何理解“管理”
答:先描述,再組織?
先描述:先用結構體確定其屬性
再組織:再用鏈表或者其它高效的數據結構將其關聯起來?
層狀結構圖?
系統調用和庫函數概念
- 在開發角度,操作系統對外會表現一個整體,但是會暴露自己的部分接口,供上層開發使用,這部分由操作系統提供的接口,叫做系統調用。
- 系統調用在使用上,功能比較基礎,對用戶的要求相對也比較高,所以,有心的開發者可以對部分系統調用進行適度,從而形成庫(c庫、c++庫等),有了庫,就方便上層用戶或者開發者進行二次開發。?
二、進程
在Windows中,我們啟動一個軟件,本質上是啟動了一個進程
而在Linux中,我們運行一條命令或者一個程序,其實就是在系統層面上創建了一個進程
概念
狹義的理解:進程是正在運行的程序的示例
廣義的理解:進程是一個具有一定獨立功能的程序關于某個數據集合的一次運行活動
內核的觀點:進程是擔當分配系統資源的實體
進程 = 對應的代碼和數據 + 進程對應的PCB結構體
描述進程—PCB(process control block)
PCB中存放著進程的信息,可以把PCB理解為是進程屬性的集合
不同的操作系統對PCB的命名可能不同,在Linux下,PCB是被命名為task_struct的結構體
task_struct是Linux中描述進程的結構體
task_struct是Linux內核的一種數據結構,它會被裝載到內存里并且包含著進程的信息
task_struct的內容劃分
- 標示符:描述本進程的唯一標示符,用來區分其它進程
- 狀態:任務狀態,退出碼,退出信號等
- 優先級:相對于其它進程的優先級
- 程序計數器:程序中即將被執行的下一條指令的地址
- 內存指針:包括程序代碼和進程相關數據的指針,還有和其它進程共享的內存塊的指針
- 上下文數據:進程執行時CPU寄存器中的數據
- I/O狀態信息:包括顯示的I/O請求,分配給進程的I/O設備和被進程使用的文件列表
- 記賬信息:可能包括處理器時間的總和,使用的時鐘數總和,時間限制,記賬號等
- 其它信息
查看進程
進程的信息可以通過/proc系統文件夾查看?
myproc.c?
#include <stdio.h> #include <unistd.h>int main() {while(1){printf("hello world\n");sleep(1);} return 0; }
通過系統調用來獲取進程標示符
- ?進程ID(PID)
- 父進程ID(PPID)
#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(){while(1){pid_t pid = getpid();//自己進程的pidpid_t ppid = getppid();//父進程 printf("hello world,pid: %d, ppid: %d\n", pid, ppid);sleep(1); } return 0; }
?其中的這個父進程就是bash
進程狀態
先來看看Linux內核中關于進程狀態的定義
/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
關于內核源碼可以自行去官網下載
- R運行狀態:并不意味這進程一定在運行中,它表明進程要么在運行中要么在運行隊列里
- S睡眠狀態:意味著進程在等待事件完成(這里的睡眠有時候也叫可中斷睡眠)
- D磁盤休眠狀態:有時候也叫不可中斷睡眠狀態,在這個狀態的進程通常會等待I/O結束
- T(t)停止狀態:可以通過發送SIGSTOP信號給進程來停止進程。這個被暫停的進程可以通過發送SIGCONT信號讓進程繼續運行。
- X死亡狀態(終止狀態):這個狀態只是一個返回狀態,是一瞬間的,你不會在任務列表里看到這個狀態
注:當你在查看你的進程狀態時后面可能會帶一個+號,表明這是一個前臺進程
如果要程序在后臺運行,可以在運行時加上&,如下
- ?Z僵尸狀態:僵尸狀態是一個比較特殊的狀態。一個子進程已經退出,但是父進程沒有讀取到子進程退出的返回代碼,此時子進程就會變成僵尸狀態,這個進程也稱為僵尸進程。僵尸進程會以終止狀態保持在進程表中,并且會一直等待父進程讀取退出狀態碼。
代碼演示僵尸狀態
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h>int main() {pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id == 0){while(1){printf("I am child, pid:%d, ppid:%d\n", getpid(), getppid());sleep(3);break;}exit(0);}else {while(1){printf("I am father, pid:%d, ppid:%d\n", getpid(), getppid());sleep(1);} }return 0; }
僵尸進程的危害
- 造成內存資源的浪費。因為進程退出了,但是還沒有被釋放,因此這個進程就還需要被維持下去,而維持這個狀態本身就是要用數據來維持,也屬于進程的基本信息,所以保存在PCB中,Z狀態一直不退出,PCB就要一直維護。
- 造成內存泄露。因為PCB是個結構體,而結構體是要在內存中開辟空間的。
孤兒進程
父進程先退出,子進程還沒退出,這時子進程就稱之為“孤兒進程”,孤兒進程會被1號init進程(系統本身)領養,當然也會被init進程回收。
代碼演示:
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h>int main() {pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id == 0){while(1){printf("I am child, pid:%d, ppid:%d\n", getpid(), getppid());sleep(1);}}else {while(1){printf("I am father, pid:%d, ppid:%d\n", getpid(), getppid());sleep(5);break;} exit(0);}return 0; }
進程優先級
?CPU資源分配的先后順序,就是指進程的優先級。優先級高的進程有優先執行的權利。
為什么要有優先級?
因為CPU是有限的,而進程太多,需要通過某種方式來競爭資源。
Linux中的優先級的做法是:
優先級 = 老的優先級 + nice值
ps -l:查看系統進程?
PRI就是進程的優先級,其值越小進程的優先級別越高
NI就是nice值,其表示進程可被執行的優先級的修正數值
加入nice值之后,此時PRI = PRI(老)+ nice
當nice值為負值時,該程序的優先級值將會變小,即其優先級會變高。因此調整進程優先級在linux下就是調整進程的nice值。
nice的取值范圍是-20至19,一共40個級別
更改進程的優先級
- ?在命令行輸入top
- 進入top后按“r”
- 輸入進程的PID
- 輸入nice值
設置有限的nice值而不直接改PRI的原因是:操作系統設置nice值的本質就是更好的平衡進程對系統資源的占用,如果直接改PRI可能產生一個進程長時間占用系統資源的現象。
三、其它的進程概念
獨立性:多進程運行,需要獨享各種資源,多進程運行期間互不干擾。
競爭性:系統進程數目眾多,而CPU資源有限,所以進程之間是具有競爭屬性的。
并行:多個進程在多個CPU下同時進行運行。
并發:多個進程在一個CPU下采用進程切換的方式,在一段時間內,讓多個進程都得以推進。
上下文數據:一個進程在被運行時,CPU里的寄存器保存的一定是這個進程的臨時數據,而這個臨時數據就叫做上下文。上下文是絕對不可以被丟去的。在進程時間片到了要被切換時,要連同上下文一起打包帶走。上下文可以有多份,分別對應不同的進程。
內容如有錯誤,還望批評指正。如果你覺得內容有用的話,就給博主一鍵三連吧,你的支持將會是我的動力。?