当前位置:文档之家› 清华大学高级操作系统2015-aos-lec5-security-chy3_19970899

清华大学高级操作系统2015-aos-lec5-security-chy3_19970899

操作系统实验指导书(清华版)

操作系统实验指导书 操作系统课程组编 内蒙古工业大学 信息工程学院计算机系 二〇〇九十月

目录 《操作系统》实验教学大纲 (1) 实验一进程管理 (1) 实验二SPOOLing技术实现 (12)

《操作系统》实验教学大纲 一、基本信息 二、实验安排 三、实验目的、内容与要求 实验一进程管理 (一)实验目的 1.加深对进程概念的理解,明确进程和程序的区别; 2.进一步认识并发执行的实质; 3.分析进程争用资源的现象,学习解决进程互斥的方法; 4.了解Linux系统中进程通信的基本原理。 (二)实验内容 1.进程的创建; 2.进程的控制; 3.进程的软中断通信; 4.进程的管道通信。 (三)实验要求 1.掌握Linux系统中进程的创建、控制和通信的实现; 2.根据实验内容,在Linux平台上用C语言编程实现,上机调试运行得出实验结果; 3.写出预习报告和实验报告。 实验二SPOOLing技术实现 (一)实验目的 1.加深对SPOOLing系统的理解; 2.进一步认识SPOOLing技术的实质; 3.分析、设计SPOOLing系统的实现方法; 4.了解Linux系统中SPOOLing的基本原理。

(二)实验内容 设计并运行一个简单的SPOOLing系统来模拟实际的SPOOLing输入/输出过程,以掌握这种以空间换时间的技术。要求将SPOOLing输入/输出处理程序编成一个独立的进程模块并与其他请求输入/输出的进程并发运行。SPOOLing进程负责把从输入设备输入的信息送到外存输入井中,或把外存输出井中的信息送到打印机等输出设备上输出。其余进程只要求编写输入/输出部分的程序。要求定义实施算法的相关数据结构,实现设备分配和SPOOLing 算法。 (三)实验要求 1.掌握SPOOLing技术的实现; 2.根据实验内容,在Linux平台上用C语言编程实现,上机调试运行得出实验结果; 3.写出预习报告和实验报告。 四、考核方式 实验成绩占课程总成绩的比重为10%。 考核方式根据实验课考勤、课前预习情况、课上实验能力、原型系统效果验收与实验报告的完成情况综合评分。 每个实验考核:实验预习占30%,实验能力和效果占30%,实验报告占40%。 五、建议教材与教学参考书 1.课程教材 [1] 张尧学. 计算机操作系统教程. 第三版. 北京:清华大学出版社. 2006 [2] 赵俊生.操作系统实验指导书.自编.2008 2.教学参考书 [1] 汤小丹.计算机操作系统.第三版.西安: 西安电子科技大学出版社.2008 [2] 徐虹. 操作系统实验指导. 北京: 清华大学出版社.2004 [3] 屠祁. 操作系统基础.第三版.北京: 清华大学出版社.2000 [4] 冯耀霖. 操作系统. 西安: 西安电子科技大学出版社.2001 [5] 左万历.计算机操作系统教程.第二版.北京:高等教育出版社.2004 六、编制说明 编制者:系统软件课程组组长:寿永熙 执笔人:赵俊生编制时间:2009年3月

清华大学操作系统课程lab2实验报告

物理内存管理实验报告 练习0:合并lab1和lab2 书上提示使用“diff/merge”工具来合并lab1和lab2的代码,可是没有找到这款工具,但是被推荐使用meld工具,也能很方便地将不同目录的文件异同比较出来,可以一一手动合并,删除,增加代码,避免了不必要的错误。 这部分主要合并的文件有kdebug.c、trap.c。 练习1:实现firstfit连续物理内存分配算法。 完成合并代码的工作之后,make qemu执行lab2,结果出现错误提示:

提示default_pmm.c的第283行出现错误,打开文件看,发现这句话出现在函数static void default_check(void) 中,这是一个检查函数,并且提示不要修改。 当然,为了调试工作,在检查函数中加一些代码还是可以的。例如通过cprintf输出一些调试信息,除此之外,还发现check函数中使用大量assert函数,大概作用是当参数条件不为1的时候就弹出debug minitor。也可以用来调试作用。 起初,我仔细看了basic_check函数,它的作用只是做了一些简单的分配释放的操作,并且也没出错,后面看了default_check函数之后也没找到问题所在。再然后是重点分析default_alloc_pages和default_free_pages函数,结合list_add函数看了许久才发现它的空闲块插入顺序有问题:每次插入都是从free_list的头部插入,事实上,应该保持free_list 的顺序,地址小的空闲块应该放在前面,地址大的空闲块应该放在后面,以便firstfit算法的从头快速查找。 找到问题后大致明白了这个exercise的目标:这个练习主要就是完善 default_alloc_pages和default_free_pages。 关键变量: #define free_list (free_area.free_list)//空闲块的链表,但是不指向具体页 #define nr_free (free_area.nr_free)//空闲块的个数 关键函数: list_init(&free_list);//初始化空闲块链表 SetPageProperty(base); ClearPageProperty(base); 关键宏: le2page(le, page_link);//由链表指针得到对应页的地址 (一)Alloc pages:用firstfit算法寻找空闲块 list_entry_t *le = &free_list; while ((le = list_next(le)) != &free_list) { struct Page *p = le2page(le, page_link);

习题答案-Linux操作系统原理实践教程-崔继-清华大学出版社

第1章 1、在VMwane中安装CentOS 7的基本步骤有哪些? (1)新建虚拟机 (2)虚拟机设置 (3)启动虚拟机 (4)设置安装信息,包括软件选择,安装位置,分区等 (5)完成最后安装 2、安装Linux时可以设置哪些分区?有哪些分区是必须的? 能够设置的分区可以根据安装系统时提示,主要包括:/,/boot,swap,/home,/opt 等等;其中/(根)分区是必须的。 第2章 1、针对Linux 系统启动运行,有哪些运行目标?每个运行目标的含义是什么? CentOS 从7.0 开始使用systemd 代替init 作为系统启动和服务器守护进程的管理器,负责在系统启动或运行时,激活系统资源,管理服务器进程。systemd 用目标(target)替代了运行级别的概念,提供了更大的灵活性,比如可以继承一个已有的目标,并添加其他服务来创建自己的目标。CentOS 7.0 之前的运行级别和systemd 目标之间的对应关系如下表所示。 2、Linux 有几种关机方法,每种关机操作有何异同? 关闭系统的命令有: shutdown(最安全的方式),halt,init,telinit,poweroff,reboot,具体含义可以参考

帮助手册页。 第3章 more、less、cat、wc 命令有什么区别? 这几个命令可用于对文本文件的处理显示,主要区别在:more命令以分页(一次一屏)显示文本信息;less类似于more,但增加了回滚功能;cat本意是连接文件并在标准输出上输出,也就是将文件一次全部输出;wc用于统计输出文件中的行数、单词数、字节数等。 第4章 (1)发出命令显示行号。 底端命令方式下 :set nu (2)保存到文件AboutLinux,并不退出。 底端命令方式下 :w AboutLinux (3)删除一句“It is this kernel that forms the base around which a Linux operating system is developed.”。 在命令方式下,先把光标移到It处,再按d$。(从当前光标处到行末的所有字符删除)(4)查找单词“Finland”。 命令方式下输入/Finland,回车后会在第一个Finland处停下来。 (5)把第一段的“Finland”单词后的内容换行,使其变成三段内容。 插入方式下,将光标移到Finland后,按回车键即可。(vi的换行标志是回车符) (6)将第二段的内容复制到文档的最后。 命令方式下:先用yy命令,然后移到文档最后,再按p键。 (7)删除第三段的内容。 命令方式下,光标移到第三段,用dd命令。(注,这里的段实际上是第3行。) (8)恢复被删除的一段内容。 命令方式下,用u命令。 (9)查找所有的“Minix”单词,并全部改为“MINIX”。 底端命令方式下,:1,$s/Minix/MINIX/g (10)不保存修改,退出vi。 底端命令方式下,:q! (11)使用vi再次打开文件AboutLinux,在第二段后插入“He began his work in 1991 when he released version 0.02 and worked steadily until 1994 when version 1.0 of the Linux Kernel was released.”。 shell命令提示符下输入:vi AboutLinux(打开保存的文件)

计算机操作系统作业汇总(清华大学出版社)

思考与练习题(第一章) 1.什么是操作系统?它的主要功能是什么? 答:操作系统是控制和管理计算机的软、硬件资源,合理地组织计算机的工作流程,以方便用户使用的程序集合。其主要功能包括进程管理功能、存储管理功能、设备管理功能和文件管理功能。 2.什么是多道程序设计技术?多道程序设计技术的主要特点是什么? 答:把多个独立的程序同时放入内存,使它们共享系统中的资源。 (1)多道,即计算机内存中同时放多道相互独立的程序。 (2)宏观上并行,是指同时进入系统的多道程序都处于运行过程中。 (3)微观上串行,是指在单道处理机环境下,内存中的多道程序轮流占用CPU,交替执行。 3.批处理操作系统是怎样的一种操作系统?它的特点是什么? 答:批处理操作系统是一种基本的操作系统类型。在该系统中,用户的作业(包括程序、数据及程序的处理步骤)被成批地输入到计算机中,然后在操作系统的控制下,用户的作业自动的执行。 特点:单道:(1)自动性。(2)顺序性。(3)单道性。 多道:(1)多道性。(2)无序性。(3)调度性。 4.什么是分时操作系统?什么是实时操作系统?试从交互性、及时性、独立性、多路性和 可靠性几个方面比较分时操作系统和实时操作系统。 答:分时操作系统:计算机能够同时为多个终端用户服务,而且能在很短的时间内响应用户的要求。实时操作系统:对外部输入的信息,实时系统能够在规定的时间内处理完毕并做出反应。 (1)多路性:分时系统是为多个终端用户提供服务,实时系统的多路性主要表现在经常对多路的现场信息进行采集以及多个对象或多个执行机构进行控制。 (2)独立性:每个终端向实时系统提出服务请求时,是彼此独立的工作、互不干扰。 (3)及时性:实时信息处理系统与分时系统对及时性的要求类似,都以人们能够接受的等待时间来确定。实时控制系统对一时性的要求更高,是以控制对象所要求的开始截止时间或完成截止时间来确定的。 5.实时操作系统分为哪两种类型?

操作系统课后习题总结清华大学出版社

习题二参考答案 4、答: 在生产者—消费者问题中,Producer进程中P(empty)与P(mutex)互换先后次序。先执行P(mutex),假设成功,生产者进程获得对缓冲区的访问权,但如果此时缓冲池已满,没有空缓冲区可供其使用,后续的P(empty)原语没有通过,Producer阻塞在信号量empty上,而此时mutex 已被改为0,没有恢复成初值1。切换到消费者进程后,Consumer进程执行P(full)成功,但其执行P(mutex)时由于Producer正在访问缓冲区,所以不成功,阻塞在信号量mutex上。生产者进程与消费者进程两者均无法继续执行,相互等待对方释放资源,会产生死锁。在生产者与消费者进程中,V操作的次序无关紧要,不会出现死锁现象。 5、答: 6、答: 设信号量sp用于控制对盘子的互斥操作,信号量sg1用于计数,表示盘子中的苹果数目,信号量sg2用于计数,表示盘子中的桔子数目。 Semaphore sp=1,sg1=0,sg2=0

dad() { while(1) { prepare an apple; p(sp); put an apple on the plate; v(sg2);} } mom() { while(1) {prepare an orange; p(sp); put an orange on the plate; v(sg1);} } son() { while(1) { p(sg1); take an orange from the plate; v(sg); eat the orange; } } daughter() { while(1) { p(sg2); take an apple from the plate; v(sg); eat the apple; } } 7、答:为了使写者优先,在原来的读优先算法基础上增加一个初值为1的信号量S,使得当至少有一个写者准备访问共享对象时,它可使后续的读者进程等待写完成;初值为0的整型变量writecount,用来对写者进行计数;初值为1的互斥信号量wmutex,用来实现多个写者对writecount的互斥访问。 reader(){ while(1){ P(s); P(rmutex);

操作系统课后习题总结(清华大学出版社)

习题二参考答案 4、答: 在生产者—消费者问题中,Producer进程中P(empty)和P(mutex)互换先后次序。先执行P(mutex),假设成功,生产者进程获得对缓冲区的访问权,但如果此时缓冲池已满,没有空缓冲区可供其使用,后续的P(empty)原语没有通过,Producer阻塞在信号量empty 上,而此时mutex已被改为0,没有恢复成初值1。切换到消费者进程后,Consumer进程执行P(full)成功,但其执行P(mutex)时由于Producer正在访问缓冲区,所以不成功,阻塞在信号量mutex上。生产者进程和消费者进程两者均无法继续执行,相互等待对方释放资源,会产生死锁。在生产者和消费者进程中,V操作的次序无关紧要,不会出现死锁现象。 5、答: 6、答: 设信号量sp用于控制对盘子的互斥操作,信号量sg1用于计数,表示盘子中的苹果数目,信号量sg2用于计数,表示盘子中的桔子数目。 Semaphore sp=1,sg1=0,sg2=0

dad() { while(1) { prepare an apple; p(sp); put an apple on the plate; v(sg2);} } mom() { while(1) {prepare an orange; p(sp); put an orange on the plate; v(sg1);} } son() { while(1) { p(sg1); take an orange from the plate; v(sg); eat the orange; } } daughter() { while(1) { p(sg2); take an apple from the plate; v(sg); eat the apple; } } 7、答:为了使写者优先,在原来的读优先算法基础上增加一个初值为1的信号量S,使得当至少有一个写者准备访问共享对象时,它可使后续的读者进程等待写完成;初值为0的整型变量writecount,用来对写者进行计数;初值为1的互斥信号量wmutex,用来实现多个写者对writecount的互斥访问。 reader(){ while(1){ P(s); P(rmutex);

清华大学操作系统lab1_实验报告

实验1:系统软件启动过程 练习1: (1)操作系统镜像文件ucore.img 是如何一步一步生成的? 在命令行中输入“make V=” 1、首先把C的源代码进行编译成为.o文件,也就是目标文件(红色方框内) 2、ld命令将这些目标文件转变成可执行文件,比如此处的bootblock.out(绿色方框内) 3、dd命令把bootloder放到ucore.img count的虚拟硬盘之中 4、还生成了两个软件,一个是Bootloader,另一个是kernel。 (2)一个被系统认为是符合规范的硬盘主引导扇区的特征: 在/lab1/tools/sign.c中我们可以了解到 规范的硬盘引导扇区的大小为512字节,硬盘结束标志位55AA

练习2: (1)从CPU 加电后执行的第一条指令开始,单步跟踪BIOS 的执行 改写Makefile文件 lab1-mon: $(UCOREIMG) $(V)$(TERMINAL) -e "$(QEMU) -S -s -d in_asm -D $(BINDIR)/q.log -monitor stdio -hda $< -serial null" $(V)sleep 2 $(V)$(TERMINAL) -e "gdb -q -x tools/lab1init" 在调用qemu时增加-d in_asm -D q.log参数,便可以将运行的汇编指令保存在q.log 中。 (2)在初始化位置0x7c00 设置实地址断点,测试断点正常。 在tools/gdbinit结尾加上 set architecture i8086 b *0x7c00 //在0x7c00处设置断点。 continue x /2i $pc //显示当前eip处的汇编指令 (3)将执行的汇编代码与bootasm.S 和bootblock.asm 进行比较,看看二者是否一致。 Notice:在q.log中进入BIOS之后的跳转地址与实际应跳转地址不相符,汇编代码也 与bootasm.S 和bootblock.asm不相同。 这是由于在gdb之中调试的原因,可以直接输入make debug,在生成的qemu虚拟机之中进行调试可以看到在虚拟机中运行的汇编代码,之后再与bootasm.S 和bootblock.asm 进行比较。

清华大学操作系统lab2及slub实现实验报告

练习0:把实验1的代码填入本实验中代码有lab1的注释相应的部分。 用understand中的merge工具将实验1中填写代码部分复制到实验2中,如图1。 图1 练习1:实现firstfit连续物理内存分配算法。 对于lab2代码首先对其make,之后在虚拟机中运行查看其错误所在位置如图2。 可以发现其错误出现在default_check(void)这个函数之中,该函数为检查firstfit算法的函数。继续分析错误出现的原因: struct Page *p0 = alloc_pages(5), *p1, *p2; assert(p0 != NULL); assert(!PageProperty(p0)); list_entry_t free_list_store = free_list; list_init(&free_list); assert(list_empty(&free_list)); assert(alloc_page() == NULL); unsigned int nr_free_store = nr_free; nr_free = 0;

free_pages(p0 + 2, 3); assert(alloc_pages(4) == NULL); assert(PageProperty(p0 + 2) && p0[2].property == 3); assert((p1 = alloc_pages(3)) != NULL); assert(alloc_page() == NULL); assert(p0 + 2 == p1); p2 = p0 + 1; free_page(p0); free_pages(p1, 3); assert(PageProperty(p0) && p0->property == 1); assert(PageProperty(p1) && p1->property == 3); assert((p0 = alloc_page()) == p2 - 1); //错误出现的位置 分析源码后可知,在其对内存进行一些列分配释放操作后,再次申请一页内存后出现错误,可知其在最后一次p0 = alloc_page()申请中得到内存页的位置与算法规则不相符,回到default_alloc_pages(size_t n)、default_free_pages(struct Page *base, size_t n)函数中可以分析得到,在分配函数和释放函数中都出现错误: list_add(&free_list, &(p->page_link)); 分配函数中若分得的块大小大于申请页数,则需要将多余的页形成一个块,按照从低地址到高地址的顺序挂回free_list中,而不是直接挂到free_list的后面。 list_add(&free_list, &(base->page_link)); 将释放页与空闲页合并操作之后,只是将新的空闲区域挂到了free_list的后面,并没有按照从低地址到高地址的顺序将其挂到free_list之中,导致后面check 函数中出现错误。对源代码做如下修改(红色为修改部分): static struct Page * default_alloc_pages(size_t n) { assert(n > 0); //出错判断 if (n > nr_free) { //申请页大小与现有空闲页比较 return NULL; } struct Page *page = NULL; list_entry_t *le = &free_list; while ((le = list_next(le)) != &free_list) { //从free_list的头开始寻找符合条件的空闲块 struct Page *p = le2page(le, page_link); if (p->property >= n) { page = p; break; } } if (page != NULL) {

清华大学综合教务管理系统简介

清华大学集成财务系统 系统简介 清华大学集成财务系统(Tsinghua Integrated Finance System,简称THIFS),是由清华大学财务处和计算机与信息管理中心共同研发的、面向高等院校财务管理与会计核算的专用软件。基于"通用、灵活、标准"的设计理念,采用网络财务的管理思想,将财务管理、监督、控制、服务的要求融为一体,应用最先进的信息集成技术,为高校各级财务人员、财务主管和院校领导提供了集成协同化的办公环境,从而为满足财务信息化、财务网络化需求提供了有力的保障。 THIFS是以各高校会计电算化为基础,采用集客户/服务器(C/S)、浏览器/服务器(B/S)为一体的解决方案。可通过数据接口,使得相关财务业务数据及时、准确的入帐管理。针对核算上"操作快捷、功能复杂"的特点,采用C/S结构处理方式;而对管理上"用户面广、操作功能简单"的特点,采用B/S结构处理方式。 系统功能 THIFS通过运行于财务专网和校园网上的管理平台对各子系统的用户、权限、日志进行统一管理。其功能模块的组成结构如下:

●系统整体划分 管理平台(财务处专网):运行于财务处内部(专网),用于统一管理内部核算和管 理的业系统,包括统一授权、统一日志管理。 管理平台(校园网):运行于财务处之外(校园网),用于统一管理外部业务系统及 信息发布系统,包括统一授权、统一日志监控和分析。 ●运行于专网管理平台的系统:通用基金管理子系统(工资管理、津贴管理、奖学 金/助学金管理、特殊津贴管理、购房补贴)、汇款及待转款子系统、银行对帐子 系统、预算管理子系统、票据管理子系统、项目管理子系统、备份恢复子系统、财 务档案子系统。 ●运行于校园网管理平台的系统:管理者报表平台子系统、学生收费子系统、个人财 务信息查询子系统(工资查询、公积金查询、退休基金查询、个人项目经费查询、 专项拨款/校长机动费查询、学生奖学金/助学金查询、学生收费信息查询)、财务 信息门户、银行帐号子系统。 系统特点 ●通用、灵活的统一应用管理平台,对财务信息进行标准化管理,固定的数据传输接 口,灵活的数据处理方式,准确的数据处理; ●通用基金子系统可根据工作需要自行定义数据结构、检索方式、报表样式,在集成 管理的同时满足个性化需求; ●依托先进的网络技术保证财务信息完整,实现财务核算数据集中安全存放,根据服 务和管理的需要,及时发布所需数据; ●提供统一数据交换模式,建立财务数据从财务专网到校园网的安全传输通道。 开发语言 ●用户端应用程序:PowerBuilder,java ●WEB应用程序:java

清华大学操作系统实验lab1实验报告

练习1、理解通过make生成执行文件的过程。 [练习1.1] 操作系统镜像文件ucore.img 是如何一步一步生成的? 在proj1执行命令make V=可以得到make指令执行的过程 从这几条指令中可以看出需要生成ucore.img首先需要生成bootblock,而生成bootblock需要先生成bootmain.o和bootasm.o还有sign,这三个文件又分别由bootmain.c、bootasm.S、sigh.c来生成。 ld -m elf_i386 -N -e start -Ttext 0x7C00 obj/boot/bootasm.o obj/boot/bootmain.o – o obj/bootblock.o 这句话用于生成bootblock,elf_i386表示生成elf头,0x7C00为程序的入

口。 'obj/bootblock.out' size: 440 bytes 这句话表示生成的bootblock的文件大小,因为大小不到512字节,所以需要给 blootblock填充,填充的功能在sign.c中有所体现,最后两字节设置为了0x55,0xAA buf[510] = 0x55; buf[511] = 0xAA; FILE *ofp = fopen(argv[2], "wb+"); size = fwrite(buf, 1, 512, ofp); [练习1.2] 一个被系统认为是符合规范的硬盘主引导扇区的特征是什么? 前面已经提到过:引导扇区的大小为512字节,最后两个字节为标志性结束字节0x55,0xAA,做完这样的检查才能认为是符合规范的磁盘主引导扇区。 Sign.c文件中有作检查: if (size != 512) { fprintf(stderr, "write '%s' error, size is %d.\n", argv[2], size); return -1; } 练习2:使用qemu执行并调试lab1中的软件。 [练习2.1] 从CPU 加电后执行的第一条指令开始,单步跟踪BIOS 的执行。[练习2.2] 在初始化位置0x7c00 设置实地址断点,测试断点正常。 [练习2.3] 在调用qemu 时增加-d in_asm -D q.log 参数,便可以将运行的汇编指令保存在q.log 中。将执行的汇编代码与bootasm.S 和bootblock.asm 进行比较,看看二者是否一致。 实验是基于老lab1/proj1做的,练习开始时是打算用命令行一句一句执行得到结果的,后来发现直接修改makefile和gdbinit可以大大提高调试效率。

清华大学操作系统lab3实验报告

实验3:虚拟内存管理 练习1:给未被映射的地址映射上物理页 ptep=get_pet(mm->dir,addr,1); if(ptep == NULL){ //页表项不存在 cprintf("get_pte in do_pgfault failed\n"); goto failed; } if (*ptep == 0) { //物理页不在内存之中 //判断是否可以分配新页 if (pgdir_alloc_page(mm->pgdir, addr, perm) == NULL) { cprintf("pgdir_alloc_page in do_pgfault failed\n"); goto failed; } } else{ if(swap_init_ok) { struct Page *page=NULL; ret = swap_in(mm, addr, &page); if(ret != 0){ //判断页面可否换入 cprintf("swap_in in do_pgfault failed\n"); goto failed; } //建立映射 page_insert(mm->pgdir, page, addr, perm); swap_map_swappable(mm, addr, page, 1); } else { cprintf("no swap_init_ok but ptep is %x, failed\n",*ptep); goto failed; } } ret = 0; failed: return ret; } 练习2:补充完成基于FIFO算法 _fifo_map_swappable(struct mm_struct *mm, uintptr_t addr, struct Page *page, int swap_in){ list_entry_t *head=(list_entry_t*) mm->sm_priv; list_entry_t *entry=&(page->pra_page_link); assert(entry != NULL && head!=NULL);

操作系统课后习题总结(清华大学出版社)

操作系统课后习题总结(清华大学出版社) 习题二参考答案 4、答: 在生产者—消费者问题中,Producer进程中P和P(mutex)互换先后次序。先执行P(mutex),假设成功,生产者进程获得对缓冲区的访问权,但如果此时缓冲池已满,没有空缓冲区可供其使用,后续的P原语没有通过,Producer 阻塞在信号量empty上,而此时mutex已被改为0,没有恢复成初值1。切换到消费者进程后,Consumer进程执行P成功,但其执行P时于Producer正在访问缓冲区,所以不成功,阻塞在信号量mutex上。生产者进程和消费者进程两者均无法继续执行,相互等待对方释放资源,会产生死锁。在生产者和消费者进程中,V操作的次序无关紧要,不会出现死锁现象。 5、答: 6、答: 设信号量sp用于控制对盘子的互斥操作,信号量sg1用于计数,表示盘子中的苹果数目,信号量sg2用于计数,表示盘子中的桔子数目。 Semaphore sp=1,sg1=0,sg2=0 dad { while(1)

{ prepare an apple; p(sp); put an apple on the plate; v(sg2);} } mom { while(1) {prepare an orange; p(sp); put an orange on the plate; v(sg1);} } son { while(1) { p(sg1); take an orange from the plate; v(sg); eat the orange; } } daughter { while(1) { p(sg2); take an apple from the plate; v(sg); eat the apple; } } 7、答:为了使写者优先,在原来的读优先算法基础上增加一个初值为1的信号量S,使得当至少有一个写者准备访问共享对象时,它可使后续的读者进程等待写完成;初值为0的整型变量writecount,用来对写者进行计数;初值为1的互斥信号量wmutex,用来实现多个写者对writecount 的互斥访问。 reader{ while{ P;P; ifP;readcount++;V;V;读文件;

相关主题
文本预览
相关文档 最新文档