進程
進程概念
爲了使程序併發的執行,並且對併發執行的程序加以描述和控制,人們引入了進程的概念,進而提高了硬件設備的利用率與系統的吞吐量。
進程:是指在系統中作爲系統資源分配的基本單位,由機器指令、數據和堆棧組成,是一個獨立運行的活動實體。
操作系統用於描述和管理進程的一個數據結構,稱爲進程控制塊(Process Control Block, PCB);
進程實例:由程序段, 相關的數據段, 和PCB;
創建進程:實際上是創建相應的PCB, 操作系統分配相配套的資源;
銷燬進程:實際上就是釋放進程佔有的資源,回收PCB;
Linux下:
PCB是task_struct結構體;
在本人linux系統下task_struct定義在
/usr/src/kernels/2.6.32-431.el6.i686/include/linux路徑下的sched.h文件
task_struct 描述信息分類:
- 標示符 : 描述本進程的唯一標識符,用來區別其他進程。
- 狀態 :任務狀態,退出代碼,退出信號等。
- 優先級 :相對於其他進程的優先級。
- 程序計數器:程序中即將被執行的下一條指令的地址。
- 內存指針:包括程序代碼和進程相關數據的指針,還有和其他進程共享的內存塊的指針。
- 上下文數據:進程執行時處理器的寄存器中的數據。
- I/O狀態信息:包括顯示的I/O請求,分配給進程的I/O設備和被進程使用的文件列表。
- 記賬信息:可能包括處理器時間總和,使用的時鐘數總和,時間限制,記賬號等。
- 其它信息;
通過系統調用獲取進程ID
- PID :進程ID
- PPID:父進程ID
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
printf("pid :%d\n", getpid);
printf("ppid :%d\n", getppid);
return 0;
}
通過系統調用創建進程
函數調用成功 父進程返回子進程ID, 子進程返回0
失敗返回-1
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t id = fork();
if(id < 0)
{
perror("fork");
return 1;
}
else if(id == 0) //child
{
while(1)
{
sleep(1);
printf("I am child ID : %d, father ID : %d\n", getpid(), getppid() );
}
}
else //father
{
while(1)
{
sleep(1);
printf("I am father ID : %d, father ID : %d\n", getpid(), getppid());
}
}
return 0;
}
可以看到兩個進程間是交替運行的。
fork() 創建出來的進程,父子進程代碼共享,數據各自開闢空間, 各有一份(寫實拷貝)。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
int data = 10;
pid_t pid;
if((pid = fork()) < 0)
{
perror("fork");
return 1;
}
else if(pid == 0)
{
//child
while(1)
{
sleep(1);
printf("child data : %d, pid = %d, ppid = %d\n",\
data, getpid(), getppid());
}
}
else
{
//father
while(1)
{
sleep(1);
printf("father data: %d, pid = %d, ppid = %d\n", data,\
getpid(), getppid());
}
}
return 0;
}
進程狀態
linux下進程狀態
- R運行狀態(running):並不意味進程一定在運行中,它表明進程要麼是在運行中要麼在運行隊列中。
- S睡眠狀態(sleeping):意味進程在等待某件事情的完成(有時也叫可中斷睡眠(interruptible sleep))。
- D磁盤休眠狀態(Disk sleep)有時叫作不可中斷睡眠狀態(uninterruptible sleep), 通常這個狀態的進程會等待IO的結束。
- T停止狀態(stopped) : 可以通過發送SIGSTOP信號給進程停止(T)進程,可以通過發送SIGCONT信號讓進程繼續運行。
- X死亡狀態(dead): 這個狀態只是一個返回狀態,你不會在任務列表裏看到這個狀態。
進程優先級
CPU分配資源的先後順序 ,就是指進程的優先級(priority)
ps -l 命令
PRI:表示進程優先級
NI:代表進程nice值
PRI值越小,表示權限越高。
PRI與NI關係:
PRI(new) = PRI(old) + nice
- nice 取值範圍-19~20, 一共40個級別。
修改進程優先級命令:
nice/renice/top
nice: 啓動進程前設定進程nice值
nice -n -3 ./a.out
設置進程nice爲-3
renice: 進程已存在時設定進程nice值
renice -3 -p 2455
設置進程pid爲2455的nice值爲-3
top: 進程已存在時設定進程nice值
top
進入top後輸入 r ——> 輸入進程pid -->輸入 nice 值
歡迎各位,批評指正。