版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章习题:你用过或见过什么操作系统,谈谈你对这些操作系统的认识?参考答案:略什么是操作系统?操作系统的功能有哪些?参考答案:操作系统是一个系统软件,它是这样一些程序模块的集合——管理和控制计算机系统中的硬件及软件资源,合理地组织计算机工作流程,以便有效地利用这些资源为用户提供一个具有足够功能、使用方便、可扩展、安全可靠和可管理的工作环境,从而在计算机与用户之间起到接口的作用。为有效管理计算机系统,操作系统需要实现处理机管理、存储管理、设备管理以及文件管理,同时为便于用户的使用,还需要提供用户接口。你认为推动操作系统发展的动力是什么?参考答案:操作系统不断发展与改进的驱动因素包括:硬器件的更新换代和硬件成本的不断下降;计算机体系结构的发展;提高资源利用率、方便用户和新的应用需求发展。为什么引入多道程序技术?参考答案:第二代计算机中所使用的批处理操作系统无需人机交互过程,在一定程度上提高了计算机的效率。然而,其处理机和输入/输出设备的运行是串行的,即在程序进行输入/输出时,处理机只能等待。处理机需要不断地探询I/O是否完成,此时不能执行其他程序。这种让高速设备等待低速设备的状况会降低计算机系统的效率。若处理机和I/O能够并行运行,也就是将处理机运行和输入/输出设备的运行重叠起来,必将极大地提高资源的利用率,改善整个系统的运行效率。CPU和I/O重叠需要我们将多个程序同时加载到计算机内存里,基于这一基本设想,出现了多道程序技术。目前的操作系统有哪些类型?操作系统的3种基本类型是什么?参考答案:目前的操作系统类型有:批处理操作系统、分时操作系统、实时操作系统、通用操作系统、微机操作系统、嵌入式操作系统、网络操作系统和分布式操作系统、多处理机操作系统、移动终端操作系统。操作系统的3种基本类型是批处理操作系统、分时操作系统、实时操作系统。什么是多道批处理、分时和实时操作系统?它们各有什么特点?参考答案:在批处理操作系统中引入多道程序设计技术后就形成了多道批处理系统。多道批处理在内存中可同时装入多个作业,当一个作业因等待外部设备而不能继续运行时,处理机可马上执行另一个作业;若该作业又因某种原因不能继续运行时,处理机便运行下一个作业,如此继续,直至第一个作业外部设备操作完成返回后再执行第一个作业。特点:(1)多道。计算机内存中同时存放几道相互独立的程序。(2)宏观上并行。同时进入系统的几道程序都处于运行过程中,即它们先后开始了各自的运行,但都未运行完毕。(3)微观上串行。在同一时刻只能有一道程序占用处理机,各道程序轮流使用处理机,交替执行。分时操作系统采用分时技术使一台计算机为多个终端用户服务,是一个联机的多用户交互式的操作系统。对每个用户能保证足够快的响应时间,并提供交互会话能力。特点:(1)交互性。用户可以在程序动态运行的情况下对其加以控制,从而方便用户调试程序,提供了软件开发的良好环境。其次,用户上机提交作业更方便,特别对于远程终端用户,不必将其作业交给机房,在终端上就可以提交、调试、运行其程序。(2)多用户同时性。多个用户同时在自己的终端上使用主机,共享处理机和其他资源,充分发挥系统的效率。(3)独占性。由于采用时间片轮转方式使一台计算机同时为多个终端服务,对于每个用户的操作命令又能快速响应,因此用户彼此之间都感觉不到有其他用户也在使用该台计算机,如同自己独占计算机一样。(4)响应及时性。分时系统应能及时接收并处理用户命令,用户的请求能在短时间内获得响应。实时操作系统是指当接收外界事件或数据时,能以足够快的速度予以处理,其处理结果又能在规定的时间内控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。提供及时响应和高可靠性是其主要特点,具有一定的专用性,与多道批处理系统、分时系统相比,实时系统的资源利用率可能较低。操作系统的特征是什么?参考答案:操作系统的基本特征包括并发、共享、虚拟和异步。操作系统的并发性是指计算机系统中同时存在多个运行着的程序,因此它具有处理多个程序同时执行的能力。正是程序的并发执行,才使得操作系统能有效地提高系统中资源的利用率,增加系统的吞吐量。共享是指系统中的资源可供内存中的多个并发执行的程序共同使用。虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体是以硬件形式实际存在的;而后者是以软件形式虚拟出来的。常见的虚拟技术包括虚拟处理器、虚拟存储器和虚拟设备等。在多道程序环境下,允许多个程序并发执行,但由于资源有限,程序的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是异步。实现操作系统的结构有哪几种?它们各有什么特点?参考答案:(1)简单结构特点:在早期开发操作系统时,设计者只把注意力放在了功能的实现和效率的提高上,而缺乏一致的设计思想。此时的操作系统是一组过程的集合,每个过程均可任意调用其他过程,操作系统内部既复杂又混乱。那时的操作系统是无结构的,称为整体结构或简单结构。(2)模块化结构它通过“分解”和“模块化”原则来控制大型软件系统的复杂度,将操作系统按其功能划分为若干个独立的模块。每个模块负责特定的管理功能并明确规定各模块之间的接口,确保它们能够通过这些接口实现交互。模块化设计不仅提高了操作系统的可靠性、稳定性和可扩展性,还为开发人员提供了更灵活的开发和维护方式,促进了代码的复用和团队协作。缺点:模块之间的关系往往非常复杂,添加一个新的功能可能会导致其他所有功能块都需要调整,从而增加了开发和维护的难度。网状调用关系容易引发循环调用,进而导致死锁问题。(3)分层式结构将操作系统的功能划分为不同的层次,低层次的功能块为其上一层功能块提供服务,简化了系统的设计和调试过程。分层结构自下而上的设计方式使所有设计中的功能都是有序的,或者说是建立在较为可靠的基础上的。这样比较容易保证整个系统的正确性。在系统中增加、修改或替换一个层次中的模块或整个层次,只要不改变相应层次间的接口,就不会影响其他层次,使系统维护和扩充变得更加容易。然而,由于分层结构的分层是单向依赖的,因此必须在相邻层之间建立层次间的通信机制,操作系统每执行一个功能,通常要自上而下地穿越多个层次,这就会增加系统的开销,从而导致系统效率的降低。(4)宏内核结构其特征是操作系统内核的所有模块的代码编译连接之后,形成一个大的可执行程序。该程序运行在特权模式(内核态),具备直接操作硬件的能力,并且向用户应用程序提供系统调用接口。宏内核不需要频繁地进行用户态到内核态的切换,可以获得较高的性能。宏内核的设计相对简单,模块之间的交互直接,易于实现和调试。内核服务之间的通信是直接的函数调用,而不是通过消息传递,因此响应时间更短,延迟更低。宏内核结构操作系统的所有组件均使用同一个地址空间,一个组件中的故障往往会导致其他组件连锁式的崩溃。而且,由于所有模块都运行在内核态,因此新功能的引入或修改需要对整个内核进行修改和重新编译,扩展性较差。此外,一个通用的设计常常意味着很难满足特定场景下对安全性、可靠性、实时性等方面的需求。(5)微内核结构对宏内核结构的操作系统进行解耦,将单个功能或模块从内核中拆分出来,作为一个独立的服务部署到独立的运行环境中,内核仅保留核心功能,这种结构称为微内核。微内核结构下,服务与服务之间是完全隔离的,单个服务即使出现故障或受到安全攻击,也不会直接导致整个操作系统崩溃或被攻破,从而能有效提高操作系统的可靠性与安全性。此外,微内核结构带来了机制与策略的进一步分离,也可以更方便地为不同场景定制不同的服务。(6)外核或外内核结构内核不提供传统操作系统中的进程、虚拟存储器等抽象事物,而是专注于物理资源的隔离(保护)与复用。具体来说,在基于外核结构的操作系统中,一个非常小的内核负责保护系统资源,而硬件资源的管理职责则委托给应用程序。这样,操作系统就可以做到在保证资源安全的前提下减少对应用程序的限制,充分满足应用程序对硬件资源的不同需求。一个多道批处理系统中仅有J1和J2两个作业,J2比J1晚5ms到达,它们的计算和I/O操作顺序如下。J1:计算60ms,I/O操作80ms,计算20ms。J2:计算120ms,I/O操作40ms,计算40ms。不考虑调度和切换,请计算完成两个作业需要的最少时间。参考答案:作业执行时间关系图如下图所示。由于在多道批处理系统中,J1与J2可以部分并行,因此,J1先到达系统,其会先占用CPU进行计算(到60ms),然后执行I/O操作的时间是60ms~140ms;而在J1执行I/O操作的过程中,J2可获得CPU运行120ms,到180ms结束;当J1执行完它的I/O操作后,执行计算,此时CPU正被J2占用,因此J1须等J2执行完后才能获得CPU执行剩余的20ms,执行完成后退出系统;此时,J2会执行I/O操作40ms,到220ms;最后J2获得CPU运行剩余的40ms,到260ms结束。由图可知,完成两个作业需要的最少时间为260ms。若某计算问题的执行情况如图1.10所示,请回答下列问题。(1)叙述该计算问题中处理机、输入机和打印机是如何协同工作的。(2)计算在图1.10所示的情况下处理机的利用率。(3)简述处理机利用率不高的原因。(4)请画出能提高处理机利用率的执行方案。参考答案:(1)处理机、输入机和打印机是按照输入一处理一打印的顺序依次执行的,输入机为处理机提供数据,处理机得到数据后进行处理,处理结果通过打印机打印输入。输入机读取一批数据,花费时间为100;处理机对这批数据进行计算,花费时间为20;打印机打印计算结果,花费时间为40。(2)处理机的利用率=[20/(100+20+40)]x100%=12.5%(3)当一道程序在运行中发出I/O请求后,处理机只能处于等待状态,即必须等I/O完成后才能继续运行,因此处理机会长时间处于空闲状态,这会导致其利用率不高。(4)采用多道程序设计技术使处理机、输入机和打印机并行工作,可以提高处理机的利用率,如下图所示。
第二章习题:什么是作业?作业由哪几部分组成?各有何功能?参考答案:在计算机操作系统中,作业(Job)是用户提交给计算机系统进行处理的一个独立工作单位。作业通常由程序、数据、作业说明书这三部分组成。程序主要负责核心处理逻辑。包含具体的算法指令,是实现用户所需计算或处理功能的代码。数据是处理对象。程序运行所需的输入信息以及产生的输出结果。数据以特定格式组织,为程序提供“原材料”。作业说明书则表明了控制意图。它告诉系统如何处理这个作业,包括作业名、优先级、所需资源(内存大小、设备类型)以及执行流程。操作系统为用户提供哪些接口?它们的区别是什么?参考答案:操作系统主要为用户提供命令接口、图形用户接口和程序接口三大类交互方式。命令接口允许用户通过键盘输入文本指令来直接控制系统,分为用于实时交互的联机命令和用于批量处理的脱机命令,其特点是资源占用少、操作效率高但学习成本较高;图形用户接口则是目前最主流的交互方式,它利用窗口、图标、菜单和指针将系统功能可视化,用户通过鼠标点击或触屏即可直观操作,极大地降低了使用门槛,但相对消耗更多系统资源;而程序接口是专为应用程序开发者设计的,它由一组预定义的系统调用组成,允许程序在运行时请求操作系统内核服务,是应用程序获取系统资源的唯一途径,普通用户无法直接在终端调用。处理机为什么要区分核心态和用户态?在什么情况下进行两种方式的切换?参考答案:处理机区分核心态(内核态)和用户态的根本目的是为了保障操作系统的安全性与稳定性,通过硬件层面的权限隔离,防止普通应用程序因错误操作或恶意行为直接访问关键硬件资源或修改系统核心数据,从而避免导致整个系统崩溃。在核心态下,CPU拥有最高权限,可执行包括特权指令在内的所有指令并直接访问硬件;而在用户态下,权限受限,程序只能执行非特权指令,若需访问硬件必须通过系统调用请求内核协助。两种状态的切换主要发生在以下三种场景:一是系统调用,即用户程序主动通过软中断请求内核服务;二是硬件中断,即外部设备向CPU发送信号,迫使CPU暂停当前任务转由内核处理;三是异常,即程序运行出错(如除数为零、缺页异常)时,CPU自动陷入内核态进行错误处理。什么是系统调用?它与一般用户程序有何区别?与库函数又有何区别?参考答案:系统调用是操作系统内核提供给用户程序的一组特殊接口,是用户程序主动请求内核服务的唯一合法途径,其本质是一次从用户态到内核态的切换。它与一般用户程序的核心区别在于运行权限和执行位置:系统调用运行在拥有最高权限的内核态,可以直接访问硬件和核心内存;而一般用户程序运行在权限受限的用户态,无法直接执行特权指令或访问硬件资源。系统调用与库函数的区别则在于封装关系和性能开销:库函数是运行在用户态的普通函数,它通常是对一个或多个系统调用的封装,旨在为程序员提供更便捷、通用的编程接口;调用库函数本身不涉及模式切换,开销较小,但如果该库函数内部发起了系统调用,则会产生从用户态到内核态再返回的上下文切换开销,性能成本远高于普通函数调用。简述系统调用的实现过程。参考答案:系统调用的实现过程是一个从用户态到内核态再返回的闭环流程,始于用户程序调用标准库函数,该库函数将对应的系统调用号存入指定寄存器并传递参数;接着执行陷入指令触发硬件异常,使CPU从用户态切换至内核态并保存当前上下文;随后内核根据系统调用号查询系统调用表,定位并执行相应的内核服务例程来完成特权操作;最后,内核将结果存入寄存器,执行返回指令恢复用户态上下文,将控制权交还给用户程序继续执行。Linux操作系统为用户提供哪些接口?试举例说明。参考答案:Linux操作系统主要为用户提供三大类接口,分别是命令行接口、图形用户接口和程序接口。命令行接口是Linux最基本、最核心的交互方式,用户通过在终端中输入文本命令来操作和管理系统。它高效、灵活,是系统管理员和开发者的首选工具,例如使用ls命令列出目录内容,或使用vim编辑文件。图形用户接口为普通用户提供了直观的桌面环境,通过窗口、图标和菜单进行可视化操作,大大降低了学习成本。常见的Linux桌面环境有GNOME、KDEPlasma等。程序接口是为应用程序开发者提供的接口,主要形式是系统调用。它允许程序在运行时请求内核服务,如文件操作、进程管理等,是应用程序与操作系统内核交互的桥梁。例如,C语言程序通过调用open()函数来请求内核打开一个文件。在你周围装有Linux系统的计算机上,查看有关Shell的基本命令,并编写一个简单的Shell程序,完成一个已有数据文件的复制和打印。参考答案:$echo"这是用于测试的原始数据内容">source_data.txt#!/bin/bash#检查用户是否提供了两个参数(源文件和目标文件)if[$#-ne2];thenecho"错误:参数数量不正确。"echo"用法:$0<源文件><目标文件>"exit1ficp$1$2cat$2用Linux文件读/写相关的系统调用,编写一个copy程序。参考答案:#include<stdio.h>#include<stdlib.h>#include<fcntl.h>//包含open系统调用的标志定义(如O_RDONLY)#include<unistd.h>//包含read,write,close系统调用#include<sys/stat.h>//包含文件权限宏(如S_IRUSR)#defineBUFFER_SIZE1024//定义缓冲区大小,每次读写1024字节intmain(intargc,char*argv[]){intsrc_fd,dest_fd;//文件描述符charbuffer[BUFFER_SIZE];//数据缓冲区ssize_tbytes_read,bytes_written;//用于记录实际读写的字节数//1.参数检查if(argc!=3){fprintf(stderr,"用法:%s<源文件><目标文件>\n",argv[0]);exit(1);}//2.打开源文件(使用open系统调用)//O_RDONLY:只读模式src_fd=open(argv[1],O_RDONLY);if(src_fd==-1){perror("打开源文件失败");//perror用于打印系统调用错误的详细信息exit(1);}//3.创建/打开目标文件(使用open系统调用)//O_WRONLY|O_CREAT|O_TRUNC:只写模式|如果文件不存在则创建|如果文件存在则截断为空//0644:设置文件权限为rw-r--r--(所有者可读写,组和其他人只读)dest_fd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0644);if(dest_fd==-1){perror("创建目标文件失败");close(src_fd);//关闭已打开的源文件exit(1);}//4.循环读取和写入while((bytes_read=read(src_fd,buffer,BUFFER_SIZE))>0){//read返回实际读取的字节数,如果为0则表示到达文件末尾//使用write系统调用将缓冲区内容写入目标文件//注意:需要处理写入字节数可能小于读取字节数的情况(虽然在此简单示例中未完全展开处理)bytes_written=write(dest_fd,buffer,bytes_read);if(bytes_written!=bytes_read){perror("写入文件失败");close(src_fd);close(dest_fd);exit(1);}}if(bytes_read==-1){perror("读取文件失败");exit(1);}//5.关闭文件(使用close系统调用)if(close(src_fd)==-1){perror("关闭源文件失败");}if(close(dest_fd)==-1){perror("关闭目标文件失败");}printf("文件复制成功。\n");return0;}在Linux终端中,使用gcc编译器进行编译:gcc-omy_copycopy.c
第三章习题:1.结合具体场景谈谈线程概念的动机及优势。参考答案:线程的引入,主要是为了解决传统进程在并发执行时开销过大的问题,通过提供更轻量级的执行单元来显著提升系统的并发性和多核处理机利用率。线程的优势主要体现在性能、响应性和资源利用三个方面,我们可以通过以下具体场景来理解:场景一:图形用户界面(GUI)应用优势:改善程序响应性在一个单线程的GUI程序中,如果用户点击一个需要长时间计算的按钮(如加载一个大文件),整个界面会“卡死”,无法响应其他操作(如移动窗口、点击菜单)。线程解决方案:主线程:专门负责处理用户交互和界面绘制,确保界面始终保持流畅响应。工作线程:当用户触发耗时操作时,创建一个新线程来执行这个任务。这样,即使工作线程在后台忙碌,主线程依然可以响应用户的其他指令。场景二:Web服务器优势:提高系统吞吐量一个Web服务器需要同时处理成千上万个客户端请求。这些请求大多涉及I/O操作(如读取数据库、访问磁盘文件),而I/O操作的速度远慢于CPU。线程解决方案:服务器采用线程池模型。主线程负责监听和接收新的网络连接,然后将连接分配给线程池中的一个空闲工作线程。当一个工作线程在处理某个请求并因I/O操作而阻塞时,其他工作线程可以继续处理其他客户端的请求。这样,CPU的计算时间和I/O的等待时间得以重叠,服务器的整体并发处理能力(吞吐量)得到极大提升。场景三:科学计算或视频编码优势:充分利用多核并行计算这类任务通常是计算密集型的,需要处理海量数据。例如,对一个超大矩阵进行运算,或对一段高清视频进行转码。线程解决方案:将庞大的计算任务分解成多个可以独立执行的子任务。创建多个线程,每个线程负责处理一部分数据。操作系统会将这些线程调度到不同的CPU核心上同时运行,从而实现真正的并行计算,使总耗时从任务总时间缩短到约max(子任务时间)。2.阐述进程的模式切换和上下文切换的区别和联系。参考答案:进程的模式切换(ModeSwitch)和上下文切换(ContextSwitch)是两个相关但本质不同的概念。简单来说,模式切换是“换权限”,而上下文切换是“换进程”。模式切换发生在CPU需要在用户态(UserMode)和内核态(KernelMode)之间转换时。当一个用户态进程需要执行I/O操作(如读写文件)时,它必须通过系统调用(如read())请求内核的帮助。这个请求会触发一个“陷入(Trap)”,CPU从用户态切换到内核态。内核代表该进程执行特权操作,完成后,再通过“返回(Return)”操作切换回用户态,让进程继续执行。整个过程都在同一个进程内完成,只是CPU的执行权限发生了变化。上下文切换是操作系统实现多任务处理的核心机制。当操作系统调度器决定让另一个进程使用CPU时,就会发生上下文切换。保存旧进程上下文:将当前运行进程的所有状态信息(如程序计数器、通用寄存器、进程状态等)保存到其进程控制块(PCB)中。加载新进程上下文:从下一个要运行的进程的PCB中,将其之前保存的状态信息加载到CPU寄存器和内存管理单元中。恢复执行:CPU跳转到新进程的程序计数器所指向的位置,开始执行。这个过程就像是暂停一本书的阅读,记下页码和笔记,然后拿起另一本书,找到上次的页码和笔记继续阅读。区别和联系:尽管模式切换和上下文切换是两个独立的操作,但它们在实际运行中紧密相关:(1)模式切换是上下文切换的前奏上下文切换本身是一项特权操作,只能由操作系统内核执行。因此,无论是由于中断、系统调用还是时间片到期,要触发一次上下文切换,CPU必须先从用户态切换到内核态(即发生一次模式切换),然后才能由内核中的调度程序来完成保存和恢复进程上下文的工作。(2)模式切换不一定导致上下文切换这是理解两者区别的关键。一次系统调用(如printf)会触发模式切换,内核执行完毕后直接返回用户态继续执行原进程,期间并没有更换进程,因此没有发生上下文切换。(3)上下文切换必然包含模式切换因为上下文切换总是在内核态下进行,所以从用户进程的角度看,进入内核态本身就是一个模式切换的过程。总而言之,模式切换是权限的变更,是访问内核资源的必要步骤;而上下文切换是执行单元的更换,是实现多任务并发的基础。前者开销小,后者开销大。3.什么是进程?操作系统为何要引入进程?调研Linux等系统,并结合实际详细阐述进程的基本要素及其在内存中的映像布局。参考答案:进程是操作系统中最核心的概念之一。要全面理解它,我们需要从定义、动机、基本要素和内存布局四个层面进行剖析。进程是程序的一次动态执行过程,是操作系统进行资源分配和调度的基本单位。我们可以用一个生动的比喻来区分“程序”和“进程”:程序:就像一份静态的菜谱,它是指令的集合,静静地躺在磁盘上。进程:则是根据这份菜谱实际做菜的过程。它包含了厨师(CPU)、食材(数据)、厨具(内存等资源)以及烹饪的当前步骤(执行状态)。同一份菜谱(程序)可以同时被多个厨师(进程)使用,但每个厨师的操作过程(进程)都是独立的。因此,进程=程序的代码和数据+程序执行时的上下文环境。动机:操作系统引入进程的概念,主要是为了解决早期单任务系统的局限,以实现更高效、更安全、更易管理的多任务环境。包括:增强系统效率与资源利用率;提供安全隔离的多任务环境;简化系统管理。进程基本要素:从操作系统的视角看,一个进程由一系列复杂的要素构成,这些要素共同描述了进程在执行过程中的完整状态。在Linux内核中,这些信息主要由一个名为task_struct的核心数据结构(即进程控制块PCB)来维护。进程标识符(PID):每个进程都有一个独一无二的数字ID,用于操作系统识别和管理。进程状态:描述进程当前所处的生命周期阶段,如运行态(R)、阻塞态(B)、僵尸态(Z)等。程序计数器(PC):指向进程下一条将要执行的指令的内存地址。CPU寄存器:保存进程被中断时的CPU上下文,包括通用寄存器、栈指针等,确保进程被重新调度时能从断点处无缝恢复。内存管理信息:包含指向进程代码段、数据段、堆、栈等内存区域的指针,以及页表等用于地址转换的信息。I/O状态信息:记录进程已打开的文件描述符列表、分配的I/O设备等资源。记账信息:统计进程使用的CPU时间、内存大小等资源消耗情况。进程在内存中的映像布局当一个程序被加载到内存中成为进程时,操作系统会为其分配一块独立的虚拟地址空间。在Linux等系统中,这块空间通常被划分为几个逻辑区域,形成进程的内存映像。·代码段(.text):也称为文本段,存放程序编译后的二进制机器码。这部分通常是只读的,以防止程序意外修改自身指令,并且可以被多个运行同一程序的进程共享,以节省内存。·初始化数据段(.data):存放程序中所有已初始化的全局变量和静态变量。·未初始化数据段(.bss):存放程序中所有未初始化或初始化为零的全局变量和静态变量。程序执行前,系统会自动将此段清零。·堆(Heap):用于程序在运行时动态分配内存(例如C语言中的malloc函数)。堆的大小不固定,会随着内存的申请和释放而动态增长或收缩,其增长方向是向高地址。·栈(Stack):用于支持函数调用。它存放函数的局部变量、参数、返回地址等信息。栈由编译器自动分配和释放,其增长方向是向低地址。·内核空间:虚拟地址空间的最高部分,由操作系统内核使用。这部分内存对所有进程都是可见的,但只有在内核态下才能访问,从而保证了系统的安全性和稳定性。4.进程最基本的状态有哪些?哪些事件可能引起不同状态之间的相互转换?参考答案:理论上,进程有三种最基本、最核心的状态,它们是理解所有其他状态的基础:就绪态(Ready):进程已经获得了除CPU之外的所有必要资源,万事俱备,只欠CPU。它正位于就绪队列中,等待操作系统调度器的青睐。运行态(Running):进程获得了CPU,其指令正在被CPU执行。在单核CPU系统中,任一时刻最多只有一个进程处于运行态。阻塞态(Blocked):也称为等待态。进程因等待某个事件(如I/O完成、申请资源失败)而暂时无法继续执行。此时,即使CPU空闲,它也无法运行。除了这三种基本状态,一个完整的进程生命周期通常还包含以下两种状态:新建态(New):进程正在被创建,操作系统正在为其分配进程控制块(PCB)和初始化资源,尚未进入就绪队列。终止态(Terminated):进程执行完毕或因异常而结束,操作系统正在回收其占用的资源。新建态→就绪态触发事件:进程创建成功。当操作系统完成了对新进程PCB的初始化、内存等资源的分配后,便会将其放入就绪队列,等待调度。就绪态→运行态触发事件:CPU调度。这是进程从“准备”到“执行”的关键一步。操作系统的调度器会根据特定算法(如时间片轮转、优先级调度)从就绪队列中选择一个进程,并将CPU分配给它。运行态→就绪态触发事件:时间片用完:在分时操作系统中,每个进程只能连续运行一个固定的时间片。时间一到,它就必须让出CPU,回到就绪队列队尾等待下一轮调度。被抢占:当一个更高优先级的进程进入就绪态时,为了保证高优先级任务的及时响应,操作系统可能会剥夺当前运行进程的CPU使用权,使其回到就绪态。运行态→阻塞态触发事件:进程主动请求等待。当运行中的进程需要等待某个外部事件时,它会主动放弃CPU。常见场景包括:发起一个I/O请求(如读写文件)、申请一个已被占用的资源(如信号量)、或调用sleep()函数主动休眠。阻塞态→就绪态触发事件:等待的事件完成。当进程所等待的事件发生后(例如,I/O操作完成、所需资源变为可用、定时器超时),操作系统会将其从阻塞队列中唤醒,并移入就绪队列,重新参与CPU的竞争。运行态→终止态触发事件:进程执行结束。这可以是正常退出(如main函数执行完毕、调用exit()),也可以是因发生致命错误(如除零、访问非法内存地址)而被操作系统强制终止。需要注意:阻塞态不能直接转换为运行态:处于阻塞态的进程在事件完成后,必须先回到就绪态,经过调度器的选择后才能获得CPU。这是为了保证调度的公平性。就绪态不能直接转换为阻塞态:就绪态的进程尚未获得CPU,因此它无法执行任何指令,自然也无法主动发起一个会导致阻塞的操作(如I/O请求)。5.为何要引入进程的挂起态?参考答案:引入进程的挂起态(SuspendState),本质上是操作系统为了应对内存资源不足和复杂的管理需求而采取的一种高级策略。简单来说,当内存不够用,或者系统需要“冻结”某些进程时,操作系统会将这些进程从内存(主存)暂时“挪”到外存(磁盘交换区)。这不仅解决了内存紧张的问题,还为用户和系统提供了更灵活的控制手段。挂起态是操作系统将进程调度与内存管理紧密结合的体现。它通过“以时间换空间”(磁盘读写慢,但空间大)的策略,使得操作系统能够在有限的内存资源下,支持更多的进程并发执行。总结原因如下:(1)缓解内存紧张(最主要原因)这是引入挂起态最直接的动机。背景:机器的物理内存是有限的。当系统中运行的进程过多,或者某个进程占用内存过大时,内存资源可能不足以容纳所有活跃进程。机制:为了保证系统不崩溃,操作系统会将暂时不运行的进程(通常是处于阻塞态或就绪态的进程)的数据和代码从内存交换(Swap)到磁盘的交换分区中。效果:这释放了宝贵的物理内存空间,供其他急需内存的进程使用,从而维持系统的正常运行。(2)终端用户的请求(调试与检查)挂起态赋予了用户暂停程序的能力,这在开发和调试中非常有用。场景:当你运行一个程序时,发现输出结果可疑,或者想要检查程序的中间状态。操作:你可以通过终端命令(如Linux下的Ctrl+Z)主动挂起该进程。目的:进程会暂停执行并驻留在外存中,用户可以利用这段时间研究进程的执行情况、修改代码或进行调试,待准备好后再通过命令(如fg或bg)将其激活。(3)父进程的请求(协调与监控)在复杂的程序结构中,父进程可能需要控制子进程的行为。场景:父进程创建了一个子进程,但需要考察子进程的执行逻辑,或者需要协调多个子进程的活动节奏。目的:父进程可以挂起子进程,对其进行修改或等待其他条件满足后再激活它。(4)负荷调节的需要(保障实时性)在实时系统或高负载系统中,挂起态是保障关键任务优先级的工具。场景:当系统工作负荷过重,或者出现了高优先级的实时任务,而内存资源又被低优先级的任务占据时。目的:操作系统会主动将一些不重要的、非实时的进程挂起,腾出资源给关键任务,确保系统对实时事件的控制能力。(5)操作系统的自身需要(维护与安全)操作系统本身也需要“喘息”的空间来维护系统健康。检查与记账:操作系统可能需要挂起某些进程,以便检查运行中的资源使用情况、进行记账或审计。故障恢复:当系统出现故障或某些功能受损时,操作系统可以挂起受影响的进程,待故障消除或修复后,再恢复其状态,保证数据的一致性。6.结合PCB知识,描述当进程发生如下状态转换时,操作系统要修改PCB中的哪些内容?就绪→运行运行→阻塞参考答案:就绪→运行当一个处于就绪态的进程被操作系统的调度器选中,准备分配给它CPU资源时,操作系统会执行以下操作:修改进程状态操作系统会修改PCB中的进程状态字段,将其值从“就绪”更新为“运行”。这是状态转换最直接的体现。更新队列指针操作系统会修改PCB中的队列指针,将该进程的PCB从就绪队列中移除。因为进程已经不再是“等待被调度”的状态了。恢复CPU现场操作系统会读取PCB中保存的现场信息(如程序计数器、通用寄存器、栈指针等),并将这些值加载到CPU的对应寄存器中。这个过程被称为“恢复上下文”或“布置CPU现场”,它确保了进程能够从上次被暂停的地方精确地继续执行。运行→阻塞当一个正在运行的进程因为需要等待某个事件(如I/O操作完成、申请资源失败)而无法继续执行时,操作系统会执行以下操作:保存CPU现场这是最关键的一步。操作系统会将当前CPU的所有相关寄存器(包括程序计数器、通用寄存器、栈指针等)中的值,完整地保存到该进程的PCB的现场信息区域。这个操作保证了当进程未来被唤醒并重新获得CPU时,能够恢复到此刻被中断的精确状态。修改进程状态操作系统会修改PCB中的进程状态字段,将其值从“运行”更新为“阻塞”。更新队列指针操作系统会修改PCB中的队列指针,将该进程的PCB从运行状态(逻辑上移出CPU)并插入到相应的阻塞队列中。进程会在这里等待它所请求的事件发生。7.在创建一个进程时,操作系统完成的主要工作是什么?哪些事件会引起进程的创建?参考答案:创建进程的过程并非一蹴而就,而是由操作系统内核通过一系列原子操作(即进程创建原语)来完成的。操作系统创建进程的主要按顺序完成以下四个主要步骤,核心是围绕进程控制块展开的:(1)申请空白的进程控制块(PCB)操作系统首先会在其维护的PCB表中寻找一个空闲的表项。PCB是进程存在的唯一标志,包含了进程的所有关键信息(如PID、状态、程序计数器等)。为进程分配一个唯一的进程标识符(PID)也是此步骤的一部分。(2)为新进程分配所需资源操作系统需要为新进程分配执行所必需的资源。这主要包括:内存空间:为进程分配独立的虚拟地址空间,并将程序的代码段、数据段等从磁盘加载到内存中。I/O资源:分配默认的文件句柄,如标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。(3)初始化进程控制块(PCB)操作系统会用初始值填充PCB的各个字段,为新进程“建档”。关键操作包括:设置进程状态为“就绪态”;初始化程序计数器(PC),使其指向程序的入口地址;初始化栈指针(SP),指向为新进程分配的栈空间;记录进程的优先级、所属用户等信息。(4)将新进程插入就绪队列完成所有初始化工作后,操作系统会将这个新进程的PCB放入系统的就绪队列中。从此,它就成为了一个合法的、等待被CPU调度的实体,与其他就绪进程一起竞争CPU时间片。8.在终止一个进程时,操作系统完成的主要工作是什么?哪些事件会引起进程的终止?参考答案:当一个进程被终止时,操作系统会执行一套被称为“终止原语”的标准流程,主要包括以下四个步骤:(1)检索并读取进程状态操作系统首先会根据被终止进程的标识符(PID),在进程控制块(PCB)表中检索到该进程的PCB,并从中读取其当前状态。(2)立即终止执行并释放CPU如果该进程正处于运行态,操作系统会立即剥夺其CPU使用权,强制中断其指令的执行,并将CPU资源重新分配给其他就绪的进程。(3)回收全部资源这是终止过程中最关键的一步。操作系统会回收该进程所占用的所有资源,包括:内存空间:释放进程占用的所有用户空间内存,如代码段、数据段、堆和栈。I/O资源:关闭所有已打开的文件描述符(文件、网络套接字、管道等)。其他资源:归还从操作系统或其父进程处获得的其他任何资源。(4)移除进程控制块(PCB)在所有资源被回收后,操作系统会将该进程的PCB从相应的队列(如就绪队列或阻塞队列)中删除,并释放PCB本身占用的内核内存。至此,该进程在系统中的所有痕迹被完全清除。
第四章习题假设一个录像厅有0,1,2三种不同的录像片可由观众选择放映。录像厅的放映规则为:(1)任何时刻最多只能放映一种录像片,正在放映的录像片是自动循环放映的,最后一个观众主动离开时结束当前录像片的放映;(2)选择当前正在放映录像片的观众可立即进入,允许同时有多位选择同一种录像片的观众同时观看,同时观看的观众数量不受限制;(3)等待观看其他录像片的观众按到达顺序排队,当一种新的录像片开始放映时,所有等待观看该录像片的观众可一次进入录像厅同时观看。请用PV信号量实现以上同步机制。参考答案:int
count0=0;
//看影片0的观众数int
count1=0;
//看影片1的观众数int
count2=0;
//看影片2的观众数semaphore
movie=1;
//代表放映的录像厅资源,每次只能播放一部录像片semaphore
mutex0=1;
//对count0变量的互斥操作semaphore
mutex1=1;//对count1变量的互斥操作semaphore
mutex2=1;//对count2变量的互斥操作audience0(){//看录像片0的观众进程
P(mutex0);
count0++;
if
(count0==1){
P(movie);
播放电影0;
}
V(mutex0);
看影片0;
P(mutex0);
count0--;
if
(count0==0){
关闭电影0;
V(movie);
}
V(mutex0);
}//另外两个与之相似,略2.某系统有R1,R2和R3共三种资源,在T0时刻P1,P2,P3和P4这四个进程对资源的占用和需求情况见下表,此时系统的可用资源向量为(2,1,2)。试问:(1)系统是否处于安全状态?若安全,则请给出一个安全序列。(2)若此时进程P1和进程P2均发出资源请求向量Request(1,0,1),为了保证系统的安全性,应如何分配资源给这两个进程?说明所采用策略的原因。(3)若(2)中两个请求立即得到满足后,系统此刻是否处于死锁状态?Max=[[3,2,2],[6,1,3],[3,1,4],[4,2,2]];Allocation=[[1,0,0],[4,1,1],[2,1,1],[0,0,2]]参考答案:1)利用安全性算法对T0时刻分配情况进行分析,可得到如下表所示的安全性检测情况。可以看出,此时存在一个安全序列{P2,P3,P4,P1},故该系统是安全的。Work(P2,P3,P4,P1)=[[2,1,2],[6,2,3],[8,3,4],[8,3,6]];Need(P2,P3,P4,P1)=[[2,0,2],[1,0,3],[4,2,0],[2,2,2]];Allocation(P2,P3,P4,P1)=[[4,1,1],[2,1,1],[0,0,2],[1,0,0]];Work+Allocation(P2,P3,P4,P1)=[[6,2,3],[8,3,4],[8,3,6],[9,3,6]];Finish(P2,P3,P4,P1)=[true,true,true,true].此处要注意,一般大多数题目中的安全序列并不唯一。2)若此时P1发出资源请求Request1(1,0,1),则按银行家算法进行检查:Request1(1,0,1)<=Need1(2,2,2);Request1(1,0,1)<=Available(2,1,2);试分配并修改相应数据结构,由此形成的进程P1请求资源后的资源分配情况见下表。Allocation(P1,P2,P3,P4)=[[2,0,1],[4,1,1],[2,1,1],[0,0,2]];Need(P1,P2,P3,P4)=[[1,2,2],[2,0,2],[1,0,3],[4,2,0]];available(P1,P2,P3,P4)=[1,1,1].再利用安全性算法检查系统是否安全,可用资源Available(1,1,1)已不能满足任何进程,系统进入不安全状态,此时系统不能将资源分配给进程P1。若此时进程P2发出资源请求Request2(1,0,1),则按银行家算法进行检查;Request2(1,0,1)<=Need2(2,0,2);Request2(1,0,1)<=Available(2,1,2);试分配并修改相应数据结构,由此形成的进程P2请求资源后的资源分配情况下表:Allocation(P1,P2,P3,P4)=[[1,0,0],[5,1,2],[2,1,1],[0,0,2]];Need(P1,P2,P3,P4)=[[2,2,2],[1,0,1],[1,0,3],[4,2,0]];available(P1,P2,P3,P4)=[1,1,1].再利用安全性算法检查系统是否安全,可得到如下表中所示的安全性检测情况。注意表中各个进程对应的Work+Allocation向量表示在该进程释放资源之后更新的Work向量。Work(P2,P3,P4,P1)=[[1,1,1],[6,2,3],[8,3,4],[8,3,6]];Need(P2,P3,P4,P1)=[[1,0,1],[1,0,3],[4,2,0],[2,2,2]];Allocation(P2,P3,P4,P1)=[[5,1,2],[2,1,1],[0,0,2],[1,0,0]];Work+Allocation(P2,P3,P4,P1)=[[6,2,3],[8,3,4],[8,3,6],[9,3,6]];从上表中可以看出,此时存在一个安全序列{P2,P3,P4,P1},因此该状态是安全的,可以立即将进程P2所申请的资源分配给它。3)若2)中的两个请求立即得到满足,则此刻系统并未立即进入死锁状态,因为这时所有的进程未提出新的资源申请,全部进程均未因资源请求没有得到满足而进入阻塞态。只有当进程提出资源申请且全部进程都进入阻塞态时,系统才处于死锁状态。3.有三个进程PA、PB、PC协作解决文件打印问题:PA将文件记录从磁盘读入内存的缓冲区1中,每执行一次读一个记录;PB将缓冲区1中的内容复制到缓冲区2,每执行一次复制一个记录;PC将缓冲区2的内容打印出来,每执行一次打印一个记录。缓冲区的大小和一个记录大小一样。请用P、V操作来保证文件的正确打印。参考答案:设置四个信号量empty1、empty2、full1、full2、mutex1和mutex2,信号量empty1和empty2分别表示缓冲池1和缓冲池2是否为空,其初值为m和n;信号量full1和full2分别表示缓冲池1和缓冲池2是否有记录供读出,其初值均为0;信号量mutex1和mutex2分别表示对缓冲池1和缓冲池2的访问互斥,其初值为1。其进程间的同步与互斥关系如下:intempty1=m;intempty2=n;intfull1=0;intfull2=0;intmutex1=1;intmutex2=1;main(){PA();PB();PC();}PA(){while(1){从磁盘读出一个文件记录;p(empty1);p(mutex1);将一个文件记录读入缓冲池1;v(mutex1);v(full1);}}PB(){while(1){p(full1);p(mutex1);从缓冲区1中读出一个文件记录;v(mutex1);v(empty1);p(empty2);p(mutex2);将一个记录读入缓冲区2;v(mutex2);v(full2);}}PC(){while(1){p(full2);p(mutex2);从缓冲池2读出一个文件记录打印;v(mutex2);v(empty2);}}4.P1、P2、P3、P4、P5、P6为一组合作进程,其执行的同步前趋关系如图所示,试用P、V操作完成这6个进程的同步。参考答案:本前驱图存在六个同步信号量,P1和P2之间的mutex12,以此类推,mutex13、mutex14、mutex25、mutex36、mutex56,参考代码如下:P1(){while(1){操作;V(mutex12);V(mutex13);V(mutex14);}}P2(){while(1){P(mutex12)操作;V(mutex25);}}P3(){while(1){P(mutex13);操作;V(mutex36);}}P4(){while(1){V(mutex12);操作;}}P5(){while(1){P(mutex25);操作;V(mutex56);}}P6(){while(1){P(mutex36);P(mutex56);操作;}}5.考虑某个系统在下表所示时刻的状态,请使用银行家算法回答下面的问题。1)计算Need矩阵。2)系统是否处于安全状态?如安全,请给出一个安全序列。3)如果从进程P1发来一个请求(0,4,2,0),这个请求能否立刻被满足?如安全,请给出一个安全序列。表4.10为P0分配资源后的有关资源数据进程AllocationMaxavailableABCDABCDABCDP0001200121520P110001750P213542356P300140656参考答案:(1)Need=Max-Allocation=0000075010020642(2)通过计算available=[1,5,2,0],找到一个安全序列(p0,p2,p1,p3),因此系统是安全的;(3)因为request_1=[0,4,2,0],其小于available向量,且小于Need_1=[0,7,5,0],尝试给它,最后发现分配后的系统状态如下(略),找到了一个安全序列(P0,P2,P1,P3)说明系统安全,因此P1的请求应该能够立刻满足。6.假定某计算机系统有R1设备3台、R2设备4台,它们被P1、P2、P3和P4这4个进程所共享,且已知这4个进程均以下面所示的顺序使用现有设备。->申请R1->申请R2->申请R1->释放R1->释放R2->释放R11)请分析系统运行过程中是否有产生死锁的可能,为什么?2)如果有可能产生死锁,请分析列举一种情况,并画出表示该死锁状态的进程资源分配图。参考答案:1)系统运行过程中可能会产生死锁,因为,系统只有3台R1,被四个进程共享,且每个进程最大的需求为2,由于R1设备不足,且其互斥不可被剥夺,系统又没有采取任何措施破坏死锁产生的剩余两个必要条件,持有并等待条件和环路等待条件,因此,可能会发生死锁。2)当P1,P2,P3各自得到一个R1资源实例,他们可以继续运行,并顺利各自申请得到1个R2资源实例,当第二次申请R1时,系统没有空闲的设备,故全部阻塞并进入循环等待的死锁状态,如图所示7.某博物馆最多可容纳500人同时参观,有一个出入口,该出入口一次仅允许一人通过。请先设计必要的信号量和P,V[或wait(),signal()]操作,实现参观者在上述过程中的互斥与同步。要求写出完成的过程,说明信号量的含义并赋初值。参考答案:empty表示资源为500的信号量,只要empty不为零,则允许从出入口进入。初始值大小为500;出入口分别需要一个互斥信号量实现对出入口的互斥访问mutex0和mutex1,初始值为均为1。参观者进程i{P(empty);P(mutex0);进门;V(mutex0);参观;P(mutex1);出门;V(mutex1);V(empty);}8.某火车订票系统,可供多个用户同时共享一个订票数据库。规定允许多个用户同时查询该数据库,有查询者时,用户不能订票;有用户订票而需要更新数据库时,不可以有其他用户使用数据库。请用P、V操作写出查询者和订票者的同步执行程序。参考答案:一个典型的读者-写者问题,查询者是读者,订票者是写者。读者-写者问题的主要要求是:①允许多个读者共享对象:②不允许写者和其他读者或写者同时访问共享对象。为了达到上述控制,引入一个变量readcount,用于记录当前正在运行的读者进程数以及读互斥信号量rmutex和写互斥信号量wmutex.每个读者进程进入系统后需对readcount加1.当readcount的值由0变为1时,说明是第一个读者进程进入,因此需要该读者进程对控制写者进程的信号量wmutex进行P操作,以便与写者进程互斥运行:当readcount的值由非0值增加时,说明不是第一个读者进程,此时控制写者进程的信号量已进行过P操作,已经禁止写者进程进入,因此不需要再次对该信号量进行P操作,当读者进程退出时,需对readcount减1.如发现减1后readcount的值变为0,说明是最后一个读者进程退出,因此需要该读者进程对控制写者进程的信号量wmutex进行V操作,以便写者进程能够进入。同步程序如下:Semaphorermutex=1,wmutex=1;intreadcount=0;查询者(){while(true){P(rmutex);if(readcount==0)P(wmutex);//若有查询者,则不允许订票readcount++;V(rmutex);查询数据库;P(rmutex);readcount--;if(readcount==0)V(wmutex);//最后一个查询者退出后允许订票V(rmutex);}}订票者(){while(true){P(wmutex);使用数据库并订票;V(wmutex);}}为了改进该流程为写者优先,即允许多个用户同时查询数据的同时,当有订票者到达时,不允许后续查询者进入数据库查询,算法描述如下:9.假设具有5个进程的进程集合P={P0,P1,P2,P3,P4),系统中有三类资源A,B,C,假设在某时刻有如下状态:表4.11为P0分配资源后的有关资源数据进程AllocationMaxavailableABCABCABCp0003004140p1100175p2135235p3002064p4001065当前系统是否处于安全状态?若系统中的可利用资源Available为(0,6,2),系统成否安全?若系统处在安全状态,请给出安全序列;若系统处在非安全状态,简要说明原因。10.某寺庙有小和尚和老和尚若干,有一个水缸,由小和尚提水入缸供老和尚饮用。水缸可以容纳10桶水,水取自同一口井中,由于水井口窄,每次只能容纳一个水桶取水。水桶总数为3个(老和尚和小和尚共同使用)。每次入水、取水仅为一桶,且不可同时进行。试给出有关取水、入水的算法描述。参考答案:mutex_gang,mutex_jing,gang_empty,gang_full,bucket分别表示缸互斥,井互斥,缸空,缸满,水桶总个数,mutex_jing=1,mutex_gang=1,gang_empty=10,gang_full=0,bucket=3;void老和尚(){while(true){ p(gang_full); p(bucket);//取一个桶 p(mutex_gang); 从缸中取水; v(mutex_gang); v(bucket);//还一个桶 v(gang_empty);}}void小和尚(){while(true){ p(gang_empty); p(bucket);//取一个桶 p(mutex_jing); 从井中打水; v(mutex_jing); p(mutex_gang); 将水倒入缸中; v(mutex_gang); v(bucket);//还一个桶 v(gang_full);}}11.某系统有R1,R2,和R3共三种资源,在T0时刻P1,P2,P3和P4这四个进程对资源的占用和需求情况见下表,此时系统的可用资源向量为(2,1,2)。试问:1)系统是否处于安全状态?若安全,则请给出一个安全序列。2)若此时进程P1和进程P2均发出资源请求向量Request(1,0,1),为了保证系统的安全性,应如何分配资源给这两个进程?说明所采用策略的原因。3)若2)中两个请求立即得到满足后,系统此刻是否处于死锁状态?表4.12为P0分配资源后的有关资源数据进程MaxAllocationR1R2R3R1R2R3p1322100p2613411p3314211p4422002参考答案:同第2题12.有两个并发进程P1,P2,其程序代码如下:p1(){x=1;y=2;if(x>1)z=x+y;elsez=x*y;printz;}p2(){x=-1;a=x+3;x=a+x;b=a+x;c=b*b;printc;}1)可能打印出的z值有多少?(假设每条赋值语句是一个原子操作)2)可能打印出的c值有多少?(其中x为P1和P2的共享变量)参考答案:1)z的值有:-2,1,2,3,5,7。2)c的值有:9,25,81。13.下面是两个并发执行的进程,它们能正确运行吗?若不能请举例说明并改正。intx;process_p1{inty,z;x=1;y=0;if(x>=1)y=y+1;z=y;}process_p2{intt,u;x=0;t=0;if(x<=1)t=t+2;u=t;}参考答案:P1和P2两个并发进程的执行结果是不确定的,它们都对同一变量X进程操作,X是一个临界资源,而没有进行保护。例如:1)若先执行完P1再执行P2,结果是x=0,y=l,z=1,t=2,u=2)。2)若先执行P1到“x=1”,然后一个中断去执行完P2,再一个中断回来执行完P1,结果是x=0,y=0,z=0,t=2,u=2。显然,两次执行结果不同,所以这两个并发进程不能正确运行。可将这个程序改为:intx;SemaphoreS=1;process_p1{inty,z;P(S);x=1;y=0;if(x>=1)y=y+1;V(S);z=y;}process_p2{intt,u;P(S);x=0;t=0;if(x<=1)t=t+2;V(S);u=t;}14.有一个烟草供应商和3个抽烟者。抽烟者若要抽烟,必须具有烟叶、烟纸和火柴。3个抽烟者中,一个有烟叶、一个有烟纸、一个有火柴。烟草供应商会源源不断地分别供应烟叶、烟纸和火柴,并将它们放在桌上。若他放的是烟纸和火柴,则有烟叶的抽烟者会拾起烟纸和火柴制作香烟,然后抽烟。其他类推。试用信号量同步烟草供应商和3个抽烟者。参考答案:Semaphoresmoker[3]={0};Semaphorematerial[3]={0};Semaphoreagent=1;intturn=0;voidAgent(){while(true){P(agent);//查看是否需要放置原料V(smoker[turn]);//准备放第i个抽烟者所需的原料V(material[(turn+1)%3]);//放置第一种原料V(material[(turn+2)%3]);//放置第二种原料turn=(turn+1)%3;//序号后移,准备放其他抽烟者所需的原料}}voidsmoker(inti){//第一个抽烟者进程while(true){P(smoker[i]);//查看是否有自己需要的原料P(material[(i+1)%3]);//拾走第一种原料P(material[(i+2)%3]);//拾走第二种原料V(agent);//通知供应商原料被取走smoking();}}15.桌上有一空盘,允许存放一个水果。爸爸可向盘中放苹果,也可向盘中放橘子,儿子专等吃盘中的橘子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一个水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿3个并发进程的同步。参考答案:father进程、son进程和daughter进程之间的临界资源为盘子,father和son之间存在同步,father和daughter之间存在同步,由于只有一个father进程,只有盘子里有橘子才能被son拿走,设置father和son之间的私有信号量为orange,初始值=0;只有盘子里有苹果才能被daughter拿走,设置father和daughter之间的私有信号量为apple,初始值=0;只有盘子为空,father进程才能往里放水果,设置father与son和daughter之间的私有信号量为empty,初始值=1.father(){while(true){P(empty);put(x);if(x==apple)V(apple);if(x==orange)V(orange);}}son(){while(true){P(orange);get(x);V(empty);}}daughter(){while(true){P(apple);get(x);V(empty);}}16.什么是前驱图?画出下列4条语句的前驱图。S1:a=x+y;S2:b=z+1;S3:c=a–b;S4:w=c+1;。参
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中华人民共和国基本医疗卫生与健康促进法知识测试试卷附答案
- 2026年共青团团校入团特训题库附答案
- 2026年三基护理知识模拟试题含参考答案
- 2026年共青团入团考试青年勤学提升试题与答案详解
- 2026年安全技术练习题库与答案
- 2026年共青团入团考试团员品行规范试题与答案
- 生物制品试题及答案
- 成本会计函授试题及答案
- 2026年苏教版适配小学四年级地理期中质量检测卷人口城市与产业布局标准试卷第450套(含答案解析与可打印作答区)
- 2026北师大三下获奖课件
- 2024年江苏无锡市江阴市江南水务股份有限公司招聘笔试参考题库含答案解析
- 杉木人工林抚育经营技术规程
- 西南师大版五年级下册异分母分数加减混合运算练习400题及答案
- 高三化学二轮复习16-小专题-硅酸盐阴离子结构专题
- 安全用药管理培训内容
- 冠脉造影识图
- 《C语言入门教程》课件
- 辽宁省沈阳市皇姑区2022-2023学年六年级下学期期末质量监测语文试卷
- 中国慢性呼吸道疾病呼吸康复管理指南(2021年)
- 2022年第一师阿拉尔市招募三支一扶计划人员考试真题及答案
- 新北师大版五年级下册分数乘除法计算专项训练
评论
0/150
提交评论