西 安 郵 電 大學 (計算機學院)
操作系統課內實驗報告
實驗名稱:進程
專業名稱:計算機科學與技術
班 級:計科1503
學生姓名:魏新超
學號(8位):04151091
指導教師:陳莉君
實驗日期:2017年4月13日
一. 實驗目的及實驗環境
通過觀察、分析實驗現象,深入理解進程及進程在調度執行和內存空間等方面的特點,掌握在POSIX 規范中fork和kill系統調用的功能和使用
實驗環境:deepin-15.3
二. 實驗內容
- 你最初認為運行結果會怎么樣?
會按序號執行,當按q時退出 - 實際的結果什么樣?有什么特點?試對產生該現象的原因進行分析。
實際結果與起初猜想不同,不是按順序輸出,而是隨機輸出的,每隔10秒輸出10個進程,進程的執行是系統隨機調度的。 - proc_number 這個全局變量在各個子進程里的值相同嗎?為什么?
不相同,proc_number在每個子進程中被修改,所以不相同。 - kill 命令在程序中使用了幾次?每次的作用是什么?執行后的現象是什么?
調用次數按用戶輸入次數,沒輸入一次執行一次,每次執行完殺死一個進程,進程被殺死終結 - 使用kill 命令可以在進程的外部殺死進程。進程怎樣能主動退出?這兩種退出方式哪種更好一些?
進程是用q退出的,主動退出好點,q退出殺死父進程,子進程被迫殺死,主動退出使用exit,能主動釋放資源。
三.方案設計
先猜想一下這個程序的運行結果。假如運行“./process 20”,輸出會是什么樣?然后按照注釋里的要求把代碼補充完整,運行程序。可以多運行一會兒,并在此期間啟動、關閉一些其它進程,看process 的輸出結果有什么特點,記錄下這個結果。開另一個終端窗口,運行“ps aux|grep process”命令,看看process 究竟啟動了多少個進程。回到程序執行窗口,按“數字鍵+回車”嘗試殺掉一兩個進程,再到另一個窗口看進程狀況。按q 退出程序再看進程情況。
四.測試數據及運行結果
1.正常測試數據(3組)及運行結果;
2.png
五.總結
在本次進程實驗中,了解到操作系統中進程的執行機制,不是隨機執行的,而是隨著操作系統的調度而執行,而且了解到殺死進程的多種方式以及優缺點
六.附錄:源代碼(電子版, 紙質版不打印)
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<signal.h>
#include<ctype.h>
#define MAX_CHILD_NUMBER 10 /* 允許建立的子進程個數最大值 */
#define SLEEP_INTERVAL 4 /* 子進程睡眠時間 */
int proc_number = 0; /*子進程編號*/
void do_something();
int main(int argc,char* argv[]){
int child_proc_number = MAX_CHILD_NUMBER; /*將子進程數量限定在最大值*/
int i,ch;
pid_t child_pid;
pid_t pid[10] = {0}; /*初始化pid*/
if(argc > 1){
child_proc_number = atoi(argv[1]);
child_proc_number = (child_proc_number > 10) ? 10 : child_proc_number;
}
for(i=0;i<child_proc_number;i++){
child_pid = fork();
proc_number = i;
if(child_pid == 0) do_something();
if(child_pid != 0) pid[i] = child_pid;
}
while((ch=getchar())!='q'){
if(isdigit(ch)){
kill(pid[ch-'0'],SIGTERM);
pid[ch-'0'] = 0;
}
}
for(i=0;i<child_proc_number;i++){
if(pid[i] != 0){
kill(pid[i],SIGTERM);
pid[i] = 0;
}
}
return 0;
}
void do_something(){
while(1){
printf("this is process No.%d and its pid is %d\n",proc_number,getpid());
sleep(SLEEP_INTERVAL);
}
}