2023年銀行從業(yè)考試個人理財模擬試題參考_第1頁
2023年銀行從業(yè)考試個人理財模擬試題參考_第2頁
2023年銀行從業(yè)考試個人理財模擬試題參考_第3頁
2023年銀行從業(yè)考試個人理財模擬試題參考_第4頁
2023年銀行從業(yè)考試個人理財模擬試題參考_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2023-2023學(xué)年第2學(xué)期操作系統(tǒng)課程設(shè)計規(guī)定:1.每位同學(xué)按學(xué)號尾數(shù)作相應(yīng)的課題,如1號同學(xué)做課題一,2號同學(xué)作課題二。2.允許同學(xué)之間換題。3.允許用不同的方法作課題,即可以在Windows、Linux下采用各種編程語言和開發(fā)工具實現(xiàn)課題所規(guī)定的功能。(所附資料僅供參考)課程設(shè)計報告格式課程設(shè)計目的課題內(nèi)容設(shè)計思緒源代碼運營與測試心得體會

課題一:編寫一個小型命令解決器smallshell一、目的設(shè)計并實現(xiàn)一個簡樸的命令解決程序,名字為smallshell。規(guī)定具有以下基本功能:1.支持交互式的用戶界面2.支持內(nèi)置命令:cd,exit,設(shè)立搜索途徑path等。3.支持可執(zhí)行文獻的運營4.支持輸入輸出重定向功能5.支持管道功能二、準(zhǔn)備知識1.交互式用戶界面在smallshell中,顯示如下格式的交互界面:[sername@servername:pathname]$需要涉及以下函數(shù):#include<uniste.h>char*getlogin(void);/*getlogin函數(shù)返回與當(dāng)前用戶關(guān)聯(lián)的用戶名*/intgethostname(char*name,size_tnamelen);/*gethostname函數(shù)把機器的網(wǎng)絡(luò)名寫到字符串name中,name的長度為namelen,因此該字符串的長度不得超過namelen個字符,函數(shù)成功返回0,否則返回-1。*/#include<unistd>char*getcwd(char*name,size_tsize);/*getcwd函數(shù)返回一個指向當(dāng)前工作目錄的指針,并將當(dāng)前工作目錄存于name中,假如該目錄名長度超過size給出的長度,返回NULL。若size為0,返回-1。*/例如,下面這段程序模仿了pwd命令:#include<stdio.h>#include<unistd.h>#defineVERYBIG200voidmy_pwd(void);main(){my_pwd();}voidmy_pwd(void);{chardirname[VERYBIG];if(getcwd(dirname,VERYBIG)==NULL) printf(“getcwderror”);else printf(“%s”,dirname);}2.支持內(nèi)置命令:cd,exit,設(shè)立搜索途徑path等?假如用戶輸入內(nèi)置命令,smallshell根據(jù)命令名及參數(shù)進行相應(yīng)解決。下面以cd,exit,path命令為例,分別說明其實現(xiàn)所涉及的函數(shù)。?(1)cd命令該命令用于切換當(dāng)前目錄,可以通過chdir()函數(shù)實現(xiàn)。chdir()使當(dāng)前目錄變?yōu)閜ath所指向的目錄,該函數(shù)的用法如下:#include<unistd.h>intchdir(constchar*path);chdir在失敗的情況下返回-1。需要注意的是,chdir只影響調(diào)用進程,并不會影響啟動這個進程的shell進程。例如,使用chdir(“/usr/bin”);可切換到/usr/bin目錄。(2)exit命令?該命令用于退出smallshell,需要調(diào)用exit函數(shù)實現(xiàn),exit函數(shù)用法如下:#include<stdlib.h>?voidexit(intstatus);(3)path命令?該命令用于設(shè)立搜索途徑。可以設(shè)立一個全局變量gpath,實現(xiàn)對搜索途徑的更新。3.支持可執(zhí)行文獻的運營假如用戶輸入的不是內(nèi)置命令,而是一個可執(zhí)行文獻名,則需要在設(shè)立的途徑中搜索該命令,并在此環(huán)境中執(zhí)行??梢酝ㄟ^access()函數(shù)先對該命令進行測試: #include<unistd.h>intaccess(constchar*pathname,intmode);該函數(shù)根據(jù)用戶id測定進程是否具有訪問某個特定文獻的權(quán)限。參數(shù)pathname表達(dá)的是文獻的名字,參數(shù)mode有三種也許的取值,它們的定義在<unistd.h>中可以找到:R_OK調(diào)用進程是否具有讀訪問權(quán)限W_OK調(diào)用進程是否具有寫訪問權(quán)限X_OK調(diào)用進程是否具有執(zhí)行權(quán)限access函數(shù)返回0,表達(dá)用戶對文獻具有訪問權(quán)限,返回-1表達(dá)不具有此種訪問權(quán)限。假如命令可執(zhí)行,下一步是創(chuàng)建smallshell的子進程,之后讓子進程執(zhí)行這個可執(zhí)行文獻。因此需要用到fork和exec類函數(shù)。fork函數(shù)的使用請參考課程實驗指導(dǎo)書,exec類函數(shù)有6個,這里可以用其中的execve()函數(shù),用法如下:#include<unistd.h> intexecve(constchar*pathname,char*constargv[],char*constenvp[];pathname參數(shù)是子進程要執(zhí)行的文獻的途徑名,argv是一個參數(shù)字符串列表,envp是一個環(huán)境變量字符串和值的列表。execve成功不會返回,失敗返回-1.例:cmd=”helloworld”;//helloworld是一個可執(zhí)行文獻char*envp[]={“PATH=/home/stu1”,0};execve(cmd,NULL,envp);//執(zhí)行helloworld4.支持輸入輸出重定向功能每個進程的描述符中包含一個file_struct結(jié)構(gòu),記錄用戶的文獻打開情況,這個結(jié)構(gòu)稱為用戶打開文獻表。并且用戶打開文獻表的信息在fork()和exec()調(diào)用后將仍然保持和繼承。進程的打開文獻表記錄進程已經(jīng)打開的文獻描述符,即指向文獻對象的指針。通常系統(tǒng)為正在執(zhí)行的進程自動打開三個文獻:標(biāo)準(zhǔn)輸入(鍵盤),標(biāo)準(zhǔn)輸出(顯示器),標(biāo)準(zhǔn)錯誤。通常相應(yīng)文獻描述符0,1,2。因此,輸入輸出重定向?qū)嶋H就是將標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出的文獻描述符指向用戶指定的文獻??梢允褂孟铝泻瘮?shù)實現(xiàn):#include<unistd.h>fid=open(constchar*pathname,intflags);intdup2(intoldfd,intnewfd);open函數(shù)打開一個文獻,返回該文獻的描述符。參數(shù)pathname是文獻的途徑名,flag指定文獻存取模式,取值為:O_RDONLY,O_WRONLY,O_RDWR,O_CREATE等。dup2函數(shù)將老的文獻描述符oldfd復(fù)制到新的文獻描述符newfd,即創(chuàng)建一個oldfd的拷貝。例如:fid=open(filename,O_WRONLY|O_CREAT);//以寫的方式創(chuàng)建并打開文獻filenamedup2(fid,1);//將文獻描述符復(fù)制到標(biāo)準(zhǔn)輸出,即輸出時便輸出到新建文獻中,//從而實現(xiàn)了輸出重定向。5.支持管道功能shell中的管道功能是將一個命令的輸出作為另一個命令的輸入??梢杂胮ipe函數(shù)創(chuàng)建無名管道。返回的pipe文獻描述符只能被同一家族的父子進程使用,因此可以用fork函數(shù)和exec函數(shù)創(chuàng)建兩個不同的進程并使其具有父子關(guān)系,之后使一個進程的輸出重定向到管道,另一個進程的輸入重定向到管道,從而實現(xiàn)管道功能。程序框架如下:intfd[2];pipe(fd);if(fork>0){//父進程close(fd[0]);//關(guān)閉用于讀文獻的描述符dup2(fd[1],1);//父進程實現(xiàn)輸出重定向......}else{//子進程close(fd[1]);//關(guān)閉用于寫的文獻描述符dup2(fd[0],0);//子進程實現(xiàn)輸入重定向...... }三、smallshell總體結(jié)構(gòu)交互界面交互界面命令解析內(nèi)部命令可執(zhí)行文獻創(chuàng)建子進程執(zhí)行I/O重定向創(chuàng)建管道?課題二使用SystemV的IPC機制實現(xiàn)“生產(chǎn)者-消費者”問題一、目的學(xué)習(xí)SystemV的進程間通信機制,使用信號量和共享內(nèi)存實現(xiàn)經(jīng)典進程同步問題“生產(chǎn)者-消費者”問題。具體規(guī)定:1.創(chuàng)建信號量集,實現(xiàn)同步互斥信號量。2.創(chuàng)建共享內(nèi)存,模擬存放產(chǎn)品的公共緩沖池。3.創(chuàng)建并發(fā)進程,實現(xiàn)進程對共享緩沖池的并發(fā)操作。二、準(zhǔn)備知識1.信號量集(1)創(chuàng)建信號量集#include<sys/sem.h>intsemget(key_tkey,intnsems,intpermflags);該調(diào)用與文獻的open或creat相似,參數(shù)key是一個標(biāo)記信號量集的數(shù),參數(shù)nsems是信號量集中包含的信號量的個數(shù),元素索引從0到nsems-1,permflags是semget函數(shù)將實現(xiàn)的操作,有兩個值供選擇,在頭文獻<sys/ipc.h>有定義,這兩個值可以單獨使用,也可用“或”位運算符連起來使用:IPC_CREAT:創(chuàng)建一個key所代表的新信號量集,類似于creat。IPC_EXCL:同IPC_CREAT都設(shè)立時,若key相應(yīng)信號量集存在,則返回-1,并將錯誤指示變量errno置EEXIST。例如:semid=semget((key_t)0010,1,0600|IPC_CREAT|IPC_EXCL);注意:這里0600表達(dá)對該信號量集的存取權(quán)限,設(shè)立的方式同文獻存取權(quán)限的設(shè)立一致。0600表達(dá)對信號量集的創(chuàng)建者具有讀寫權(quán)限,對同組用戶和其他用戶無任何權(quán)限。(2)信號量控制#include<sys/sem.h>intsemctl(intsemid,intsem_num,intcommand,unionsemunctl_arg);該函數(shù)可以對semid表達(dá)的信號量集中的第sem_num號信號量執(zhí)行command指示的操作。sem_num是信號量的索引號,注意,索引號從0開始。command給出要完畢何種功能,功能可分為種:標(biāo)準(zhǔn)IPC功能、只對單個信號量起作用的功能、影響整個信號量集的功能。標(biāo)準(zhǔn)IPC函數(shù)IPC_STAT:把狀態(tài)信息放入ctl_arg.bufIPC_SET:用stl_arg.buf中的值設(shè)立信號量的所有權(quán)/許可權(quán)IPC_RMID:從系統(tǒng)中刪除信號量集(此時sem_num參數(shù)忽略)單信號量操作GETVAL:返回信號量的值SETVAL:設(shè)立信號量的值,寫入ctl_arg.valGETPID:返回最后一個對sem_num號信號量執(zhí)行semop操作的進程idGETNCNT:返回等待sem_num號信號量值增長的進程數(shù),即在該信號量上等待的進程數(shù)GETZCNT:返回等待sem_num號信號量值變?yōu)?的進程數(shù)。全信號量操作GETALL:返回所有信號量的值,結(jié)果保存在ctl_arg.array,忽略參數(shù)sem_numSETALL:通過ctl_arg.array更新所有信號量的值。參數(shù)sem_num與上述第二類功能選項一起使用,以針對某一個信號量。參數(shù)ctl_arg是調(diào)用該函數(shù)的進程必須事先定義的一個聯(lián)合體,定義如下;unionsemun{intval;structsemid_ds*buf;unsignedshort*array};unionsemunctl_arg;聯(lián)合體中的三個成員分別相應(yīng)semctl的三個功能,val是針對信號量值的,例如賦初值。結(jié)構(gòu)體semid_ds是IPC_STAT和IPC_SET的緩沖,array針對全信號量操作。(3)信號量操作#include<sys/sem.h>intsemop(intsemid,structsembuf*op_array,size_tnum_ops);該函數(shù)可以實現(xiàn)信號量的p、v操作。參數(shù)semid是信號量集的標(biāo)記符,op_array指向sembuf結(jié)構(gòu)體類型的數(shù)組,參數(shù)num_ops是操作的個數(shù)。下面給出sembuf的結(jié)構(gòu):structsembuf{unsignedshortsem_num;//存放信號量在信號量集合中的索引 ?shortsem_op;//1,-1分別可表達(dá)加一和減一操作,相稱與V、P操作 ?shortsem_flg;//標(biāo)志,設(shè)立SEM_UNDO表達(dá)進程退出時自動還原}例如,下面這段程序可以實現(xiàn)針對一個信號量的P操作:intP(intsemid)? //semid是信號量集的標(biāo)記符{structsembufp_buf;?p_buf.sem_num=0;? p_buf.sem_op=-1;?p_buf.sem_flg=SEM_UNDO;if(semop(semid,&p_buf,1)==-1)//第三個參數(shù)是p_buf指向的sembuf數(shù)組的大小?{perror("p(semid)failed");?exit(1);?}return(0);}2.共享存儲共享存儲操作適得兩個或兩個以上的進程可以共用一段物理內(nèi)存(一般情況下,兩個進程的數(shù)據(jù)區(qū)是完全獨立的,父進程用fork創(chuàng)建子進程后,子進程會復(fù)制父進程數(shù)據(jù)到自己的數(shù)據(jù)區(qū))。(1)創(chuàng)建共享內(nèi)存#include<sys/shm.h>intshmget(key_tkey,size_tsize,intpermflags);參數(shù)key是共享內(nèi)存的標(biāo)記,size是共享內(nèi)存段的最小字節(jié)數(shù),permflags是訪問權(quán)限,值的設(shè)立同semget同樣。(2)共享內(nèi)存的控制#include<sys/shm.h>intshmctl(intshmid,intcommand,structshmid_ds*shm_stat);該函數(shù)semctl相似,command可設(shè)為IPC_STAT,IPC_SET,IPC_RMID。參數(shù)shm_stat指向存放屬性的結(jié)構(gòu)體,具體內(nèi)容請參考手冊。(3)共享內(nèi)存的附接和斷開#include<sys/shm.h>void*shmat(intshmid,constvoid*addr,intshmflags);intshmdt(constvoid*addr);由于兩個函數(shù)需指出進程地址空間中的地址,因此比較復(fù)雜。簡化的方法是將shmat(yī)中的地址設(shè)為NULL。三、程序框架//semaphoreheaderfile#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>#include<errno.h>#include<stdlib.h>#include<stdio.h>#include<unistd.h>typedefunion_semun{//定義聯(lián)合體......}semun;structdat(yī)abuf{//定義“生產(chǎn)者-消費者”問題中存放數(shù)據(jù)的buffer......};stat(yī)icintshmid,semid;voidinitshm(structdatabuf**p)//創(chuàng)建共享存儲區(qū),并附接到調(diào)用進程{......}intinitsem()//創(chuàng)建信號量集,并初始化{......}voidremobj(void)//刪除IPC對象{if(shmctl(shmid,IPC_RMID,NULL)==-1)printf("shmctlerror");if(semctl(semid,IPC_RMID,0)==-1)printf("\nsemctlremobjerror\n");}intP()//定義p操作{......?}intV()//定義v操作{......}voidproducer()//生產(chǎn)者{......}voidconsumer()//消費者{......}main()//主程序{key_tsemkey,shmkey;structdat(yī)abuf*buf;//產(chǎn)品緩沖池......initshm(&buf);//創(chuàng)建共享存儲區(qū),并附接到buf指針指示的位置semid=initsem(semkey);//創(chuàng)建信號量集......//創(chuàng)建若干并發(fā)進程,實現(xiàn)producer與consumer的并發(fā)執(zhí)行 remobj();? ? //刪除IPC對象? ?}?課題三使用SystemV的IPC機制實現(xiàn)“讀者-寫者”問題一、目的學(xué)習(xí)SystemV的進程間通信機制,使用信號量和共享內(nèi)存實現(xiàn)經(jīng)典進程同步問題“讀者-寫者”問題。具體規(guī)定:1.創(chuàng)建信號量集,實現(xiàn)互斥信號量。2.創(chuàng)建共享內(nèi)存,將“讀者-寫者”共享的文獻保存其中,并保存讀者共享的計數(shù)值。3.創(chuàng)建并發(fā)進程,實現(xiàn)“讀者-寫者”的并發(fā)操作。二、準(zhǔn)備知識見課題二三、程序框架//semaphoreheaderfile#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>#include<errno.h>#include<stdlib.h>#include<stdio.h>#include<unistd.h>typedefunion_semun{//定義聯(lián)合體......}semun;staticintshmid,semid;voidinitshm(structdatabuf**p)//創(chuàng)建共享存儲區(qū),并附接到調(diào)用進程{......}intinitsem()//創(chuàng)建信號量集,并初始化{......}voidremobj(void)//刪除IPC對象{if(shmctl(shmid,IPC_RMID,NULL)==-1)printf("shmctlerror");if(semctl(semid,IPC_RMID,0)==-1)printf("\nsemctlremobjerror\n");}intP()//定義p操作{...... }intV()//定義v操作{......}voidreader()//讀者{......}voidwriter()//寫者{......}main()//主程序{key_tsemkey,shmkey;int*readercount//讀者計數(shù)值......initshm(&readercount);//創(chuàng)建共享存儲區(qū),并附接到readercount指針指示的位置semid=initsem(semkey);//創(chuàng)建信號量集......//創(chuàng)建若干并發(fā)進程,實現(xiàn)producer與consumer的并發(fā)執(zhí)行 remobj(); ? //刪除IPC對象? }

課題四運用信號量和多線程機制實現(xiàn)“哲學(xué)家進餐”問題一、目的學(xué)習(xí)多線程編程,使用線程的同步機制實現(xiàn)“哲學(xué)家進餐”問題。具體規(guī)定:1.創(chuàng)建POSIX線程,實現(xiàn)多線程的并發(fā)執(zhí)行,驗證多線程共享進程資源的特性。2.使用互斥量和條件變量,或使用信號量實現(xiàn)線程的同步互斥。3.驗證“哲學(xué)家進餐”問題中的死鎖情況,并加以解決。二、準(zhǔn)備知識一方面,請自學(xué)課程教材中關(guān)于線程同步的內(nèi)容。POSIX線程函數(shù)庫(pthread)為多線程編程提供了一套支持函數(shù),這些函數(shù)在頭文獻pthread.h中定義,所有多線程程序都必須包含這個頭文獻。由于pthread庫不是Linux系統(tǒng)的庫,所以編譯時,需要用-lpthread選項來鏈接線程庫。1.創(chuàng)建線程intpthread_create(pthread_t*thread,//線程id指針pthread_at(yī)tr_t*attr,//線程屬性指針??? void*(start_routine)(void*),//返回void類型的指針函數(shù) ???void*arg);//start_routine的形參該函數(shù)成功返回0,失敗返回非0值。例:/*theexamplefileiscreatethread.c*/#include<pthread.h>#include<stdio.h>void*create(void*arg)//新線程執(zhí)行的函數(shù){inti;for(i=0;i<10;i++)printf("%dnewthreadcreated%c\n",i,*(char*)arg);pthread_exit(NULL);//退出線程}intmain(intargc,char*argv[])//程序從主函數(shù)開始{pthread_tp_thread;//線程IDintret;chara='A';charb='B';ret=pthread_creat(yī)e(&p_thread,NULL,create,(void*)&a);//創(chuàng)建新線程執(zhí)行create函數(shù),傳遞參數(shù)acreate((void*)&b);//主線程執(zhí)行此函數(shù),傳遞參數(shù)b}編譯時使用命令:gcc-lpthread-ocreatethreadcreatethread.c2.等待子線程結(jié)束#include<pthread.h>intpthread_join(pthread_tp_thread,void**stat(yī)us);該函數(shù)的第一個參數(shù)是線程的ID,第二個參數(shù)為子線程返回的值,該函數(shù)返回0表達(dá)成功,非0為失敗。下面給出“觀測者-報告者”線程并發(fā)的例子,體會多線程共享數(shù)據(jù)也許導(dǎo)致的問題。#include<pthread.h>#include<stdio.h>staticintcount=10;void*observer(void*arg)//觀測者執(zhí)行的函數(shù){inti;for(i=0;i<100;i++)printf("observer%dcount=%d\n",i,(*(int*)arg)++);pthread_exit(NULL);//退出線程}void*reporter(void*arg)//報告者執(zhí)行的函數(shù){inti;for(i=0;i<100;i++){printf("%dcount=%d\n",i,*(int*)arg);*(int*)arg=0;}pthread_exit(NULL);//退出線程}intmain(intargc,char*argv[])//主函數(shù){pthread_tp1_thread,p2_thread;//線程IDpthread_create(&p1_thread,NULL,observer,(void*)&count);//創(chuàng)建新線程pthread_create(&p2_thread,NULL,reporter,(void**)&count);pthread_join(p1_thread,NULL);//主線程等待子線程結(jié)束pthread_join(p2_thread,NULL);}3.互斥鎖互斥鎖可以解決線程之間互斥訪問資源的問題。當(dāng)一個線程鎖定一個互斥量后,可以執(zhí)行臨界區(qū),而此時另一個線程若要鎖定互斥量,將被掛起,直到前一個線程解鎖該互斥量后,后一個線程才干再次鎖定互斥量,并進入臨界區(qū)訪問。創(chuàng)建互斥量前,必須先聲明一個類型為pthread_mutex_t的變量,并對它初始化,例如:pthread_nutex_t=PTHREAD_MUTEX_INITIALIZER;//該初始化可創(chuàng)建一個快速互斥量下面三個函數(shù)分別用來鎖定互斥量,解鎖互斥量以及銷毀互斥量intpthread_mutex_lock(pthread_mutex_t*mutex);intpthread_mutex_unlock(pthread_mutex_t*mutex);intpthread_mutex_destroy(pthread_mutex_t*mutex);三個函數(shù)執(zhí)行對的時,返回0。4.條件變量通?;コ饬颗c條件變量同時使用,用互斥量實現(xiàn)線程互斥,用條件變量實現(xiàn)線程間的同步。條件變量是一種使線程等待某些事件發(fā)生的機制。線程等待一個條件變量,直到另一個線程給該條件變量發(fā)送一個信號將該線程喚醒。(1)創(chuàng)建條件變量創(chuàng)建條件變量時,必須先聲明一個類型為pthread_cond_t類型的變量,并進行初始化??梢院啒愕厥褂靡粋€宏P(guān)THREAD_COND_INITIALIZER或調(diào)用pthread_cond_init()函數(shù)。例如:pthread_cond_tgot_request=PTHREAD_COND_INITIALIZER需要注意的是,PTHREAD_COND_INITIALIZER是一個結(jié)構(gòu),只能在條件變量聲明時對它進行初始化,運營時對條件變量初始化必須使用pthread_cond_init()函數(shù)。(2)向條件變量發(fā)信號向條件變量發(fā)出信號,可以喚醒等待這個條件變量的一個線程或所有線程(廣播方式),使用下面兩個函數(shù)可以實現(xiàn):intpthread_cond_signal(&got_request);//got_request是一個已經(jīng)對的初始化的條件變量intpthread_cond_broadcast(&got_request);//廣播函數(shù)成功時返回0,失敗時返回非0值。(3)守候條件變量pthread_cond_wait(pthread_cond_t*restrictcond,pthread_mutex_t*restrictmutex);pthread_cond_timewait(pthread_cond_t*restrictcond,pthread_mutex_t*restrictmutex,conststructtimespec*restrictabstime);這兩個函數(shù)將使調(diào)用線程阻塞在條件變量上,并解鎖互斥量(為避免競爭使用條件變量,在守候條件變量前必須加鎖互斥量),第二個函數(shù)中,允許用戶給定一個超時間隔,過了時間間隔,函數(shù)就返回,返回值為ETIMEDOUT。而第一個函數(shù)若沒有收到信號將一直等下去。進一步說明上述兩個守候條件變量的函數(shù):在守候條件變量前,先對互斥量加鎖,然后調(diào)用守候函數(shù),這時,線程阻塞去等候條件,并解鎖互斥量,之后,當(dāng)某個線程向這個條件變量發(fā)出信號便會喚醒等候的線程。(4)銷毀條件變量intpthread_cond_destory(pthread_cond_t*cond);成功時返回0,失敗時返回非0值。三、程序框架#include<pthread.h>

#include<stdio.h>

#include<errno.h>?......//聲明條件變量和互斥量,以及線程共享的數(shù)據(jù)voidP()?{pthread_mutex_lock();?......pthread_cond_wait();//等待條件變量

......pthread_mutex_unlock();?......}

voidV()?{pthread_mutex_lock();

......pthread_cond_signal();?pthread_mutex_unlock();?}

void*creat(yī)e(void*arg)//新線程執(zhí)行的函數(shù)?{intph_no;//哲學(xué)家編號ph_no=*(int*)arg;

......?P(ph_no);

P((ph_no+1)%5);

printf("theno%dphilosopherdining\n",ph_no);

V(ph_no);?V((ph_no+1)%5);?pthread_exit(NULL);

}?main()

{pthread_tp_thread[5];//線程ID

intph_no[5],ret,i;//ph_no為哲學(xué)家編號?pthread_create();///創(chuàng)建5個哲學(xué)家線程

......

}?}

?課題五基于消息緩沖通信實現(xiàn)客戶進程與服務(wù)者進程間的通信一、目的學(xué)習(xí)SystemV的進程間通信機制,使用消息緩沖通信實現(xiàn)多個客戶進程和一個服務(wù)進程之間的通信。具體規(guī)定:1.創(chuàng)建多個客戶進程,以及一個服務(wù)進程。2.創(chuàng)建兩個公共消息隊列,一個用于客戶進程向服務(wù)進程發(fā)送請求,一個用于服務(wù)進程向客戶進程返回結(jié)果。3.客戶進程發(fā)送請求,并阻塞接受結(jié)果,服務(wù)進程接受請求并完畢服務(wù)后返回結(jié)果給相應(yīng)的客戶進程。二、準(zhǔn)備知識一方面,請復(fù)習(xí)課程教材中關(guān)于消息緩沖通信的內(nèi)容。消息緩沖所涉及的系統(tǒng)調(diào)用如下:1.建立消息隊列#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>intmsqid=msgget(key_tkey,intmsgflg);其中,key是消息隊列的關(guān)鍵字,是通信雙方約定的一個長整型數(shù)。key有以下兩個取值:(1)IPC_PRIVATE:表達(dá)建立一個私有消息隊列。(2)正整數(shù):表達(dá)建立一個公共的消息隊列。Msgflg是消息隊列的創(chuàng)建方式,有兩個取值,這兩個值可以單獨使用,也可用“或”位運算符連起來使用:(1)IPC_CREAT:創(chuàng)建一個key所代表的新消息隊列,類似于create。(2)IPC_EXCL:同IPC_CREAT同時使用時,若key相應(yīng)消息隊列存在,則返回-1,并將錯誤指示變量errno置EEXIST,單獨使用時無意義。此外,還可以設(shè)立消息隊列的存取權(quán)限。調(diào)用該消息隊列系統(tǒng)調(diào)用時,若key=0,則創(chuàng)建一個消息隊列,若key≠0,在消息隊列中查找關(guān)鍵字是key的消息隊列,假如找到,且有權(quán)訪問,則返回消息隊列標(biāo)記,假如無權(quán)訪問則犯錯返回,假如沒有找到,且msgflg具有IPC_CREAT標(biāo)志,則創(chuàng)建一個消息隊列,并返回消息隊列標(biāo)記。例如:msqid=msgget(123,0600|IPC_CREAT|IPC_EXCL);注意:這里0600表達(dá)對該消息隊列的存取權(quán)限,設(shè)立的方式同文獻存取權(quán)限的設(shè)立一致。0600表達(dá)對消息隊列的創(chuàng)建者具有讀寫權(quán)限,對同組用戶和其他用戶無任何權(quán)限。2.向消息隊列發(fā)送消息#include<sys/msg.h>intmsgsnd(intmsqid,void*msgp,size_tmsgsz,intmsgflg);其中,msqid是消息隊列標(biāo)記,msgp是指向用戶區(qū)要發(fā)送的消息的指針,msgsz是要發(fā)送的消息正文的字節(jié)數(shù),msgflg是同步標(biāo)志,當(dāng)發(fā)送消息的某個條件不滿足時,若msgflg中的IPC_NOWAIT標(biāo)志未設(shè)立(即=0),發(fā)送進程阻塞等待,直到將消息掛入消息隊列,若IPC_NOWAIT標(biāo)志已設(shè)立,發(fā)送進程立即返回。該函數(shù),成功時返回實際發(fā)送的字節(jié)數(shù),錯誤時返回-1。3.接受消息#include<sys/msg.h>intmsgrcv(intmsqid,void*msgp,size_tmsgsz,longmsgtyp,intmsgflg);其中,msqid是消息隊列標(biāo)記,msgp是指向用戶接受消息的指針,msgsz是要接受的消息正文的字節(jié)數(shù),msgflg是同步標(biāo)志,當(dāng)接受消息的某個條件不滿足時,若msgflg中的IPC_NOWAIT標(biāo)志未設(shè)立(即=0),接受進程阻塞等待,直到接受到消息為止,若IPC_NOWAIT標(biāo)志已設(shè)立,接受進程立即返回。Msgtyp是要接受的消息類型,msgtyp=0,表達(dá)接受消息隊列中的第一個消息,若msgtyp>0,則接受消息隊列中與msgtyp相同的第一個消息,若msgtyp<0,則接受消息隊列中類型值小于msgtyp絕對值且類型值最小的消息。該函數(shù)成功時,返回接受消息的正文長度,錯誤時,返回-1。三、程序框架系統(tǒng)規(guī)定最少設(shè)立三個客戶進程,一個服務(wù)進程,客戶進程將請求(四則運算)提交給服務(wù)進程,服務(wù)進程從消息隊列1接受后進行服務(wù)(進行運算,求得四則運算表達(dá)式的結(jié)果),將結(jié)果發(fā)送到消息隊列2,客戶進程從消息隊列2接受屬于自己的結(jié)果。//client1.c#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#defineSDKEY75//SDKEY是發(fā)送請求的消息隊列關(guān)鍵字,是一個公共消息隊列#defineRVKEY76//RVKEY是接受結(jié)果的消息隊列關(guān)鍵字,也是一個公共消息隊列structmsgform{//消息的格式longmtype;/*消息類型*/charmtext[N];/*消息正文*/}……//client2.c……//client3.c……//server.c……

課題六銀行家算法模擬一、目的1.加深了解資源申請、避免死鎖等概念。2.體會避免死鎖的具體實行方法——銀行家算法的實現(xiàn)過程。3.進一步提高軟件開發(fā)能力。二、規(guī)定1.復(fù)習(xí)銀行家算法,設(shè)計一個具有若干(不少于3種)資源和若干

溫馨提示

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

評論

0/150

提交評論