計算機作業系統實驗之_程式觀測_實驗報告

chen_yilong發表於2012-11-10

南陽理工學院計算機作業系統實驗之

課程名稱:

計算機作業系統

實驗學期:

2011-2012第二學期


實驗目的和要求


(1)瞭解在Linux作業系統中程式的特點和表現形式

(2)掌握Linux檢視程式的方式與方法
(3)在一個程式中建立另一個程式的方法

(4)掌握父程式和子程式的關係和fork的用法 

實驗內容與分析設計

實驗內容:
(1)編寫一個簡單的程式,使用ps或top工具觀察該程式的的ID號,並使用kill工具終止程式執行。
(2)編寫一個程式,使用fork函式生成一個子程式,並使用相關工具觀察程式狀態。
實驗步驟:
(1)

#include <stdio.h>
int main()
{
	//設計一個迴圈,使其反覆執行,方便觀察
	while(1)
	{
		printf("I am the first process!\n");
	}
	return 0;
}



檔名命名為process1.c,使用gcc process1.c -o process編譯該程式。執行該程式,開啟其它一個終端


視窗,輸入命令top,觀察名稱為process1的程式,記錄各項資料(包括程式號)。使用"kill 程式號" 直接殺死該程式。觀察程式是否消失?
需要記錄的資料:程式狀態中的id,記憶體使用和CPU佔有率。由於該程式一直處於迴圈中,思考id、記憶體


使用和cpu佔有率哪一個因素和迴圈
關係密切?如何避免,請給出合理的建議。這是否說明CPU也是作業系統中的一個重要資源?
(2)
//process2.c
#include <sys/types.h>   
#include <unistd.h>
#include <stdio.h>
int main()
{
    int i;
    if ( fork() == 0 ) 
    {
       /* 子程式程式 */
       for ( i = 1; i <1000; i ++ ) 
          printf("This is child process\n");
    }
    else 
    {
       /* 父程式程式*/
       for ( i = 1; i <1000; i ++ ) 
          printf("This is process process\n");
    }
}


請儲存為process2.c,編譯執行,寫出你觀察到的輸出結果,能否對輸出的現象做一個合理的解釋?
若將上述例項(2),改寫為:
//process4.c
#include <sys/types.h>   
#include <unistd.h>
#include <stdio.h>
int main()
{
    int i;
    if ( fork() == 0 ) 
    {
       /* 子程式程式 */
       for ( ;; ) 
          printf("This is child process\n");
    }
    else 
    {
       /* 父程式程式*/
       for ( i=1;i<1000;i++ ) 
          printf("This is process process\n");
    }
}


請儲存為process4.c,編譯執行,寫出你觀察到的輸出結果,能否對輸出的現象做一個合理的解釋?
若將將例項(2)改為:
//process3cc
#include <sys/types.h>   
#include <unistd.h>
#include <stdio.h>
int main()
{
    int i;
    if ( fork() == 0 ) 
    {
       /* 子程式程式 */
       for ( ;; ) 
          printf("This is child process\n");
    }
    else 
    {
       /* 父程式程式*/
       for ( ;; ) 
          printf("This is process process\n");
    }
}


請儲存為process3.c,編譯執行,寫出你觀察到的輸出結果,能否對輸出的現象做一個合理的解釋? 

實驗步驟和除錯過程:


統一執行一下命令
vim process*.c(編輯原始檔)
gcc process*.c -o process*(編譯)
./process(執行程式)
top(檢視程式)
kill -9 程式號(結束程式)


實驗結果:

(1)process.c:    程式無限次輸出 I am the first process!直到輸入“kill 程式號”才結束

(2)process2.c:  父程式、子程式各輸出1000,且輸出次序不一
(3)process4.c(process2.c更改後的版本):父程式執行1000次,子程式不確定,且順序不確定
(4)父程式子程式列印順序不確定,可見父程式和子程式各獨立執行。父程式子程式均無限次輸出,知道輸入“kill -9 程式號”才終止

疑難小結

(1)、最後一個程式peocess3.c,執行後,kill 程式號無法結束程式,只有kill 程式號-9後才能終止程式
(2)、父子程式列印次序無規律,說明父子程式的進行是無序的隨機的。

主要演算法和程式清單



 
 //process1.c
 #include <stdio.h>
 
 
 int main()
 {
 //設計一個迴圈,使其反覆執行,方便觀察
 while(1)
 {
 printf("I am the first process!\n");
 }
 return 0;
 }
 
 
 //process2.c
 #include <sys/types.h>   
 #include <unistd.h>
 #include <stdio.h>
 int main()
 {
 int i;
 if ( fork() == 0 ) 
 {
 /* 子程式程式 */
for ( i = 1; i <1000; i ++ ) 
printf("This is child process\n");
}
else 
{
    /* 父程式程式*/
    for ( i = 1; i <1000; i ++ ) 
        printf("This is process process\n");
        }
}



//process4.c
#include <sys/types.h>   
#include <unistd.h>
#include <stdio.h>
int main()
{
    int i;
    if ( fork() == 0 ) 
    {
        /* 子程式程式 */
        for ( ;; ) 
            printf("This is child process\n");
    }
    else 
    {
        /* 父程式程式*/
        for ( i=1;i<1000;i++ ) 
            printf("This is process process\n");
    }
}
//process3.c
#include <sys/types.h>   
#include <unistd.h>
#include <stdio.h>
int main()
{
    int i;
    if ( fork() == 0 ) 
    {
        /* 子程式程式 */
        for ( ;; ) 
            printf("This is child process\n");
    }
    else 
    {
        /* 父程式程式*/
        for ( ;; ) 
            printf("This is process process\n");
    }
}


參考書目


西安電子科技大學出版社 《計算機作業系統(第 三 版)》湯小丹 、樑紅兵、哲鳳屏、 湯子瀛 著

實驗原始碼以及編譯好的程式下載地址點選開啟連結

相關文章