一進程控制原理
1
進程是一個具有一定獨立功能的程序的一次運行活動。
進程是運行着的程序。
2
特點
動態性,併發性,獨立性,異步性
3
狀態
就緒態,執行態,阻塞態
4
進程ID-PID
父進程ID-PPID
啓動進程的用戶-UID
5
進程互斥
當硬件或軟件資源不允許多個進程共同使用時就會產生互斥
6
臨界資源
臨界區:
7
進程同步:一組併發進程按《固定的順序》執行的過程稱爲進程間的同步。
8
進程調度:從一組進程中選一個來佔有CPU
調度方式:搶佔式和非搶佔式
9
調度算法:
先來先服務;短進程優先調度;高優先級優先調度;時間片輪轉法
時間片輪轉法:每個進程在時間片,進行輪轉執行。
10
死鎖:多個進程因競爭資源而形成的僵局。
實例:getpid.c、fork1.c、
fork_count
#include<unistd.h>
#include<stdio.h>
int main(void)
{
pid_t pid;
int count =0;
pid=fork();
count++;
printf("count=%d\n",count);
return 0;
}
上面,fork()後面的會被執行兩次,父進程和子進程各執行一次,但彼此數據獨立,so兩次count值相等。
結果是count=1
count=1
vfork創建的父進程與子進程共用數據段
fork創建的父進程與子進程獨立,不共用數據段
#include<unistd.h>
#include<stdio.h>
int main(void)
{
pid_t pid;
int count =0;
pid=vfork();
count++;
printf("count=%d\n",count);
return 0;
}
count=1
count=2
問題:我的count=1
count=13623285而且還循環不停顯示
二進程控制程序設計1
獲取ID
2
父進程:說到父進程,要提到子進程,當進程創建進程時,創建的進程爲子進程,原來的進程爲父進程。
pid_t getpid(void)
pid_t getppid(void)
3
進程傳進
#include<unistd.h>
pid_t fork(void)
功能:創建子進程
代碼段是共享的,子進程會將其拷貝過來,故:下面的程序,父進程執行一次,子進程也執行一獨立
4
父進程和子進程的數據完全彼此。
5
vfork:子進程和父進程共享數據段
fork:父、子進程的執行次序不確定。
vfork:子進程先運行,父進程後運行
6
exec函數族
exec用《被執行的程序》替換《調用它的程序》。
fork創建新進程,產生一個新的PID
exec啓動一個新程序,替換原有進程,因此進程PID不會改變
7
execl//包含路徑
execlp//不包含路徑
execv(const char*path,char*const argv[])//含路徑,argv[]:被執行程序所需的命令行參數數組
實例
#include<unistd.h>
main()
{
execl("/bin/ls","ls","-al","/etc/passwd",(char*)0);
}
#include<unistd.h>
main()
{
char*argv[]={"ls","-al","/etc/passwd",(char*)0};
execv(“/bin/ls",argv);
}
#include<stdlib.h>
void main()
{
system("ls -al /etc/passwd");
}
8
system.c///system調用exec產生子進程
9
pid_t wait(int *status)//等帶其某個子進程退出。
實例
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
void mian()
{
pid_t pc,pr;
pc fork();
if(pc==0)
{
printf("This is chile process with pid of %d\n",getpid());
sleep(10);//睡眠10秒
}
else if(pid>0)//如果是父進程
{
pr=wait(NULL);
printf(“I catched a chile process with pid of %d\n”,pr);
}
exit(0);
}