16281005作業系統實驗二
- 實驗題目
-
- 一、實驗目的:
- 二、基礎知識:
- 三、實驗題目:
- 四、實驗解答:
實驗題目
一、實驗目的:
- 加深對程序概念的了解,明确程序和程式的差別。
- 掌握Linux系統中的程序建立,管理和删除等操作。
- 熟悉使用Linux下的指令和工具,如man, find, grep, whereis, ps, pgrep, kill, ptree, top, vim, gcc,gdb, 管道|等。
二、基礎知識:
-
程序的建立
Linux中,載入記憶體并執行程式映像的操作與建立一個新程序的操作是分離的。将程式映像載入記憶體,并開始運作它,這個過程稱為運作一個新的程式,相應的系統調用稱為exec系統調用。而建立一個新的程序的系統調用是fork系統調用。
- exec系統調用
#include <unistd.h>
int execl (const char *path, const char *arg,...);
execl()将path所指路徑的映像載入記憶體,arg是它的第一個參數。參數可變長。參數清單必須以NULL結尾。
通常execl()不會傳回。成功的調用會以跳到新的程式入口點作為結束。發生錯誤時,execl()傳回-1,并設定errno值。
例如,編輯/home/kidd/hooks.txt:
int ret;
ret = execl (”/bin/vi”, ”vi”,”/home/kidd/hooks.txt”, NULL);
if (ret == -1)
perror (”execl”);
- fork系統調用
#include <sys/types.h>
#include <unistd.h>
pid_t fork (void);
成功調用fork()會建立一個新的程序,它與調用fork()的程序大緻相同。發生錯誤時,fork()傳回-1,并設定errno值。
例如:
pid_t pid;
pid = fork ();
if (pid > 0)
printf (”I am the parent of pid=%d!\n”, pid);
else if (!pid)
printf (”I am the baby!\n”);
else if (pid == -1)
perror (”fork”);
-
終止程序
exit()系統調用:
#include <stdlib.h>
void exit (int status);
-
程序挂起
pause() 系統調用:
int pause( void );
函數pause會把程序挂起,直到接收到信号。在信号接收後,程序會從pause函數中退出,繼續運作。
- wait(等待子程序中斷或結束)
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait (int * status);
wait()會暫時停止目前程序的執行,直到有信号來到或子程序結束。
如果在調用 wait()時子程序已經結束,則wait()會立即傳回子程序結束狀态值。
子程序的結束狀态值會由參數status傳回,而子程序的程序識别碼也會一起傳回。
如果不在意結束狀态值,則參數status可以設成 NULL。
- VIM常用指令速查
16281005作業系統實驗二實驗題目
三、實驗題目:
根據課堂所學内容和基礎知識介紹,完成實驗題目。
- 打開一個vi程序。通過ps指令以及選擇合适的參數,隻顯示名字為vi的程序。尋找vi程序的父程序,直到init程序為止。記錄過程中所有程序的ID和父程序ID。将得到的程序樹和由pstree指令的得到的程序樹進行比較。
- 編寫程式,首先使用fork系統調用,建立子程序。在父程序中繼續執行空循環操作;在子程序中調用exec打開vi編輯器。然後在另外一個終端中,通過ps –Al指令、ps aux或者top等指令,檢視vi程序及其父程序的運作狀态,了解每個參數所表達的意義。選擇合适的指令參數,對所有程序按照cpu占用率排序。
- 使用fork系統調用,建立如下程序樹,并使每個程序輸出自己的ID和父程序的ID。觀察程序的執行順序和運作狀态的變化。
16281005作業系統實驗二實驗題目 - 修改上述程序樹中的程序,使得所有程序都循環輸出自己的ID和父程序的ID。然後終止p2程序(分别采用kill -9 、自己正常退出exit()、段錯誤退出),觀察p1、p3、p4、p5程序的運作狀态和其他相關參數有何改變。
四、實驗解答:
-
打開一個vi程序。通過ps指令以及選擇合适的參數,隻顯示名字為vi的程序。尋找vi程序的父程序,直到init程序為止。記錄過程中所有程序的ID和父程序ID。将得到的程序樹和由pstree指令的得到的程序樹進行比較。
在終端輸入vi,打開vi程序,效果如下圖。
通過查閱資料我們可以得知ps -A指令可以查閱目前所有的程序資訊,效果如下。在終端輸出資訊如下。16281005作業系統實驗二實驗題目 是以我們可以選用了ps -A | pgrep vi的方式指令,篩選名字為vi的程序,效果如下圖。pgrep vi指令是進行參數比對查找篩選出名字為vi的程序。而中間的“|”是管道指令,是指pps指令與grep同時執行。16281005作業系統實驗二實驗題目 在上述圖檔中我們可以看出此種搜尋方式隻能擷取程序号,不能擷取程序資訊。是以為擷取更加詳盡的程序資訊采取了如下方式:使用了# pgrep vi | xargs ps -u --pid指令實作對于名字為vi的程序查找。可以從下圖中看出兩種查找方式搜尋出來的程序号是相同的,隻不過第二種搜尋方式具有更多的程序詳細資訊。16281005作業系統實驗二實驗題目 我們由上面查找程序可知,vi程序的程序号為1866,為了尋找vi程序的父程序一直尋找到init程序位置,我們使用ps -l [程序号]的方式逐漸尋找目前程序号的父程序,執行過程如下圖。16281005作業系統實驗二實驗題目 接下來使用pstree -p指令擷取目前的程序樹,如圖所示16281005作業系統實驗二實驗題目 16281005作業系統實驗二實驗題目 16281005作業系統實驗二實驗題目 16281005作業系統實驗二實驗題目 通過程序樹和上述的單步查找父程序,我們可以得知,目前vi程序的程序式列為
Systemd(1)->lightdm(864)->lightdm(1133)->upstart(1143)->gan(1848)->bash(1853)->vi(1866)
-
編寫程式,首先使用fork系統調用,建立子程序。在父程序中繼續執行空循環操作;在子程序中調用exec打開vi編輯器。然後在另外一個終端中,通過ps –Al指令、ps aux或者top等指令,檢視vi程序及其父程序的運作狀态,了解每個參數所表達的意義。選擇合适的指令參數,對所有程序按照cpu占用率排序。
程式執行效果如下:(程式見githup源代碼2.cpp)
16281005作業系統實驗二實驗題目 16281005作業系統實驗二實驗題目
- 打開另一中斷測試指令ps -Al,得出如下結果
16281005作業系統實驗二實驗題目
參數 | 含義 |
---|---|
F | 标志 |
S | 程式狀态 |
UID | 執行者身份 |
PID | 程序号 |
PPID | 父程序号 |
C | CPU使用百分比 |
PRI | 程序執行優先權 |
NI | 程序的nice值(負值表示高優先級) |
ADDR | 核心函數 |
SZ | 占用記憶體大小 |
WCHAN | 程序正在睡眠的核心函數 |
TTY | 終端機位置 |
TIME | 使用掉的CPU時間 |
CMD | 下達的指令名稱 |
- 執行ps aux指令效果如下:
參數 | 含義 |
---|---|
USER | 使用者 |
PID | 程序号 |
%CPU | 占用CPU百分比 |
%MEM | 記憶體使用率 |
VSZ | 占用虛拟記憶體大小 |
RSS | 占用記憶體大小 |
TTY | 中斷的次要裝置号 |
STAT | 程序的狀态 |
START | 程序開始時間 |
TIME | 程序執行時間 |
COMMAND | 所執行的指令 |
- top指令 部分參數含義如下
16281005作業系統實驗二實驗題目
參數 | 含義 |
---|---|
PR | 優先級 |
VIRT | 程序使用的虛拟記憶體總量 |
RES | 程序使用的、未被換出的實體記憶體 |
S | 程序狀态 |
TIME+ | 程序使用的CPU時間總計 |
- 使用fork系統調用,建立如下程序樹,并使每個程序輸出自己的ID和父程序的ID。觀察程序的執行順序和運作狀态的變化。 執行程式結果如下圖:(程式見githup源代碼3.cpp)
16281005作業系統實驗二實驗題目 系統函數fork實作的功能為啟動一個新的與原有程序相同的新程序,稱為子程序。子程序複制父程序的堆棧段和資料段。在fork函數使用後含有兩個傳回值,我們根據傳回值的不同,可以區分子程序和父程序,其中子程序=0,父程序>0。16281005作業系統實驗二實驗題目 -
修改上述程序樹中的程序,使得所有程序都循環輸出自己的ID和父程序的ID。然後終止p2程序(分别采用kill -9 、自己正常退出exit()、段錯誤退出),觀察p1、p3、p4、p5程序的運作狀态和其他相關參數有何改變。
程式執行效果如下:(程式見githup源代碼4-1.cpp)
16281005作業系統實驗二實驗題目
- Kill -9 [程序号],結束相關程序号的對應程序。在之後的循環過程中該程序被終止,效果如圖。
16281005作業系統實驗二實驗題目 16281005作業系統實驗二實驗題目 - 設定exit()函數,自動停止,。(程式見githup源代碼4-2.cpp)
16281005作業系統實驗二實驗題目 - 設定段錯誤:所謂段錯誤,一般是通路了未申請的記憶體或非法的記憶體時産生的,概括點說在代碼中一般是由指針的不當使用引起的。(程式見githup源代碼4-3.cpp) githup源碼連結
16281005作業系統實驗二實驗題目