![2023年操作系統(tǒng)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)四_第1頁](http://file4.renrendoc.com/view/4bbb8eb80f158bcae9d9370a31c4281b/4bbb8eb80f158bcae9d9370a31c4281b1.gif)
![2023年操作系統(tǒng)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)四_第2頁](http://file4.renrendoc.com/view/4bbb8eb80f158bcae9d9370a31c4281b/4bbb8eb80f158bcae9d9370a31c4281b2.gif)
![2023年操作系統(tǒng)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)四_第3頁](http://file4.renrendoc.com/view/4bbb8eb80f158bcae9d9370a31c4281b/4bbb8eb80f158bcae9d9370a31c4281b3.gif)
![2023年操作系統(tǒng)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)四_第4頁](http://file4.renrendoc.com/view/4bbb8eb80f158bcae9d9370a31c4281b/4bbb8eb80f158bcae9d9370a31c4281b4.gif)
![2023年操作系統(tǒng)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)四_第5頁](http://file4.renrendoc.com/view/4bbb8eb80f158bcae9d9370a31c4281b/4bbb8eb80f158bcae9d9370a31c4281b5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
實(shí)驗(yàn)四:進(jìn)程管理(二)實(shí)驗(yàn)內(nèi)容:.編寫一個(gè)程序,打印進(jìn)程的如下信息:進(jìn)程標(biāo)記符,父進(jìn)程標(biāo)記符,真實(shí)用戶ID,有效用戶|D,真實(shí)用戶組ID,有效用戶組IDo并分析真實(shí)用戶ID和有效用戶ID的區(qū)別。源代碼及結(jié)果:/include<stdltb.h>#tnclude<stdto.h>#include<untstd.h>intmain(){printf("progress:\nH);printf(MPID:%d\nM,getpid());printf(MPPID:%d\nH,getppid());printf(MUID:%d\nH,getuid());printf(EUID:%d\nM,geteutd());printf('GID:%d\nM,getgtd());printf(MEGID:%d\nn,getegid());)blank@blank-Vi.rtua'LBox:*$?progress:PID:3856PPID:1787UID:1000EUID:1O00GID:1000EGID:1O00blank@blank-VlrtualBox:一$真實(shí)用戶ID和有效用戶ID的區(qū)別:真實(shí)用戶ID:這個(gè)ID就是我們登陸unix系統(tǒng)時(shí)的身份IDo有效用戶ID:定義了操作者的權(quán)限。有效用戶ID是進(jìn)程的屬性,決定了該進(jìn)程對(duì)文獻(xiàn)的訪問權(quán)限。.閱讀如下程序,編譯并運(yùn)營,分析進(jìn)程執(zhí)行過程的時(shí)間消耗(總共消耗的時(shí)間和CPU消耗的時(shí)間),并解釋執(zhí)行結(jié)果。再編寫一個(gè)計(jì)算密集型的程序替代grep,比較兩次時(shí)間的花銷。注釋程序重要語句。/*叩rocessusingtime*/incIude<stdio.h>incIude<stdlib.h>#include<sys/times.h>#include<time.h>#incIude<unistd.h>#include<stdio.h>#include<stdlib.h>#include<sys/time.h>#tnclude<sys/resource.h>#include<untstd.h>main(){pid_tpid;intstatus;|pid=fork();if(ptd>0){〃在父進(jìn)程中設(shè)置子進(jìn)程優(yōu)先級(jí)setpriority(PRIO_PROCESS,ptd,15);prtntf(Hthepriorityofsonprocessis%d\nM,getpriortty(PRIO_PROCESS,pid));}一else{〃子迸程執(zhí)行shell命令find/-namehda*的功能execlp(Mfindn,?'find",H-nameH,whda*\(char*)6);exit(O);)wait(O);printf(Mchild[%d]terminated\nM,pid);exit(O);}程序運(yùn)營結(jié)果:?O?user@ubuntu:~/usr/share/alsa/intt/hda/usr/src/linux-headers-3.2.0-54/inc'lude/sound/hda_hwdepehthepriorityofsonprocessis15child[4731]terminated(END)?00use「@ubuntu:?find:'/proc/3551/task/3551/ns1:權(quán)限不夠find:'/proc/3551/fd1:權(quán)限不夠find:'/proc/3551/fdinfo':權(quán)限不夠find:'/proc/3551/ns1:權(quán)限/夠find:'/proc/4364/task/4364/fd1:權(quán)限不夠find:'/proc/4364/task/4364/fdinfo*:權(quán)俊不筋find:'/proc/4364/task/4364/ns,:權(quán)限/夠find:'/proc/4364/fd1:權(quán)限不夠find:'/proc/4364/fdinfo':權(quán)限不夠find:'/proc/4364/ns1:權(quán)限木夠find:%/proc/4383/task/4383/fd,:權(quán)限不夠find:'/proc/4383/task/4383/fdinfo1:權(quán)限不夠find:'/proc/4383/task/4383/ns1:權(quán)限/夠find:'/proc/4383/fd1:權(quán)限不夠find:'/proc/4383/fdinfo':權(quán)限不夠find:'/proc/4383/ns1:權(quán)限不夠find:'/proc/4646/task/4646/fd1:權(quán)限不夠find:'/proc/4646/task/4646/fdinfo,:權(quán)限不夠find:'/proc/4646/task/4646/ns1:權(quán)限/夠find:'/proc/4646/fd1:權(quán)限不夠find:'/proc/4646/fdinfo':權(quán)限不夠find:'/proc/4646/ns1:權(quán)限不夠find:'/root1:權(quán)限不夠find:'/sys/fs/fuse/connections/191:權(quán)限不夠find:'/sys/kernel/debug1:權(quán)限不夠thepriorityofsonprocessis15child[4731]terminated./**編寫程序,規(guī)定父進(jìn)程創(chuàng)建一個(gè)子進(jìn)程,子進(jìn)程對(duì)一個(gè)50*50的字符數(shù)組賦值,由父進(jìn)程改變子進(jìn)程的優(yōu)先級(jí),觀測不同優(yōu)先級(jí)進(jìn)程使用CPU的時(shí)間。*/.查閱Linux系統(tǒng)中structtask_struct的定義,說明每項(xiàng)成員的作用。a注:searchin/usr/src/linux-2.6/incIude/linux/sched.h廣義上,所有的進(jìn)程信息被放在一個(gè)叫做進(jìn)程控制塊的數(shù)據(jù)結(jié)構(gòu)中,可以理解為進(jìn)程屬性的集合。每個(gè)進(jìn)程在內(nèi)核中都有一個(gè)進(jìn)程控制塊(PCB)來維護(hù)進(jìn)程相關(guān)的信息,Linux內(nèi)核的進(jìn)程控制塊是task_struct結(jié)構(gòu)體。task_struct是Linux內(nèi)核的一種數(shù)據(jù)結(jié)構(gòu),它會(huì)被裝載到RAM里并且包含著進(jìn)程的信息。每個(gè)進(jìn)程都把它的信息放在task_struct這個(gè)數(shù)據(jù)結(jié)構(gòu)里,task_st「uct包含了這些內(nèi)容:(1)標(biāo)示符:描述本進(jìn)程的唯一標(biāo)示符,用來區(qū)別其他進(jìn)程。⑵狀態(tài):任務(wù)狀態(tài),退出代碼,退出信號(hào)等。a(3)優(yōu)先級(jí):相對(duì)于其他進(jìn)程的優(yōu)先級(jí)。49)程序計(jì)數(shù)器:程序中即將被執(zhí)行的下一條指令的地址。(5)內(nèi)存指針:涉及程序代碼和進(jìn)程相關(guān)數(shù)據(jù)的指針,尚有和其他進(jìn)程共享的內(nèi)存塊的指針。(6)上下文數(shù)據(jù):進(jìn)程執(zhí)行時(shí)解決器的寄存器中的數(shù)據(jù)。(7)I/O狀態(tài)信息:涉及顯示的I/0請(qǐng)求,分派給進(jìn)程的1/0設(shè)備和被進(jìn)程使用的文獻(xiàn)列表。a(8)記賬信息:也許涉及解決器時(shí)間總和,使用的時(shí)鐘數(shù)總和,時(shí)間限制,記賬號(hào)?!觥觥觥觥觥霰4孢M(jìn)程信息的數(shù)據(jù)結(jié)構(gòu)叫做task_struet,并且可以在inc1ude/Iinux/sched.h里找到它。A所有運(yùn)營在系統(tǒng)里的進(jìn)程都以task.struct鏈表的形式存在內(nèi)核里。進(jìn)程的信息可以通過/proc系統(tǒng)文獻(xiàn)夾查看。task_struct一些字段的介紹:.調(diào)度數(shù)據(jù)成員(1)voIatilelongstates;表達(dá)進(jìn)程的當(dāng)前狀態(tài)2)unsigned1ongflags;進(jìn)程標(biāo)志33)Iongpriority冷進(jìn)程優(yōu)先級(jí)。優(yōu)先級(jí)可通過系統(tǒng)調(diào)用sys_setpriorty改變。unsigned1ongrt_priority;Art_priority給出實(shí)時(shí)進(jìn)程的優(yōu)先級(jí),rt_priority+1000給出進(jìn)程每次獲取CPU后可使用的時(shí)間(同樣按jiffies計(jì))。實(shí)時(shí)進(jìn)程的優(yōu)先級(jí)可通過系統(tǒng)調(diào)用sys_sched_setscheduIer()改變(見kerne1/sched.c)。Iongcounter;在輪轉(zhuǎn)法調(diào)度時(shí)表達(dá)進(jìn)程當(dāng)前還可運(yùn)營多久。在進(jìn)程開始運(yùn)營是被賦為priority的值,以后每隔一個(gè)tick(時(shí)鐘中斷)遞減1,減到0時(shí)引起新一輪調(diào)度。重新調(diào)度將從run_queue隊(duì)列選出counter值最大的就緒進(jìn)程并給予CPU使用權(quán),因此counter起到了進(jìn)程的動(dòng)態(tài)優(yōu)先級(jí)的作用(priority則是靜態(tài)優(yōu)先級(jí))。unsignedIongpoIicy;該進(jìn)程的進(jìn)程調(diào)度策略,可以通過系統(tǒng)調(diào)用sys_sched_setscheduler()更改(見kernel/schecLc)。調(diào)度策略有:a?SCHED_OTHER0非實(shí)時(shí)進(jìn)程,基于優(yōu)先權(quán)的輪轉(zhuǎn)法(「。undrobin)o^?sCHED_FIFO1實(shí)時(shí)進(jìn)程,用先進(jìn)先出算法。a?SCHED_RR2實(shí)時(shí)進(jìn)程,用基于優(yōu)先權(quán)的輪轉(zhuǎn)法。號(hào)解決a(1)unsignedIongsignaI;進(jìn)程接受到的信號(hào)。每位表達(dá)一種信號(hào),共32種。置位有效。⑵unsignedlongblocked泠進(jìn)程所能接受信號(hào)的位掩碼。置位表達(dá)屏蔽,復(fù)位表達(dá)不屏蔽。structsignaI_struct*sig;由于signa1和bIocked都是32位的變量,Linux最多只能接受32種信號(hào)。對(duì)每種信號(hào),各進(jìn)程可以由PCB的sig屬性選擇使用自定義的解決函數(shù),或是系統(tǒng)的缺省解決函數(shù)。指派各種信息解決函數(shù)的結(jié)構(gòu)定義在include/linux/sched.h中。對(duì)信號(hào)的檢查安排在系統(tǒng)調(diào)用結(jié)束后,以及“慢速型”中斷服務(wù)程序結(jié)束后(IRQ#_interrupt()o幺.進(jìn)程隊(duì)列指針a(l)structtask_struet*next_task,*prev_task;所有進(jìn)程(以PCB的形式)組成一個(gè)雙向鏈表。next_task和就是鏈表的前后指針。鏈表的頭和尾都是init_task(即0號(hào)進(jìn)程)。2(a)structtask_struct*next_run,*prev_run;由正在運(yùn)營或是可以運(yùn)營的,其進(jìn)程狀態(tài)均為TASK_RUNNING的進(jìn)程所組成的一個(gè)雙向循環(huán)鏈表,即run_queue就緒隊(duì)列。該鏈表的前后向指針用nextn和prev_run,鏈表的頭和尾都是inittask(即。號(hào)進(jìn)程)。structtask_struct*p—opptr,*p_pptr;和structtask_struct*p_cptr,*p_ysptr,*p_ospt「泠以上分別是指向原始父進(jìn)程(originalparent)x父進(jìn)程(parent)、子進(jìn)程(youngestchild)及新老兄弟進(jìn)程(youngersibIing,oldersibling)的指針。a4.進(jìn)程標(biāo)記(1)unsignedshortuid,gid;uid和gid是運(yùn)營進(jìn)程的用戶標(biāo)記和用戶組標(biāo)記。2(a)intgroups[NGROUPS]泠與多數(shù)現(xiàn)代UNIX操作系統(tǒng)同樣,Linux允許進(jìn)程同時(shí)擁有一組用戶組號(hào)。在進(jìn)程訪問文獻(xiàn)時(shí),這些組號(hào)可用于合法性檢查。3(a)unsignedshorteuid,egid;aeuid和egid又稱為有效的uid和gid。出于系統(tǒng)安全的權(quán)限的考慮,運(yùn)營程序時(shí)要檢查euid和egid的合法性。通常,uid等于euid,gid等于egid。有時(shí)候,系統(tǒng)會(huì)賦予一般用戶暫時(shí)擁有r。ot的uid和gid(作為用戶進(jìn)程的euid和egid),以便于進(jìn)行運(yùn)作。a(4)unsignedshortfsuid,fsgid;fsuid和fsgid稱為文獻(xiàn)系統(tǒng)的uid和gid,用于文獻(xiàn)系統(tǒng)操作時(shí)的合法性檢查,是Linux獨(dú)特的標(biāo)記類型。它們一般分別和euid和egid一致,但在NFS文獻(xiàn)系統(tǒng)中NFS服務(wù)器需要作為一個(gè)特殊的進(jìn)程訪問文獻(xiàn),這時(shí)只修改客戶進(jìn)程的fsuid和fsgIdo⑸unsignedshortsuid,sgid;asuid和sgid是根據(jù)POSIX標(biāo)準(zhǔn)引入的,在系統(tǒng)調(diào)用改變uid和gid時(shí),用于保存真正的uid和gid。intpid,pgrp,session;進(jìn)程標(biāo)記號(hào)、進(jìn)程的組織號(hào)及session標(biāo)記號(hào),相關(guān)系統(tǒng)調(diào)用(見程序kernel/sys.c)有sys_setpgidxsys_getpgid、sys_setpgrp、sys_getpgrpxsys_getsid及sys_setsid幾種。intleader;^是否是session的主管,布爾量。5A.時(shí)間數(shù)據(jù)成員(1)unsignedlongtimeout泠用于軟件定期,指出進(jìn)程間隔多久被重新喚醒。采用tick為單位。2(a)unsignedIongit_reaI_vaIue,it_real_iner;用于itimer(interva1timer)軟件定期。采用jiffies為單位,每個(gè)tick使it_reaI—value減到。時(shí)向進(jìn)程發(fā)信號(hào)SIGALRM,并重新置初值。初值由it—reaI—incr保存。具體代碼見kernel/itimer.c中的函數(shù)it_real_fn()o(3)structtimer_Iistrea1—timer;一種定期器結(jié)構(gòu)(Linux共有兩種定期器結(jié)構(gòu),另一種稱作oldjimer)。數(shù)據(jù)結(jié)構(gòu)的定義在incIude/1inux/timer.h中,相關(guān)操作函數(shù)見kernel/sched.c中add_time1()和del_timer()等。4(a)unsignedlongit_virt_vaIue,it_virt_incr泠關(guān)于進(jìn)程用戶態(tài)執(zhí)行時(shí)間的itimer軟件定期。采用jiffies為單位。進(jìn)程在用戶態(tài)運(yùn)營時(shí),每個(gè)tick使it_virevalue減1,減至lj0時(shí)向進(jìn)程發(fā)信號(hào)SIGVTALRM,并重新置初值。初值由it_virt_incr保存。具體代碼見kernel/sched.c中的函數(shù)do_it_virt()o(5)unsignedlongit_prof_value,it_prof_incr;同樣是itimer軟件定期。采用jiffies為單位。不管進(jìn)程在用戶態(tài)或內(nèi)核態(tài)運(yùn)營,每個(gè)tick使it_prof_value減1,減至lj0時(shí)向進(jìn)程發(fā)信號(hào)SIGPROF,并重新置初值。初值由it_prof_incr保存。具體代碼見kernel/sched.c中的函數(shù)do_it_prof。(6)1ongutime,stime,cutime,cstime,start_time;以上分別為進(jìn)程在用戶態(tài)的運(yùn)營時(shí)間、進(jìn)程在內(nèi)核態(tài)的運(yùn)營時(shí)間'所有層次子進(jìn)程在用戶態(tài)的運(yùn)營時(shí)間總和、所有層次子進(jìn)程在核心態(tài)的運(yùn)營時(shí)間總和,以及創(chuàng)建該進(jìn)程的時(shí)間。信號(hào)量數(shù)據(jù)成員structsem_undo*semundo泠進(jìn)程每操作一次信號(hào)量,都生成一個(gè)對(duì)本次操作的undo操作,它由sem_undo結(jié)構(gòu)描述。這些屬于同一進(jìn)程的undo操作組成的鏈表就由semundo屬性指示。當(dāng)進(jìn)程異常終止時(shí),系統(tǒng)會(huì)調(diào)用undo操作。sem_undo的成員semadj指向一個(gè)數(shù)據(jù)數(shù)組,表達(dá)各次undo的量。結(jié)構(gòu)定義在include/linux/sem.h。2(a)structsem_queue*semsleepin每一信號(hào)量集合相應(yīng)一個(gè)sem_queue等待隊(duì)列(J41include/Iinux/sem.h)o進(jìn)程因操作該信號(hào)量集合而阻塞時(shí),它被掛到semsleeping指示的關(guān)于該信號(hào)量集合的sem—queue隊(duì)列。反過來,semsIeeping。sleeper指向該進(jìn)程的PCB。7.進(jìn)程上下文環(huán)境4(1)structdesc_struct*ldt;進(jìn)程關(guān)于CPU段式存儲(chǔ)管理的局部描述符表的指針,用于仿真WINEWindows的程序。其他情況下取值NULL,進(jìn)程的Idt就是arch/i386/traps.c定義的default」dt。structthread_structtssM壬務(wù)狀態(tài)段,其內(nèi)容與INTEl_CPU的TSS相應(yīng),如各種通用寄存器CPU調(diào)度時(shí),當(dāng)前運(yùn)營進(jìn)程的TSS保存到PCB的tss,新選中進(jìn)程的tss內(nèi)容復(fù)制到CPU的TSSo結(jié)構(gòu)定義在incIude/linux/tasks,h中。a(3)unsigned1ongsaved_kernel_stack凈為MS-DOS的仿真程序(或叫系統(tǒng)調(diào)用vm86)保存的堆棧指針。a(4)unsignedlongkerne1_stack_page;在內(nèi)核態(tài)運(yùn)營時(shí),每個(gè)進(jìn)程都有一個(gè)內(nèi)核堆棧,其基地址就保存在kernel_stack_page中。必.文獻(xiàn)系統(tǒng)數(shù)據(jù)成員(1)struetfs_struct*fs;afs保存了進(jìn)程自身與VFS的關(guān)系消息,其中root指向根目錄結(jié)點(diǎn),pwd指向當(dāng)前目錄結(jié)點(diǎn),umask給出新建文獻(xiàn)的訪問模式(可由系統(tǒng)調(diào)用umask更改),count是Linux保存的屬性,如下頁圖所示。結(jié)構(gòu)定義在include/linux/sched.h中。structfiles_struct*files;files包含了進(jìn)程當(dāng)前所打開的文獻(xiàn)(structfile*fd[NR_OPEN])。在Linux中,一個(gè)進(jìn)程最多只能同時(shí)打開NR_OPEN個(gè)文獻(xiàn)。并且,前三項(xiàng)分別預(yù)先設(shè)立為標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和犯錯(cuò)消息輸出文獻(xiàn)。intlink_count;c文獻(xiàn)鏈(link)的數(shù)目。Array.內(nèi)存數(shù)據(jù)成員a(1)structmm_struet*mm;a在1inux中,采用按需分頁的策略解決進(jìn)程的內(nèi)存需求。task_struct的數(shù)據(jù)成員mm指向關(guān)于存儲(chǔ)管理的mm_struct結(jié)構(gòu)。其中包含了一個(gè)虛存隊(duì)列mmap,指向由若干vm_area_struct描述的虛存塊。同時(shí),為了加快訪問速度,mm中的mmap_avl維護(hù)了一個(gè)AVL樹。在樹中,所有的vm_area_struct虛存塊均由左指針指向相鄰的低虛存塊,右指針指向相鄰的高虛存塊。結(jié)構(gòu)定義在incIude/linux/sched.h中。voidtime_print(char*,clock_t);intmain(void){〃取得進(jìn)程運(yùn)營相關(guān)的時(shí)間eclocktstart,end;structtmst_start,t_end;start=times(&t_start);。system("grepthe/us「/doc/*/*>/dev/nuI12〉/dev/nuH");/"command>/dev/nulI的作用是將是command命令的標(biāo)準(zhǔn)輸出丟棄,而標(biāo)準(zhǔn)錯(cuò)誤輸出還是在屏幕上。一般來講標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出都是屏幕,因此錯(cuò)誤信息還是會(huì)在屏幕上輸出。>/dev/nu1I2>/dev/nu1I標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯(cuò)誤輸出都會(huì)被丟棄*///012標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸出錯(cuò)誤輸出//>將信息放到該文獻(xiàn)nuI1中nd=times(&t_end);otime_printf'elapsed'end—start);叩uts("parenttimes");“time_print(叭tuserCPU”,匚end.tms_utime);time_print(“\tsysCPU”,t_end.tms_stime);gputs("childtimes");time_print(6C\tuserCPU",t_end.tmscutime);time_print("\tsysCPU“J_end.tms_cstime);exit(EXIT_SUCCESS);
voidtime_print(chartr,clock_ttime)Iongtps=sysconf(_SC_CLK_TCK);/*函數(shù)syscon千()的作用為將時(shí)鐘滴答數(shù)轉(zhuǎn)化為秒數(shù),—SC_CLK_TCK為定義每秒鐘有多少個(gè)滴答的宏興/printf("%s:%6,2fsecs'rT,str,(fIoat)time/tps);)程序運(yùn)營結(jié)果:/Include#include#include#include/Include<stdto.h>/Include#include#include#include/Include<stdto.h><stdltb.h><sys/ttmes.h><ttme.h><untstd.h>voidtime_print(char*,clock_t);tntmatn(){clock_tstart,end;structtmst_start,tend;start=ttmes(&t_start);system("grepthe/usr/doc/*/*>/dev/null2>/dev/null");end=times(&t_end);time_prtnt("elapsed",end-start);puts("parenttimes");ttme_prtnt("\tuserCPUH,t_end.tms_utime);time_prtnt(M\tsysCPU",t_end.tms_sttme);puts("childtimes0);time_print("\tuserCPU,',t_end.tms_cutime);time_prtnt(H\tsysCPU",t_end.tms_cstime);extt(EXIT_SUCCESS);voidtine_prtnt(char*str,clock_tttme){longtps=sysconf(_SC_CLK_TCK);prtntf("%s:%6.2fsecs\n",str,(float)time/tps);C-制表符寬度:8^第20行,第1列▼插入文件(F)編輯(E)查看(V)搜索(S)終端(T)幫助(H)blank@blank-VirtualBox:~$gcc4-2.c-o4-2blank@blank-VirtualBox:-$~/4-2elapsed:0.O8secsparenttimesuserCPU:O.OOsecssysCPU:O.OOsecschildtimesuserCPU:O.OOsecssysCPU:O.OOsecsblank@blank-VirtualBox:?/4-2elapsed:0.21secsparenttimesuserCPU:0.00secssysCPU:O.OOsecschildtimesuserCPU:O.OOsecssysCPU:O.Olsecsblank@blank-VirtualBox:~$?/4?2elapsed:O.OlsecsparenttimesuserCPU:O.OOsecssysCPU:O.OOsecschildtimesuserCPU:O.OOsecssysCPU:O.OOsecsblank@blank-VirtualBox:**$?/4?2由于該程序計(jì)算量很小,故消耗的時(shí)間比較少,CPU消耗時(shí)間均為0.OOsecs局限性為奇。而進(jìn)程的執(zhí)行時(shí)間等于用戶CPU時(shí)間和系統(tǒng)CPU時(shí)間加從硬盤讀取數(shù)據(jù)時(shí)間之和。密集型的程序替代grep:#include<stdio.h>又件(F)編輯(E)查看(V)搜索(S)終端(T)幫助(H)#include<stdlib.h>499][438]=937a[499][439]=938a[499][440]=939a[#tnclude<sys/ttmes.h>499][441]=940a[499][442]=941a[499][443]=942a[#include<ttme.h>499][444]=943a[499][445]=944a[499][446]=945a[/Include<unistd.h>499][447]=946a[499][448]=947a[499][449]=948a[voidtime_print(char*,clock_t);499][450]=949a[499][451]=950a[499][452]=951a[intmain(){499][453]=952a[499][454]=953a[499][455]=954a[clock_tstart,end;499][456]=955a[499][457]=956a[499][458]=957d[structtmst_start,t_end;499][459]=958a[499][460]=959a[499][461]=960a[start=times(&t_start5;499][462]=961a[499][463]=962a[499][464]=963a[intm=50O,n=5O0,i,j;499][465]=964a[499][466]=965a[499][467]=966a[inta[5O0][50O];499][468]=967a[499][469]=968a[499][470]=969a[for(i=0;499][471]=970a[499][472]=971a[499][473]=972a[for(j=0;j<n;j++)499][474]=973a[499][475]=974a[499][476]=975a[499][477]=976a[499][478]=977a[499][479]=978a[}499][480]=979a[499][481]=980a[499][482]=981d[for(i=0;i<m;i++){499][483]=982a[499][484]=983a[499][485]=984a[for(j=0;j<n;j++)499][486]=985a[499][487]=986a[499][488]=987a[printf(*'a[%d][%d]=%d\tn,i,j,a[i][j]);j499][489]=988a[499][490]=989a[499][491]=990a[prtntf(n\n");499][492]=991a[499][493]=992a[499][494]=993d[}499][495]=994a[499][496]=995a[499][497]=996a[end=times(&t_end);499][498]=997a[499][499]=998time_print("elapsed",end-start);elapsed:1.77secsputs("parenttimes'*);parenttimestime_print(H\tuserCPU",t_end.tms_utime);userCPU:0.04secstime_print("\tsysCPU",t_end.tms_stime);sysCPU:0.24secsputs("chlldtimes");childtimestime_print(H\tuserCPU",t_end.tms_cutime);userCPU:O.OOsecstime_print(H\tsysCPU",t_end.tms_cstime);sysCPU:0.O0secsextt(EXIT_SUCCESS);blank@blank-VirtualBox>-$J||)更改為計(jì)算密集型的之后就較容易觀測出消耗時(shí)間的差異。3.閱讀下列程序,編譯并多次運(yùn)營,觀測執(zhí)行輸出順序,說明順序相同(或不同)的因素;觀測進(jìn)程ID,分析進(jìn)程ID的分派規(guī)律??偨Y(jié)fork()的使用方法。注釋程序重要語句。/*forkusage*/#include<unistd,h>#incIude<stdio.h>#include<stdlib.h>intmain(void)(pid_tchild;“f((child=fork0)=—1){8。perror("fork”);oexit(EXIT_FAILURE);。}elseif(chiId==0){8puts("inchild");3printf(“\tchildpid=%d\n':getpid());。叩rintff\tchildppid=%d\n”,getppid());“exit(EXIT_SUCCESS);}else{gputs(“inparent");eprintf("\tparentpid=%d\n,9,getpid());。。printf("\tparentppid=%d\n",getppid());00}8exit(EXIT_SUCCESS);程序運(yùn)營結(jié)果:user@ubuntu:~$~/4?3inparentparentpid=2872parentppid=2680inchildchildpid=2873childppid=1use「@ubuntu:~$user@ubuntu:~$~/4?3inparentparentpid=2874parentppid=2680Inchildchildpid=2875childppid=1user@ubuntu:~$~/4?3inparentparentpid=2876parentppid=2680inchildchildpid=2877childppid=1user@ubuntu:-$~/4-3inparentparentpid=2879parentppid=2680inchildchildpid=2880childppid=1use「@ubuntu:~$~/4-3(?)創(chuàng)建進(jìn)程ID開始時(shí)一般隨機(jī)分派,但若多次運(yùn)營,或創(chuàng)建子進(jìn)程時(shí),會(huì)順序分派內(nèi)存。此外,當(dāng)父進(jìn)程結(jié)束時(shí),子進(jìn)程尚未結(jié)束,則子進(jìn)程的父進(jìn)程ID變?yōu)閘oMork()函數(shù)的實(shí)質(zhì)是一個(gè)系統(tǒng)調(diào)用(和write函數(shù)類似),其作用是創(chuàng)建一個(gè)新的進(jìn)程,當(dāng)一個(gè)進(jìn)程調(diào)用它,完畢后就出現(xiàn)兩個(gè)幾乎一模同樣的進(jìn)程,其中由fork()創(chuàng)建的新進(jìn)程被稱為子進(jìn)程,而本來的進(jìn)程稱為父進(jìn)程。子進(jìn)程是父進(jìn)程的一個(gè)拷貝,即子進(jìn)程從父進(jìn)程得到了數(shù)據(jù)段和堆棧的拷貝,這些需要分派新的內(nèi)存;而對(duì)于只讀的代碼段,通常使用共享內(nèi)存方式進(jìn)行訪問。4.閱讀下列程序,編譯并運(yùn)營,等待或者按人C,分別觀測執(zhí)行結(jié)果并分析,注釋程序重要語句。flag有什么作用?通過實(shí)驗(yàn)說明。/*usageofkiI1,signal,wait*/include<unistd.h>include<stdio.h>include<sys/types.h>include<signal.h>intflag;voidstop();//自定義函數(shù),使flag=O,供signal調(diào)用intmain(void){“ntpidl,pid2;signal(3,stop);//signaI()依參數(shù)3指定的信號(hào)編號(hào)來設(shè)立該信號(hào)的解決函數(shù)while((pid1=fork())==-1);〃程序等待成功創(chuàng)建子進(jìn)程事件的發(fā)生if(pidl>0){〃當(dāng)前進(jìn)程為父進(jìn)程owhiIe((pid2=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專賣店裝修項(xiàng)目承攬合同
- 倉儲(chǔ)物流行業(yè)居間存款協(xié)議
- 辦公區(qū)翻新合同
- 物業(yè)人員疏散方案
- 通遼管道非開挖施工方案
- 2025年度安全產(chǎn)品銷售代表市場拓展合同
- 大數(shù)據(jù)四下數(shù)學(xué)試卷
- 買鋼筋合同范例
- 完善中小學(xué)體育教師隊(duì)伍建設(shè)的策略與實(shí)施途徑
- 臨時(shí)聘用廚師合同范例
- 2024年江蘇省公務(wù)員錄用考試《行測》題(A類)
- 工業(yè)自動(dòng)化生產(chǎn)線操作手冊(cè)
- 2024年10月時(shí)政100題(附答案)
- 《走進(jìn)神奇》說課稿
- 江蘇省無錫市2024年中考數(shù)學(xué)試卷(含答案)
- 2024年內(nèi)蒙古中考語文試卷五套合卷附答案
- 2024年保密知識(shí)測試試題及答案(奪冠)
- 湖南2024年湖南省衛(wèi)生健康委直屬事業(yè)單位招聘276人筆試歷年典型考題及考點(diǎn)附答案解析
- SF-36生活質(zhì)量調(diào)查表(SF-36-含評(píng)分細(xì)則)
- 五年級(jí)下冊(cè)語文教案 學(xué)習(xí)雙重否定句 部編版
- 不需公證的遺囑范文
評(píng)論
0/150
提交評(píng)論