进程同步模拟吃水果,操作系统课程设计报告书

合集下载

《操作系统》课程设计报告

《操作系统》课程设计报告

《操作系统》课程设计报告一、读者/写者的问题模拟实现读者/写者问题,是指保证一个writer 进程必须与其他进程互斥地访问共享对象的同步问题。

读者写者问题可以这样的描述:有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但是只能有一个写者在写书,并且读者必优先,也就是说,读者和写者同时提出请求时,读者优先。

当读者提出请求时,需要有一个互斥操作,另外需要有一个信号量S 来确定当前是否可操作。

信号量机制是支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的重要机制,而读者写者则是这一机制的一个经典范例。

与记录型信号量解决读者——写者问题不同,信号量机制它增加了一个限制,即最多允许RN 个读者同时读。

为此,又引入了一个信号量L,并赋予初值为RN,通过执行wait (L,1,1)操作来控制读者的数目,每当有一个读者进入时,就要执行wait (L,1,1)操作,使L 的值减1。

当有RN 个读者进入读后,L 便减为0,第RN+1 个读者要进入读时,必然会因wait(L,1,1)操作失败而堵塞。

程序实例:#include <windows.h>#include <ctype.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <malloc.h>#define MAX_PERSON 100#define READER 0 //读者#define WRITER 1 //写者#define END -1#define R READER#define W WRITERtypedef struct _Person{HANDLE m_hThread;//定义处理线程的句柄int m_nType;//进程类型(读写)int m_nStartTime;//开始时间int m_nWorkTime;//运行时间int m_nID;//进程号}Person;Person g_Persons[MAX_PERSON];int g_NumPerson = 0;long g_CurrentTime= 0;//基本时间片数int g_PersonLists[] = {//进程队列1, W, 3, 5, 2, W, 16, 5, 3, R, 5, 2,4, W, 6, 5, 5, R, 4, 3, 6, R, 17,7,END,};int g_NumOfReading = 0;int g_NumOfWriteRequest = 0;//申请写进程的个数HANDLE g_hReadSemaphore;//读者信号HANDLE g_hWriteSemaphore;//写者信号bool finished = false; //所有的读完成//bool wfinished = false; //所有的写完成void CreatePersonList(int *pPersonList);bool CreateReader(int StartTime,int WorkTime,int ID);bool CreateWriter(int StartTime,int WorkTime,int ID);DWORD WINAPI ReaderProc(LPVOID lpParam);DWORD WINAPI WriterProc(LPVOID lpParam);int main(){g_hReadSemaphore = CreateSemaphore(NULL,1,100,NULL); //创建信号灯,当前可用的资源数为1,最大为100g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); //创建信号灯,当前可用的资源数为1,最大为100CreatePersonList(g_PersonLists); // Create All the reader and writersprintf("Created all the reader and writer\n 创建\n");g_CurrentTime = 0;while(true){g_CurrentTime++;Sleep(300); // 300 msprintf("CurrentTime = %d\n",g_CurrentTime);if(finished) return 0;} // return 0;}void CreatePersonList(int *pPersonLists){int i=0;int *pList = pPersonLists;bool Ret;while(pList[0] != END){switch(pList[1]){case R:Ret = CreateReader(pList[2],pList[3],pList[0]);//351,w452,523,654break; case W:Ret = CreateWriter(pList[2],pList[3],pList[0]);break;}if(!Ret)printf("Create Person %d is wrong\n",pList[0]);pList += 4; // move to next person list}}DWORD WINAPI ReaderProc(LPVOID lpParam)//读过程{Person *pPerson = (Person*)lpParam;// wait for the start timewhile(g_CurrentTime != pPerson->m_nStartTime){ }printf("Reader %d is Requesting 等待\n",pPerson->m_nID);printf("\n\n************************************************\n");// wait for the write requestWaitForSingleObject(g_hReadSemaphore,INFINITE); if(g_NumOfReading ==0) {WaitForSingleObject(g_hWriteSemaphore,INFINITE); }g_NumOfReading++;ReleaseSemaphore(g_hReadSemaphore,1,NULL);pPerson->m_nStartTime = g_CurrentTime;printf("Reader %d is Reading the Shared Buffer等待\n",pPerson->m_nID); printf("\n\n************************************************\n"); while(g_CurrentTime <= pPerson->m_nStartTime + pPerson->m_nWorkTime) {}printf("Reader %d is Exit退出\n",pPerson->m_nID);printf("\n\n************************************************\n"); WaitForSingleObject(g_hReadSemaphore,INFINITE);g_NumOfReading--;if(g_NumOfReading == 0){ReleaseSemaphore(g_hWriteSemaphore,1,NULL);//此时没有读者,可以写}ReleaseSemaphore(g_hReadSemaphore,1,NULL);if(pPerson->m_nID == 4) finished = true; //所有的读写完成ExitThread(0);return 0;}DWORD WINAPI WriterProc(LPVOID lpParam){Person *pPerson = (Person*)lpParam;// wait for the start timewhile(g_CurrentTime != pPerson->m_nStartTime){}printf("Writer %d is Requesting 请求进行写操作\n",pPerson->m_nID);printf("\n\n************************************************\n"); WaitForSingleObject(g_hWriteSemaphore,INFINITE);// modify the writer's real start timepPerson->m_nStartTime = g_CurrentTime;printf("Writer %d is Writting the Shared Buffer写内容\n",pPerson->m_nID);while(g_CurrentTime <= pPerson->m_nStartTime + pPerson->m_nWorkTime){}printf("Writer %d is Exit退出\n",pPerson->m_nID);printf("\n\n************************************************\n");//g_NumOfWriteRequest--;ReleaseSemaphore(g_hWriteSemaphore,1,NULL);if(pPerson->m_nID == 4) finished = true;//所有的读写完成ExitThread(0);return 0;}bool CreateReader(int StartTime,int WorkTime,int ID){DWORD dwThreadID;if(g_NumPerson >= MAX_PERSON)return false;Person *pPerson = &g_Persons[g_NumPerson];pPerson->m_nID = ID;pPerson->m_nStartTime = StartTime;pPerson->m_nWorkTime = WorkTime;pPerson->m_nType = READER;g_NumPerson++;// Create an New ThreadpPerson->m_hThread= CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID); if(pPerson->m_hThread == NULL)return false;return true;}bool CreateWriter(int StartTime,int WorkTime,int ID){DWORD dwThreadID;if(g_NumPerson >= MAX_PERSON)return false;Person *pPerson = &g_Persons[g_NumPerson];pPerson->m_nID = ID;pPerson->m_nStartTime = StartTime;pPerson->m_nWorkTime = WorkTime;pPerson->m_nType = WRITER;g_NumPerson++;// Create an New ThreadpPerson->m_hThread= CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,&dwThreadID); if(pPerson->m_hThread == NULL)return false;return true;}二、进程间通信与子进程使用管道进行父子进程间通信,程序首先判断参数是否合法,因为输入的字符将从父进程通过发送到子进程中。

操作系统课程设计吃水果问题完整

操作系统课程设计吃水果问题完整
目录
1
1.1
进程同步模拟设计:吃水果问题
1.2
桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
1.3
将问题转换为信号量上的资源分配类型问题:
这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。通过编程实践时,实际是随机的调用人一个进程的操作,而这些进程的操作相当于程序中的函数调用。而计算机在执行时每一个时刻只能执行一个操作,这就默认了互斥。同步的模拟可以类似于函数调用时的前提关系即先决条件。这样进程同步模拟就完全可以通过函数的调用来实现。
int MonFa_c;//用于爸爸妈妈等待次序的区别
int Son_a;//用于两个儿子等待次序的区别
int daughter_b;//用于两个女儿等待次序的区别
int k;//产生进程调用的数量
srand((unsigned)time(NULL));//srand()函数产生一个以当前时间开始的随机种子
Son2(); //处于等待的Son2()自动调用
Son_a=1;
}
}
else
{
if(Son1_lag==true)
{
Son1_lag=false; //Son1等待取消
cout<<"处于等待的Son1自动被调用"<<endl;
Son1(); //处于等待的Son源自()自动调用Son_a=0;
}
else if(Son2_lag==true)
{
orange--;

进程同步模拟设计--吃水果问题

进程同步模拟设计--吃水果问题

附件1:学号:012课程设计题目进程同步模拟设计--吃水果问题学院计算机科学与技术学院专业计算机科学与技术专业班级计算机姓名指导教师2011 年01 月19 日课程设计任务书学生:专业班级:指导教师:作单位:计算机科学与技术学院题目: 进程同步模拟设计——吃水果问题初始条件:1.预备容:阅读操作系统的进程管理章节容,对进程的同步和互斥,以及信号量机制度有深入的理解。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟吃水果的同步模型:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

2.设计报告容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。

时间安排:设计安排一周:周1、周2:完成程序分析及设计。

周2、周3:完成程序调试及测试。

周4、周5:验收、撰写课程设计报告。

(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日进程同步模拟设计——吃水果问题1需求分析1.1吃水果问题的描述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

1.2问题的转换这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。

进程同步模型系统的设计—吃水果

进程同步模型系统的设计—吃水果

课程设计课程设计任务书学生: Miss屠专业班级: 08计科指导教师:王海英工作单位:计算机科学与技术学院题目: 进程同步模型系统的设计——吃水果问题初始条件:1.预备容:阅读操作系统的进程管理章节容,对进程的同步和互斥,以及信号量机制度有深入的理解。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.为下面吃水果的问题创建进程并利用通信API实现进程之间的同步模型。

能够处理以下的情形:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

2.设计报告容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明(功能与框图);⑶源程序的主要部分;⑷运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他的其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。

周2、周3:完成程序调试及测试。

周4、周5:撰写课程设计报告。

指导教师签名:年月日系主任(或责任教师)签名:年月日进程同步模型系统的设计——吃水果问题1、课程设计目的与功能1.1、目的为下面吃水果的问题创建进程并利用通信API实现进程之间的同步模型。

能够处理以下的情形:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

1.2、实现的功能本程序共创建了4个在windows系统环境下实现的线程,即Fahter、Mother、Son和Daughter等4个线程,以及putapple、putorange、getapple和getorange 等4个函数,其中4个线程是用于实现爸爸、妈妈、儿子和女儿分别放水果和取水果的线程操作的,并分别调用这4个函数,来实现真正的操作。

进程同步模拟设计吃水果问题

进程同步模拟设计吃水果问题

附件1:学号:012课程设计题目进程同步模拟设计--吃水果问题学院计算机科学与技术学院专业计算机科学与技术专业班级计算机姓名指引教师年01 月19 日课程设计任务书学生姓名:专业班级:指引教师:作单位:计算机科学与技术学院题目: 进程同步模拟设计——吃水果问题初始条件:1.预备内容:阅读操作系统旳进程管理章节内容,对进程旳同步和互斥,以及信号量机制度有进一步旳理解。

2.实践准备:掌握一种计算机高档语言旳使用。

规定完毕旳重要任务:(涉及课程设计工作量及其技术规定,以及阐明书撰写等具体规定)1.模拟吃水果旳同步模型:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一种水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中旳橘子,两个女儿专门等吃盘子中旳苹果。

2.设计报告内容应阐明:⑴需求分析;⑵功能设计(数据构造及模块阐明);⑶开发平台及源程序旳重要部分;⑷测试用例,运营成果与运营状况分析;⑸自我评价与总结:i)你觉得你完毕旳设计哪些地方做得比较好或比较杰出;ii)什么地方做得不太好,后来如何改正;iii)从本设计得到旳收获(在编写,调试,执行过程中旳经验和教训);iv)完毕本题与否有其她措施(如果有,简要阐明该措施);v)对实验题旳评价和改善意见,请你推荐设计题目。

时间安排:设计安排一周:周1、周2:完毕程序分析及设计。

周2、周3:完毕程序调试及测试。

周4、周5:验收、撰写课程设计报告。

(注意事项:严禁抄袭,一旦发现,一律按0分记)指引教师签名:年月日系主任(或责任教师)签名:年月日进程同步模拟设计——吃水果问题1需求分析1.1吃水果问题旳描述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一种水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中旳橘子,两个女儿专门等吃盘子中旳苹果。

1.2问题旳转换这是进程同步问题旳模拟,可以把向盘子放或取水果旳每一种过程可以转为一种进程旳操作,这些进程是互斥旳,同步也存在一定旳同步关系。

000操作系统课设报告(进程控制-吃苹果)

000操作系统课设报告(进程控制-吃苹果)
semid_full2 = semget(SEMKEY_FULL2,1, 0777);
semctl(semid_mutex,0,IPC_RMID);
semctl(semid_empty,0,IPC_RMID);
semctl(semid_full1,0,IPC_RMID);
semctl(semid_full2,0,IPC_RMID);
操作系统课程设计
——Linux系统管理实践与进程通信实现
实验学期2至2学年,第学期
学生姓名
专业班操作系统》课程设计报告
实验题目:Linux系统管理实践与进程控制、进程通信实现
设计时间:2014-01-09至
2014-01-14
一、 实验目的与要求
1、掌握基本的同步与互斥算法。
int mother()//母亲程序
int daughter()//女儿程序
int son()//儿子程序
int main(int argc, char *argv[])//主程序,包含了初始化程序
信号量:
设置互斥信号量mutex:每次盘子中只能放一只水果或取出一只水果;
设置同步信号量full1:实现父亲放苹果,女儿取水果的同步;
else
printf("Fail To Create SEM_FULL2!\n");
return -1;
}
/*给信号量赋初值*/
set_sembuf_struct(&sem_tmp, 0, BUFF_LEN, 0);/*BUFF_LEN*/
void set_sembuf_struct(struct sembuf *sem,int semnum, int semop,int semflg)

技工院--苹果-桔子问题的实现

技工院--苹果-桔子问题的实现

《操作系统》课程设计任务书题目:苹果-桔子问题的实现学生姓名:班级:物联网工程1班学号:指导教师:张清/贾娟娟一、设计目的学生通过该题目的设计过程,掌握进程同步问题的原理、软件开发方法并提高解决实际问题的能力。

二、设计内容1、了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。

2、编写程序实现苹果-桔子问题。

桌上有一个空盘子,只允许放一个水果。

爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。

规定当盘空时,一次只能放一个水果。

三、设计要求及工作量1、分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数据结构)。

2、设计合适的测试用例,对得到的运行结果要有分析。

3、设计中遇到的问题,设计的心得体会。

4、文档:课程设计打印文档每个学生一份,并装在统一的资料袋中。

5、光盘:每个学生的文档和程序资料建在一个以自己学号和姓名命名的文件夹下,刻录一张光盘,装入资料袋中。

四、要提交的成果1. 设计说明书一份,内容包括:1) 中文摘要100字;关键词3-5个;2) 设计思想;3)各模块的伪码算法;4)函数的调用关系图;5)测试结果;6)源程序(带注释);7)设计总结;8) 参考文献、致谢等。

2. 刻制光盘一张。

五、设计进度计划及时间安排六、主要参考资料1.汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.2.王清,李光明.《计算机操作系统》.冶金工业出版社.3.孙钟秀等. 操作系统教程. 高等教育出版社4.曾明. Linux操作系统应用教程. 陕西科学技术出版社.5. 张丽芬,刘利雄.《操作系统实验教程》. 清华大学出版社.6. 孟静,操作系统教程--原理和实例分析. 高等教育出版社7. 周长林,计算机操作系统教程. 高等教育出版社8. 张尧学,计算机操作系统教程,清华大学出版社9.任满杰,操作系统原理实用教程,电子工业出版社10.张坤.操作系统实验教程,清华大学出版社目录1.绪论 (1)1.1设计任务 (1)1.2设计思想 (1)1.3基础知识 (1)2.各模块伪码算法 (3)2.1父亲进程模块 (3)2.2母亲进程模块 (5)2.3儿子进程模块 (7)2.4女儿进程模块 (9)2.5Print函数 (11)3. 函数调用关系图 (14)3.1函数调用图........................................ 错误!未定义书签。

《操作系统课程设计》报告范本(doc 10页)

《操作系统课程设计》报告范本(doc 10页)

《操作系统课程设计》报告学号:姓名:班级:指导教师:报告日期:一、课设目的通过对操作系统课程的学习,熟悉进程的概念、进程的管理与存储、进程的调度,通过实践深入理解进程的调度算法。

二、课设任务要求编写一个程序,可以创建若干个虚拟进程,并对若干个虚拟进程进行调度,调度策略为时间片轮转法,主要任务包括:①进程的个数,进程的内容(即进程的功能序列)来源于一个进程序列描述文件,另外调度运行结果输出到一个运行日志文件;②设计PCB适用于时间片轮转法;③建立进程队列;④实现时间片轮转调度算法,尽量可视化的展示调度的动态过程。

○5总结程序设计的开发过程:需求分析、系统设计、系统实现及文档的收集和整理。

三、实验方法与设计分析每个进程有一个进程控制块( PCB)表示。

进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

据需要设计调查计划调查、收集数据,能按要求整理数据,在统计表进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。

进程的到达时间为输入进程的时间。

,计算机,千千万万中小创业者渴望成功高中语文,语文试卷,计算机摇篮课进程的运行时间以时间片为单位进行计算。

每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

式,因此上开店成为了一种潮流,并且越来越多高中语文,语文试卷,计算机就绪进程获得 CPU后都只能运行一个时间片。

用已占用CPU时间加1来表示。

卷,计算机络购物高中语文,语文试卷,计算机市场潜力还远未被释放课件同如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

语文,语文试卷,计算机,第5代速度达自动软件,不用东奔西走高中语文,语文每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。

进程模拟课程设计报告

进程模拟课程设计报告

操作系统课程设计报告书课程设计题目:模拟操作系统进程管理专业:计算机科学与技术班级:计算机 * * 班小组成员:成员及分工:1、2、3、4、一、课程设计目的课程设计的目的是模拟操作系统进程管理。

二、课程设计要求课程设计要求使用一种编程语言能够模拟进程创建,进程执行,进程阻塞,进程消亡和进程唤醒。

三、系统环境支持及语言选择Window操作系统,C语言编写。

四、系统框架构成五、系统功能说明本次模拟进程调度使用的是FIFO算法。

main()主函数int init() 进程初始化void drawmat( ) 汉字输入定义int enqueue(PCB *head , PCB *node) 进程入队PCB * dequeue(PCB *head) 进程出队int create() 创建进程int fexcute() 将进程调入运行队列int run() 运行进程int wake() 唤醒进程int block() 阻塞进程int outputqueue(PCB *head) 输出进程状态int help() 帮助菜单int leave() 退出程序六、用户使用说明当用户进入欢迎界面后,输入任意键,系统自动初始化,然后输入您要创建的多个进程,当输入完成后,可以按0 0表示输入结束。

程序会默认创建进程为就绪队列,接着会弹出帮助菜单,用户只要按帮助菜单的字母按钮执行相应的进程调度、进程阻塞、进程运行等操作,以实现操作系统进程管理的模拟。

七、运行界面如下八、源代码#include "stdio.h"#include"graphics.h"#include "dos.h"#include "stdlib.h"#include "conio.h"#define SEC 3#define NULL 0char han1S[]={0x00,0x80,0x00,0x80,0xFC,0x80,0x04,0xFC,0x45,0x04,0x46,0x48,0x28,0x40,0x28, 0x40,0x10,0x40,0x28,0x40,0x24,0xA0,0x44,0xA0,0x81,0x10,0x01,0x08,0x02,0x0E ,0x0C,0x04,};char han2S[]={0x00,0x00,0x41,0x84,0x26,0x7E,0x14,0x44,0x04,0x44,0x04,0x44,0xF4,0x44,0x14, 0xC4,0x15,0x44,0x16,0x54,0x14,0x48,0x10,0x40,0x10,0x40,0x28,0x46,0x47,0xFC, 0x00,0x00,};char han3S[]={0x02,0x20,0x42,0x20,0x22,0x28,0x2F,0xFC,0x02,0x20,0x02,0x20,0xE2,0x20,0x22, 0x28,0x2F,0xFC,0x22,0x20,0x22,0x20,0x22,0x20,0x24,0x20,0x50,0x26,0x8F,0xFC, 0x00,0x00,};char han4S[]={0x04,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x80,0x02,0x80,0x02, 0x80,0x04,0x40,0x04,0x40,0x08,0x20,0x08,0x20,0x10,0x10,0x20,0x10,0x40,0x0E, 0x80,0x04,};char han5S[]={0x10,0x10,0x11,0xF8,0x11,0x10,0x11,0xF0,0xFC,0x04,0x17,0xBE,0x14,0xA4,0x1F, 0xBC,0x30,0x40,0xD0,0x44,0x1F,0xFE,0x10,0xE0,0x11,0x50,0x12,0x4E,0x54,0x44, 0x20,0x40,};char han6S[]={0x09,0x00,0x09,0x00,0x09,0x04,0x11,0xFE,0x12,0x80,0x32,0x80,0x54,0x90,0x98, 0xF8,0x10,0x80,0x10,0x80,0x10,0x88,0x10,0xFC,0x10,0x80,0x10,0x80,0x10,0x80, 0x10,0x80,};char han7S[]={0x00,0x38,0x7F,0xC0,0x04,0x00,0x04,0x10,0x08,0x20,0x3F,0xC0,0x01,0x00,0x02, 0x20,0x04,0x10,0x3F,0xF8,0x01,0x08,0x09,0x20,0x09,0x10,0x11,0x08,0x25,0x08, 0x02,0x00,};char han8S[]={0x10,0x80,0x10,0x40,0x20,0x48,0x27,0xFC,0x48,0x80,0xF9,0x10,0x12,0x08,0x27, 0xFC,0x41,0x24,0xF9,0x20,0x41,0x20,0x01,0x20,0x1A,0x22,0xE2,0x22,0x44,0x1E, 0x08,0x00,};char han9S[]={0x11,0x10,0x11,0x14,0x1F,0xFE,0x11,0x10,0xFD,0x18,0x13,0xFC,0x32,0x08,0x3B, 0xF8,0x56,0x08,0x53,0xF8,0x90,0x40,0x1F,0xFE,0x10,0x40,0x10,0xB0,0x11,0x0E, 0x16,0x04,};char han10S[]={0x10,0x00,0x10,0x08,0x10,0x88,0x12,0x48,0xFE,0x68,0x12,0x28,0x16,0x08,0x1A, 0x08,0x32,0x08,0xD2,0x08,0x12,0x48,0x12,0x88,0x13,0x14,0x12,0x22,0x50,0x42, 0x20,0x80,};char han11S[]={0x02,0x20,0x42,0x20,0x22,0x28,0x2F,0xFC,0x02,0x20,0x02,0x20,0xE2,0x20,0x22, 0x28,0x2F,0xFC,0x22,0x20,0x22,0x20,0x22,0x20,0x24,0x20,0x50,0x26,0x8F,0xFC, 0x00,0x00,};char han12S[]={0x08,0x04,0x1D,0xFE,0xF1,0x04,0x11,0x04,0x11,0x04,0xFF,0x04,0x11,0xFC,0x38, 0x00,0x37,0xFE,0x54,0x20,0x50,0x28,0x91,0xFC,0x10,0x20,0x10,0x24,0x17,0xFE, 0x10,0x00,};char han13S[]={0x10,0x40,0x1F,0x7C,0x28,0x90,0x45,0x08,0x01,0x00,0x7F,0xFE,0x40,0x02,0x9F, 0xF4,0x10,0x10,0x1F,0xF0,0x10,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0, 0x10,0x00,};char han14S[]={0x00,0x08,0x13,0xFC,0xFA,0x48,0x22,0x48,0x23,0xF8,0x22,0x48,0xFA,0x48,0x23, 0xF8,0x20,0x40,0x20,0x50,0x23,0xF8,0x3C,0x40,0xE0,0x40,0x40,0x44,0x0F,0xFE, 0x00,0x00,};void drawmat(char *mat,int matsize,int x,int y,int color){int i,j,k,n;n=(matsize-1)/8+1;for(j=0;j<matsize;j++)for(i=0;i<n;i++)for(k=0;k<8;k++)if(mat[j*n+i]&(0x80>>k))putpixel(x+i*8+k,y+j,color);}/*定义结构体*/typedef struct PCB{int PID;int UID;struct PCB * next;}PCB;PCB *really , *excute , *wait;/*create queue header *//*queue operation 入队*/int enqueue(PCB *head , PCB *node) {PCB *p;p = head;if(p -> next == NULL){head -> next = node;return 1;}while(p){if(p -> next == NULL){p -> next = node;return 1;}else p = p -> next;}}/*enquue*//*dequeue 出队列 */PCB * dequeue(PCB *head){PCB *p;p = head;if(p -> next == NULL){return NULL;}else{p = p -> next;head -> next = p -> next;p -> next = NULL;return p;}/*head to next*/}/*dequeue*//*PCB operate*//*新建进程*/int create(){PCB *p;p = (PCB*)malloc(sizeof(PCB));p -> next = NULL;printf("input PID and UID to a new process\n");scanf("%d %d",&p -> PID,&p -> UID);if(enqueue(really , p))printf("create a process: PID = %d UID = %d\n", p -> PID , p -> UID);elseprintf("create Failed\n");}/*create*//*执行 fexcute*/int fexcute(){PCB *p = dequeue(really);if(p == NULL){printf("NO process in queue \n");return 0;}else{enqueue(excute , p);printf("add a process into excute queue process: PID = %d UID= %d \n" ,p->PID , p->UID);return 1;}}/*excute*/int wake(){PCB *p = dequeue(wait);if(p == NULL){ printf("NO process in queue \n");return 0;}else{ enqueue(really , p);printf("add a process into wait really process: PID = %d UID= %d \n" ,p->PID , p->UID);return 1;}}int block(){PCB *p = dequeue(excute);if(p == NULL){printf("NO process in queue \n");return 0;}else{enqueue(wait , p);printf("add a process into wait queue process: PID = %d UID= %d \n" ,p->PID , p->UID);return 1;}}/*输出队列 outputqueue*/int outputqueue(PCB *head){PCB *p;if(head -> next == NULL){/*队列为空*/printf("queue is null \n");return 1;}p = head -> next;while(p){printf("PID = %d UID = %d \n" , p -> PID , p -> UID);p = p -> next;}return 0;}/*output输出*/int output(){ printf("REALLLY QUEUE:\n");outputqueue(really);printf("EXCUTE QUEUE: \n");outputqueue(excute);printf("WAIT QUEUE: \n");outputqueue(wait);}/*init 初始化*/int init(){ int i;PCB *p;clrscr();really = (PCB*)malloc(sizeof(PCB));really -> next=NULL;excute = (PCB*)malloc(sizeof(PCB));excute -> next=NULL;wait = (PCB*)malloc(sizeof(PCB));wait -> next = NULL;printf("_________________________PROCESSSECHUDLE___________________________ \n");printf("now is initing");for(i=0;i<18;i++){printf(". ");delay(10000000000);}printf("\ninput PID and UID as integer , 0 0 as over\n");while(1){p = (PCB*)malloc(sizeof(PCB));p -> next = NULL;scanf("%d %d",&p -> PID , &p -> UID);if(p -> PID == 0 && p -> UID == 0)break;else{if(enqueue(really , p)){printf("new process PID = %d UID = %d added!\n",p -> PID , p -> UID); }else return 0;}}return 1;}/*init*//*运行一个process*/int run(){ PCB *p = excute;int s = SEC;if(excute -> next == NULL){printf("no process in excute queue \n");return 0;}else{p = excute -> next;printf("system will sleep %ds as process running\n",s);sleep(3);printf("process: PID = %d UID= %d excute successed..\n" , p -> PID , p -> UID ); excute -> next = p -> next;free(p);}}/*run*//*离开*/int leave(){ int COMMAND;printf("Are you sure to leave? YES-(1), NO-(2)\n");scanf("%d",&COMMAND);if(COMMAND==1){clrscr();exit(0);}if(COMMAND==2){printf("\n");help();}}int help(){ printf("__________________________HELP MENU____________________________\n");printf("\t-h HELP show help option\n");printf("\t-c CREATE create a new process , and put to really queue\n"); printf("\t-b BLOCK block a process in excute queue\n");printf("\t-w WAKE wake a process in wait queue\n");printf("\t-e EXCUTE excute a process in really queue\n");printf("\t-s SUSPEND suspend a process in excute queue\n");printf("\t-o OUTPUT output all processes in queues\n");printf("\t-r RUN excute a process in excute queue\n");printf("\t-x EXIT exit this program\n");printf("_______________________________________________________________\n") ;printf("\t type 'H' will show this menu\n");}int main(){char COMMAND = NULL;int i;int gdriver=DETECT,gmode;initgraph(&gdriver,&gmode,"");setbkcolor(LIGHTBLUE);setcolor(21);for(i=40;i<=600;i+=12){rectangle(i,40,i+10,49);rectangle(i,451,i+10,460);}for(i=40;i<=450;i+=12){rectangle(40,i,49,i+10);rectangle(601,i,610,i+10);}setcolor(19);rectangle(150,100,480,410);rectangle(145,95,475,405);drawmat(han1S,16,200,230,BLUE); drawmat(han2S,16,230,230,BLUE); drawmat(han3S,16,260,230,BLUE); drawmat(han4S,16,290,230,BLUE); drawmat(han5S,16,320,230,BLUE); drawmat(han6S,16,350,230,BLUE); drawmat(han7S,16,380,230,BLUE); drawmat(han8S,16,410,230,BLUE); drawmat(han9S,16,220,300,BLUE); drawmat(han10S,16,250,300,BLUE); drawmat(han11S,16,280,300,BLUE); drawmat(han12S,16,310,300,BLUE); drawmat(han13S,16,340,300,BLUE); drawmat(han14S,16,370,300,BLUE); getch();closegraph();if( init() != 1){printf("init falied ! \n ");getch();exit(0);}else{printf("init...OK\n");output();help();}while(1){/*当三队列都不空执行调度 */ printf(">");scanf("%c",&COMMAND);switch(COMMAND){ case '\n': break;case 'H':case 'h': help(); break;case 'C':case 'c': create(); break; case 'B':case 'b': block(); break; case 'W':case 'w': wake(); break;case 'E':case 'e': fexcute(); break; case 'O':case 'o': output(); break; case 'X':case 'x': leave(); break; case 'R':case 'r': run(); break;}}}。

操作系统进程同步实验报告1

操作系统进程同步实验报告1

操作系统进程同步实验报告实验三:进程同步实验一、实验任务:(1)掌握操作系统的进程同步原理;(2)熟悉linux的进程同步原语;(3)设计程序,实现经典进程同步问题。

二、实验原理:(1)P、V操作PV操作由P操作原语与V操作原语组成(原语就是不可中断的过程),对信号量进行操作,具体定义如下:P(S):①将信号量S的值减1,即S=S-1;②如果S30,则该进程继续执行;否则该进程置为等待状态,排入等待队列。

V(S):①将信号量S的值加1,即S=S+1;②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

(2)信号量信号量(semaphore)的数据结构为一个值与一个指针,指针指向等待该信号量的下一个进程。

信号量的值与相应资源的使用情况有关。

当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。

注意,信号量的值仅能由PV 操作来改变。

一般来说,信号量S30时,S表示可用资源的数量。

执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S(3)linux的进程同步原语①wait();阻塞父进程,子进程执行;②#include#includekey_t ftok (char*pathname, char proj);它返回与路径pathname相对应的一个键值。

③int semget(key_t key, int nsems, int semflg)参数key就是一个键值,由ftok获得,唯一标识一个信号灯集,用法与msgget()中的key 相同;参数nsems指定打开或者新创建的信号灯集中将包含信号灯的数目;semflg参数就是一些标志位。

参数key与semflg的取值,以及何时打开已有信号灯集或者创建一个新的信号灯集与msgget()中的对应部分相同。

该调用返回与健值key相对应的信号灯集描述字。

调用返回:成功返回信号灯集描述字,否则返回-1。

进程同步模拟设计--吃水果问题

进程同步模拟设计--吃水果问题

附件1:学号:012课程设计题目进程同步模拟设计--吃水果问题学院计算机科学与技术学院专业计算机科学与技术专业班级计算机姓名指导教师2011 年01 月19 日课程设计任务书学生:专业班级:指导教师:作单位:计算机科学与技术学院题目: 进程同步模拟设计——吃水果问题初始条件:1.预备容:阅读操作系统的进程管理章节容,对进程的同步和互斥,以及信号量机制度有深入的理解。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟吃水果的同步模型:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

2.设计报告容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。

时间安排:设计安排一周:周1、周2:完成程序分析及设计。

周2、周3:完成程序调试及测试。

周4、周5:验收、撰写课程设计报告。

(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日进程同步模拟设计——吃水果问题1需求分析1.1吃水果问题的描述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

1.2问题的转换这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。

操作系统课程设计报告

操作系统课程设计报告

《操作系统课程设计》一、课程设计目的1、进程调度是处理机管理的核心内容。

2、本设计要求用C语言编写和调试一个简单的进程调度程序。

3、通过设计本可以加深理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。

二、课程设计主要内容1、项目名称设计一个有 N个进程共行的进程调度程序2、实验设备及环境:软件要求:WINDOWS NT 系列操作系统,VC、VB、TURBO C等多种程序设计开发工具。

硬件要求:P4 2.0以上CPU、256M、40G硬盘。

3、课程设计类型综合设计型4、课程设计内容与要求1)进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。

2)每个进程有一个进程控制块( PCB)表示。

进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

3)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。

进程的到达时间为进程输入的时间。

进程的运行时间以时间片为单位进行计算。

4)每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

5)就绪进程获得 CPU后都只能运行一个时间片。

用已占用CPU时间加1来表示。

如果运行一个时间片后,进程的已占用 CPU 时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

6)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。

7)重复以上过程,直到所要进程都完成为止。

5、课程设计方法及步骤1)充分了解各项设计要求。

深入理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。

《操作系统》课程设计报告.doc

《操作系统》课程设计报告.doc

《操作系统》课程设计报告(2006-2007年度第1学期)题目:进程通信与进程同步机制实践班级:计0401学号:3040602015姓名:陈前进教师:鞠时光2007-1-26一.课程设计内容进程通信与进程同步机制实践[问题描述]有三个进程R、M、P,分别负责从键盘读入数据、对读入的数据进行处理、将处理后的数据从屏幕输出,三个进程共享同一个缓冲区。

试用操作系统提供的进程通信和同步机制,使三个进程能够相互协作,正确的完成数据的读入、处理和输出。

[具体要求]1.可以选择Linux(gcc)或者Windows(VC 6.0)作为开发平台。

最终程序的运行界面可以是图形化窗口,也可以是命令行窗口。

2.三个进程通信采用共享缓冲区机制,缓冲区应至少能存放10组数据,每组数据是一个不超过31字节的字符串。

3.数据处理进程(M)的职责是:将读入的一组数据中的○1所有大写字母转换为小写字母(但每个句子的第一个字母应该大写),○2去掉单词与单词之间、句子与句子之间多余的空格,○3如果某个标点既不是句号,也不是逗号,则将其改为句号。

以上三个功能你可以只实现其中的一个、二个或者三个功能。

4.三个进程应该能够持续不断的运行,除非你要求它终止。

二.设计思路1.设计的基本思想:三个进程R、M、P,分别负责从键盘读入数据、对读入的数据进行处理、将处理后的数据从屏幕输出,三个进程共享同一个缓冲区。

定义缓冲区和信号量靠进程通信机制来实现。

进程通信机制,简单的说,就是进程交。

换信息的方式。

由于进程不能互相访问对方的资源,所以,它们要交换信息,只能借助操作系统这个桥梁。

操作系统提供了一种称之为“内核对象”的东西,这个内核对象,它属于操作系统拥有,而不是某一个特定的进程,所以理论上,操作系统中的所有进程都可以访问它们。

内部进程间通讯和数据交换有多种方式:消息、共享内存、匿名(命名)管道、邮槽、Windows套接字等多种技术。

在此次课程设计中,所采用的是共享内存的技术。

操作系统课程设计报告—多进程同步橘子苹果问题

操作系统课程设计报告—多进程同步橘子苹果问题

操作系统课程设计报告院(系):计算机工程学院专业:计算机科学与技术专业学生姓名:__班级:__学号:题目:用多进程同步方法演示“桔子-苹果”问题____起迄日期:_2012.07.02_--2012.07.13_____设计地点:现代教育中心指导教师:熊晓芸2011—2012年度第 2 学期完成日期: 2012 年 7 月 13 日一、课程设计目的本次实验进行操作系统课程设计的主要任务是模拟生产者和消费者的一个衍生,即实现“橘子-苹果问题”。

这个问题中有两个生产者,分别生产苹果核橘子,有两个消费者,分别消费橘子和苹果。

同时,因为两个生产者和两个消费者对同一个缓冲区进行操作,所以应互斥的访问缓冲区以保证程序的正确性。

本次实验的目的就是加深各个进程正确有效的对资源的访问,即同步和互斥。

同时掌握信号量在互斥访问中的使用。

掌握生产者和消费者问题的流程和实现方法。

同时提高编程的能力、对问题的解决能力及查阅文档的能力。

二、课程设计内容与要求1、通过研究Linux的进程同步机制和信号量,实现特殊的生产者与消费者问题的并发控制。

2、说明:有两类生产者,一类负责生产桔子,一类负责生产苹果;有两类消费者,一类负责消费桔子,一类负责消费苹果;他们共享一个有20个存储单元的有界缓冲区,每个存储单元只能放入一种产品(桔子/苹果)。

3、设计要求:1)二类生产者与二类消费者数目均为20,即20个生产者负责生产桔子,20个生产者负责生产苹果;20个消费者负责消费桔子,20个消费者负责消费苹果2)二类生产者的生产速度与二类消费者的消费速度均可独立在程序界面调节,在运行中,该值调整后立即生效3)多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码,同时需要考虑算法的效率性4)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符5)采用可视化界面,可在运行过程中随时暂停,查看当前生产者、消费者以及有界缓冲区的状态三、系统分析与设计1、系统分析1.此次任务是实现特殊生产者和消费者的演示程序,所需要处理的信息是生产者和消费者的个数,生产苹果、橘子和消费苹果、橘子的速度控制,缓冲区中橘子和苹果的个数和当前生产、消费指针的位置。

操作系统进程同步实验报告

操作系统进程同步实验报告

操作系统进程同步实验报告本实验旨在通过模拟操作系统中进程的同步问题,加深学生对操作系统中进程同步机制的了解和实践能力。

本次实验分为两个部分,第一个部分是使用信号量实现进程同步,第二个部分是使用管程实现进程同步。

第一部分实验:使用信号量实现进程同步本部分实验的目标是使用信号量来实现进程同步,确保资源的互斥访问。

在Linux系统中,信号量是一种用来控制进程同步的机制,可以用于保证共享资源的互斥访问、避免死锁等问题。

具体实验流程如下:1. 定义一个信号量,用于互斥访问共享资源在Linux系统中,使用semget函数可以创建一个信号量集,使用semctl函数可以对信号量进行控制。

```#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#define KEY 1234 // 定义信号量的键值int semid; // 定义信号量标识符union semun{int val; // 信号量的初始值struct semid_ds *buf; // IPC_STAT, IPC_SET操作时用ushort *array; // GETALL, SETALL操作时用};void init_sem(){int ret;union semun semunion;// 创建信号量semid = semget(KEY, 1, IPC_CREAT | 0666);if(semid == -1){perror("semget error");exit(1);}2. 定义生产者和消费者进程,并使用信号量来实现同步在生产者和消费者进程中,需要先对信号量进行P操作,即申请资源,然后进行对共享资源的操作,最后再对信号量进行V操作,即释放资源。

本实验中,共享资源是一个循环缓冲区,生产者进程向其中写入数据,消费者进程从中读取数据。

进程模拟课程设计

进程模拟课程设计

进程模拟课程设计一、课程目标知识目标:1. 学生能理解进程模拟的基本概念,掌握进程的基本状态和转换条件。

2. 学生能够运用流程图、伪代码等方式描述进程的运行过程。

3. 学生了解操作系统中进程管理的基本原理,并能够解释进程调度、同步和互斥等相关知识。

技能目标:1. 学生能够运用所学知识,设计简单的进程模拟程序,实现进程的创建、运行和终止。

2. 学生通过实际操作,学会使用至少一种编程工具进行进程模拟,提高编程实践能力。

3. 学生能够分析并解决进程管理中可能出现的问题,如死锁、饥饿等。

情感态度价值观目标:1. 培养学生对计算机科学和操作系统的兴趣,激发他们探索未知、积极进取的精神。

2. 增强学生的团队合作意识,使他们学会在团队中沟通、协作,共同完成任务。

3. 培养学生严谨、务实的科学态度,让他们认识到进程管理在计算机系统中的重要性。

本课程针对年级学生的认知特点和学科要求,以实际操作为导向,注重理论与实践相结合。

通过本课程的学习,学生将掌握进程模拟的基本知识和技能,培养他们解决实际问题的能力,同时提升对计算机科学的兴趣和情感态度。

为实现课程目标,后续教学设计和评估将围绕具体学习成果展开,确保教学效果的达成。

二、教学内容本课程教学内容以《计算机操作系统》教材中进程管理章节为基础,涵盖以下要点:1. 进程基本概念:进程的定义、进程与程序的区别、进程的属性。

2. 进程状态及转换:运行、就绪、阻塞状态,状态转换条件。

3. 进程控制块(PCB):作用、内容、管理方式。

4. 进程调度:进程调度算法,如FCFS、SJF、优先级调度等。

5. 进程同步与互斥:同步机制、互斥概念、生产者-消费者问题、哲学家就餐问题。

6. 死锁与饥饿:死锁的定义、预防、避免、检测与解除;饥饿现象及其解决方案。

7. 进程通信:进程间通信方式,如管道、消息队列、共享内存等。

教学大纲安排如下:第一课时:进程基本概念、进程状态及转换。

第二课时:进程控制块、进程调度。

操作系统课程设计—Linux吃水果

操作系统课程设计—Linux吃水果

操作系统课程设计班级:学号:姓名:指导老师:2016年1月3号一、设计内容1、Linux系统的熟悉与常用操作命令的掌握。

2、Linux环境下进程通信的实现。

(实现父母子女放水果吃水果的同步互斥问题,爸爸放苹果,女儿专等吃苹果,妈妈放橘子,儿子专等吃橘子,盘子即为缓冲区,大小为5。

)二、Linux环境介绍1、Linux的由来与发展Linux是一种可以在PC机上执行的类似UNIX的操作系统,是一个完全免费的操作系统。

1991年,芬兰学生Linux Torvalds开发了这个操作系统的核心部分,因为是Linux改良的minix系统,故称之为Linux。

2、Linux的优点(1)Linux具备UNIX系统的全部优点Linux是一套PC版的UNIX系统,相对于Windows是一个十分稳定的系统,安全性好。

(2)良好的网络环境Linux与UNIX一样,是以网络环境为基础的操作系统,具备完整的网络功能,提供在Internet或Intranet的邮件,FTP,www等各种服务。

(3)免费的资源Linux免费的资源和公开的源代码方便了对操作系统的深入了解,给编程爱好者提供更大的发挥空间。

3、Linux的特点1)全面的多任务,多用户和真正的32位操作系统2)支持多种硬件,多种硬件平台3)对应用程序使用的内存进行保护4)按需取盘5)共享内存页面6)使用分页技术的虚拟内存7)优秀的磁盘缓冲调度功能8)动态链接共享库9)支持伪终端设备10)支持多个虚拟控制台11)支持多种CPU12)支持数字协处理器387的软件模拟13)支持多种文件系统14)支持POSIX的任务控制15)软件移植性好16)与其它UNIX系统的兼容性17)强大的网络功能三、常用命令介绍1、目录操作和DOS相似,Linux采用树型目录管理结构,由根目录(/)开始一层层将子目录建下去,各子目录以 / 隔开。

用户login后,工作目录的位置称为 home directory,由系统管理员设定。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

某某大学课程设计报告课程名称:操作系统课程设计设计题目:进程同步模拟吃水果问题系别:计算机系专业:计算机科学与技术组别:学生: 学号:起止日期:指导教师:目录第一章需求分析 (1)1.1问题概述 (1)1.2任务分析 (1)1.3设计思路 (1)1.4运行环境 (1)第二章概要设计 (2)2.1 数据结构 (2)2.2模块说明 (2)2.2.1主函数 (2)2.2.2 6个进程函数 (2)2.3 操作的流程图 (3)第三章详细设计 (4)3.1定义类 (4)3.2定义各个过程 (5)3.3定义Print()函数 (5)3.4主函数 (6)第四章调式和操作说明 (13)4.1测试用例 (13)4.2运行结果 (14)第五章总结和体会 (15)参考文献: (15)致谢: (15)第一章需求分析1.1问题概述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

1.2任务分析1.模拟吃水果的同步模型:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

2.设计报告容要求:模拟吃水果问题,实现进程的同步操作;给出实现方案(包括数据结构和模块说明等);画出程序的基本结构框图和流程图;分析说明每一部分程序的的设计思路;实现源代码;按期提交完整的程序代码和可执行程序;根据要求完成课程设计报告。

1.3设计思路这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。

通过编程实践时,实际是随机的调用人一个进程的操作,而这些进程的操作相当于程序中的函数调用。

而计算机在执行时每一个时刻只能执行一个操作,这就默认了互斥。

同步的模拟可以类似于函数调用时的前提关系即先决条件。

这样进程同步模拟就完全可以通过函数的调用来实现。

具体的每一个操作的对应的函数的关系:爸爸向盘子中放一个苹果:Father()妈妈向盘子中放一个橘子:Mother()儿子1从盘子取一个橘子:Son1()儿子2从盘子取一个橘子:Son2()女儿1从盘子取一个橘子:Daugther1()儿子1从盘子取一个橘子:Daugther2()1.4运行环境(1):硬件配置个人计算机:PⅢ 500MHz以上/128M存/10G硬盘(2):软件配置操作系统:Windows XP开发软件:VisualC++6.0第二章概要设计2.1 数据结构(1)用一个整型变量Plate_Size表示盘子,初始值为0,当放水果时Plate_Size加1,取水果时Plate_Size减1。

变量Plate_Size的最大值为2,当为2时表示盘子已经满,此时若进行放水果操作,放水果将处于等待状态;为0时表示盘子为空,此时若进行取水果操作,取水果操作将处于等待状态。

(2)整型变量orange和apple分别表示盘子中的橘子和苹果数目,初始都为0,Plate_Size=apple+orange。

(3)用6个bool型的变量 Father_lag,Mother_lag,Son1_lag,Son2_lag,Daughter1_lag,Daughter2_lag表示六个进程是否处于等待状态。

处于等待时,变量值为true。

(4)两个放水果进程进程同时处于等待状态时,若有取水果的操作将自动执行等待的放水果进程,执行按等待的先后顺序;两个取苹果或橘子进程同时候处于等待状态,若有放苹果或橘子的操作将自动执行等待的取进程,进行按等待的先后顺序。

(5)用一个随机的函数产生0—5的6个整数,分别对应六个进程的调用。

2.2模块说明2.2.1主函数用一个随机的函数产生0—5的6个整数,分别对应六个进程的调用,调用的次数可以自己输入,本程序共产生了10次随机的调用进程。

2.2.2 6个进程函数爸爸向盘子中放一个苹果操作:Father()妈妈向盘子中放一个橘子操作:Mother()儿子1从盘子取一个橘子操作:Son1()儿子2从盘子取一个橘子操作:Son2()女儿1从盘子取一个橘子操作:Daugther1()女儿2从盘子取一个橘子操作:Daugther2()2.2.3 Print函数用于输出盘子中苹果和橘子的个数,水果总个数及有哪些进程处于等待状态。

2.3 操作的流程图图一放水果操作(放水果时父亲和母亲是随即进行)图二吃水果的流程图(假如儿子1先)第三章详细设计3.1定义类*//*class A{private:int apple=0;int orange=0;public:void Father();void Mother();void Son1();void Son2();void Daughter1();void Daughter2();void print();}3.2定义各个过程void Father() //Father进程{apple++;Print();}void Mother() //Mother进程{orange++;// Print();}void Son1() //Son1进程{orange--;// Print();}void Son2() //Son2进程{orange--;// Print();}void Daughter1() //Daughter1进程{apple--;// Print();}void Daughter2() //D aughter2进程{apple--;//Print();}3.3定义Print()函数void Print(){cout<<"现在盘子里有"<<apple<<"个苹果,"<<orange<<"个橘子,"<<"共有"<<apple+orange<<"个水果."<<endl;if(Father_lag==true)cout<<"Father进程处于等待状态,";if(Mother_lag==true)cout<<"Mother进程处于等待状态,";if(Son1_lag==true)cout<<"Son1进程处于等待状态,";if(Son2_lag==true)cout<<"Son2进程处于等待状态, ";if(Daughter1_lag==true)cout<<"Daughter1进程处于等待状态,";if(Daughter2_lag==true)cout<<"Daughter2进程处于等待状态,";if(((Father_lag==false)&&(Mother_lag==false) &&(Son1_lag==false)&&(Son2_lag==false)&&(Daughter1_lag==false)&&( Daughter2_lag==false))!=true)cout<<endl;}3.4主函数int main(){int k;srand((unsigned)time(NULL));//srand()函数产生一个以当前时间开始的随机种子for(k=0;k<10;k++){ int i;cout<<"第"<<k+1<<"次操作:"<<endl;i=rand()%6; //随进生成1-5.Plate_Size=apple+orange;switch(i){ case 0:cout<<"Father调用."<<endl;if(Plate_Size==2){ Father_lag=true;//Father()等待Print();if(Mother_lag==false)MonFa_c=1;}else{Father();Print();if((Daughter1_lag==true)&&(Daughter2_lag==true)){if(Daughter_b==1){Daughter1_lag=false;//Daughter1等待取消cout<<"处于等待的Daughter1自动被调用"<<endl;Daughter1(); //处于等待的Daughter1自动调用Print();Daughter_b=2;}else{Daughter2_lag=false;//Daughter2等待取消cout<<"处于等待的Daughter2自动被调用"<<endl;Daughter2(); //处于等待的Daughter2()自动调用Print();Daughter_b=1;}}else{if(Daughter1_lag==true){Daughter1_lag=false;//Daughter1等待取消cout<<"处于等待的Daughter1自动被调用"<<endl;Daughter1(); //处于等待的Daughter1()自动调用Print();Daughter_b=0;}else if(Daughter2_lag==true){Daughter2_lag=false;//Daughter2等待取消cout<<"处于等待的Daughter1自动被调用"<<endl;Daughter2(); //处于等待的Daughter2()自动调用Daughter_b=0;}}}break;case 1:cout<<"Mother调用."<<endl;if(Plate_Size==2){Mother_lag=true; //等待Print();if(Father_lag==false)MonFa_c=2;}else{Mother();Print();if((Son1_lag==true)&&(Son2_lag==true)){if(Son_a==1){Son1_lag=false;//Son1等待取消cout<<"处于等待的Son1自动被调用"<<endl;Son1(); //处于等待的Son1()自动调用Print();Son_a=2;}else{Son2_lag=false;//Son2等待取消cout<<"处于等待的Son2自动被调用"<<endl;Son2(); //处于等待的Son2()自动调用Print();Son_a=1;}}else{if(Son1_lag==true){Son1_lag=false; //Son1等待取消cout<<"处于等待的Son1自动被调用"<<endl;Son1(); //处于等待的Son1()自动调用Print();Son_a=0;}else if(Son2_lag==true){Son2_lag=false; //Son2等待取消cout<<"处于等待的Son2自动被调用"<<endl;Son2(); //处于等待的Son2()自动调用Print();Son_a=0;}}}break;case 2:cout<<"Son1调用."<<endl;if(orange==0){Son1_lag=true; //Son1处于等待Print();if(Son2_lag==false)Son_a=1; //用于判断Son1和Son2等待的先后性}else{Son1();Print();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1)//Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=1;}}else{if(Father_lag==true) //只有Father处于等待,调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=0;}else if(Mother_lag==true)//只有Mothe处于等待,调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=0;}}}break;case 3:cout<<"Son2调用."<<endl;if(orange==0){Son2_lag=true; //Son2处于等待Print();if(Son1_lag==false)Son_a=2;}else{Son2();Print();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1)//Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=1;}}else{if(Father_lag==true)//只有Father处于等待,调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endFather();Print();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=0;}}}break;case 4:cout<<"Daughter1调用."<<endl;if(apple==0){Daughter1_lag=true; //Daughter1Print();if(Daughter2_lag==false)Daughter_b=1;}{Daughter1();Print();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1) //Father和Mother同时处于等待,但Father先{ //等待,因此先调用Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用 {Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=1;}}else{if(Father_lag==true) //只有Father处于等待,调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=0;}}break; case 5:cout<<"Daughter2调用."<<endl;if(apple==0){Daughter2_lag=true; //Daughter2等待Print();if(Daughter1_lag==false)Daughter_b=2;}else{Daughter2();Print();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1) //Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{ Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=1;}}else{if(Father_lag==true)//只有Father处于等待,调用{ Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{ Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=0;}}}break;}}return 0;}第四章调式和操作说明4.1测试用例由于程序是模拟产生10次随机的操作,执行相应的函数来模拟进程同步。

相关文档
最新文档