上機(jī)3次os實(shí)驗(yàn)第二部分操作系統(tǒng)算法_第1頁
上機(jī)3次os實(shí)驗(yàn)第二部分操作系統(tǒng)算法_第2頁
上機(jī)3次os實(shí)驗(yàn)第二部分操作系統(tǒng)算法_第3頁
上機(jī)3次os實(shí)驗(yàn)第二部分操作系統(tǒng)算法_第4頁
上機(jī)3次os實(shí)驗(yàn)第二部分操作系統(tǒng)算法_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

實(shí)驗(yàn)三、進(jìn)程調(diào)度算調(diào)度策略的使用方法。練習(xí)進(jìn)程調(diào)度算法的編程和調(diào)試技術(shù)。SCHED_OTHER默認(rèn)的分時(shí)調(diào)度策略( 后兩種于對(duì)響應(yīng)時(shí)間有特殊要求的進(jìn)程,并且會(huì)搶先于SCHED_OTHERSCHED_FIFO調(diào)度策略的進(jìn)程只能被更高優(yōu)先高。具有SCHED_OTHER0。動(dòng)態(tài)優(yōu)先數(shù)與進(jìn)程的執(zhí)行狀態(tài)有關(guān),但可以使用nice命令或系統(tǒng)調(diào)用加大進(jìn)程優(yōu)先數(shù)使其優(yōu)先級(jí)降低,或setpriority分別按進(jìn)程或進(jìn)程組或用戶號(hào)設(shè)置介于-20到+20之間的動(dòng)態(tài)#include<sched.h>#include<sys/time.h>intsched_setscheduler(pid_tpid,int,conststructsched_param*sp); structsched_paramint: 返回值:intgetpriority(intwhich,int 進(jìn)程進(jìn)程組用 intsetpriority(intwhich,intwho,intprio); 進(jìn)程進(jìn)程組用 返回值 在新建文件夾中建立以下名為psched.cC : :(C)2006by :#include<stdio.h>#include<stdlib.h>#include<sched.h>#include<sys/time.h>intmain(intargc,char{intfor(i=0;if((pid[i]=fork())p[i].sched_priorityargv[i+1]NULL)atoi(argv[i+1]):10;sched_setscheduler(pid[i],(argv[i+4]!=NULL)?atoi(argv[i+4]):setpriority(PRIO_PROCESS,pid[i],(argv[i+1]!=NULL)?}for(i=0;i<10;printf("ChildPID=%dpriority}exit(}}printf("Mychild%d is%d\n",pid[0],sched_getscheduler(pid[0]));printf("Mychild%d is%d\n",pid[1],sched_getscheduler(pid[1]));printf("Mychild%d is%d\n",pid[2],sched_getscheduler(pid[2]));returnEXIT_SUCCESS;}在當(dāng) 中建立以下Makefile文件srcs=psched.cobjs=psched.oopts=-g-c psched:gcc$(objs)-opschedpsched.o:$(srcs)gcc$(opts)rmpsched使用make命令編譯連接生成可執(zhí)行文件$makegcc-cgccpsched.o-or$#./psched 5- 00child ischild ischild isChildPID=10773priority=-10ChildPID=10772priority=5ChildPID=10771priority=10ChildPID=10773priority=-10ChildPID=10772priority=5ChildPID=10771priority=10#./psched1051800Mychild isMychild isMychild11308 is1ChildPID=11308priority=18ChildPID=11307priority=5ChildPID=11306priority=10ChildPID=11308priority=18ChildPID=11307priority=5ChildPID=11306priority=可以看出雖然進(jìn)程其優(yōu)先數(shù)最大,但由于其調(diào)度策略為先進(jìn)先出,因此#$SIGINT實(shí)驗(yàn)四、進(jìn)程同步實(shí)Linux系1)共享內(nèi)存是OS內(nèi)核為并發(fā)進(jìn)程間交換數(shù)據(jù)而提供的一塊內(nèi)存區(qū)(段)。如果段的權(quán)限設(shè)置恰當(dāng),每個(gè)要該段內(nèi)存的進(jìn)程都可以把它映射到自己私有的地址空$ipcs-222keyshmid 共享內(nèi)存所由者( 共享內(nèi)存使用權(quán)限(本例為student可讀可寫byte共享內(nèi)存字節(jié)數(shù) linuxipcss$ipcs-------SemaphoreArrays------- 0x4d00f259 beagleind 上例說明當(dāng)前系統(tǒng)中已經(jīng)建立多個(gè)信號(hào)燈。其中最后一個(gè)標(biāo)號(hào)為425996用命令ipcs-q觀察消息隊(duì)列的情況。$ipcs- 0x000001c80 msgmid消息隊(duì)列的標(biāo)used-bytes 6448在權(quán)限允許的情況下您可以使用ip -m -s )linuxproc3ipcs命令顯示的當(dāng)前IPC對(duì)象的信息,它們分別是:/proc/sysvipc/shm/proc/sysvipc/sem/proc/sysvipc/msg6)IPC對(duì)象有關(guān)的系統(tǒng)調(diào)用函數(shù)原型都在以下的頭文件中#include<sys/ipc.h>#includeintshmget(key_tkey,intsize,intsize共享內(nèi)存字節(jié)長度flagshmgetkeyflagsIPC_CREATkeykey關(guān)聯(lián)的標(biāo)識(shí)符。不成功返回-1#includechar*shmat(intshmid,char*shmaddr,intflags) shmaddr0,表示用調(diào)用者指定的指針指向共享段flags共享內(nèi)存權(quán)限位#includeintshmdt(char shmdt調(diào)用成功將遞減附加計(jì)數(shù),當(dāng)計(jì)數(shù)為0,將刪除共享內(nèi)存。調(diào)用不成功#includeintsemget(key_tkey,intnsems,intnsems信號(hào)燈數(shù)組中信號(hào)燈的個(gè)數(shù)semget調(diào)用成功,如果key用新整數(shù)指定flags中設(shè)置IPC_CREAT位,則key已存在則返回與key關(guān)聯(lián)的標(biāo)識(shí)符。不成功返回-1#include<sys/sem.h>intsemop(intsemid,structsembuf*semop,unsignednops); 由semget創(chuàng)建的信號(hào)燈數(shù)組的標(biāo)識(shí)符 指向sembuf數(shù)據(jù)結(jié)構(gòu)的指針 #include<sys/sem.h>intsemctl(intsemid,intsemnum,intcmd,unionsemunarg); 由semget創(chuàng)建的信號(hào)燈數(shù)組的標(biāo)識(shí)符semnum該信號(hào)燈數(shù)組中的第幾個(gè)信號(hào)燈 GETVAL返回當(dāng)前信號(hào)燈狀態(tài)SETVAL設(shè)置信號(hào)燈狀態(tài) unionsemunint /*valueforSETVALsemctl執(zhí)行不成功返回-1,否則返回指定的cmdintmsgget(key_tkey,intflags消息隊(duì)列權(quán)限位。msgget調(diào)用成key用新整數(shù)flagsIPC_CREAT位,則返回一個(gè)新建立的消息隊(duì)列標(biāo)識(shí)符。如果指定的整數(shù)key已存在則返回與key關(guān)聯(lián)的標(biāo)識(shí)符。成功返回-1。追加一條新消息到消息隊(duì)列的系統(tǒng)調(diào)用語法#includeintmsgsnd(intmsqid,structmsgbuf*msgp,size_tmsgsz,intmsg); structmsgbuflong /*char /*消息數(shù)據(jù),長度應(yīng)于msgsz的一致}msgszmsgsnd0,不成功返回-1#includeintmsgrcv(intmsqid,structmsgbuf*msgp,size_tmsgsz, longmsgtype,intmsg); structmsgbuflong /*char /*消息數(shù)據(jù),長度應(yīng)于msgsz的一致} =0>0mtype<0返 #includeintmsgctl(intmsqid,intcmdstructmsqid_ds*buf); msgctl調(diào)用成功返回0,不成功返回-1產(chǎn)者/消費(fèi)者共用的IPC函數(shù)的原型和變量: :(C)2006by* :IPC機(jī)制的函數(shù)原型和全局變#include<stdio.h>#include<stdlib.h>#include<sys/ipc.h>#include<sys/shm.h>#include<sys/sem.h>#include<sys/msg.h>#define intget_ipc_id(char*proc_file,key_tintset_msq(key_tmsq_key,intmsq_flag);intdown(intsem_id);intup(inttypedefunionsemuns{int}/*消息結(jié)構(gòu)體*/typedefstructmsgbuflongmtype;}key_tbuff_key;intbuff_num;key_tpput_key;intkey_tcget_key;intkey_tprod_key;key_tpmtx_key;intprod_sem;intkey_tcons_key;key_tcmtx_key;intcons_sem;intintsem_val;int int 者共用的IPC函數(shù): :(C)2006by* :#includeget_ipc_id從/proc/sysvipc/IPCidpfile:對(duì)應(yīng) msg-消息隊(duì)列,sem-信號(hào)量,shm-共享內(nèi) intget_ipc_id(char*proc_file,key_t{inti,j;charif((pf=fopen(proc_file,"r"))==NULL){perror("Procfilenotopen");}i=j=fgets(line,BUFSZ,pf);while(line[i]=='')i++;while(line[i]!='')colum[j++]=line[i++];colum[j]='\0';while(line[i]=='')while(line[i]!='')colum[j++]=line[i++];colum[j]='\0';returni;}return-1;}信號(hào)燈上的down/upsemid:semnum:intdown(int{buf.sem_op=-1;buf.sem_num=0;buf.sem_=SEM_UNDO;{perror("downerror");}return}intup(int{buf.sem_op=1;buf.sem_num=0;buf.sem_=SEM_UNDO;{perror("uperror");}return}sem_keysem_valsem_flag{intsem_id;//sem_key{if((sem_id=semget(sem_key,1,sem_))<0){}{}}return}shm_keyshm_valshm_flag{inti,shm_id;//shm_keyif((shm_id=get_ipc_id("/proc/sysvipc/shm",shm_key))<0{if((shm_id=shmget(shm_key,shm_num,shm_))<0){}if((shm_buf=(char*)shmat(shm_id,0,0))<(char*)0){}}//shm_key標(biāo)識(shí)的共享內(nèi)存區(qū)已經(jīng)建立,shm_id標(biāo)識(shí)的共享內(nèi)存附加給指shm_bufif((shm_buf=(char*)shmat(shm_id,0,0))<(char{perror("getshareMemory}return}msq_keymsq_flag{int//msq_key{if((msq_id=msgget(msq_key,msq_))<0){}}return}在當(dāng)前新文件夾中建立生產(chǎn)者程序 : :(C)2006by :#includeintmain(intargc,char{intif(argv[1]!=NULL) rate=atoi(argv[1]);elserate buff_key=101;//緩沖區(qū) buff_num=8;//緩沖區(qū) pput_num=1;//指針數(shù)buff_ptr=(char*)set_shm(buff_key,buff_num,shm_prod_key=201;//生產(chǎn)者同步信號(hào)燈鍵值pmtx_key202;//生產(chǎn)者互斥信號(hào)燈鍵值cons_key=301;//消費(fèi)者同步信號(hào)燈鍵值cmtx_key302;//消費(fèi)者互斥信號(hào)燈鍵值sem_=IPC_CREAT|0644;sem_val=buff_num;prod_sem=set_sem(prod_key,sem_val,sem_);sem_val=cons_sem=set_sem(cons_key,sem_val,sem_);sem_val=pmtx_sem=set_sem(pmtx_key,sem_val,sem_);printf("%dproducerput:%cto*pput_ptr=(*pput_ptr+1)%}return}在當(dāng)前新文件夾中建立消費(fèi)者程序 : :(C)by :#includeintmain(intargc,char{intif(argv[1]!=NULL) rate=atoi(argv[1]);elserate buff_key=101;//緩沖區(qū)的鍵值buff_num=8; cget_key=103;//消費(fèi)者取產(chǎn)品指針的鍵值cget_num=1; shm_=IPC_CREAT|0644;//共享內(nèi)存讀寫權(quán)buff_ptr=(char*)set_shm(buff_key,buff_num,shm_//獲取消費(fèi)者取產(chǎn)品指針,cget_ptrcget_ptr=(int*)set_shm(cget_key,cget_num,shm_prod_key=201; pmtx_key=202; cons_key=301; cmtx_key=302; sem_=IPC_CREAT|0644;//信號(hào)燈操作權(quán)限sem_val=buff_num;prod_sem=set_sem(prod_key,sem_val,sem_);sem_val=cons_sem=set_sem(cons_key,sem_val,sem_sem_val=cmtx_sem=set_sem(cmtx_key,sem_val,sem_); *cget_ptr=(*cget_ptr+1)%}return}opts=-g-c_src=consumer.cipc.cp_src=producer.cipc.cp_obj=producer.oipc.o producer $(c_src)$(hdrs)gcc$(opts)gcc$(p_obj)-oproducer $(p_src)$(hdrs)gcc$(opts)rmconsumerproducermgcc-g-cproducer.cgccproducer.oipc.o-oproducergcc-g-cconsumer.cipc.cgccconsumer.oipc.o-o$./producer12263producerput:AtoBuffer[0]12263producerput:BtoBuffer[1]12263producerput:CtoBuffer[2]12263producerput:DtoBuffer[3]12263producerput:EtoBuffer[4]12263producerput:FtoBuffer[5]12263producerput:GtoB

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論