版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
實驗三、進程調(diào)度算調(diào)度策略的使用方法。練習進程調(diào)度算法的編程和調(diào)試技術(shù)。SCHED_OTHER默認的分時調(diào)度策略( 后兩種于對響應時間有特殊要求的進程,并且會搶先于SCHED_OTHERSCHED_FIFO調(diào)度策略的進程只能被更高優(yōu)先高。具有SCHED_OTHER0。動態(tài)優(yōu)先數(shù)與進程的執(zhí)行狀態(tài)有關,但可以使用nice命令或系統(tǒng)調(diào)用加大進程優(yōu)先數(shù)使其優(yōu)先級降低,或setpriority分別按進程或進程組或用戶號設置介于-20到+20之間的動態(tài)#include<sched.h>#include<sys/time.h>intsched_setscheduler(pid_tpid,int,conststructsched_param*sp); structsched_paramint: 返回值:intgetpriority(intwhich,int 進程進程組用 intsetpriority(intwhich,intwho,intprio); 進程進程組用 返回值 在新建文件夾中建立以下名為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;}在當 中建立以下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=可以看出雖然進程其優(yōu)先數(shù)最大,但由于其調(diào)度策略為先進先出,因此#$SIGINT實驗四、進程同步實Linux系1)共享內(nèi)存是OS內(nèi)核為并發(fā)進程間交換數(shù)據(jù)而提供的一塊內(nèi)存區(qū)(段)。如果段的權(quán)限設置恰當,每個要該段內(nèi)存的進程都可以把它映射到自己私有的地址空$ipcs-222keyshmid 共享內(nèi)存所由者( 共享內(nèi)存使用權(quán)限(本例為student可讀可寫byte共享內(nèi)存字節(jié)數(shù) linuxipcss$ipcs-------SemaphoreArrays------- 0x4d00f259 beagleind 上例說明當前系統(tǒng)中已經(jīng)建立多個信號燈。其中最后一個標號為425996用命令ipcs-q觀察消息隊列的情況。$ipcs- 0x000001c80 msgmid消息隊列的標used-bytes 6448在權(quán)限允許的情況下您可以使用ip -m -s )linuxproc3ipcs命令顯示的當前IPC對象的信息,它們分別是:/proc/sysvipc/shm/proc/sysvipc/sem/proc/sysvipc/msg6)IPC對象有關的系統(tǒng)調(diào)用函數(shù)原型都在以下的頭文件中#include<sys/ipc.h>#includeintshmget(key_tkey,intsize,intsize共享內(nèi)存字節(jié)長度flagshmgetkeyflagsIPC_CREATkeykey關聯(lián)的標識符。不成功返回-1#includechar*shmat(intshmid,char*shmaddr,intflags) shmaddr0,表示用調(diào)用者指定的指針指向共享段flags共享內(nèi)存權(quán)限位#includeintshmdt(char shmdt調(diào)用成功將遞減附加計數(shù),當計數(shù)為0,將刪除共享內(nèi)存。調(diào)用不成功#includeintsemget(key_tkey,intnsems,intnsems信號燈數(shù)組中信號燈的個數(shù)semget調(diào)用成功,如果key用新整數(shù)指定flags中設置IPC_CREAT位,則key已存在則返回與key關聯(lián)的標識符。不成功返回-1#include<sys/sem.h>intsemop(intsemid,structsembuf*semop,unsignednops); 由semget創(chuàng)建的信號燈數(shù)組的標識符 指向sembuf數(shù)據(jù)結(jié)構(gòu)的指針 #include<sys/sem.h>intsemctl(intsemid,intsemnum,intcmd,unionsemunarg); 由semget創(chuàng)建的信號燈數(shù)組的標識符semnum該信號燈數(shù)組中的第幾個信號燈 GETVAL返回當前信號燈狀態(tài)SETVAL設置信號燈狀態(tài) unionsemunint /*valueforSETVALsemctl執(zhí)行不成功返回-1,否則返回指定的cmdintmsgget(key_tkey,intflags消息隊列權(quán)限位。msgget調(diào)用成key用新整數(shù)flagsIPC_CREAT位,則返回一個新建立的消息隊列標識符。如果指定的整數(shù)key已存在則返回與key關聯(lián)的標識符。成功返回-1。追加一條新消息到消息隊列的系統(tǒng)調(diào)用語法#includeintmsgsnd(intmsqid,structmsgbuf*msgp,size_tmsgsz,intmsg); structmsgbuflong /*char /*消息數(shù)據(jù),長度應于msgsz的一致}msgszmsgsnd0,不成功返回-1#includeintmsgrcv(intmsqid,structmsgbuf*msgp,size_tmsgsz, longmsgtype,intmsg); structmsgbuflong /*char /*消息數(shù)據(jù),長度應于msgsz的一致} =0>0mtype<0返 #includeintmsgctl(intmsqid,intcmdstructmsqid_ds*buf); msgctl調(diào)用成功返回0,不成功返回-1產(chǎn)者/消費者共用的IPC函數(shù)的原型和變量: :(C)2006by* :IPC機制的函數(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:對應 msg-消息隊列,sem-信號量,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;}信號燈上的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標識的共享內(nèi)存區(qū)已經(jīng)建立,shm_id標識的共享內(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}在當前新文件夾中建立生產(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)者同步信號燈鍵值pmtx_key202;//生產(chǎn)者互斥信號燈鍵值cons_key=301;//消費者同步信號燈鍵值cmtx_key302;//消費者互斥信號燈鍵值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}在當前新文件夾中建立消費者程序 : :(C)by :#includeintmain(intargc,char{intif(argv[1]!=NULL) rate=atoi(argv[1]);elserate buff_key=101;//緩沖區(qū)的鍵值buff_num=8; cget_key=103;//消費者取產(chǎn)品指針的鍵值cget_num=1; shm_=IPC_CREAT|0644;//共享內(nèi)存讀寫權(quán)buff_ptr=(char*)set_shm(buff_key,buff_num,shm_//獲取消費者取產(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;//信號燈操作權(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等.壓縮文件請下載最新的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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版?zhèn)€人短期小額借款合同示范文本
- 2025年度店鋪裝修施工與室內(nèi)綠化設計合同范本
- 教育科技融合小學數(shù)學游戲化學習的實施策略
- 科技助力下的兒童健康成長路徑探索
- 二零二五年度車輛保險理賠設備租賃協(xié)議3篇
- 2025年度個人帶車庫公寓買賣合同書
- 漯河2024年河南漯河市農(nóng)業(yè)農(nóng)村局招聘高層次人才6人筆試歷年參考題庫附帶答案詳解
- 二零二五年度文化產(chǎn)業(yè)園區(qū)運營承包合同書3篇
- 2025年度外墻保溫項目節(jié)能減排與施工總承包協(xié)議4篇
- 朝陽2024年遼寧朝陽師范學院招聘37人筆試歷年參考題庫附帶答案詳解
- 人教版高中生物學新舊教材知識差異盤點
- (權(quán)變)領導行為理論
- 2024屆上海市浦東新區(qū)高三二模英語卷
- 大連高新區(qū)整體發(fā)展戰(zhàn)略規(guī)劃(產(chǎn)業(yè)及功能布局)
- 2024年智慧工地相關知識考試試題及答案
- YY/T 0681.2-2010無菌醫(yī)療器械包裝試驗方法第2部分:軟性屏障材料的密封強度
- GB/T 8005.2-2011鋁及鋁合金術(shù)語第2部分:化學分析
- 不動產(chǎn)登記實務培訓教程課件
- 不銹鋼制作合同范本(3篇)
- 2023年系統(tǒng)性硬化病診斷及診療指南
- 煙氣管道阻力計算
評論
0/150
提交評論