日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

集训2--进程控制理论

發布時間:2024/4/13 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 集训2--进程控制理论 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.進程的定義;
進程是一個具有一定獨立功能的程序的一次運行活動,同時也是資源分配的最小單元;
2.程序是放到磁盤的可執行文件
進程是指程序執行的實例
3.進程是動態的,程序是靜態的:程序是有序代碼的集合;進程是程序的執行。通常進程不可在計算機之間遷移;而程序通常對應著文件、靜態和可以復制
進程是暫時的,程序使長久的:進程是一個狀態變化的過程,程序可長久保存
進程與程序組成不同:進程的組成包括程序、數據和進程控制塊(即進程狀態信息)
進程與程序的對應關系:通過多次執行,一個程序可對應多個進程;通過調用關系,一個進程可包括多個程序。
4進程的生命周期.
創建: 每個進程都是由其父進程創建,進程可以創建子進程,子進程又可以創建子進程的子進程
運行: 多個進程可以同時存在,進程間可以通信
撤銷: 進程可以被撤銷,從而結束一個進程的運行
5.進程的狀態
執行狀態:進程正在占用CPU
就緒狀態:進程已具備一切條件,正在等待分配CPU的處理時間片
等待狀態:進程不能使用CPU,若等待事件發生則可將其喚醒
6.Linux系統是一個多進程的系統,它的進程之間具有并行性、互不干擾等特點。
也就是說,每個進程都是一個獨立的運行單位,擁有各自的權利和責任。其中,各個進程都運行在獨立的虛擬地址空間,因此,即使一個進程發生異常,它也不會影響到系統中的其他進程。
7.進程互斥:
進程互斥是指當有若干進程都要使用某一共享資源時,任何時刻最多允許一個進程使用,其他要使用該資源的進程必須等待,直到占用該資源者釋放了該資源為止
8.死鎖
多個進程因競爭資源而形成一種僵局,若無外力作用,這些進程都將永遠不能再向前推進
9.指令:
ctrl+c 殺死進程
Ctrl+z 切換到后臺
fg 切換到前臺
ps -elf | grep +文件名 查找任務的進程號
(相當于windows下的任務管理器)
10.#include <unistd.h>
pid_t fork(void)
功能:創建子進程
fork的奇妙之處在于它被調用一次,卻返回兩次,它可能有三種不同的返回值:
代碼如下:
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
/此時僅有一個進程/
pid=fork();

/*此時已經有兩個進程在同時運行*/if(pid==-1)printf("error in fork!");else if(pid==0)printf("I am the child process, ID is %d\n",getpid());elseprintf("I am the parent process,ID is %d\n",getpid());

}
11.對于fork函數,子進程的數據空間、堆棧空間都會從父進程得到一個拷貝,而不是共享。
在子進程中對count進行加1的操作,并沒有影響到父進程中的count值,父進程中的count值仍然為0
12.vfork:
表頭文件: #include<unistd.h>定義函數: pid_t vfork(void);函數說明:
vfork()會產生一個新的子進程,其子進程會復制父進程的數據與堆棧空間,并繼承父進程的用戶代碼,組代碼,環境變量、已打開的文件代碼、工作目錄和資源限制等。
子進程不會繼承父進程的文件鎖定和未處理的信號。
注意,Linux不保證子進程會比父進程先執行或晚執行,因此編寫程序時要留意死鎖或競爭條件的發生。
13.fork與vfork的區別:
區別:
1 fork:子進程拷貝父進程的數據
vfork:子進程與父進程共享數據

2 fork:父、子進程的執行次序不確定
vfork:子進程先運行,父進程后運行
13.execl:
exec用被執行的程序替換調用它的程序。
區別:
fork創建一個新的進程,產生一個新的PID。
exec啟動一個新程序,替換原有的進程,因此進程的PID不會改變
用法介紹:
#include<unistd.h>
int execl(const char * path,const char * arg1, …)
參數:
path:被執行程序名(含完整路徑)。
arg1 – argn: 被執行程序所需的命令行參數,含程序名。以空指針(NULL)結束。
例子介紹:
例:execl.c (演示)
#include<unistd.h>
int main()
{
execl(“/bin/ls”,”ls”, “-al”,”/etc/passwd”,NULL);
}
14.system:
#include <stdlib.h>
int system( const char* string )
功能:
調用fork產生子進程,由子進程來調用/bin/sh -c string來執行參數string所代表的命令
15 wait:
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait (int * status)
功能:阻塞該進程,直到其某個子進程退出。
代碼如下:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{ pid_t pc,pr;
pc = fork();
if(pc == 0){
printf(“This is child process with pid of %d\n”,getpid());
sleep(10); /* 睡眠10秒鐘 /
}
else if(pc > 0){
pr=wait(NULL); / 等待 */
printf(“I catched a child process with pid of %d\n”),pr);
}
exit(0);
}
16. waitpid:
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid (pid_t pid, int * status, int options)
功能:
會暫時停止目前進程的執行,直到有信號來到或子進程結束
17.進程退出:
exit,_exit用于終止進程
區別:
_exit: 直接使進程停止,清除其使用的內存,并清除緩沖區中內容
exit與 _exit的區別:在停止進程之前,要檢查文件的打開情況,并把文件緩沖區中的內容寫回文件才停止進程。
exit()用法:
表頭文件: #include<stdlib.h>定義函數: void exit(int status);函數說明:
exit()用來正常終結目前進程的執行,并把參數status返回給父進程,而進程所有的緩沖區數據會自動寫回并關閉未關閉的文件。
18.僵尸進程:
僵尸進程指的是那些雖然已經終止的進程,但仍然保留一些信息,等待其父進程為其收尸。
如何產生?
如果一個進程在其終止的時候,自己就回收所有分配給它的資源,系統就不會產生所謂的僵尸進程了

僵尸進程產生的過程:
父進程調用fork創建子進程后,子進程運行直至其終止,它立即從內存中移除,但進程描述符仍然保留在內存中(進程描述符占有極少的內存空間)。
僵尸進程相關的代碼:
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
int main()
{
pid_t pid;
pid = fork();
if (pid==-1)
{
perror(“fork error:”);
exit(1);
}
else if (pid== 0)
{
printf(“I am child process.I am exiting.\n”);
exit(0);
}
printf(“I am father process.I will sleep two seconds\n”);
//等待子進程先退出
sleep(2);
//輸出進程信息
system(“ps -o pid,ppid,state,tty,command”);
printf(“father process is exiting.\n”);
return 0;
}
19.孤兒進程:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <errno.h>
4 #include <unistd.h>
5
6 int main()
7 {
8 pid_t pid;
9 //創建一個進程
10 pid = fork();
11 //創建失敗
12 if (pid==-1)
13 {
14 perror(“fork error:”);
15 exit(1);
16 }
17 //子進程
18 if (pid == 0)
19 {
20 printf(“I am the child process.\n”);
21 //輸出進程ID和父進程ID
22 printf(“pid: %d\tppid:%d\n”,getpid(),getppid());
23 printf(“I will sleep five seconds.\n”);
24 //睡眠5s,保證父進程先退出
25 sleep(5);
26 printf(“pid: %d\tppid:%d\n”,getpid(),getppid());
27 printf(“child process is exited.\n”);
28 }
29 //父進程
30 else
31 {
32 printf(“I am father process.\n”);
33 //父進程睡眠1s,保證子進程輸出進程id
34 sleep(1);
35 printf(“father process is exited.\n”);
36 }
37 return 0;
38 }

20.signal與alarm函數
#include <stdio.h>
#include <signal.h>

/void handler(int sig)
{
printf(“hello %d\n”, sig);
}/

void handler(int sig)
{
printf(“helloworld\n”);
alarm(2);
}

int main()
{
//signal(SIGINT, SIG_IGN); //忽略Ctrl C信號
//signal(SIGINT, handler);

alarm(2); //2秒后,給進程發送SIGALRM信號,有效期 一次 signal(SIGALRM, handler);while (1); //進程不能掛return 0;

}
21.僵尸進程與孤兒進程特點總結:
//孤兒進程:父進程提前結束
//僵尸進程:父進程沒有回收子進程資源

總結

以上是生活随笔為你收集整理的集训2--进程控制理论的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。