進程的創(chuàng)建與并發(fā)執(zhí)行-帶答案版課案_第1頁
進程的創(chuàng)建與并發(fā)執(zhí)行-帶答案版課案_第2頁
進程的創(chuàng)建與并發(fā)執(zhí)行-帶答案版課案_第3頁
進程的創(chuàng)建與并發(fā)執(zhí)行-帶答案版課案_第4頁
進程的創(chuàng)建與并發(fā)執(zhí)行-帶答案版課案_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、實驗二 進程管理2.1 進程的創(chuàng)建與并發(fā)執(zhí)行1. 實驗目的(1) 加深對進程概念的理解 , 理解進程和程序的區(qū)別。(2) 認識并發(fā)進程的實質(zhì)。分析進程爭用資源的現(xiàn)象,學習解決進程互斥的方法。(3) 理解系統(tǒng)調(diào)用和用戶命令的區(qū)別。2. 實驗類型: 驗證型3. 實驗學時: 24. 實驗原理和知識點(1) 實驗原理: 程序的并發(fā)執(zhí)行具有隨機性和不可再現(xiàn)性。 程序并發(fā)執(zhí)行會導致資源共享和 資源競爭, 各程序向前執(zhí)行的速度會受資源共享的制約。 程序的動態(tài)執(zhí)行過程用進程這個概 念來描述。 由于向前推進的速度不可預知, 所以多個進程并發(fā)地重復執(zhí)行, 整體上得到的結(jié) 果可能不同。但要注意,就其中某單個進程而言

2、,其多次運行結(jié)果是確定的。(2) 知識點:進程、子進程、并發(fā)執(zhí)行的特性;5. 實驗環(huán)境(硬件環(huán)境、軟件環(huán)境) :(1) 硬件環(huán)境: Intel Pentium III 以上 CPU, 128MB 以上內(nèi)存, 2GB 以上硬盤(2) 軟件環(huán)境: linux 操作系統(tǒng)。6. 預備知識(1) fork() 系統(tǒng)調(diào)用頭文件: #include unix standard header/* 是 POSIX 標準定義的 unix 類系統(tǒng)定義符號常量的頭文件,包含了許多 UNIX 系統(tǒng)服務 的函數(shù)原型,例如 read 函數(shù)、 write 函數(shù)和 getpid 函數(shù) */ 函數(shù)原型: pid_t fork(v

3、oid);/* 是 Linux 下的進程號類型,也就是 Process ID _ Type的縮寫。其實是宏定義的unsigned int 類型 */函數(shù)功能: fork 的功能是創(chuàng)建 子進程 。調(diào)用 fork 的進程稱為 父進程 。如圖 2.1 所示。子 進程是父進程的一個拷貝,它繼承了父進程的用戶代碼、 組代碼、 環(huán)境變量、 已打開的文件 代碼、工作目錄及資源限制。 fork 語句執(zhí)行后,內(nèi)核向父進程返回子進程的進程號,向子 進程返回 0。 父子進程都從 fork() 的下一句開始并發(fā)執(zhí)行 。返回值:返回值 =-1 :創(chuàng)建失敗。返回值 =0 : 程序在子進程中。返回值 0 : 程序在父進程中

4、。 (該返回值是子進程的進程號)編程提示: 雖然子進程是父進程的一個復制品,但父子的行為是不同的。編程時要抓住內(nèi) 核的返回值。通過返回值,可以知道是父進程還是子進程,因而可以編寫不同行為的代碼。圖 2.1 fork()創(chuàng)建進程示意圖發(fā)出 wait 調(diào)用的進程只要有子進程,就會睡眠(2) wait() 系統(tǒng)調(diào)用 頭文件: #include 函數(shù)原型: pid_t wait(int *status); 函數(shù)功能: wait 的功能是等待子進程結(jié)束。直到子進程中的一個終止為止。若沒有子進程,則該調(diào)用立即返回。 函數(shù)參數(shù): status 是子進程退出時的狀態(tài)信息。 返回值:成功則返回子進程號,否則返回

5、-1 。(3) getpid() 系統(tǒng)調(diào)用 頭文件: unistd.h ,在 VC+6.0 下可以用 process.h 函數(shù)原型: pid_t getpid(void);函數(shù)功能: wait 的功能是將父進程掛起,等待子進程終止。 getpid 函數(shù)用來取得目前進程 的進程 ID,許多程序利用取到的此值來建立臨時文件,以避免臨時文件相同帶來的問題。 返回值:目前進程的進程 ID 。execnice(4) 其他系統(tǒng)調(diào)用 exit 終止進程 執(zhí)行一個應用程序 改變進程的優(yōu)先7. 實驗內(nèi)容與步驟(將所有截圖換成用戶名為你們自己姓名的拼音,并回答所有的問題) (1 )運行圖 2.1 所示程序?qū)D 2

6、.1 中的源程序保存為 e201.c 在終端中編譯 gcc o e201 e201.c運行 ./e201此時, 程序為死循環(huán),在該終端中無法繼續(xù)輸入命令執(zhí)行,于是, 我們可以暫時不管這一個 終端,而是再新建一個終端,然后鍵入 ps e ,列出當前所有進程觀察屏幕,是否有兩個名為 e201 的進程。比較它們的進程號,判別哪個是父進程,哪 個是子進程。ctrl+c 強制結(jié)束。程序中的 while(1); 語句是為了不讓程序退出來,以便于你觀察進程狀態(tài)。用 kill 命令 把這兩個進程終止??梢?,第一個終端如下圖所示,已經(jīng)從死循環(huán)中解救出來了。當然,最簡單粗暴的方法不是關閉相關進程,而是直接通過對圖

7、 2.1 的程序稍加改進,可看見兩個進程的進程號。(2) 編寫一段名為 e202.c 的源程序 , 使用系統(tǒng)調(diào)用 fork() 創(chuàng)建兩個子進程 p1 和 p2 。p1 的功能為顯示字符 b ,p2 的功能為顯示字符 c ,父進程的功能為顯示字符 a ,父進程 和兩個子進程并發(fā)運行。不停的運行 e202 ,觀察并記錄屏幕上的顯示結(jié)果。程序設計過程:用 while 語句控制 fork() 直到創(chuàng)建成功。 用 if 語句判別是在子進程中還是在父進程 中。程序運行后會創(chuàng)建三個進程,它們分別是子進程p1、p2 、父進程。這三個進程并發(fā)運行。假定子進程有些任務要做, 完成這些任務要花一定時間, 因此,可以

8、用一個延時函數(shù)簡 單地模擬這些任務。/e202.c #include void delay(int x) /*int i,j;for(i=0;ix;i+) for(j=0;j0 & p20 & p30) printf(A:%dn,getpid(); if(p1=0 & p20 & p30) printf(B:%dn,getpid(); if(p1=0 & p2=0 & p30) printf(C:%dn,getpid(); if(p1=0 & p2=0 & p3=0)printf(D:%dn,getpid(); if(p1=0 & p20 & p3=0) printf(E:%dn,getpid

9、(); if(p10 & p2=0 & p30) printf(F:%dn,getpid();if(p10 & p2=0 & p3=0) printf(G:%dn,getpid(); if(p10 & p20 & p3=0) printf(H:%dn,getpid(); sleep(10);return 0;這些進程構(gòu)成的進程樹為(要畫出進程樹才有加分哦 ! ):ps f 命令可以查看當前終端進程的進程數(shù)關系圖8. 心得體會附錄 pstree 的用法格式: pstree 以樹狀圖顯示進程,只顯示進程的名字,且相同進程合并顯示。 格式: pstree -p 以樹狀圖顯示進程,還顯示進程 PID

10、。格式: pstree 格式: pstree -p 以樹狀圖顯示進程 PID 為 的進程以及子孫進程, 如果有 -p 參數(shù)則同時顯示每個進程 的 PID 。附錄 Linux 系統(tǒng)調(diào)用列表以下是 Linux 系統(tǒng)調(diào)用的一個列表,包含了大部分常用系統(tǒng)調(diào)用和由系統(tǒng)調(diào)用派生出的的函數(shù)。其中 有一些函數(shù)的作用完全相同,只是參數(shù)不同。 (有點像 C+ 函數(shù)重載,但是 Linux 核心是用 C 語言寫的, 所以只能取成不同的函數(shù)名)。還有一些函數(shù)已經(jīng)過時,被新的更好的函數(shù)所代替了( gcc 在鏈接這些函 數(shù)時會發(fā)出警告),但因為兼容的原因還保留著,這些函數(shù)在前面標上“*”號以示區(qū)別。各系統(tǒng)調(diào)用的使用方法,可

11、以通過 man 命令獲得。、進程控制:fork創(chuàng)建一個新進程clone按指定條件創(chuàng)建子進程execve運行可執(zhí)行文件exit中止進程exit立即中止當前進程getdtablesize進程所能打開的最大文件數(shù)getpgid獲取指定進程組標識號setpgid設置指定進程組標志號getpgrp獲取當前進程組標識號setpgrp設置當前進程組標志號getpid獲取進程標識號getppid獲取父進程標識號getpriority獲取調(diào)度優(yōu)先級setpriority設置調(diào)度優(yōu)先級modify ldt讀寫進程的本地描述表nanosleep使進程睡眠指定的時間nice改變分時進程的優(yōu)先級pause掛起進程,等待

12、信號personality設置進程運行域prctl對進程進行特定操作ptrace進程跟蹤sched get priority max取得靜態(tài)優(yōu)先級的上限sched get priority min取得靜態(tài)優(yōu)先級的下限sched getparam取得進程的調(diào)度參數(shù)sched getscheduler取得指定進程的調(diào)度策略sched rr get interval取得按 RR 算法調(diào)度的實時進程的時間片長度sched setparam設置進程的調(diào)度參數(shù)sched setscheduler設置指定進程的調(diào)度策略和參數(shù)sched yield進程主動讓出處理器 ,并將自己等候調(diào)度隊列隊尾vfork創(chuàng)建一

13、個子進程,以供執(zhí)行新程序,常與 execve 等同時使用wait等待子進程終止wait3參見 waitwaitpid等待指定子進程終止wait4參見 waitpidcapget獲取進程權(quán)限capset設置進程權(quán)限getsid獲取會晤標識號setsid設置會晤標識號二、文件系統(tǒng)控制1、文件讀寫操作fcntl文件控制open打開文件creat創(chuàng)建新文件close關閉文件描述字read讀文件write寫文件readv從文件讀入數(shù)據(jù)到緩沖數(shù)組中writev將緩沖數(shù)組里的數(shù)據(jù)寫入文件pread對文件隨機讀pwrite對文件隨機寫lseek移動文件指針llseek在 64 位地址空間里移動文件指針dup復

14、制已打開的文件描述字dup2按指定條件復制文件描述字flock文件加 / 解鎖pollI/O 多路轉(zhuǎn)換truncate截斷文件ftruncate參見 truncateumask設置文件權(quán)限掩碼fsync把文件在內(nèi)存中的部分寫回磁盤2、文件系統(tǒng)操作access確定文件的可存取性chdir改變當前工作目錄fchdir參見 chdirchmod改變文件方式fchmod參見 chmodchown改變文件的屬主或用戶組fchown參見 chownlchown參見 chownchroot改變根目錄stat取文件狀態(tài)信息lstat參見 statfstat參見 statstatfs取文件系統(tǒng)信息fstatfs

15、參見 statfsreaddir讀取目錄項getdents讀取目錄項mkdir創(chuàng)建目錄mknod創(chuàng)建索引結(jié)點rmdir刪除目錄rename文件改名link創(chuàng)建鏈接symlink創(chuàng)建符號鏈接unlink刪除鏈接readlink讀符號鏈接的值mount安裝文件系統(tǒng)umount卸下文件系統(tǒng)ustat取文件系統(tǒng)信息utime改變文件的訪問修改時間utimes參見 utimequotactl控制磁盤配額三、系統(tǒng)控制ioctlI/O 總控制函數(shù)sysctl讀/ 寫系統(tǒng)參數(shù)acct啟用或禁止進程記賬getrlimit獲取系統(tǒng)資源上限setrlimit設置系統(tǒng)資源上限getrusage獲取系統(tǒng)資源使用情況us

16、elib選擇要使用的二進制函數(shù)庫ioperm設置端口 I/O 權(quán)限iopl改變進程 I/O 權(quán)限級別outb低級端口操作reboot重新啟動swapon打開交換文件和設備swapoff關閉交換文件和設備bdflush控制 bdflush 守護進程sysfs取核心支持的文件系統(tǒng)類型sysinfo取得系統(tǒng)信息adjtimex調(diào)整系統(tǒng)時鐘alarm設置進程的鬧鐘getitimer獲取計時器值setitimer設置計時器值gettimeofday取時間和時區(qū)settimeofday設置時間和時區(qū)stime設置系統(tǒng)日期和時間time取得系統(tǒng)時間times取進程運行時間uname獲取當前 UNIX 系統(tǒng)的

17、名稱、版本和主機等信息vhangup掛起當前終端nfsservctl對 NFS 守護進程進行控制vm86進入模擬 8086 模式create module創(chuàng)建可裝載的模塊項delete module刪除可裝載的模塊項init module初始化模塊query module查詢模塊信息*get kernel syms取得核心符號 , 已被 query module 代替四、內(nèi)存管理brk改變數(shù)據(jù)段空間的分配sbrk參見 brkmlock內(nèi)存頁面加鎖munlock內(nèi)存頁面解鎖mlockall調(diào)用進程所有內(nèi)存頁面加鎖munlockall調(diào)用進程所有內(nèi)存頁面解鎖mmap映射虛擬內(nèi)存頁munmap去除內(nèi)

18、存頁映射mremap重新映射虛擬內(nèi)存地址msync將映射內(nèi)存中的數(shù)據(jù)寫回磁盤mprotect設置內(nèi)存映像保護getpagesize獲取頁面大小sync將內(nèi)存緩沖區(qū)數(shù)據(jù)寫回硬盤cacheflush將指定緩沖區(qū)中的內(nèi)容寫回磁盤五、網(wǎng)絡管理getdomainname取域名setdomainname設置域名gethostid獲取主機標識號sethostid設置主機標識號10gethostname獲取本主機名稱sethostname設置主機名稱六、socket 控制socketcallsocket 系統(tǒng)調(diào)用socket建立 socketbind綁定 socket 到端口connect連接遠程主機acce

19、pt響應 socket 連接請求send通過 socket 發(fā)送信息sendto發(fā)送 UDP 信息sendmsg參見 sendrecv通過 socket 接收信息recvfrom接收 UDP 信息recvmsg參見 recvlisten監(jiān)聽 socket 端口select對多路同步 I/O 進行輪詢shutdown關閉 socket 上的連接getsockname取得本地 socket 名字getpeername獲取通信對方的 socket 名字getsockopt取端口設置setsockopt設置端口參數(shù)sendfile在文件或端口間傳輸數(shù)據(jù)socketpair創(chuàng)建一對已聯(lián)接的無名 sock

20、et七、用戶管理getuid獲取用戶標識號setuid設置用戶標志號getgid獲取組標識號setgid設置組標志號getegid獲取有效組標識號setegid設置有效組標識號geteuid獲取有效用戶標識號seteuid設置有效用戶標識號setregid分別設置真實和有效的的組標識號setreuid分別設置真實和有效的用戶標識號getresgid分別獲取真實的 ,有效的和保存過的組標識號setresgid分別設置真實的 ,有效的和保存過的組標識號getresuid分別獲取真實的 ,有效的和保存過的用戶標識號setresuid分別設置真實的 ,有效的和保存過的用戶標識號setfsgid設置文件系統(tǒng)檢查時使用的組標

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論