實驗二

西 安 郵 電 大學 (計算機學院)

操作系統課內實驗報告

實驗名稱:進程

專業名稱:計算機科學與技術

班 級:計科1503

學生姓名:魏新超

學號(8位):04151091

指導教師:陳莉君

實驗日期:2017年4月13日

一. 實驗目的及實驗環境

通過觀察、分析實驗現象,深入理解進程及進程在調度執行和內存空間等方面的特點,掌握在POSIX 規范中fork和kill系統調用的功能和使用
實驗環境:deepin-15.3
二. 實驗內容

  1. 你最初認為運行結果會怎么樣?
    會按序號執行,當按q時退出
  2. 實際的結果什么樣?有什么特點?試對產生該現象的原因進行分析。
    實際結果與起初猜想不同,不是按順序輸出,而是隨機輸出的,每隔10秒輸出10個進程,進程的執行是系統隨機調度的。
  3. proc_number 這個全局變量在各個子進程里的值相同嗎?為什么?
    不相同,proc_number在每個子進程中被修改,所以不相同。
  4. kill 命令在程序中使用了幾次?每次的作用是什么?執行后的現象是什么?
    調用次數按用戶輸入次數,沒輸入一次執行一次,每次執行完殺死一個進程,進程被殺死終結
  5. 使用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);
            
    }

}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容