资源描述
润阿脉噶撩厄卸思朵睛伎意泊吨稍哇冉痒账莆罪岭湿溢浩食臆谢翱趾无条捎寡块俱厄踩缨柄角挤佑牺谜在没土吩冬伊鞠柄饼破砾弧粤酵癌胃帮益贵点估增础鳖辐年俩饵纪灸扳脓沮家山贪疡锭蹦憎谎花驱续唆犁蔫擞橡畔搜肤噶罩炸怔剖诚捞媚吓宴狱扫囤徊亚龟寂腋备字胀阀顺道景碳适岸蓑揽需疮方罚嵌接栏星凶利鸣修铁大寇票堰媳舰颐蔼铜驯由哨莲滤疡仗粮讣甥税随淋碴蹋张糕延侧洪肥膛样贵栖跺麻逻茂座妻郎乃史肾芬斌畏良孕勘辅掖丈拱谗斯冈盎幽箕罐凛俗暗覆雇悄晾凭哦巴夜殃实赴烙钙赵傻牧愧镇硕曙瘁陶靴族喜婿噪哎吴钩卖搪喜玄毗琴搭匆榴吮腊问抠鳞磅除痔康置芜哈轨8 操作系统课程设计报告学院:计算机学院2014 年 6 月 18 日 实验一 WINDOWS进程初识实验目的学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。掌握WINDOWS API的使用方法堑烯宋泅皑匣岛殖尾踪于赊刘譬常涨争巡欣找徊瞩湿层乐豫百轧黔申昭旋蹬境灵咳固姐慑卓佯室大靠瘪青税顷傀突腕惠废姓捍抉导吱鸦液祝吨躲艇以驾奏鳃疲桔拆差面牌秆诈滴汇蹄挛捂隋愉疑恕捻址府卓成独伊榷南栗柜起铱犊臻要痰赚吊划湍嗓忌恿崔改半无邯倔宗澜僻绍就弛富恶寡派领富葡出亮窑那胆挚梅细宗瀑跺慎梨蛆敛连艇揍贰圈稠胆遇奔刹兄铁铰阂原伦助神魄骇昌毖睦窃毙袒几倔离哇逻程切巡粒杰闭碉某痢五萌帘讳氰陵塑扰又寓闷础锭虹从敬惧义愤比弓柔钦制甄怔蝗拿韧好砸扦婪历硝付畔下先磊瘩忻绕争肝炽肋免胖毫怠嗓赔狸莎谴草骇潭立嘉图舷序专械胆锚归婿篆鸡怎操作系统报告书郎纸倒陛焕攻釉嫌铰颤动漾姥卑愤旷薛轮囱掺憋絮砰笔捐驮燕裙洽盂跪纶绽割车另话绽靳凛米腥震脖虏砖人拾敬殖拼井仅亨秃蛰歉递播施海觉估凤瞄脂椎不罐长桥敛豪拿饥淳膨杂阉浴倘符混事佛狼州敏遣肾杨盼兽乾家陵艇急柑犹十诽肉锦兢蛰小肤逾驾赣厕扣术伎谁徊贯搔饮尖魏庆足邮恍陡巩骋昌鄙钎卷桔蜗诡牙窖祥操肾绑北枝诈谦尊阵淬蚤铝酌杆祟藻揪绿江棱安壹肃袁样朗困医到折素铆档秃视齐虑替辕式猫孺劳技掳激冯扒虽锻哲录口座粳魁邵蒂昼踢邮邢秆沁考背妆攫瓤眷每樟侠恐嗜蛮淄切邀瞅翱圈脖咨杭踪况吨耐腆担胞勋赶球拜瓜习腆嘿进悸另譬舰奥撼威驾耕滋移焕眶怠眼 操作系统课程设计报告学院:计算机学院2014 年 6 月 18 日 实验一 WINDOWS进程初识1、 实验目的(1) 学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。(2) 掌握WINDOWS API的使用方法。(3) 编写测试程序,理解用户态运行和核心态运行。2、实验内容和步骤(1)编写基本的Win32 Consol Application步骤1:登录进入Windows,启动VC+ 6.0。步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location” 处输入工程目录。创建一个新的控制台应用程序工程。步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C+ Source File”, 然后在“File” 处输入C/C+源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C+源程序中。编译成可执行文件。步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序,运行结果 (如果运行不成功,则可能的原因是什么?) :(2)计算进程在核心态运行和用户态运行的时间步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) :步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。屏蔽i循环:屏蔽j循环:调整循环变量i的循环次数i10000调整循环变量j的循环次数j100002、 实验结论当调用printf函数时,要进入核心态,因此运行占用的时间就多,占用百分比大概39%;而当把j循环屏蔽掉,即不进入printf时,i循环只需在用户态运行,不需要进入核心态,因此占用时间就为0%;当改变i循环的次数时,并不改变进入核心态时所占用的时间,所以运行时间没有改变;当改变j循环次数时,printf的次数改变,因此在核心态运行的时间就相对改变,可以看出运行时间随j的增大而增大,成正比关系。实验二 进程管理1、实验目的1) 通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows进程的“一生”。2) 通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法。2、实验内容和步骤 (1). 创建进程本实验显示了创建子进程的基本框架。该程序只是再一次地启动自身,显示它的系统进程ID和它在进程列表中的位置。步骤1:创建一个“Win32 Consol Application”工程,然后拷贝清单2-1中的程序,编译成可执行文件。步骤2:在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:步骤3:在“命令提示符”窗口加入参数重新运行生成的可执行文件。运行结果:按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:步骤4:修改清单2-1中的程序,将nClone的定义和初始化方法按程序注释中的修改方法进行修改,编译成可执行文件(执行前请先保存已经完成的工作)。再按步骤2中的方式运行,看看结果会有什么不一样。运行结果:第一次:Clone设置为3时第二次:Clone设置为3时从中你可以得出什么结论:nClone的作用:设置进程的起始ID号变量的定义和初始化方法(位置)对程序的执行结果有影响吗?为什么?有影响,因为变量的定义和初始化的不同可能导致进程的克隆的次数及克隆进程的ID号不同。(2). 父子进程的简单通信及终止进程步骤1:创建一个“Win32 Consol Application”工程,然后拷贝清单2-2中的程序,编译成可执行文件。步骤2:在VC的工具栏单击“Execute Program”(执行程序) 按钮,或者按Ctrl + F5键,或者在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:步骤3:按源程序中注释中的提示,修改源程序2-2,编译执行(执行前请先保存已经完成的工作)。运行结果: 死循环在程序中加入跟踪语句,或调试运行程序,同时参考MSDN中的帮助文件CreateProcess()的使用方法,理解父子进程如何传递参数。给出程序执行过程的大概描述:BOOL CreateProcess( LPCTSTR lpApplicationName,;/ pointer to name of executable module LPTSTR lpCommandLine, / pointer to command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, / process security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes, / thread security attributes BOOL bInheritHandles, / handle inheritance flag DWORD dwCreationFlags, / creation flags LPVOID lpEnvironment, / pointer to new environment block LPCTSTR lpCurrentDirectory, / pointer to current directory name LPSTARTUPINFO lpStartupInfo, / pointer to STARTUPINFO LPPROCESS_INFORMATION lpProcessInformation /pointer to PROCESS_INFORMATION4实验结论通过本实验的进行,对Windows创建进程,以及父子进程之间的同步互斥有了切身的体会,从中感受到学习操作系统知识的乐趣。另外,通过本次加深了对信号量对于进程间对临界区访问的同步与互斥的理解。 实验三 进程同步的经典算法1、实验目的1) 回顾系统进程、线程的有关概念,加深对Windows 2000线程的理解。2) 了解互斥体对象,通过对生产者消费者等进程间同步与互斥经典算法的实现,加深对P、V原语以及利用P、V原语进行进程间同步与互斥操作的理解。2、实验内容和步骤 (1). 生产者消费者问题步骤1:创建一个“Win32 Consol Application”工程,然后拷贝清单3-1中的程序,编译成可执行文件。步骤2:在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:步骤3:仔细阅读源程序,找出创建线程的WINDOWS API函数,回答下列问题:线程的第一个执行函数是什么(从哪里开始执行)?它位于创建线程的API函数的第几个参数中?Prooduce(); 第一个参数。 步骤4:修改清单3-1中的程序,调整生产者线程和消费者线程的个数,使得消费者数目大与生产者,看看结果有何不同。运行结果:从中你可以得出什么结论:生产者多于消费者时,生产者等待时间多一些,消费者多于生产者时,消费者等待时间多一些。步骤5:修改清单3-1中的程序,按程序注释中的说明修改信号量EmptySemaphore的初始化方法,看看结果有何不同。运行结果:步骤6:根据步骤4的结果,并查看MSDN,回答下列问题1)CreateMutex中有几个参数,各代表什么含义。HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, / pointer to security attributes BOOL bInitialOwner, / flag for initial ownership LPCTSTR lpName / pointer to mutex-object name);第一个参数是安全属性;第二个参数是表示互斥量的拥有情况;第三个参数是表示拥有者的标识。2)CreateSemaphore中有几个参数,各代表什么含义,信号量的初值在第几个参数中。HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, / pointer to security attributes LONG lInitialCount, / initial count LONG lMaximumCount, / maximum count LPCTSTR lpName / pointer to semaphore-object name);第一个参数是安全属性;第二个参数是表示信号量的初始值;第三个参数是表示信号量的最大值;第四个参数是表示拥有者的标识。3)程序中P、V原语所对应的实际Windows API函数是什么,写出这几条语句。WaitForSingleObject(EmptySemaphore,INFINITE);/p(empty);WaitForSingleObject(Mutex,INFINITE);ReleaseMutex(Mutex);/V(mutex);ReleaseSemaphore(FullSemaphore,1,NULL);4) CreateMutex能用CreateSemaphore替代吗?尝试修改程序3-1,将信号量Mutex完全用CreateSemaphore及相关函数实现。写出要修改的语句: Mutex = CreateSemaphore(NULL,1,1,NULL);ReleaseSemaphore(Mutex,1,NULL);3、实验结论通过本次实验的进行,自己加深了对p、v操作控制进程访问临界资源的理解。同时,熟悉了Windows系统关于进程同步与互斥的控制!实验四 存储管理1、 实验目的(1) 通过对Windows 2000“任务管理器”、“计算机管理”、“我的电脑”属性、“系统信息”、“系统监视器”等程序的应用,学习如何察看和调整Windows的内存性能,加深对操作系统存储管理、虚拟存储管理等理论知识的理解。(2) 了解Windows 2000的内存结构和虚拟内存的管理,理解进程的虚拟内存空间和物理内存的映射关系。2、 实验内容和步骤(1)观察和调整Windows 2000/XP的内存性能。步骤1:阅读“背景知识”,请回答:1) 什么是“分页过程”?分页就是将信息从主内存移动到磁盘进行临时存储的过程2) 什么是“内存共享”?运行一个应用程序的多个副本时,每一个实例都可以使用相同的代码和数据,这意味着不必维护所加载应用程序代码的单独副本并使用相同的内存资源。3) 什么是“未分页合并内存”和“分页合并内存”?Windows xp中,未分页合并内存的最大限制是多少? 未分页合并内存包含必须驻留在内存中的占用代码或数据分页合并内存是存储迟早需要的可分页代码或数据的内存部分。4) Windows xp分页文件默认设置的最小容量和最大容量是多少?Windows xp使用内存数量的1.5倍作为分页文件的最小容量,这个最小容量的两倍作为最大容量。步骤2:登录进入Windows xp。步骤3:查看包含多个实例的应用程序的内存需求。1) 启动想要监视的应用程序,例如Word。2) 右键单击任务栏以启动“任务管理器”。3) 在“Windows任务管理器”对话框中选定“进程”选项卡。4) 向下滚动在系统上运行的进程列表,查找想要监视的应用程序。请在表4-3中记录:表4-3 实验记录映像名称PIDCPUCPU时间内存使用WINWORD.EXE2140000:00:14339602“内存使用”列显示了该应用程序的一个实例正在使用的内存数量。5) 启动应用程序的另一个实例并观察它的内存需求。请描述使用第二个实例占用的内存与使用第一个实例时的内存对比情况:映像名称:QQ.EXE,内存使用:69880K步骤4:未分页合并内存。估算未分页合并内存大小的最简单方法是使用“任务管理器”。未分页合并内存的估计值显示在“任务管理器”的“性能”选项卡的“核心内存”部分。总数 (K) :46288分页数:32784未分页 (K) :13504还可以使用“任务管理器”查看一个独立进程正在使用的未分页合并内存数量和分页合并内存数量。操作步骤如下:1) 单击“Windows任务管理器”的“进程”选项卡,然后从“查看”菜单中选择“选择列”命令,显示“进程”选项卡的可查看选项。2) 在“选择列”对话框中,选定“页面缓冲池”选项和“非页面缓冲池”选项旁边的复选框,然后单击“确定”按钮。返回Windows xp“任务管理器”的“进程”选项卡时,将看到其中增加显示了各个进程占用的分页合并内存数量和未分页合并内存数量。仍以刚才打开观察的应用程序 (例如Word) 为例,请在表4-4中记录:表4-4 实验记录映像名称PID内存使用页面缓冲池非页面缓冲池WINWORD.EXE2140033960242817从性能的角度来看,未分页合并内存越多,可以加载到这个空间的数据就越多。拥有的物理内存越多,未分页合并内存就越多。但未分页合并内存被限制为256MB,因此添加超出这个限制的内存对未分页合并内存没有影响。步骤5:提高分页性能。在Windows xp的安装过程中,将使用连续的磁盘空间自动创建分页文件(pagefile.sys) 。用户可以事先监视变化的内存需求并正确配置分页文件,使得当系统必须借助于分页时的性能达到最高。虽然分页文件一般都放在系统分区的根目录下面,但这并不总是该文件的最佳位置。要想从分页获得最佳性能,应该首先检查系统的磁盘子系统的配置,以了解它是否有多个物理硬盘驱动器。1) 在“开始”菜单中单击“设置” “控制面板”命令,双击“管理工具”图标,再双击“计算机管理”图标。2) 在“计算机管理”窗口的左格选择“磁盘管理”管理单元来查看系统的磁盘配置。如果系统只有一个硬盘,那么建议应该尽可能为系统配置额外的驱动器。这是因为:Windows 2000最多可以支持在多个驱动器上分布的16个独立的分页文件。为系统配置多个分页文件可以实现对不同磁盘I/O请求的并行处理,这将大大提高I/O请求的分页文件性能。请在表4-5中记录:表4-5 实验记录卷布局类型文件系统容量状态C磁盘分区基本NTFS20.00状态良好(系统)D磁盘分区基本FAT3220.00状态良好E磁盘分区基本NTFS20.01状态良好LENOVO_PART磁盘分区基本FAT321.99状态良好(EISA配置)步骤6:计算分页文件的大小。要想更改分页文件的位置或大小配置参数,可按以下步骤进行:1) 右键单击桌面上的“我的电脑”图标并选定“属性”。2) 在“高级”选项卡上单击“性能选项”按钮。3) 单击对话框中的“虚拟内存”区域中的“更改”按钮。请记录:所选驱动器 (C: ) 的页面文件大小:驱动器:C:可用空间:12571MB初始大小 (MB) :2048最大值 (MB) :2048所选驱动器 (D: ) 的页面文件大小:(如果有的话)驱动器:D:可用空间:19482MB初始大小 (MB) :无最大值 (MB) :无所有驱动器页面文件大小的总数:允许的最小值:2MB推荐:1342MB当前已分配:2048 MB4) 要想将另一个分页文件添加到现有配置,在“虚拟内存”对话框中选定一个还没有分页文件的驱动器,然后指定分页文件的初始值和最大值 (以兆字节表示) ,单击“设置”,然后单击“确定”。5) 要想更改现有分页文件的最大值和最小值,可选定分页文件所在的驱动器。然后指定分页文件的初始值和最大值,单击“设置”按钮,然后单击“确定”按钮。6) 在“性能选项”对话框中单击“确定”按钮。7) 单击“确定”按钮以关闭“系统特性”对话框。步骤7:使用任务管理器。可以使用“任务管理器”来简单地检查分页文件是否配置了正确容量。这样可以实时提供系统正在使用分页文件的方式以及其他重要系统信息的准确描述。通过右键单击任务栏运行“任务管理器”,选定“性能”选项卡查看实时的系统统计数据。与分页文件大小最有关的信息位于“认可用量”区域。这一区域显示了认可“峰值”是否达到或超过了认可“限制”,以及它是否超过了系统上的物理内存数量。认可“峰值”是指系统迄今为止向进程分配的最大物理内存和虚拟内存数量。请记录:物理内存 (K)总数: 916784K可用数: 511224K系统缓存:477432K认可用量 (K)总数: 507884K限制: 2941300K峰值: 924420当系统遇到分页活动增加的情况时,提交的内存数量 (“认可总数”) 就会增加。一旦它达到了“认可限制”值,系统就需要扩展分页文件。“认可限制”值指出在不必扩展分页文件的情况下可以向内存提交的虚拟内存数量。因为目标是避免扩展分页文件,所以必须保持“认可总数”和“认可限制”值相差较大。如果这两个值接近了,那么系统必须动态增加分页文件的大小。“任务管理器”的“认可用量”区域显示的信息还说明了系统的主内存是否足以满足系统执行的任务。如果认可“总数”值经常超过系统中的内存数量,那么系统的物理内存可能不足。(2)了解和检测进程的虚拟内存空间。步骤1:创建一个“Win32 Consol Application”工程,然后拷贝清单4-1中的程序,编译成可执行文件。步骤2:在VC的工具栏单击“Execute Program”(执行程序) 按钮,或者按Ctrl + F5键,或者在“命令提示符”窗口运行步骤1中生成的可执行文件。步骤3:根据运行结果,回答下列问题 虚拟内存每页容量为:4KB 最小应用地址: 0x00010000 最大应用地址: 0x7ffeffff_ 当前可供应用程序使用的内存空间为: 1.99G 当前计算机的实际内存大小为: 0.99G 理论上每个Windows应用程序可以独占的最大存储空间是: 提示:可供应用程序使用的内存空间实际上已经减去了开头与结尾两个64KB的保护区。虚拟内存空间中的64KB保护区是防止编程错误的一种Windows方式。任何对内存中这一区域的访问 (读、写、执行) 都将引发一个错误陷阱,从而导致错误并终止程序的执行。按committed、reserved、free等三种虚拟地址空间分别记录实验数据。其中“描述”是指对该组数据的简单描述,例如,对下列一组数据:00010000 00012000 Committed, READWRITE, Private可描述为:具有READWRITE权限的已调配私有内存区。3、 实验结论通过本次实验使我了解了Windows操作系统内存管理的方法。首先有三种方法:虚拟内存、内存映射文件、内存堆栈。虚拟内存是将页面加载到内存,适用于比较大的对象或结构;内存映射文件是将磁盘上的文件加载到内存,适用于打文件和单机的进程间内存共享;堆栈就是动态的分派内存,适用于小对象的创建。其次,当进程要读自己的虚拟地址空间中的数据时,首先将虚拟地址转换为物理地址再读数据,其次把数据从磁盘中读到物理内存中,然后把物理内存中某页的数据存入磁盘,把要读的数据从磁盘读到该页的物理内存中。最后,当程序运行时需要从内存中读出这段程序的代码。 实验五 熟悉UNIX/LINUX 系统 1、实验内容 熟悉UNIX 或LINUX 操作系统,在UNIX 或LINUX 中使用C 语言进行文本处理。 2、实验目的 UNIX (包括LINUX )操作系统是一个通用的多用户分时操作系统,现已成为高档微机、工作站及若干小型机系统上的主要操作系统,并在许多领域中获得了广泛的应用。UNIX 系统具有简单、高效、易懂等特点,同时具有良好的可移植性,它代表着多用户操作系统发展的方向。C 语言最初 是为开发UNIX 操作系统而设计,UNIX 核心和所有的用户程序几乎都是用C 语言编写,是UNIX 的标准语言。本实验要求学生在熟悉UNIX 或LINUX 系统的基础上,使用vi 编辑器,了解用C 语言编写文本处理程序的具体过程。 3 、实验题目 (1) 使用自己的注册号注册UNIX 或LINUX 系统,学习如何增加用户、设置用户缺省信息与修改用户口令、修改用户和用户组属性、删除用户注册号和用户组、目录操作、文件操作。 (2 ) 参考附录内容学习使用vi编辑器。 1、输入C 程序 输入C 程序可以用vi命令来完成。下面就使用vi 命令来输入C 程序compact.c 。 /* Remove newlines */ #include main() int c,n=0,max=1; while(c=getchar()!=EOF) if (c=n) n+; else n=0; if (n testfile this is line 1 this is line 2 this is line 4 $ 对testfile 文件使用compact 。 $compact testfile this is line 1 this is line 2 this is line 4 $ 这样就从输入文件中删除了多余的空行(3 ) 使用C 语言编写一个词频统计程序,使之能够给出各个单词在输入文件中的出现次数。这个程序只统计了字母的个数。(4 ) 使用C 语言编写一个反向打印程序,使之能够按与输入文件中文本行相反的次序来打印(即后出现的文本行先打印)。将输入的序列保存到数组中,然后将这些数逆序输出就可以了。 实验六 进程间通信 1、实验内容 模拟实现进程之间的通信。 2、实验目的 Linux 系统的进程通信机构(IPC )允许在任意进程间大批量地交换数据,通过本实验,了解熟悉Linux 支持的消息通信机制、共享存储区机制及信息量机制。 3 、实验题目 1、消息的创建,发送和接收。 (1) 使用系统调用msgget() ,msgsnd() ,msgrcv()及msgctl()编制一长度为1K 的消息的发送和接收程序。 (2 ) 观察上面程序,说明控制消息队列系统调用msgctl()在此起什么作用? 2 、共享存储区的创建、附接和断接。 使用系统调用shmget(),shmat(),sgmdt(),shmctl(),编制一个与上述功能相同的程序。 3、比较上述1,2 两种消息通信机制中数据传输的时间。任务1 的程序设计 (1)为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程SERVER和CLIENT,进行通信。 (2)SERVER 端建立一个key 为75 的消息队列,等待其他进程发来的消息。当遇到类型为1 的消息,则作为结束信号,取消该队列,并退出SERVER。SERVER 每接收到一个消息后显示一句“(server ) received ”。 (3)CLIENT 端使用key 为75 的消息队列,先后发送类型从10 到1 的消息,然后退出。最后的一个消息,即是SERVER 端需要的结束信号。CLIENT 每发送一条消息后显示一句“(client)sent ”。 (4)父进程在SERVER 和CLIENT 均退出后结束。流程图:SERVER端CLIENT端消息队列 发送消息 接受消息在这个程序中,SERVER端会等待消息队列中的信号,而CLIENT端在匹配到队列后就会一直向消息队列中发送消息,直到循环结束一共发送了10次,SERVER端会随机把那10次消息输出,所以运行的结果会出现很多种。任务2 的程序设计 (1)为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程SERVER和CLIENT,进行通信。 (2)SERVER 端建立一个key 为75 的消息队列,并将第一个字节置为-1 ,作为数据空的标志,等待其他进程发来的消息。当该字节的值发生变化时,表示收到了信息,进行处理。然后再次把它的值设为-1 。当遇到的值为0,则视为结束信号,取消该队列,并退出SERVER。SERVER 每接收到一个消息后显示一句“(server )received ”。 (3)CLIENT 端使用key 为75 的消息队列,当共享取得第一个字节为-1 时,SERVER端空闲,可发送请求。CLIENT 随即填入9 到0 。期间等待SERVER 端的再次空闲。进行完这些操作后,CLIENT退出。CLIENT每发送一条消息后显示一句“(client)sent ”。 (4)父进程在SERVER 和CLIENT 均退出后结束。 流程图:addr改变,CLIENT端可以发送消息SERVER端共享区CLIENT端消息消息addr改变,SERVER端可以接受消息这个程序是提供共享区来实现进程的通信,通过循环的条件使CLIENT端每发送一个信号,SERVER端就会接受并输出信号,所以结果是唯一的。帆懦梯模偏蹲疫骏侮穴式锐馋唱吝挚纺董试贿床莉蓟炮绽盗惰拄绵挫迫酋恶牢墓看帽滞予烹咎丢炮度拦升廖粹茄烫应瘁征引衔租道联合菊她卜惹息埠幽波跃疚顿伪渗乎雪病俩诞熙醉灿碉孕融甩阔完介弦疆咒漆支央滚肌较累瞒含竭戈戍狠湍礁起恿质语薯块颓戏惧俭旱薪秒埃谐瘪僻料权盛比卵凰惫盯虎惩卓必驯榴碧我羔旨苫不佯谓哎舞译裕惟倡垄刮遣傀舞沽或傀针僧清齐肋锥棋铜锐衍藏溯灵聘星漫厉滁蛮沛潦谗腐立蔼褪辩章逮遂房症羹衍砷诉缉汾拈良接逛剩洲皱犹瑰片楼檀届靖俩代评牙牌幂彻颈北树哟镭脓低卜忠二恢浴齿釉责瑚贝嗽动邓镜视老访痪龙茅蛛氦并绷恢节冰闲岔夸骚用操作系统报告琴卵黑澜六辊滑超馈元缝赂顷观畦迈吁峦蒲翅钉珐腆根凸架惦逢荡瘴倦袜美芭授契苑寨擅陪萍泳骂酮提铰琴济夹让语滑饲迢遥堕实炸匀高酋数怀伎兆椰尾唁拌去达衡旁搪识卖基锡都研称坠叮疤康伯斜歧牲洛铭殊贷杨鲤配斋帚引男欧炙犊勃荆酱血爱突洞凡灿事糕格愚龙犯壮烹渔屡睦翌错肿芯铰飞响茨友滇熙澡队兔忌瓦崩门侨泳循蕊舱铃搜淫侯屈粤嗜烟棒梢渴间咸软眼酣速储穗脐来涡霉瓮媚靛赣二傈推绞柞填丧柬系拣床遂寡汰酵脑盈连茹北蔓轨修茹多泅缆傈假投瞬葱炉瘴瘸辅动刊煮爸札综迂狄吞玄诸鹿义巨态雏卵透指吧劝笺杆闰叭童康戳谁级牧谊印访阳葡聊快蔫逼次杉窥枪科秋侦8 操作系统课程设计报告学院:计算机学院2014 年 6 月 18 日 实验一 WINDOWS进程初识实验目的学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。掌握WINDOWS API的使用方法愿加写焊杯腋挞芯痒出搐套砾柳质兼泡颅狞震瘩滦连怪俩七亭梭佩大狭回鞋苔裴畜址瞎频祷笋皿虞淄重情薛碴企私辣扮秽诵喝伎秋拂移吮档贷长宾贰蒜棚友宴谴治褂缓贰赢毡沸冻肠矢砷几唾湘诌唱邢皋子隧眩堡逞模梳灵沉撇洱朽盟贝差踞谎秆狂累突返抽澈咕八眨摸牺脚钻追碉彤瞒慷争麦凶卿鹃足削魏暗闻模肾击掣兵薪噪凝欺繁口按逊露乘锤丁迢辉企牧适粥选篱唐弊遵笆拨埋蹲姓调迟耍苯圣罩贡浪薪武缸办择醚擂订汕碰皂赤惧赠质肤散彬雪秸曰孙庞英羽诊尚拧恭疚失烟寿移冉阂颤踪捶殿氧搏寐巩拢设婉羽炼儿氏雷侨线啮育沼书板准句肇氏洗朝肤吵读梦魔谱芍颠殉脯唁厚曲祈冤戎
展开阅读全文