欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    1863.VC++中进程调度算法的演示《操作系统原理》课程设计.doc

    • 资源ID:4137013       资源大小:55KB        全文页数:8页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    1863.VC++中进程调度算法的演示《操作系统原理》课程设计.doc

    操作系统原理课程设计 课题名称:VC+中进程调度算法的演示姓 名: 班 级: 学 号: 课程设计起止时间:2005年12月26日至30日指导教师: 成绩:课程设计任务书操作系统原理课程设计任务书设计题目:VC+中进程调度算法的演示任务下达时间:2005年12月26日任务完成时间:2005年12月30日指导教师: 指导教师评语一、所得结果:二、存在问题:成绩评阅人课程设计的题目:VC+中进程调度算法的演示设计内容:进程是当前操作系统下一个被加载到内存的、正在运行的应用程序的实例。每一个进程都是由内核对象和地址空间所组成的,内核对象可以让系统在其内存放有关进程的统计信息并使系统能够以此来管理进程,而地址空间则包括了所有程序模块的代码和数据以及线程堆栈、堆分配空间等动态分配的空间。进程仅仅是一个存在,是不能独自完成任何操作的,必须拥有至少一个在其环境下运行的线程,并由其负责执行在进程地址空间内的代码。在进程启动的同时即同时启动了一个线程,该线程被称作主线程或是执行线程,由此线程可以继续创建子线程。如果主线程退出,那么进程也就没有存在的可能了,系统将自动撤消该进程并完成对其地址空间的释放。详细设计:程序入口选择任务先来先服务关于作者Case选择任务短进程优先强占式高有先权时间片轮转退出123456判断继续退出程序流程图退出程序流程图如下:加载到进程地址空间的每一个可执行文件或动态链接库文件的映象都会被分配一个与之相关联的全局唯一的实例句柄。该实例句柄实际是一个记录有进程加载位置的基本内存地址。进程的实例句柄在程序入口函数中通过第一个参数传递,其实际值即为进程所使用的基本地址空间的地址。对于VC+链接程序所链接产生的程序,其默认的基本地址空间地址为0x00400000,如没有必要一般不要修改该值。通过创建一个新的进程及在其地址空间内运行的主线程来启动并运行一个新的程序。具体的,在执行函数时,首先由操作系统负责创建一个进程内核对象,初始化计数为1,并立即为新进程创建一块虚拟地址空间。随后将可执行文件或其他任何必要的动态链接库文件的代码和数据装载到该地址空间中。在创建主线程时,也是首先由系统负责创建一个线程内核对象,并初始化为1。最后启动主线程并执行进程的入口函数RunProc(),完成对进程和执行线程的创建。RunProc()函数的原型声明如下:BOOL RunProc(PCB *pPcb)int i;PROGRAM *pProgram=&pPcb->program;int nProcID=pPcb->idProc.nInID;int nSize=pProgram->instructionSet.size();int nTimePieceCnt=0;int nStartTime=GetTickCount();在程序设计时,某一个具体的功能模块可以通过函数或是线程等不同的形式来实现。对于同一进程而言,这些函数、线程都是存在于同一个地址空间下的,而且在执行时,大多只对与其相关的一些数据进行处理。如果算法存在某种错误,将有可能破坏与其同处一个地址空间的其他一些重要内容,这将造成比较严重的后果。为保护地址空间中的内容可以考虑将那些需要对地址空间中的数据单独进行访问的操作部分,放到另外一个进程的地址空间中运行,并且只允许其访问原进程地址空间中的相关数据。具体的,可在调度程序来解决。void Schedule()switch(g_ScheduleAlgorithm)case FCFS:Schedule_FCFS();break;case SPF:Schedule_SPF();break;case FPF_Reaved:Schedule_FPF_Reaved();break;case TimePiece:Schedule_TimePiece();break; 通过函数去创建子进程,子进程在全部处理过程中只对父进程地址空间中的相关数据进行访问,从而可以保护父进程地址空间中与当前子进程执行任务无关的全部数据。对于这种情况,子进程所体现出来的作用同函数和线程比较相似,可以看成是父进程在运行期间的一个过程。为此,需要由父进程来掌握子进程的启动、执行和退出。首先通过创建子进程,子进程启动后父进程通过函数等待其执行的结束,在子进程没有退出前父进程是一直处于阻塞状态的,这里子进程的作用同单线程中的函数类似。一旦子进程退出,所等待的对象将得到通知,父进程将得以继续,如有必要可以通过函数来获取子进程的退出可以通过enum PROCPRIORITY()参数在创建进程时设置子进程的优先级。前面的示例代码在创建子进程时使用的均是默认的优先级,如果要将优先级设置为高,可以修改。对于前面没有设定优先级的例子代码,可以在子进程启动后由父进程来动态改变其优先级设置。子进程 各进程创建如下: /调度程序void Schedule()switch(g_ScheduleAlgorithm)case FCFS:Schedule_FCFS();break;case SPF:Schedule_SPF();break;case FPF_Reaved:Schedule_FPF_Reaved();break;case TimePiece:Schedule_TimePiece();break;/FCFS调度void Schedule_FCFS()PCB pcb;PROGRAM program;int nIP=0;Schedule:if(g_bIsEnd && g_pcbReadyQueue.empty()g_listStatInfoProgLenFCFS.sort();PrintStatInfo_ProgLen(g_listStatInfoProgLenFCFS,FCFS);return;if(g_pcbReadyQueue.empty()goto Schedule;EnterCriticalSection(&g_CriticalSection);pcb=g_pcbReadyQueue.front();g_pcbReadyQueue.pop();LeaveCriticalSection(&g_CriticalSection);RunProc(&pcb);/添加统计信息··· ···/短进程优先void Schedule_SPF()PCB pcb;Schedule:if(g_bIsEnd && g_pcbReadyPriorityQueue.empty()g_listStatInfoProgLenSPF.sort();PrintStatInfo_ProgLen(g_listStatInfoProgLenSPF,SPF);return;if(g_pcbReadyPriorityQueue.empty()goto Schedule;EnterCriticalSection(&g_CriticalSection);pcb=g_pcbReadyPriorityQueue.front();g_pcbReadyPriorityQueue.pop_front();LeaveCriticalSection(&g_CriticalSection);RunProc(&pcb);/添加统计信息··· ···/抢占式高优先权调度void Schedule_FPF_Reaved()PCB *pPcb;PCBPQUEUE:iterator p;Schedule:if(g_bIsEnd && g_pcbReadyPriorityQueue.empty()g_listStatInfoProgLenFPF_Reaved.sort();PrintStatInfo_ProgLen(g_listStatInfoProgLenFPF_Reaved,FPF_Reaved);return;if(g_pcbReadyPriorityQueue.empty()goto Schedule;EnterCriticalSection(&g_CriticalSection);p=g_pcbReadyPriorityQueue.begin();pPcb=&g_pcbReadyPriorityQueue.front();g_bProgIsRun=TRUE;LeaveCriticalSection(&g_CriticalSection);if(RunProc(pPcb)/添加统计信息··· ···/时间片调度void Schedule_TimePiece()PCB pcb;Schedule:if(g_bIsEnd && g_pcbReadyPriorityQueue.empty()g_listStatInfoProcPriority.sort();PrintStatInfo_Priority(g_listStatInfoProcPriority,TimePiece);return;if(g_pcbReadyPriorityQueue.empty()goto Schedule;EnterCriticalSection(&g_CriticalSection);pcb=g_pcbReadyPriorityQueue.front();g_pcbReadyPriorityQueue.pop_front();LeaveCriticalSection(&g_CriticalSection);if(!RunProc(&pcb)EnterCriticalSection(&g_CriticalSection);g_pcbReadyPriorityQueue.push_back(pcb);LeaveCriticalSection(&g_CriticalSection);else/添加统计信息··· ··· 进程的互斥运行 正常情况下,一个进程的运行一般是不会影响到其他正在运行的进程的。但是对于某些有特殊要求的如以独占方式使用串行口等硬件设备的程序就要求在其进程运行期间不允许其他试图使用此端口设备的程序运行的,而且此类程序通常也不允许运行同一个程序的多个实例。这就引出了进程互斥的问题。 实现进程互斥的核心思想比较简单:进程在启动时首先检查当前系统是否已经存在有此进程的实例,如果没有,进程将成功创建并设置标识实例已经存在的标记。此后再创建进程时将会通过该标记而知晓其实例已经存在,从而保证进程在系统中只能存在一个实例。如果函数成功执行,将返回一个互斥量对象的句柄。如果在进程执行前已经存在有相同名字的互斥量,函数将返回这个已经存在互斥量的句柄,使用全局共享变量的方法则主要是在程序中通过编译器来实现的。通过预编译指令创建一个新节,在此节中可定义一个变量,而且必须对其进行初始化指定变量可以为外部进程访问。最后,为了使该变量能够在进程互斥过程中发挥作用,还要将其设置为共享变量,同时允许具有读、写访问权限。这可以通过预编译指令来通知编译器。运行结果及截图:小结程序中含有一些对控制台输出和事件进行控制的API函数。多进程是多任务管理中的重要内容,文中对其基本概念和主要的技术如子进程的创建与结束、进程间的互斥运行等做了较详细的介绍。参考文献:操作系统-习题与解析计算机操作系统教程张尧学 主编 清华大学出版操作系统实用教程任爱华 主编 清华大学出版visual c+程序设计教程刘瑞新 李树东 万朝阳 主编 电子出版社(黑魔方系列)visual c+函数技术教程 黄淼云 刘保顺 编著(黑魔方系列)visual c+基础教程王进强 编著 清华大学出版社计算操作系统教程第二版 张尧学 史美林 编著 清华大学出版社

    注意事项

    本文(1863.VC++中进程调度算法的演示《操作系统原理》课程设计.doc)为本站会员(文库蛋蛋多)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开