江西理工大学操作系统课程设计报告

合集下载

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

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

《操作系统》课程设计报告一、读者/写者的问题模拟实现读者/写者问题,是指保证一个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;}二、进程间通信与子进程使用管道进行父子进程间通信,程序首先判断参数是否合法,因为输入的字符将从父进程通过发送到子进程中。

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

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

长江大学操作系统课程设计报告系(院):计算机科学学院专业班级:软工******姓名: ******* ***学号: 2013*****指导教师: *** **设计时间: 2015.12.27 - 2016.1.5设计地点: 4教5楼机房目录一、基本要求 (3)二、课程设计内容 (3)三、运行环境 (3)四、算法原理 (3)4.1银行家算法原理 (3)4.2页面置换算法原理 (3)4.3电梯调度算法原理 (4)五、程序结构 (4)5.1银行家算法结构 (4)5.2页面置换算法结构 (5)5.3电梯调度算法结构 (6)六、核心代码 (7)6.1银行家算法核心代码 (7)6.2页面置换算法核心代码 (13)6.3电梯调度算法核心代码 (17)七、运行结果截图 (20)7.1银行家算法截图 (20)7.2页面置换算法截图 (21)7.3电梯调度算法截图 (22)八、总结 (23)一、基本要求1.熟悉操作系统原理知识,理解各类管理算法。

2.能根据具体问题的数据特点,选用适当的数据结构,实现数据的组织和管理。

3.进一步巩固程序设计与数据结构的实践技能。

二、课程设计内容1.银行家算法模拟;2.页面置换算法模拟(OPT,FIFO,LRU);3.电梯调度算法(磁盘调度)模拟。

三、运行环境编程语言:C++,编程软件Microsoft Visual C++6.0,操作系统:Windows7。

四、算法原理4.1银行家算法原理银行家算法:系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。

如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。

把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。

当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。

”资源需求总量”表示进程在整个执行过程中总共要申请的资源量。

操作系统课程设计实验报告

操作系统课程设计实验报告

操作系统课程设计实验报告操作系统课程设计实验报告引言:操作系统是计算机科学中的重要课程,通过实验设计,可以帮助学生更好地理解操作系统的原理和实践。

本文将结合我们在操作系统课程设计实验中的经验,探讨实验设计的目的、实验过程和实验结果,以及对操作系统的理解和应用。

一、实验设计目的操作系统课程设计实验的目的是帮助学生深入理解操作系统的工作原理和实际应用。

通过设计和实现一个简单的操作系统,学生可以更好地掌握操作系统的各个组成部分,如进程管理、内存管理、文件系统等。

同时,实验设计还可以培养学生的动手能力和问题解决能力,提高他们对计算机系统的整体把握能力。

二、实验过程1. 实验准备在进行操作系统课程设计实验之前,我们需要对操作系统的基本概念和原理进行学习和理解。

同时,还需要掌握一些编程语言和工具,如C语言、汇编语言和调试工具等。

这些准备工作可以帮助我们更好地进行实验设计和实现。

2. 实验设计根据实验要求和目标,我们设计了一个简单的操作系统实验项目。

该项目包括进程管理、内存管理和文件系统三个主要模块。

在进程管理模块中,我们设计了进程创建、调度和终止等功能;在内存管理模块中,我们设计了内存分配和回收等功能;在文件系统模块中,我们设计了文件的创建、读写和删除等功能。

通过这些模块的设计和实现,我们可以全面了解操作系统的各个方面。

3. 实验实现在进行实验实现时,我们采用了分阶段的方法。

首先,我们实现了进程管理模块。

通过编写相应的代码和进行调试,我们成功地实现了进程的创建、调度和终止等功能。

接下来,我们实现了内存管理模块。

通过分配和回收内存空间,我们可以更好地管理系统的内存资源。

最后,我们实现了文件系统模块。

通过设计文件的读写和删除等功能,我们可以更好地管理系统中的文件资源。

三、实验结果通过实验设计和实现,我们获得了一些有意义的结果。

首先,我们成功地实现了一个简单的操作系统,具备了进程管理、内存管理和文件系统等基本功能。

操作系统课程设计报告

操作系统课程设计报告

目录一、课程设计目的 (2)二、课程设计要求 (2)三、创新思维 (3)四、系统环境支持及语言选择 (4)五、系统框架构成 (4)(一)整体框架: (4)(二)流程图 (5)1.先来先服务算法流程图 (5)2.优先级算法 (5)六、系统功能说明 (6)(一)先来先服务算法的实现: (6)(二)静态优先级算法的实现: (6)(三)动态优先级算法的实现: (6)(四)创建进程的实现: (6)(五)阻塞进程的实现: (7)(六)唤醒进程的实现: (7)(七)撤销进程的实现: (7)(八)进程控制的实现: (7)七、用户使用说明 (8)八、体会与自我评价 (8)一、课程设计目的在学习操作系统课程的基础上,在对操作系统各部分充分理解的基础上,对操作系统的整体进行一个模拟。

本实验进行的进程调度系统的算法采用的是动态和静态优先数优先的调度算法(即把处理机分配给优先数最低的进程)先来先服务算法。

通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。

同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、创新能力、开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。

二、课程设计要求1.进程管理功能以进程调度为主要功能。

以进程控制为辅助功能。

2.体现操作系统原理中进程调度算法和进程控制算法。

按照操作系统原理设计。

3.结构化设计。

设计时构建出模块结构图并存于文件中。

模块化实现,对每一功能,每一操作使用模块、函数、子程序设计方法实现。

4.进程以PCB为代表。

队列、指针用图示。

每一步功能在桌面上能显示出来。

5.系统应具有排错功能,对可能出现的错误应具有排查功能和纠错能力。

6.界面自行设计,语言自行选择。

(可用C#语言,也可用你会的其他语言,甚至还可用PPT)7.每人的设计功能都能表现或说明出来。

8.进程以队列法组织,对不同进程调度算法:FIFO队列或PRI队列或rotate(轮转队列)用同一个进程序列组织,对阻塞队列可设置一个,也可设多个。

操作系统课程设计实验报告(附思考题答案)

操作系统课程设计实验报告(附思考题答案)

操作系统课程设计实验报告(附思考题答案)课程设计(综合实验)报告( 2015 -- 2016 年度第 1 学期)名称:操作系统综合实验题目:oslab综合实验院系:计算机系班级:学号:学生姓名:指导教师:设计周数:分散进行成绩:日期:2015 年10 月29 日一、综合实验的目的与要求1. 理解和掌握操作系统的基本概念、基本组成与工作原理;2. 理解和掌握操作系统中主要功能模块的工作原理及其实现算法;3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。

二、实验正文实验1:实验环境的使用1.1实验目的:1.熟悉操作系统集成实验环境OS Lab 的基本使用方法。

2.练习编译、调试EOS 操作系统内核以及EOS 应用程序。

1.2实验内容:1.启动OS Lab2.学习OS Lab 的基本用法● 新建 Windows 控制台应用程序项目(1)在“文件”菜单中选择“新建”,然后单击“项目”。

(2)在“新建项目”对话框中,选择项目模板“控制台应用程序(c)”。

(3)在“名称”中输入新项目使用的文件夹名称“oslab ”。

(4)在“位置”中输入新项目保存在磁盘上的位置“C:\test ”。

(5)点击“确定”按钮。

● 生成、执行项目●3.EOS 内核项目的生成和调试● 新建 EOS 内核项目并按F7生成项目● 调试项目● 查看软盘镜像文件中的内容、EOS SDK (Software Development Kit )文件夹4.EOS 应用程序项目的生成和调试● 新建 EOS 应用程序项目● 修改 EOS 应用程序项目名称使用断点中断执行查看变量的值5.退出OS Lab6.保存EOS内核项目1.3思考与练习●在实验1中,生成EOS SDK文件夹的目的和作用是什么?答:SDK文件夹中提供了开发EOS应用程序需要的所有文件。

debug文件夹是在使用debug配置生成项目时生成的,其中存放了调试版本的EOS二进制文件。

操作系统课程设计报告

操作系统课程设计报告

一、课程设计任务划分二、根本原理〔一〕页面置换算法定义在地址映射过程中,假设在页面中发现所要访问的页面不再内存中,那么产生缺页中断。

当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。

而用来选择淘汰哪一页的规那么叫做页面置换算法。

〔二〕所使用的算法1) 最正确置换算法(OPT):将以后永不使用的或许是在最长(未来)时间内不再被访问的页面换出。

2) 先进先出算法(FIFO):淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。

3) 最近最久未使用算法(LRU):淘汰最近最久未被使用的页面。

〔三〕设计思想选择置换算法,先输入所有页面号,为系统分配物理块,依次进行置换:OPT根本思想:是用一维数组page[pIZE]存储页面号序列,memery[mIZE]是存储装入物理块中的页面。

数组ne某t[mIZE]记录物理块中对应页面的最后访问时间。

每当发生缺页时,就从物理块中找出最后访问时间最大的页面,调出该页,换入所缺的页面。

FIFO根本思想:是用一维数组page[pIZE]存储页面号序列,memery[mIZE]是存储装入物理块中的页面。

数组flag[10]标记页面的访问时间。

每当使用页面时,刷新访问时间。

发生缺页时,就从物理块中页面标记最小的一页,调出该页,换入所缺的页面。

三、根本思路实验环境:vc++,编程语言:c语言 #include #include /某全局变量某/int mIZE; /某物理块数某/int pIZE; /某页面号引用串个数某/tatic int memery[10]={0}; /某物理块中的页号某/ tatic int page[100]={0}; /某页面号引用串某/ tatic int temp[100][10]={0}; /某辅助数组某/ /某置换算法函数某/ void FIFO(); void LRU(); void OPT(); /某辅助函数某/void print(unigned int t); void deignBy(); void download();void mDelay(unigned int Delay); /某主函数某/ void main() {canf("%1d",&page[i]); download(); ytem("cl"); ytem("color 0E"); do{ put("输入的页面号引用串为:"); for(k=0;k<=(pIZE-1)/20;k++){ for(i=20某k;(i<pize)&&(i<20某(k+1));i++) 20="=0)||(((i+1))&&</p">(i==pIZE-1))) printf("%d ",page[i]); ele printf("%d ",page[i]); } } printf("某某某某某某某某某某某某某某某某某某某某某某某 "); printf("某请选择页面置换算法:某 "); printf("某 ----------------------------------------- 某 ");printf("某 1.先进先出(FIFO) 2.最近最久未使用(LRU) 某 "); printf("某 3.最正确(OPT) 4.退出某 "); printf("某某某某某某某某某某某某某某某某某某某某某某某 "); printf("请选择操作:[ ]"); canf("%d",&code); witch(code) { cae 1:FIFO(); break; cae 2:LRU(); break; cae 3:OPT(); break; cae 4: ytem("cl"); ytem("color 0A"); deignBy(); /某显示设计者信息后退出某/ printf("┃谢谢使用页面置换算法演示器!ytem("cl"); }while (code!=4); getch(); }/某载入数据某/ void download() { int i; ytem("color 0D");printf("╔════════════╗ "); printf("║正在载入数据,请稍候 !!!║ "); printf("╚════════════╝ "); printf("Loading... "); printf("for(i=0;i<51;i++) printf(""); for(i=0;i<50;i++) { mDelay((pIZE+mIZE)/2);printf(">"); } printf(" Finih. 载入成功,按任意键进入置换算法选择界面:/某设置延迟某/void mDelay(unigned int Delay) {unigned int i;for(;Delay>0;Delay--) { for(i=0;i<124;i++) { printf(" "); } } }/某显示设计者信息某/ void deignBy(){ printf("┏━━━━━━━━━━━━━━━━━━━━┓ "); printf("┃页面置换算法┃ "); printf("┃ 12级1班┃ ");O");printf("┃姓名:张海洋,李奔┃ ");printf("┣━━━━━━━━━━━━━━━━━━━━┫ "); }void print(unigned int t) { int i,j,k,l; int flag; for(k=0;k<=(pIZE-1)/20;k++) { for(i=20某k;(i<pize)&&(i<20某(k+1));i++) 20="=0)||(((i+1))&&(i==pIZE-1)))" ele="" d="" j="0;j<mIZE;j++)" i="">=j) printf(" |%d|",temp[i][j]); ele printf(" | |"); } for(i=mIZE+20某k;(i<pize)&&(i<20某(k+1));i++) {=""for(flag="0,l=0;l<mIZE;l++)" if(temp[i][l]="=temp[i-1][l])" flag++;=""if(flag="=mIZE)/某页面在物理块中某/" printf("="" ");="" ele=""|%d|",temp[i][j]);="" }="" 某每行显示20个某="" if(i="=0)" continue;="" printf(" ");="" printf("---------------------------------------- ");="" printf("缺页次数:%d",t+mize);="" printf("缺页率:%d="" %d ",t+mize,pize);<="" p="">printf("置换次数:%d ",t); printf("访问命中率:%d%% ",(pIZE-(t+mIZE))某100/pIZE); printf("---------------------------------------- "); }/某先进先出页面置换算法某/ void FIFO() {int memery[10]={0};int ma某=0; /某记录换出页某/ int count=0; /某记录置换次数某/ /某前mIZE 个数直接放入某/ for(i=0;i<mize;i++) {<="" p="">for(j=0;j<mize;j++) temp[i][j]="memery[j];" }<="" p="">for(i=mIZE;i<pize;i++) {="" 某判断新页面号是否在物理块中某=""for(j="0,k=0;j<mIZE;j++)" {<="" p="">if(memery[j]!=page[i]) k++;}if(k==mIZE) /某如果不在物理块中某/ {count++; /某计算换出页某//某最近最久未使用置换算法某/ void LRU() {int memery[10]={0};int flag[10]={0}; /某记录页面的访问时间某/ int i,j,k,m;int ma某=0; /某记录换出页某/ int count=0; /某记录置换次数某/ /某前mIZE 个数直接放入某/ for(i=0;i<mize;i++) {<="" p="">memery[i]=page[i]; flag[i]=i;for(j=0;j<mize;j++) temp[i][j]="memery[j];" }<="" p="">for(i=mIZE;i<pize;i++) {="" 某判断新页面号是否在物理块中某=""for(j="0,k=0;j<mIZE;j++)" {<="" p="">if(memery[j]!=page[i]) k++; ele flag[j]=i; /某刷新该页的访问时间某/ }if(k==mIZE) /某如果不在物理块中某/ {count++; /某计算换出页某/ma某=flag[0]<flag[1] 0:1; for(m="2;m<mIZE;m++)" if(flag[m]flag[ma某]=i; /某记录该页的访问时间某/ for(j=0;j<mize;j++)temp[i][j]="memery[j];" }="" ele="" {<="" p="">/某最正确置换算法某/ void OPT() {int memery[10]={0};int ne某t[10]={0}; /某记录下一次访问时间某/ int i,j,k,l,m;int ma某; /某记录换出页某/int count=0; /某记录置换次数某/ /某前mIZE个数直接放入某/for(i=0;i<mize;i++) {<="" p="">memery[i]=page[i]; for(j=0;j<mize;j++) temp[i][j]="memery[j];" }<="" p=""> for(i=mIZE;i<pize;i++) {<="" p="">/某判断新页面号是否在物理块中某/ for(j=0,k=0;j<mize;j++) {<="" p="">if(memery[j]!=page[i]) k++; }if(k==mIZE) /某如果不在物理块中某/ { count++; /某得到物理快中各页下一次访问时间某/ for(m=0;m=ne某t[1] 0:1; for(m=2;mne某t[ma某]) ma某=m; /某下一次访问时间都为pIZE,那么置换物理块中第一个某/ memery[ma某]=page[i]; for(j=0;j<mize;j++) temp[i][j]="memery[j];" }="" ele="" {<="" p="">四、调试及实验结果第一组数据:1.运行结果2. 按任意键进行初始化:3. 载入数据:4. 进入置换算法选择界面:5.运算中延迟操作:6.三种算法演示结果7.退出算法第二组数据:1.运行结果2.按任意键进行初始化:3.载入数据:4.进入置换算法选择界面:5.运算中延迟操作:6. 三种算法演示结果7.退出算法五、个人体会由于时间有限,本次设计完成的并不是很完美,下面从以下几点来说明本次课程设计的个人体会:1.本次课程设计中做的比拟好的地方:做的.好的地方就是在于对题目意思的正确理解,以及在此根底上的模型设计。

操作系统课程设计报告

操作系统课程设计报告

操作系统课程设计——多线程通讯-TCP聊天程序-VC++操作系统课程设计任务书一、设计题目:多机进程通信应用Socket进程通信技术编写聊天室程序,实现基于服务器的并发多机信息转发。

如果各客户端在线则可以实时聊天、发送接收文件,如果某客户端离线,则发送给他的消息可由服务器端进行内容缓存,待重新连线后可以自动接收通过服务器转发的信息或文件。

缓存与转发的控制算法可参考操作系统课程中生产者消费者进程同步方法、缓冲池技术等相关理论。

二、设计思路和功能的详细描述采用TCP协议,所以属于客户机/服务器模式,因此需要聊天服务器端和聊天客户端两个程序,实现的功能是:任意一台装有客户端程序的计算机都可以通过服务器端的IP地址与服务器相连,然后进入聊天室与连接到服务器的其他客户进行聊天。

当客户聊天结束时,可以点断开与服务器断开连接,以释放进程让其他等待的客户进入聊天室,本聊天室最大同时支持50个客户端的连接,如果服务器配置较高可以修改程序来增加同时连接数。

三、采用的方法、技术、运行环境及其配置本聊天程序采用TCP协议,用VC++编写,属于客户机/服务器模式。

采用了多线程的机制。

其中使用windows Sockets实现多台计算机(多个进程)间的通信,SOCKET实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有SOCKET接口的计算机通信。

应用程序在网络上传输,接收的信息都通过这个SOCKET接口来实现。

在客户机/服务器模式中客户应用程序向服务器程序请求服务。

一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。

在这个时刻,服务程序被“惊醒”并且为客户提供服务即对客户的请求作出适当的反应。

本聊天程序就是基于这中思想实现的,程序分为两大部分:TCP聊天服务器端和TCP聊天客户端。

两者都拥有各自的SOCKET接口,其中服务器端SOCKET接口需要绑定到固定地址上(实现语句:ock=Socket(AF_INET,SOCK_STREAM,0);),等待客户端的连接(实现语句:listen(sock,5);)。

操作系统课程设计报告

操作系统课程设计报告

实践课设计报告课程名称操作系统课程设计模拟设计内存管理中的地址题目转换(动态分区、页式十进制)学院班级学号姓名指导教师年月日课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 模拟设计内存管理中的地址转换(动态分区、页式十进制)初始条件:1.预备内容:阅读操作系统的内存管理章节内容,理解动态分区、页式、段式和段页式存储管理的思想及相应的分配主存的过程。

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

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.下列内部存储器管理中地址转换,在完成指定存储管理技术中的地址转换基础上还可以选择其它内部存储器管理中的地址转换进行模拟设计并实现:⑴动态分区方案,用最先适用算法对作业实施内存分配,然后把作业地址空间的某一逻辑地址转换成相应的物理地址。

能够处理以下的情形:输入某一逻辑地址,程序能判断地址的合法性,如果合法,计算并输出相应的物理地址。

如果不能计算出相应的物理地址,说明原因。

⑵页式存储管理中逻辑地址到物理地址的转换(十进制)。

能够处理以下的情形:输入某一十进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用十进制表示。

⑶页式存储管理中逻辑地址到物理地址的转换(八进制)。

能够处理以下的情形:输入某一八进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用八进制表示。

⑷页式存储管理中逻辑地址到物理地址的转换(十六进制)。

能够处理以下的情形:输入某一十六进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用十六进制表示。

⑸段式存储管理中逻辑地址到物理地址的转换。

能够处理以下的情形:指定内存的大小,进程的个数,每个进程的段数及段大小;能检查地址的合法性,如果合法进行转换,否则显示地址非法的原因。

⑹段页式存储管理中逻辑地址到物理地址的转换。

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

操作系统课程设计报告时间:2013-1-7~2013-1-18地点:信息技术实验中心计算机科学与技术(或软件工程)专业 2010级软件1班09号林琳2013-1-18目录实验一进程调度算法模拟 (2)1 设计目的 (2)2 设计要求 (2)3 使用动态优先权的进程调度算法的模拟 (3)流程图 (3)主要函数 (4)运行效果 (4)主要代码 (5)实验二动态分区分配方式模拟 (8)1 设计目的 (8)2 设计思想 (8)3 设计要求 (8)4 模拟算法的实现 (9)首次适应算法 (9)最佳适应算法 (9)流程图 (10)运行效果 (11)主要代码 (12)实验三请求调页存储管理方式模拟 (17)1 设计目的 (17)2 设计要求 (17)3 模拟算法的实现 (18)整体流程图 (18)OPT算法 (18)FIFO算法 (19)LRU算法 (19)运行效果 (19)主要代码 (21)实验四简单文件系统的实现 (24)1 设计目的 (24)2 设计要求 (24)3 算法的实现 (25)主要函数 (25)流程图 (27)运行效果 (27)主要代码 (28)总结 (35)课程设计的目的和意义 (35)实验一:进程调度算法模拟1.设计目的:通过优先权法模拟加深对进程概念和进程调度过程的理解,掌握进程状态之间的切换,同时掌握进程调度算法的实现方法和技巧。

2.设计要求:(1)用C语言来实现对N个进程采用动态优先权优先算法的进程调度;(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:●进程标识数ID。

●进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。

●进程已占用CPU时间CPUTIME。

●进程还需占用的CPU时间ALLTIME。

当进程运行完毕时,ALLTIME变为0。

●进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。

●进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。

●进程状态STATE。

●队列指针NEXT,用来将PCB排成队列。

(3)优先数改变的原则:●进程在就绪队列中呆一个时间片,优先数增加1。

●进程每运行一个时间片,优先数减3。

(4)假设在调度前,系统中有5个进程,它们的初始状态如下:ID 0 1 2 3 4PRIORITY 9 38 30 29 0CPUTIME 0 0 0 0 0ALLTIME 3 3 6 3 4STARTBLOCK 2 -1 -1 -1 -1BLOCKTIME 3 0 0 0 0STATE READY READY READY READY READY设计思想:(1)当系统空闲(就绪队列为空)时,系统运行闲逛进程,否则运行其他进程,发生变迁1(就绪→运行)。

(2)在运行进程(包括闲逛进程)的过程中,可能发生变迁2(运行→阻塞),即将运行进程插入到阻塞队列(闲逛进程不能被阻塞),可能有其他新的进程创建PCB,还可能唤醒阻塞队列中的某些进程PCB,发生变迁3(阻塞→就绪),即从阻塞队列中移出并插入就绪队列中。

(3)时间片运行结束后,若进程累计占用CPU时间大于等于进程需要运行的时间,则进程执行结束,释放其PCB。

若进程累计占用CPU时间小于进程需要运行时间,发生变迁4(运行→就绪),即将当前运行的进程插入就绪队列中。

3动态优先权算法模拟: 流程图:Y NNYYNNY图1-1输入开始进程个数n 创建n 个PCB ,并加入ready queue 中各进程按优先级从高到低排序 Ready queue 为空?Running<=逐个将ready_pc 中的PCBRunning 阻塞? Running idle 将running 从ready_queue 中删除再将running 加入block_queueb 是否创建新PCB 创建新进程并加入到ready_queue 中 对ready_queue 中的进程PCB 进行优先级排序 开始 结束Running<=id主要函数:int ID;//进程标识ID,其中0为闲逛进程,用户进程的标识数为1,2,3…int priority;//进程优先级Priority,闲逛进程(idle)的优先级为0,用户进程的优先级大于0,且随机产生,标识数越大,优先级越高。

int CPUtime;//进程占用的CPU时间CPUtime,进程每运行一次,累计值等于4int ALLtime;//进程总共需要运行时间Alltimeint State;//进程状态,0-就绪态;1-运行态;2-阻塞态。

struct Pcb *next;//队列指针next,用来将多个进程控制块PCB链接为队列typedef struct Pcb PCB;void init(); /*产生idle进程,输入用户进程数目,调用insert()*/void print(PCB *pcb); /*输出进程属性信息*/void print_init(PCB *pcb); /*输出所有PCB的初始值*/void insert_queue(PCB *queue,PCB *item); /*动态优先权调试算法将item插入到队列中,使得插入后,队列中按照优先级从高到低有序*/void pushback_queue(PCB *queue,PCB *item); /*将item插入到队列的尾部*/void insert(); /*动态优先权的进程调度算法生成进程属性信息,插入进程就绪队列*/ void run(PCB *pcb); /*运行进程,随机阻塞进程、产生新进程,插入就绪队列,唤醒阻塞进程*/void block(PCB *pcb); /*调用destroy(),将进程插入阻塞队列*/void wakeup(); /*动态优先权的进程调度算法唤醒进程,插入就绪队列*/void proc_priority(); /*优先权调度算法模拟*/void update(PCB *pcb); /*更新进程信息*/PCB *ready_queue,*block_queue,*idleprocess; /*就绪队列,阻塞队列及闲逛进程指针变量*/ 运行效果:图1-2图1-3主要代码:void init(){int i;for(i=0;i<N;++i){READY[i]=-1;//是-1,便于后面排序用且后面如果大于0则表示有进程,如果小于0则表示没有了BLOCK[i]=-1;RUNOUT[i][0]=-1;//表示第几个进程RUNOUT[i][1]=-1;//表示第几个时间片完成Process[i].ID=i;Process[i].Cputime=0;Process[i].State=Ready;Process[i].Startblock=-1;//再运行这么长时间就进入阻塞,如果是0则马上进入阻塞Process[i].Blocktime=0;//初始化为0}Process[0].Priority=9;Process[0].Alltime=3;Process[0].Startblock=2;//运行两个时间片就阻塞Process[0].Blocktime=3;//阻塞3个时间片就就绪Process[1].Priority=38;Process[1].Alltime=3;//默认无限制Process[2].Priority=30;Process[2].Alltime=6;Process[3].Priority=29;Process[3].Alltime=3;Process[4].Priority=0;Process[4].Alltime=4;}void print()//用于输出当前状态{int i;if(getRunning()>=0)printf("\tRUNNING PROG: %d\n",getRunning());printf("\tREADY_QUEUE:");for(i=0;i<N;++i){if(READY[i]>=0)printf("->%d",Process[READY[i]].ID);else{break;}}printf("\n\tBLOCK_QUEUE:");for(i=0;i<N;++i){if(BLOCK[i]>=0)printf("->%d",Process[BLOCK[i]].ID);else{break;}}printf("\n=====================================================\n");printf("ID\t");for(i=0;i<N;++i){printf("\t%d",Process[i].ID);}printf("\nPRIORITY");for(i=0;i<N;++i){printf("\t%d",Process[i].Priority);}printf("\nCPUTIME\t");for(i=0;i<N;++i){printf("\t%d",Process[i].Cputime);}printf("\nALLTIME\t");for(i=0;i<N;++i){printf("\t%d",Process[i].Alltime);}printf("\nSTARTBLOCK");for(i=0;i<N;++i){printf("\t%d",Process[i].Startblock);}printf("\nBLOCKTIME");for(i=0;i<N;++i){printf("\t%d",Process[i].Blocktime);}printf("\nSTATE\t");for(i=0;i<N;++i){switch(Process[i].State){case 0:printf("\tReady");break;case 1:printf("\tRun");if(Process[i].Alltime==0){Process[i].State=RunOut;}else Process[i].State=Ready;break;case 2:printf("\tBlock");break;case 3:printf("\tRunOut");break;}}printf("\n");printf("\tRUNOUT LIST:");for(i=0;i<N;++i){if(RUNOUT[i][0]>=0)printf("->%d(%d)",Process[RUNOUT[i][0]].ID,RUNOUT[i][1]);else{printf("\n");break;}}printf("\n");}int getRunning(){int i;for(i=0;i<N;++i)//找出正在运行的进程{if(Process[i].State==Run)return i;}for(i=0;i<N;++i)//如果没有正在运行的进程则找出马上就要阻塞的进程{if(Process[i].Startblock==0)return i;}return -1;}void sort()//作用是排序,找出就绪队列和阻塞队列分别放入READY[] ,BLOCK[] {int i,j,k;for(i=0;i<N;++i){READY[i]=-1;BLOCK[i]=-1;}for(i=0;i<N;++i)//找出了READYQUEUE按权从大到小放在READY[]中{if(Process[i].State==Ready||Process[i].State==Run){if(Process[i].Alltime==0)continue;for(j=0;j<N;++j){if(READY[j]<0){READY[j]=i;break;}else if(Process[i].Priority<=Process[READY[j]].Priority){ continue; }else{for(k=N-1;k>j;--k){READY[k]=READY[k-1];}READY[j]=i;break;}}}else if(Process[i].State==Block)//找出阻塞队列放入BLOCK[]中{for(j=0;j<N;++j){if(BLOCK[j]<0){BLOCK[j]=i;break;}else if(Process[i].Blocktime>=Process[BLOCK[j]].Blocktime){ continue; }else{for(k=N-1;k>j;--k){BLOCK[k]=BLOCK[k-1];}BLOCK[j]=i;break;}}}}}实验二:动态分区分配方式模拟设计目的:通过这次实验,加深对动态分区分配算法的理解,进一步掌握首次适应算法和最佳适应算法的实现方法。

相关文档
最新文档