操作系统实验指导——进程同步模拟
操作系统 实验三 进程同步

集美大学计算机工程学院实验报告课程名称:操作系统指导教师:王丰实验成绩:实验编号:实验三实验名称:进程同步班级:计算12姓名:学号:上机实践日期:2015.5上机实践时间:2学时一、实验目的1、掌握用Linux信号灯集机制实现两个进程间的同步问题。
2、共享函数库的创建二、实验环境Ubuntu-VMware、Linux三、实验内容⏹需要的信号灯: System V信号灯实现☐用于控制司机是否可以启动车辆的的信号灯 S1=0☐用于控制售票员是否可以开门的信号灯 S2=0System V信号灯实现说明□ System V的信号灯机制属于信号灯集的形式, 一次可以申请多个信号灯.□同样利用ftok()生成一个key: semkey=ftok(path,45);□利用key申请一个包含有两个信号灯的信号灯集, 获得该集的idsemid=semget(semkey,2,IPC_CREAT | 0666);□定义一个联合的数据类型union semun{int val;struct semid_ds *buf;ushort *array;};□利用semctl()函数对信号灯初始化,参数有:信号灯集的id: semid要初始化的信号灯的编号:sn要设定的初始值:valvoid seminit(int semid, int val,int sn){union semun arg;arg.val=val;semctl(semid,sn,SETVAL,arg);}利用初始化函数,初始化信号灯:seminit(semid,0,0);//用来司机启动汽车的同步seminit(semid,0,1);//用来售票员开门的同步控制□利用semop()函数, 对信号灯实现V操作:sembuf是一个在头部文件中的预定义结构、semid—信号灯集id, sn—要操作的信号灯编号void semdown(int semid,int sn){/* define P operating*/struct sembuf op;op.sem_num=sn;op.sem_op=-1;//P操作为-1op.sem_flg=0;semop(semid,&op,1);}2、Linux的静态和共享函数库·Linux生成目标代码: gcc -c 源程序文件名(将生成一个与源程序同名的.o目标代码文件。
OS实验指导——进程同步模拟分解

OS实验指导一2013计算机科学与技术(师范)+2014信息管理与信息系统《操作系统》实验指导一开课实验室:A209 2015-9-14int Rmutex=1;//表示对Rcount的互斥操作int r[10]={0,0,0,0,0,0,0,0,0,0};//表示读者的状态,1表示正在读int w[10]={0,0,0,0,0,0,0,0,0,0};//表示写者的状态,1表示正在写int w_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//表示等待队列,0-9表示写者,10时需引入读者的等待队列,-1表示空int r_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//读者的等待队列,0-9表示对应的读者,-1为空5. 模块说明四组P、V函数:1)写者进程由3个函数组成void write_p(int i);//模拟写者对Wmutex的P操作,同时也作为写者进程的入口void write(int i);//开始写操作void write_v(int i);//模拟写者对Wmutex的V操作,写操作完成的时候调用2)读者进程由8个函数组成void radd_p(int i);//模拟读之前对Rmutex的P操作,同时也作为读者进程的入口void radd(int i);//Rcount加1void read_p(int i);//模拟读者对Wmutex的P操作void radd_v(int i);//模拟读之前对Rmutex的V操作void read(int i);//读void rsub_p(int i);//模拟读之后对Rmutex的P操作,读操作完成的时候调用void rsub(int i);//Rcount减1void read_v(int i);//模拟读者对Wmutex的V操作void rsub_v(int i);//模拟读之后对Rmutex的V操作源程序的主要部分1写操作的设计:模拟写者对Wmutex的P操作,同时为写者进程也作写的入口:void write_p(int i){Wmutex--;。
操作系统实验一-进程同步

实验一进程同步一、实验目的:分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者与消费者问题的模拟,进一步加深对进程同步与互斥的理解。
二、实验内容:用C语言实现对生产者与消费者问题的模拟。
实验原理:生产者和消费者是经典的进程同步问题,在这个问题中,生产者不断的向缓冲区中写入数据,而消费者则从缓冲区中读取数据。
生产者进程和消费者对缓冲区的操作是互斥,即当前只能有一个进程对这个缓冲区进行操作,生产者进入操作缓冲区之前,先要看缓冲区是否已满,如果缓冲区已满,则它必须等待消费者进程将数据取出才能写入数据,同样的,消费者进程从缓冲区读取数据之前,也要判断缓冲区是否为空,如果为空,则必须等待生产者进程写入数据才能读取数据。
三、实验准备:1. 实现步骤:(1)分析计算机系统中对资源的分配与释放过程:计算机系统中的每个进程都可以消费或生产某类资源。
当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。
而当某个进程释放资源时,则它就相当一个生产者。
(2)定义生产者消费者问题中的各数据结构,并初始化信号量;(3)创建生产者与消费者进程,利用信号量实现生产者与消费者之间的同步与互斥;最后编程实现。
2. 相关函数:在实现的过程中需要用到以下API函数:(1)CreateThread()//该函数创建一个在调用进程的地址空间中执行的线程。
若线程创建成功,将返回该线程的句柄。
函数原型:HANDLE CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes, //描述安全性,用NULL表示使用缺省值DWORD dwStackSize, //新线程拥有自己的堆栈,0表示使用缺省值1MB,推荐LPTHREAD_START_ROUTINE lpStartAddress, //新线程的起始地址,放线程函数名称LPVOID lpParameter,//此值被传送到线程函数去作为参数DWORD dwCreationFlags,//允许产生一个暂时挂起的线程,默认是0立即开始执行LPDWORD lpThreadld );//新线程的ID被传到这用法举例:hHandle1 = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE) ThreadName1,(LPVOID) NULL,0, &dwThreadID1 );(2)CreateMutex()函数可用来创建一个有名或无名的互斥量对象,函数返回值为互斥对象的句柄。
操作系统:进程同步

实验二:进程同步实验二:进程同步计科112 康岩岩2011008142202013/4/18实验二:进程同步一.实验目的(1)掌握基本的同步算法,理解生产者消费者模型。
(2)学习使用Windows XP中基本的同步对象,掌握相关API 的使用方法。
(3)了解Windows XP中多线程的并发执行机制,实现进程的同步与互斥。
二.实验属性该实验为设计性实验。
三.实验仪器设备及器材普通PC386以上微机四.实验要求本实验要求2学时完成。
本实验要求完成如下任务:(1)以生产者/消费者模型为依据,在Windows XP环境下创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。
学习并理解生产者/消费者模型及其同步/互斥规则;学习了解Windows同步对象及其特性;熟悉实验环境,掌握相关API的使用方法;设计程序,实现生产者/消费者进程(线程)的同步与互斥。
(2)扩展任务2选1:1>利用信号量机制,写出不会发生死锁的解决哲学家进程(线程)。
最多允许4个同时进餐;奇:先左后右偶:先右后左。
2>利用信号量机制,写出不会发生死锁的读者写者进程(线程)。
实验前应复习实验中所涉及的理论知识和算法,针对实验要求完成基本代码编写并完成预习报告;实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。
实验后认真书写符合规范格式的实验报告(参见附录A),并要求用正规的实验报告纸和封面装订整齐,按时上交。
五实验步骤1)任务分析:此次试验所要解决的生产者与消费者问题,每一个生产者或一个消费者都要占有一个独立的线程。
但是生产者和消费者需要共享一个中间容器,这个容器用来存放产品。
生产者生产或是消费者消费都需要以现有中间容器为条件,即同一时刻只有一个进程(生产者进程或消费者进程)能访问中间容器。
在访问的过程中还要判断中间容器是否为空或者是否已满,然后做出相应的处理(释放资源锁,进入等待状态)。
操作系统课程设计-进程同步模拟设计

课程设计题目进程同步模拟设计——生产者和消费者问题学院计算机科学与技术学院专业计算机科学与技术班级0806姓名张方纪指导教师孙玉芬2010 年 1 月20 日课程设计任务书学生姓名:张方纪专业班级:计算机0806指导教师:孙玉芬工作单位:计算机科学与技术学院题目: 进程同步模拟设计——生产者和消费者问题初始条件:1.预备内容:阅读操作系统的进程管理章节内容,对进程的同步和互斥,以及信号量机制度有深入的理解。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟用信号量机制实现生产者和消费者问题。
2.设计报告内容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日进程同步模拟设计——生产者和消费者问题1课设任务本课程设计的任务在于,通过编写一个具体的有关操作系统进程同步互斥的经典问题,加强对操作系统实现进程间同步与互斥的机制的理解。
同时培养提出问题、发现知识、使用工具、解决问题的能力。
具体地,我们要编制出一个程序,利用PV原语以及进程创建、同步、互斥、销毁等相关的系统调用来模拟“生产者—消费者”问题。
2背景介绍2.1“生产者—消费者”问题(the producer-consumerproblem)问题描述:一组生产者向一组消费者提供消息,它们共享一个有界缓冲区n,生产者向其中投放消息,消费者从中取得消息。
山东大学操作系统实验报告4进程同步实验

计算机科学与技术学院实验报告int msq_id;if((msq_id = get_ipc_id("/proc/sysvipc/msg",msq_h)) < 0 ) { if((msq_id = msgget(msq_h,msq_flg)) < 0){perror("messageQueue set error");exit(EXIT_FAILURE);}}return msq_id;}实验结果:分析:多进程的系统中避免不了进程间的相互关系。
进程互斥是进程之间发生的一种间接性作用,一般是程序不希望的。
通常的情况是两个或两个以上的进程需要同时访问某个共享变量。
我们一般将发生能够问共享变量的程序段称为临界区。
两个进程不能同时进入临界区,否则就会导致数据的不一致,产生与时间有关的错误。
解决互斥问题应该满足互斥和公平两个原则,即任意时刻只能允许一个进程处于同一共享变量的临界区,而且不能让任一进程无限期地等待。
进程同步是进程之间直接的相互作用,是合作进程间有意识的行为,典型的例子是公共汽车上司机与售票员的合作。
只有当售票员关门之后司机才能启动车辆,只有司机停车之后售票员才能开车门。
司机和售票员的行动需要一定的协调。
同样地,两个进程之间有时也有这样的依赖关系,因此我们也要有一定的同步机制保证它们的执行次序。
信号量机制就是其中的一种。
信号灯机制即利用pv操作来对信号量进行处理。
PV操作由P操作原语和V 操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的值减1,即S=S-1;②如果S³0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
V(S):①将信号量S的值加1,即S=S+1;②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。
操作系统进程调度和进程同步实验要求

0711操作系统进程调度和进程同步实验要求实验内容:用线程模拟进程,实现进程调度和进程同步。
在任意操作系统中,用c、c++或者java 编写程序。
并且完成相应的实验报告。
实验要求:实验一:进程调度⑴ 主线程,创建子线程,保存子线程的虚拟PCB(参见恐龙书P74)、要求运行多少时间(可随机产生)、已经等待多少时间(初始化为0),优先级(可随机产生)等信息,并负责子线程的调度。
调度的基本时间单位为1 S。
⑵ 创建20个线程(可以只用一个线程函数,传递不同的参数即上述数据结构)分别实现FCFS调度、SJF调度、RR调度、优先级调度和多级队列调度,并且计算每个调度的平均等待时间。
其中,多级队列调度要求设计4个调度队列,每个队列5个线程,队列内部分别采用FCFS、SJF、RR和优先级调度。
时间片的长度可以随机生成为n S。
⑶ 对于每个子线程,在其运行期间,输出其占用的时间标号(例如,第3个线程占用了第10秒的CPU时间,输出为:“Thread 3: 10”,格式可自行设计)。
实验二:进程同步⑴ 模拟哲学家就餐问题:设置5个子线程模拟5个哲学家,设置5个互斥区为筷子。
⑵ 输出问题解决方法:在每个哲学家线程中输出其获得的筷子标号与时间(可以读取系统时间,或者自行设置时间标准),例如:哲学家2在第n秒获得筷子1,在第m秒获得筷子2。
实验报告要求:写明实验目的、实验设计步骤、实验结果、总结。
附录:windows线程基本操作以windows线程函数为例介绍线程基本操作,以下函数都必须包含windows.h头文。
如果想更深入地了解线程,请参见《c++编程艺术》等相关书籍。
线程创建函数:HANDLE CreateThread (LPSECURITY_ATTRIBUTES secAttr,SIZE_T stackSize,LPTHREAD_START_ROUTINE threadFunc,LPVOID param,DWORD flags,LPDWORD threadID);在此,secAttr是一个用来描述线程的安全属性的指针。
哈尔滨工程大学操作系统 实验四进程的同步

操作系统实验报告哈尔滨工程大学软件学院第四讲进程的同步一、实验概述1. 实验名称:进程的同步2. 实验目的:(1)使用E OS 的信号量,编程解决生产者—消费者问题,理解进程同步的意义。
(2)调试跟踪E OS 信号量的工作过程,理解进程同步的原理。
(3)修改E OS 的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。
3. 实验类型:验证+设计4. 实验内容1)准备实验2)使用EOS 的信号量解决生产者-消费者问题3)调试EOS 信号量的工作过程4)修改EOS 的信号量算法二、实验环境操作系统:windows xp编译器:Bochs 模拟器语言:C语言工具:OSLAB三、实验过程1 准备实验按照下面的步骤准备本次实验:1. 启动OS Lab。
2. 新建一个EOS Kernel项目。
3. 生成EOS Kernel项目,从而在该项目文件夹中生成SDK 文件夹。
4. 新建一个EOS应用程序项目。
5. 使用在第3步生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK 文件夹。
2 使用EOS 的信号量解决生产者-消费者问题在本实验文件夹中,提供了使用EOS的信号量解决生产者-消费者问题的参考源代码文件pc.c。
使用OS Lab打开此文件(将文件拖动到OS Lab窗口中释放即可打开),仔细阅读此文件中的源代码和注释,各个函数的流程图可以参见图13-1。
思考在两个线程函数(Producer 和Consumer)中,哪些是临界资源?哪些代码是临界区?哪些代码是进入临界区?哪些代码是退出临界区?进入临界区和退出临界区的代码是否成对出现?按照下面的步骤查看生产者-消费者同步执行的过程:1. 使用pc.c文件中的源代码,替换之前创建的EOS 应用程序项目中EOSApp.c文件内的源代码。
2. 按F7生成修改后的EOS应用程序项目。
3. 按F5启动调试。
OS Lab会首先弹出一个调试异常对话框。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2)“写-写”互斥,即不能有两个写者同时进行写操作;
3)“读-读”允许,即可以有两个以上的读者同时进行读操作。
1)Wmutex表示读写的互斥信号量,初值:Wmutex =1;
2)公共变量Rcount表示“正在读”的进程数,初值:Rcount =0;
void radd_p(int i);//模拟读之前对Rmutex的P操作,同时也作为读者进程的入口
void radd(int i);//Rcount加1
void read_p(int i);//模拟读者对Wmutex的P操作
void radd_v(int i);//模拟读之前对Rmutex的V操作
四组P、V函数:
1)写者进程由3个函数组成
void write_p(int i);//模拟写者对Wmutex的P操作,同时也作为写者进程的入口
void write(int i);//开始写操作
void write_v(int i);//模拟写者对Wmutex的V操作,写操作完成的时候调用
2)读者进程由8个函数组成
Rcount++;
if (Rcount==1) P (Wmutex);
V(Rmutex);读P(Rmute);Rcount--;
if (Rcount==0) V(Wmutex);
V(Rmutex);
while (false);
写者进程:
writem()
{
P(Wmutex);
写
V(Wmutex);
}
cout<<"-->"<<"写者"<<(w_wait[k]+1);
}
cout<<endl;
}
for(k=0;k<w_num;k++)
{
x=0;
for(j=0;j<w_num;j++)
{
if(k==w_wait[j])
{
a[k]=1;
x=1;
}
}
if(x==1) continue;
cout<<"("<<(k+1)<<")写者"<<(k+1);
while(1)
{
cout<<"************************************"<<endl;
for(k=0;k<20;k++) a[k]=0;
cout<<"Wmutex="<<Wmutex<<"Rcount="<<Rcount<<" Rmutex="<<Rmutex<<endl;
{
j=w_wait[0];
for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1];
write(j);
}
else
{
j=r_wait[0];
for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1];
for(k=0;k<r_num;k++) r_wait[k]=r_wait[k+1];
void read(int i);//读
void rsub_p(int i);//模拟读之后对Rmutex的P操作,读操作完成的时候调用
void rsub(int i);//Rcount减1
void read_v(int i);//模拟读者对Wmutex的V操作
void rsub_v(int i);//模拟读之后对Rmutex的V操作
{
j=w_wait[0];
for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1];
write(j);
}
else
{
j=r_wait[0];
for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1];
for(k=0;k<r_num;k++) r_wait[k]=r_wait[k+1];
cin>>w_num;
}//完成对写者个数的输入
cout<<"请输入读者个数(1到10):";
cin>>r_num;
while(r_num<1||r_num>10)
{
cout<<"输入有误,请重新输入读者个数(1到10):";
cin>>r_num;
}//完成对读者个数的输入
int x,k,j,a[20];
if(w[k]==0) cout<<"申请";
else cout<<"完成";
}
for(k=0;k<r_num;k++)
{
x=0;
for(j=0;j<r_num;j++)
{
if(k==r_wait[j])
{
a[k+w_num]=1;
x=1;
}
}
if(x==1) continue;
cout<<"("<<(k+1+w_num)<<")读者"<<(k+1);
设计中首先用户输入读者个数r_num和写者个数w_num,来模拟用信号量机制实现r_num个读者和w_num个写者同时处理一个数据区的问题。所有的读者或写者对操作的申请和完成都是由用户控制,更容易反映读者和写者问题的规律。
3.算法流程图
int r_num;//读者个数
int w_num;//写者个数
{
if(r[k]==0) radd_p(k);
else rsub_p(k);
break;
if(r[k]==0) cout<<"申请";
else cout<<"完成";
}
cout<<"("<<(w_num+r_num+1)<<")结束"<<endl;
cout<<"请输入选项序号:";
cin>>x;
while(x<1||x>(w_num+r_num+1)||a[x-1]==1)
{
if(a[x-1]==1) cout<<"该对象已在等待队列中,请重新输入:";
void radd(int i)
{
Rcount++;
if(Rcount==1)
read_p(i);
else
radd_v(i);
}
模拟读者对Wmutex的P操作:
void read_p(int i)
{
Wmutex--;
if(Wmutex<0)表示如果Wmutex<0,则进入等待队列
{
w_wait[-Wmutex-1]=10;
int Wmutex=1;//表示允许写或允许读
int Rcount=0;//表示正在读的进程数
int Rmutex=1;//表示对Rcount的互斥操作
int r[10]={0,0,0,0,0,0,0,0,0,0};//表示读者的状态,1表示正在读
int w[10]={0,0,0,0,0,0,0,0,0,0};//表示写者的状态,1表示正在写
{
Rcount--;
if(Rcount==0)
read_v(i);
else
rsub_v(i);
}
模拟读者对Wmutex的V操作:
void read_v(int i){
Wmutex++;
if(Wmutex<=0)表示如果Wmutex<=0,则从等待队列中选择写者或读者进行操作
{
int k,j;
if((w_wait[0]>=0)&&(w_wait[0]<w_num))
radd(j);
}
read(i);
}
进行读操作:
void read(int i)
{
r[i]=1;
}
模拟读之后对Rmutex的P操作,读操作完成的时候调用:
void rsub_p(int i)
{
r[i]=0;
Rmutex--;
rsub(i);
}
对Rcount减1的控制:
void rsub(int i)
1.问题描述:
模拟用信号量机制实现读者和写者问题,即有两组并发进程:读者和写者,共享一组数据区,进行读写操作,要求任一时刻“写者”最多只允许一个,而“读者”则允许多个。
2.规则说明:
允许多个读者同时执行读操作;
不允许读者、写者同时操作;
不允许多个写者同时操作。
四、实验设计参考
1.分析读者和写者的相互关系:
模拟写者对Wmutex的P操作,同时为写者进程也作写的入口:
void write_p(int i)