操作系统实验题目及实验报告要求 - 图文 联系客服

发布时间 : 星期日 文章操作系统实验题目及实验报告要求 - 图文更新完毕开始阅读a671c7375a8102d276a22f1e

//发送信号,把信号量的数值加1,此处相当于对信号量进行V操作 sem_op.sem_num=0; sem_op.sem_op=1; sem_op.sem_flg=0;

semop(sem_set_id,&sem_op,1); }

//子进程写文件

void do_child_loop(int sem_set_id,char *file_name){ pid_t pid=getpid(); int i,j;

for(i=0;i<3;i++){

update_file(sem_set_id,file_name,pid); for(j=0;j<4000000;j++); } }

int main(int argc,char **argv) {

int sem_set_id; //信号量集的ID

union semun sem_val; //信号量的数值,用于semctl() int child_pid; int i; int rc;

// 建立信号量集,ID是250,其中只有一个信号量 sem_set_id=semget(SEM_ID,1,IPC_CREAT|0600); if(sem_set_id==-1){

perror(\ exit(1); }

//把第一个信号量的数值设置为1 sem_val.val=1;

rc=semctl(sem_set_id,0,SETVAL,sem_val); if(rc==-1) {

perror(\ exit(1); }

//建立一些子进程,使它们可以同时以竞争的方式访问信号量 for(i=0;i

perror(\ case 0: //子进程

do_child_loop(sem_set_id,FILE_NAME); exit(0);

default: //父进程接着运行 break; } }

//等待子进程结束

for(i=0;i

printf(\ fflush(stdout); return 0; }

2.模拟PV操作同步机构,且用PV操作解决生产者——消费者问题。

模拟PV操作同步机构,且用PV操作解决生产者——消费者问题。 [提示]:

(1) PV操作同步机构,由P操作原语和V操作原语组成,它们的定义如下:

P操作原语P(s):将信号量s减去1,若结果小于0,则执行原语的进程被置成等待信号量s的状态。

V操作原语V(s):将信号量s加1,若结果不大于0,则释放一个等待信号量s的进程。 这两条原语是如下的两个过程:

procedure p (var s: semaphore); begin s:=s-1; if s<0 then W(s) end {p}

procedure v (var s: semaphore); begin s: =s+1; if s<=0 then R(s) end {V}

其中W(s)表示将调用过程的进程置为等待信号量s的状态;R(s)表示释放一个等待信号量s的进程。

在系统初始化时应把semaphore定义为某个类型,为简单起见,在模拟实验中可把上述的semaphore直接改成integer。

(2)生产者——消费者问题。

假定有一个生产者和消费者,生产者每次生产一件产品,并把生产的产品存入共享缓冲器以供消费者取走使用。消费者每次从缓冲器内取出一件产品去消费。禁止生产者将产品放入已满的缓冲器内,禁止消费者从空缓冲器内取产品。假定缓冲器内可同时存放10件产品。那么,用PV操作来实现生产者和消费者之间的同步,生产者和消费者两个进程的程序如下:

B:array [0..9] of products; s1,s2: semaphore; IN, out; integer; IN:=0;out:=0; cobegin

procedure producer; c: products; begin L1:

produce (c); p (s1); B[IN]:=C;

IN:=(IN+1)mod 10; v(s2); goto L1 end;

procedure consumer; x: products; begin

L2:P(s2); x:=B[out];

out:=(out+1) mod 10; v(s1);

consume(x); goto L2

end;

coend

其中的semaphore和products是预先定义的两个类型,在模拟实现中semaphore用integer或char等代替。

(3)进程控制块PCB。

为了纪录进程执行时的情况,以及进程让出处理器后的状态,断点等信息,每个进程都有一个进程控制块PCB。在模拟实验中,假设进程控制块的结构如图4-1。其中进程的状态有:运行态、就绪态、等待态和完成态。当进程处于等待态时,在进程控制块PCB中要说明进程等待原因(在模拟实验中进程等待原因为等待信号量s1或s2);当进程处于等待态或就绪态时,PCB中保留了断点信息,一旦进程再度占有处理器则就从断点位置继续运行;当进程处于完成状态,表示进程执行结束。

进程名

状态

等待原因

断点

图4-1 进程控制块结构

(4)处理器的模拟。

计算机硬件提供了一组机器指令,处理器的主要职责是解释执行机器指令。为了模拟生产者和消费者进程的并发执行,我们必须模拟一组指令和处理器职能。

模拟的一组指令见图4-2,其中每条指令的功能由一个过程来实现。用变量PC来模拟“指令计数器”,假设模拟的指令长度为1,每执行一条模拟指令后,PC加1,指出下一条指令地址。使用模拟的指令,可把生产者和消费者进程的程序表示为图4-3的形式。

定义两个一维数组PA[0..4]和SA[0..4],每一个PA[i]存放生产者程序中的一条模拟指令执行的入口地址;每个SA[i]存放消费者程序中的一条模拟指令执行的入口地址。于是模拟处理器执行一条指令的过程为:取出PC之值,按PA[PC] 或SA[PC]得模拟指令执行的入口地址,将PC之值加1,转向由入口地址确定的相应的过程执行。

(5)程序设计

本实验中的程序由三部分组成:初始化程序、处理器调度程序、模拟处理器指令执行程序。各部分程序的功能及相互间的关系由图4-4至图4-7指出。

模拟的指令 P(s) V(s) put GET produce consume GOTO L NOP 执行P操作原语 执行v操作原语 B[IN]:=product;IN:=(IN+1) mod 10 X:=B[out];out:=(out+1) mod 10 输入一个字符放入C中 打印或显示x中的字符 PC: L 空操作 功能

图4-2 模拟的处理器指令

序号 0 1 2 3 4 生产者程序 produce P(s1) PUT V(s2) goto 0 消费者程序 P(s2) GET V(s1) consume goto 0