实验报告五生产者和消费者问题概要x
时间:2020-10-28 12:41:49 来源:勤学考试网 本文已影响 人
实验报告五
——生产者和消费者问题
姓名:丛菲 学号: 20100830205 班级:信息安全二班
一、实习内容
? 1、模拟操作系统中进程同步和互斥
? 2、实现生产者和消费者问题的算法实现
二、实习目的
? 1、熟悉临界资源、信号量及 PV 操作的定义与物理意义
? 2、了解进程通信的方法
? 3、掌握进程互斥与进程同步的相关知识
? 4、掌握用信号量机制解决进程之间的同步与互斥问题
? 5、实现生产者-消费者问题,深刻理解进程同步问题
三、实习题目
? 在 Linux 操作系统下用 C 实现经典同步问题:生产者 — 消费者,具体要求如下:
一个大小为 10 的缓冲区,初始状态为空。
2 个生产者,随机等待一段时间,往缓冲区中添加数据,若缓冲区已满,等待消 费者取走数据之后再添加,重复 10 次。
2 个消费者,随机等待一段时间,从缓冲区中读取数据,若缓冲区为空,等待生 产者添加数据之后再读取,重复 10 次。
? 提示
本实验的主要目的是模拟操作系统中进程同步和互斥。在系统进程并发执行 异步推进的过程中,由于资源共享和进程间合作而造成进程间相互制约。进程间的 相互制约有两种不同的方式。
间接制约。这是由于多个进程共享同一资源(如 CPU 、共享输入 /输出设备)
而引起的,即共享资源的多个进程因系统协调使用资源而相互制约。
直接制约。
只是由于进程合作中各个进程为完成同一任务而造成的, 即并发进
程各自的执行结果互为对方的执行条件,从而限制各个进程的执行速度。
生产者和消费者是经典的进程同步问题,在这个问题中,生产者不断的向缓冲
区中写入数据,而消费者则从缓冲区中读取数据。生产者进程和消费者对缓冲区的
操作是互斥,即当前只能有一个进程对这个缓冲区进行操作,生产者进入操作缓冲
区之前,先要看缓冲区是否已满,如果缓冲区已满,则它必须等待消费者进程将数
据取出才能写入数据,同样的,消费者进程从缓冲区读取数据之前,也要判断缓冲
区是否为空,如果为空,则必须等待生产者进程写入数据才能读取数据。
在本实验中, 进程之间要进行通信来操作同一缓冲区。
一般来说, 进程间的通信根据通信内 容可以划分为两种: 即控制信息的传送与大批量数据传送。
有时, 也把进程间控制在本实验 中,进程之间要进行通信来操作同一缓冲区。
一般来说, 进程间的通信根据通信内容可以划 分为两种: 即控制信息的传送与大批量数据传送。
有时, 也把进程间控制信息的交换称为低 级通信,而把进程间大批量数据的交换称为高级通信。
目前,计算机系统中用得比较普遍的高级通信机制可分为 3 大类:共享存储器系统、 消 息传递系统及管道通信系统。
? 共享存储器系统 共享存储器系统为了传送大量数据,在存储器中划出一块共享存储区,诸进程可通过对 共享存储区进行读数据或写数据以实现通信。
进程在通信之前, 向系统申请共享存储区中的 一个分区,并为它指定一个分区关键字。
信息的交换称为低级通信,而把进程间大批量数 据的交换称为高级通信。
目前,计算机系统中用得比较普遍的高级通信机制可分为 3 大类:共享存储器系统、消息 传递系统及管道通信系统。
? 消息传递系统
在消息传递系统中, 进程间的数据交换以消息为单位, 在计算机网络中被称为报文。
消息传 递系统的实现方式又可以分为以下两种:
(1)直接通信方式
发送进程可将消息直接发送给接收进程, 即将消息挂在接收进程的消息缓冲队列上, 而接收 进程可从自己的消息缓冲队列中取得消息。
(2)间接通信方式
发送进程将消息发送到指定的信箱中, 而接收进程从信箱中取得消息。
这种通信方式又称信 箱通信方式, 被广泛地应用于计算机网络中。
相应地, 该消息传递系统被称为电子邮件系统。
? 管道通信系统
向管道提供输入的发送进程, 以字符流方式将大量的数据送入管道, 而接收进程从管道中接 收数据。由于发送进程和接收进程是利用管道进行通信的,故称为管道通信。
为了协调发送和接收双方的通信,管道通信机制必须提供以下 3 方面的协调功能。
(1)互斥
当一个进程正在对 pipe 文件进行读或写操作时,另一个进程必须等待。
(2)同步 当写进程把一定数量的数据写入 pipe 文件后,便阻塞等待,直到读进程取走数据后,再把 写进程唤醒。
(3)确认对方是否存在
只有确定对方已存在时, 才能进行管道通信,否则会造成因对方不存在而无限制地等待。 在
这个问题当中,我们采用信号量机制进行进程之间的通信, 设置两个信号量,空的信号量和
满的信号量。在Linux系统中,一个或多个信号量构成一个信号量集合。使用信号量机制可
以实现进程之间的同步和互斥, 允许并发进程一次对一组信号量进行相同或不同的操作。 每
个P、V操作不限于减1或加1,而是可以加减任何整数。在进程终止时,系统可根据需要 自动消除所有被进程操作过的信号量的影响
?缓冲区采用循环队列表示,利用头、尾指针来存放、读取数据,以及判断队列是否为空。
缓冲区中数组大小为 10;
?利用随机函数rand()得到A?Z的一个随机字符,作为生产者每次生产的数据, 存放到缓
冲区中;
使用shmget()系统调用实现共享主存段的创建, shmget()返回共享内存区的ID。对于已
经申请到的共享段,进程需把它附加到自己的虚拟空间中才能对其进行读写。
4?信号量的建立采用 semget()函数,同时建立信号量的数量。在信号量建立后,调用semctl() 对信号量进行初始化,例如本实习中,可以建立两个信号量 SEM_EMPTY、SEM_FULL ,
初始化时设置 SEM_EMPTY为10, SEM_FULL为0。使用操 作信号的函数semop()做排除 式操作,使用这个函数防止对共享内存的同时操作。对共享内存操作完毕后采用 shmctl()函
数撤销共享内存段。
5?使用循环,创建 2个生产者以及2个消费者,采用函数 fork()创建一个新的进程。
6?—个进程的一次操作完成后,采用函数 fflush()刷新缓冲区。
7.程序最后使用semctl()函数释放内存。
模拟程序的程序流程图如下所示:
1?主程序流程图:
退出」
2?生产者进程流程图
3?消费者进程流程图
|X sem_idT S EM_FU L L)
v<?m id,册N FMPn i
P操作流程图
stiuct sembufpc;
pc.seMi_num=
pc.SHfli_qp=-l;
pc.sem_flg = 0,
s&irinp^s&^id, fepc, !);+■'
退出」
5.V操作流程图
退出屮
四、实现代码为:
// exet5.cpp
〃#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#define mSIZE 3
#define pSIZE 20
staticintmemery[mSIZE] = {0};
staticint process[pSIZE] = {0};
//static int process[pSIZE] = {2,3,2,1,5,2,4,5,3,2,5,2};
//static int process[pSIZE]
{7,10,1,2,10,3,10,4,2,3,10,3,2,1,2,10,1,7,10,1};
void build();
void LRU();
int main(intargc, char *argv[])
{
printf("Random sequence is as follows:\n");
build();
printf("\nlnvoking LRU Algorithn: \n");
LRU();
return 0;
}
void build()
{
inti = 0;
for(i=0; i<pSIZE; i++)
{
process[i] = (int)(10.0*rand()/(RAND_MAX));
printf("%d ",process[i]);
}
printf("\n");
}
void LRU()
{
int flag[mSIZE] = {0};
inti = 0, j = 0;
int m = -1, n = -1;
int max = -1,maxflag = 0;
int count = 0;
for(i = 0; ivpSIZE; i++)
{
for(j=0; jvmSIZE; j++){
for(j=0; jvmSIZE; j++)
{
if(memery[j] == 0)
{
m = j;
break;
}
}
//Find if there are same processes for(j = 0; j <mSIZE; j++)
{
if(memery[j] == process[i])
{
n = j;
}
}
//Find free PB
for(j = 0; j <mSIZE;j++)
{
if(flag[j]>maxflag)
{
maxflag = flag[j];
max = j;
}
}
if(n == -1) // Find no same process
{
if(m != -1) // find free PB
{
memery[m] = process[i];
flag[m] = 0;
for(j = 0;j <= m; j++)
{
flag[j]++;
}
m = -1;
}
else //NO find free PB
{
memery[max] = process[i];
flag[max] = 0;
for(j = 0;j <mSIZE; j++)
{ {
{ {
flag[j]++;
}
max = -1;
maxflag = 0;
count++;
}
}
else // Find same process
{
memery[n] = process[i];
flag[n] = 0;
if(m != -1) //find free PB
{
flag[m] = 0;
}
for(j = 0;j vmSIZE; j++)
五、在虚拟机上的具体操作及结果
flag[j]++;
}
max = -1;
maxflag = 0;
n = -1;
}
for(j = 0 ;j <mSIZE; j++)
{
printf("%d ",memery[j]);
}
printf("\n");
}
printf("\nThe times of page conversion is: %d\n",count);
}
I 寧三町 四 3. D3:Z1:55 wwgbo0file £dliL Jiiew dearth IeohCotumeriiljb 圧Ip
I 寧三町 四 3. D3:Z1:55 wwgbo0
file £dliL Jiiew dearth Ieoh
Cotumeriiljb 圧Ip
I eseSx Q
excS.c〔T - godit
untto
Find
■include
?Include
^include
^include
RE
In ■ ?; // Eu^Qft
art ■ ?; // £G-WGEi3uA-|iAi*4A
buff[H] - {6}; // >?,i3eeF? i<8£-' l ■乍哇土忌蔚工肇" t entity // 匸^询肛糾昶r piAuA^^+xeOiEuzub€-
t full tf 上—罰肛皿丘"|HA*ZUA- LtX^D1!^ - N
?tdlib.h> cunifitd.h> <pthreadlJh> ^seraphore.h>
"tu?辆E皿)1〕刖卯關站为畝
^define N J
^define H 1€ ff 卯
lnt int int
i?[i
ser
pthre^d ex t iii讥ex: // ^5
int product id - l; //^nJuOBid
lnt prochtu Jd ■ o; //iQ-NbBid
执行exe5.c文件
选择 Applications Acecessories Terminal,执行文件:
S CjIculdLcra CTiaracuriM^p二 Disk Analyser显 MrHUL^e Pt fi( jNk.<,FasswordE and Encryption Ke屮Ttm' inalUse tie cc"irraTd lineZ TCKC Ediior?oor 呱四圻 3. OJ 17j3& wangtwE |亜.T^ke Screerishcrt—:File system it Networic一
S CjIculdLcr
a CTiaracuriM^p
二 Disk Analyser
显 MrHUL^e Pt fi( jNk
.<,FasswordE and Encryption Ke屮
Ttm' inal
Use tie cc"irraTd line
Z TCKC Ediior
?oo
r 呱四圻 3. OJ 17j3& wangtwE |
亜.T^ke Screerishcrt
—:File system it Networic
一 Floppy Dfiv& j. Ubuntu 9.04a!B
孑 Tomboir Notes
CD/DVD Creator
1 Ubon Lu
_iV ALLes&oriH
>1
>
j- Graphic
>
“ Internet I
>
鮭 Office
>
sound & video
>
r/ Adcl#RemDye.?
Places
一寸 Tra&h
_l
Wk
M SJt
#in?j
tmrl fLncl
ExeS-t
exei
^3
Qxn outer
SesrcD
i 100%
氓 ItaD View
V
依次预处理
错误显示为很多头文件没有预定义。连续查找之后得知原因是链接不上 pthread
库
在执行命令后面加上-pthread,即新命令格式为:gcc -oexe5exe5.—pthread,重 新执行后的结果显示如下截图:
!亨丘 9 IK 1 月 3?03:28;4S wangbo Q
?x?5.c (*) - gedlt
=
wangbotSwangbo-desktop:"
二 C2L
Applications Places System
■
File Edit Yiew Ienninal Help
I C UbtmUi
wangbo^/anqbo ? desktop:
7 g“
0
exe5 exe5
c ?Ipthread
3
wdnabo<Vanat>o-desktOD:*?$ ?/exeS
productl in o. like:
1 e
e
0
e
6
6
e
e
0
=
product2 in 1. like:
1 1
8
0
e
e
e
9
e
0
consumed? in e. Uke:
d 1
e
0
e
e
e
e
e
0
consumedl in 1? li“:
e e
e
0
e
e
6
e
e
9
productl in 2? Uke:
9 e
1
0
e
e
e
e
e
e
product2 in 3. like:
e e
1
1
e
0
e
3
e
e
consumed2 in 2? like:
9 e
e
1
0
0
6
e
e
e
consunedl in 3. like;
9 0
e
0
e
0
e
e
e
0
productl in 4. like:
0 0
e
0
1
0
6
0
e
0
product2 in 5. like:
o e
e
0
1
1
e
e
e
e
consumed? in 4. like:
e e
8
9
e
1
6
3
e
e
consumedl in 5. like:
e e
B
9
e
?
e
e
e
e
productl in 6. like:
b e
B
0
B
0
1
3
6
e
product2 in 7. like:
o e
e
0
0
e
1
1
e
e
consumed2 in 6. like:
e e
e
0
e
e
6
1
e
0
consumedl in 7. Uke:
o e
e
0
e
0
6
9
0
e
productl in 8. like:
e e
e
0
e
6
e
e
1
e
product2 in 9. like:
8 e
e
0
e
o
e
3
1
1
consumed2 in 8? like;
e e
e
0
e
e
e
3
e
1
consumedl in 9. like:
9 G
8
0
e
e
e
e
e
9
productl in 0. like:
1 6
e
0
8
0
6
9
e
0
pro(iuct2 in 1. like:
1 1
e
0
e
e
6
e
e
9
Ijft Ubuntu
! v 4 牢匹 1 月 3.03:29 40 wangboM
匚I r x
exeS.c (*) - gedit
File Edit view Terminal Help
o
e
e
e
4
0
e
0
9
Q
6
e
o
e
e
o
e
e
0
6
e
o
v/angbo^wangbo-desktop: ~
e
1
e
0
e
o o 0
0 0 0
0
0
e
e
Appl: canons Places system
亘
consu?ed2 in o. like: consuiedl In 1. like: productl in 2. like: product2 in 3. like: consu?ed2 in 2. like: consuiedl in 3. like: productl in 4. like: product2 m 5? like: consuB^d2 In 4. like: con^uoedl in 、? likw: productl in 6. like: product2 in 7. like: consu?ed2 in 6. like: consuiedl in 7. like: productl In 8. like: product2 in 9. like: consu?&d2 in 8 like: consuoedl in 9? like: productl in 0. like: product2 in 1. like: consuBed2 in 0? like: consutedl In 1. like: productl In 2. Uke: product2 in 3. like;
e e e e
e e e e
e e e e
9
9
9
e e e e
e e e e e e e
1 e o o
9
0
0
0
更 VtMintu X
w9■■雲
w9■■雲(-)? gerdit
App|dfHtior5 Places 1 ■no
■ ■W” 丽 3.03r3%24 | M?gt?O
wa 的 Be 归 wnng fa o-tfestctopTW
File Edit view Terrninial Help
consumedz in 2- like: ■conswed 1 in 1,
consumedz in 2- like: ■conswed 1 in 1, likei productl in 4.. Like; product2 in 5 likje: ccnnaumE?d2 in 4. like- conswiBdl in 気 Ute^ productl in 6. lik巴: products in 7, like: consurhedZ In &. Like^ coinsuffiedi in 化 like^ produKtl in 8a like: prcductZ in 9. like: consumed! in 3_ like: consumed 1 in 91. likei prodiictl in 9.. Like- prodluet2 in 1.. like: cofisuied2 in 0_ like; co^suoedl in 1? li诞: produictl in 2, like: product2 in 3, like: consumed2 in 2. Like: CDnsufhedl in 3- like: product! in 4. like: piroducta in 5. like;
e e e e
e B a a a e
9
O 1 0 & 6 Q 0 8 1 0 -6 1 0 6 0 Q Q Q BBS 0 6 B OSS o q e OSSA o e @ e o e b e e e e e o e o e o q e a 0 fl 9 6 o e e e lose 1 1 e e 0 19? q a o e 9 e i ? o e i i
e
8
0
9
8
e
B
a
6
9
9
B
8
8
B
9
9
0 8 0
& & &
0 g (3
0 Q 0
01 fl 9
Q S
日日日
1 e e
leg
Q Q 0
& 1 B
Q 1 1
8日1 OSS
9 8 0
0 Q 0
0日0 see
9 8 9
o g B
Q G G
0 0S
0 0 0
其中1表示缓冲区被生产者 produced 或者二producer2写入了 Item ,0表示没
有写入数据或者被消费者 consumerl或者consumer2消耗掉
六、实验总结及思考
1、 本次实验是关于生产者与消费者之间互斥和同步的问题。
问题的是指是P、 V操作,实验设一个共享缓冲区,生产者和消费者互斥的使用, 当一个线程使用 缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。
2、 实验中包含的知识点很多,包括临界区资源共享问题、信号量定义、 PV 操作流程、进程间的通信方式(消息传递和共享内存)、进程同步和互斥、信号 量机制解决进程之间的同步与互斥问题等等。加深了对于本部分内容的理解
通过本实验设计,我们对操作系统的 P、V进一步的认识,深入的了解 P、 V操作的实质和其重要性。课本的理论知识进一步阐述了现实中的实际问题。