10郝斌(75-81)线程同步、买票、生产消费程序
- 格式:doc
- 大小:1.72 MB
- 文档页数:17
山东省2010年普通高等教育专升本统一考试计算机科学与技术专业综合一试卷本试卷共8页。
满分100分,考试时间180分钟。
考试结束后,将本试卷交回。
答题前考生务必将自己的姓名、准考证号、座号和所在学校填写在规定的位置。
操作系统(50分)一、判断题(10分,每题1分)1.原语和系统调用的主要区别在于两者的实现方法不同。
()2.进程状态的转换是由操作系统完成的,对用户是透明的。
()3.打印机是一类典型的块设备。
()4.优先数是进程调度的重要依据一旦确定不能改变。
()5.对文件进行读写前,要先打开文件。
()6.同一文件系统中不允许文件同名,否则会引起混乱。
()7.参与死锁的进程至少有两个已经占有资源。
()8.进程间的互斥是一种特殊的同步关系。
()9.存储保护的目的是限制内存的分配。
()10.在虚存系统中,只要磁盘空间无限大,作业就能拥有任意大的编址空间。
()二、填空题(10分,每空1分)1.用户进程从日态(常态)转换为管态(特态)的唯一途径是_______________________。
2.分区存储管理中的放置策略有:首次适应法、______________、______________。
3.常见的文件的物理结构有:连续结构、_________________、_______________。
4.核态是_______________执行时,机器所处的状态。
5.磁带上的文件只能采用________________存取方式。
6.批处理操作系统中,作业存在的唯一标志是______________。
7.从静态的观点看,操作系统中的进程是由程序段、__________和__________三部分组成。
三、简答题(20分,每题4分)1.什么是设备独立性,有哪几种类型的设备独立性?2.生产者——消费者问题的同步算法中,为什么颠倒生产者进程中的两个P操作的次序,可能导致进程死锁?3.叙述进程和程序的主要区别。
4.何谓抖动。
习题二1.操作系统中为什么要引入进程的概念?为了实现并发进程之间的合作和协调,以及保证系统的安全,操作系统在进程管理方面要做哪些工作?答:( 1)为了从变化的角度动态地分析研究可以并发执行的程序,真实地反应系统的独立性、并发性、动态性和相互制约,操作系统中就不得不引入“进程”的概念;( 2)为了防止操作系统及其关键的数据结构,受到用户程序有意或无意的破坏,通常将处理机的执行状态分成核心态和用户态;对系统中的全部进程实行有效地管理,其主要表现是对一个进程进行创建、撤销以及在某些进程状态之间的转换控制,2.试描述当前正在运行的进程状态改变时,操作系统进行进程切换的步骤。
答:(1)就绪状态→运行状态。
处于就绪状态的进程,具备了运行的条件,但由于未能获得处理机,故没有运行。
( 2)运行状态→就绪状态。
正在运行的进程,由于规定的时间片用完而被暂停执行,该进程就会从运行状态转变为就绪状态。
(3)运行状态→阻塞状态。
处于运行状态的进程,除了因为时间片用完而暂停执行外还有可能由于系统中的其他因素的影响而不能继续执行下去。
3.现代操作系统一般都提供多任务的环境,试回答以下问题。
(1)为支持多进程的并发执行,系统必须建立哪些关于进程的数据结构?答:为支持进程的并发执行,系统必须建立“进程控制块(PCB)”,PCB的组织方式常用的是链接方式。
(2)为支持进程的状态变迁,系统至少应该供哪些进程控制原语?答:进程的阻塞与唤醒原语和进程的挂起与激活原语。
(3)当进程的状态变迁时,相应的数据结构发生变化吗?答:创建原语:建立进程的PCB,并将进程投入就绪队列。
;撤销原语:删除进程的 PCB,并将进程在其队列中摘除;阻塞原语:将进程 PCB中进程的状态从运行状态改为阻塞状态,并将进程投入阻塞队列;唤醒原语:将进程 PCB中进程的状态从阻塞状态改为就绪状态,并将进程从则色队列摘下,投入到就绪队列中。
4.什么是进程控制块?从进程管理、中断处理、进程通信、文件管理、设备管理及存储管理的角度设计进程控制块应该包含的内容。
int stack[10];int top;void getspace(){int free;free=stack[top];top--;cout<<" free="<<free<<endl;}void release(int free){top++;stack[top]=free;}main(){for(top=0;top<10;top++)stack[top]=-1;stack[0]=288;stack[1]=121;stack[2]=85;stack[3]=32;stack[4]=6;top=4;cobegin{release(100);getspace();}cout<<" top="<<top<<endl;for(;top>=0;top--)cout<<"stack["<<top<<"]="<<stack[top]<<endl;}进程同步练习题1. 第二类读者写者问题,信号量解决方法答:为了使写者优先,可在原来的读优先算法的基础上增加一个互斥信号量s,初值为1,使得当至少有一个写者准备访问共享对象时,它可以使后续的读者进程等待完成;整型变量writecount,初值为0,用来对写者进行计数;互斥信号量mutex,初值为1,用来实现多个读者对写者writecount进行互斥访问。
Process reader(){ while(1){wait(s);wait(rmutex);if(readcount==0)wait(wmutex);readcount++;signal(rmutex);signal(s);perform read operation;wait(rmutex);readcount--;if(readcount==0)signal(wmutex);signal(rmutex);}}Process writer(){ while(1){wait(mutex);if(writecount==0)wait(s);writecount++;signal(mutex);wait(wmutex);perform write operation;signal(wmutex);wait(mutex);writecount--;if(writecount==0)signal(s);signal(mutex);}}Main( ){cobegin{ reader();writer(); }}2. 复印室里有一个操作员为顾客复印资料,有5把椅子供顾客休息等待复印。
习题二1.操作系统中为什么要引入进程的概念?为了实现并发进程之间的合作和协调,以及保证系统的安全,操作系统在进程管理方面要做哪些工作?答:( 1)为了从变化的角度动态地分析研究可以并发执行的程序,真实地反应系统的独立性、并发性、动态性和相互制约,操作系统中就不得不引入“进程”的概念;( 2)为了防止操作系统及其关键的数据结构,受到用户程序有意或无意的破坏,通常将处理机的执行状态分成核心态和用户态;对系统中的全部进程实行有效地管理,其主要表现是对一个进程进行创建、撤销以及在某些进程状态之间的转换控制,2.试描述当前正在运行的进程状态改变时,操作系统进行进程切换的步骤。
答:(1)就绪状态→运行状态。
处于就绪状态的进程,具备了运行的条件,但由于未能获得处理机,故没有运行。
( 2)运行状态→就绪状态。
正在运行的进程,由于规定的时间片用完而被暂停执行,该进程就会从运行状态转变为就绪状态。
(3)运行状态→阻塞状态。
处于运行状态的进程,除了因为时间片用完而暂停执行外还有可能由于系统中的其他因素的影响而不能继续执行下去。
3.现代操作系统一般都提供多任务的环境,试回答以下问题。
(1)为支持多进程的并发执行,系统必须建立哪些关于进程的数据结构?答:为支持进程的并发执行,系统必须建立“进程控制块(PCB)”,PCB的组织方式常用的是链接方式。
(2)为支持进程的状态变迁,系统至少应该供哪些进程控制原语?答:进程的阻塞与唤醒原语和进程的挂起与激活原语。
(3)当进程的状态变迁时,相应的数据结构发生变化吗?答:创建原语:建立进程的PCB,并将进程投入就绪队列。
;撤销原语:删除进程的 PCB,并将进程在其队列中摘除;阻塞原语:将进程 PCB中进程的状态从运行状态改为阻塞状态,并将进程投入阻塞队列;唤醒原语:将进程 PCB中进程的状态从阻塞状态改为就绪状态,并将进程从则色队列摘下,投入到就绪队列中。
4.什么是进程控制块?从进程管理、中断处理、进程通信、文件管理、设备管理及存储管理的角度设计进程控制块应该包含的内容。
第一章:引论1.系统调用与中断的概念。
作业题解第一章引论PE1-14. 陷阱和中断的主要差别是什么?答:陷阱是由程序造成的,并且与它同步。
如果程序一而再地被运行,陷阱将总在指令流中相同的位置的精确发生。
而中断则是由外部事件和其他时钟造成的,不具有重复性。
PE1-20. 有一个文件,其文件描述符是fd,内含下列字节序列:3,1,4,1,5,9,2,6,5,3,5.有如下系统调用:lseek (fd, 3, SEEK_SET); // 从文件开头偏移量为3,此时将读写位置移到文件1,5,9,2的1处Read(fd, &buffer, 4);其中lseek调用寻找文件中的字节3.在读操作完成之后,buffer中的内容是什么?答:包含字节: 1,5,9,2。
PE1-22. 块特殊文件和字符特殊文件的基本差别是什么?答:块特殊文件包含被编号的块,每一块都可以独立地读取或者写入。
而且可以定位于任何块,并且开始读出或写入。
这些对于字符特殊文件是不可能的。
PE1-29. 下面是单位转换练习:(a)一微年是多少秒?(b)微米常称micron.那么gigamicron是多长?(c)1TB存储器中有多少字节?(d)地球的质量是6000 yottagram,换算成kilogram是多少?答:这些都可以直接转换:(a) micro year = 10-6X 365 X 24 X 3600 = 31.536 sec。
(b) 1km或者1000。
(c)有240字节,也就是1,099,511,627,776 字节。
(d)它是6 X 1024公斤。
第二章:进程与线程1.进程的概念。
答:进程是对正在运行的程序的一个抽象。
是容纳运行一个程序所需要的所有信息的容器。
也可以说一个进程就是就是一个正在运行的实例。
2.进程的三种基本状态。
运行态(该时刻进程实际占用CPU)。
就绪态(可运行,但因为其他进程正在运行而暂时停止)。
阻塞态(除非某种外部事件发生,否则进程不能运行)。
il操作系统原理试题库1.0第一章操作系统引论 (1)1.1 操作系统的目标与作用 (1)1.2 操作系统的发展过程 (3)1.3 操作系统的基本特征 (6)1.4 操作系统的主要功能 (6)1.5 操作系统的结构设计 (7)第二章进程管理 (11)2.1 进程的基本概念 (11)2.2 进程控制 (16)2.3 进程同步 (16)2.4 经典进程同步问题(P、V操作解决进程同步问题) (22)2.5 进程通信 (73)2.6 线程的基本概念 (74)第三章处理机调度与死锁 (75)3.1 处理机调度的基本概念 (75)3.2 调度算法 (76)3.5 死锁 (96)第四章存储器管理 (109)4.1 存储器管理的基本概念 (109)4.2 连续分配(分区管理)方式 (110)4.3 基本分页存储管理方式 (113)4.4 基本分段存储管理方式 (118)4.5 段页式存储管理方式 (119)4.6 虚拟存储管理 (121)第五章设备管理 (135)5.1 I/O系统 (135)5.2 I/O控制方式 (135)5.3 缓冲管理 (136)5.4 设备分配和设备处理 (136)5.5 磁盘存储器管理 (139)第六章文件管理 (147)6.1 文件和文件系统基本概念 (147)6.2 文件的物理结构(存储结构) (151)6.3 目录管理 (159)6.4 文件保护 (166)6.5 文件存储空间管理 (167)第七章操作系统接口 (172)7.1 联机命令接口 (172)7.2 Shell命令接口 (173)7.3 系统调用 (173)【注】试题标识(流水号)中的节号仅供参考,可依照汤小丹等编著的《计算机操作系统》(第三版)作调整。
第一章操作系统引论1.1 操作系统的目标与作用``010110011020101计算机操作系统的功能是。
A.把源程序代码转换为目标代码B.实现计算机用户之间的相互交流C.完成计算机硬件与软件之间的转换D.控制、管理计算机系统的资源和程序的执行``010110011020100D``010110021020101操作系统是一组。
第1章1.5 操作系统的主要功能有那些?答:存储器管理、处理机管理、设备管理、文件管理和用户接口1.7 何谓联机I/O,何谓脱机I/O ?答:联机I/O就是作业从卡片机上传送到磁带上,再从磁带上调入内存,以及结果的输出,这些都是由处理机(CPU)来完成的。
脱机I/O就是在主机之外另设一台功能较为简单的小型卫星机。
该机只与外部设备打交道,使得主机从烦琐的输入输出操作中解放出来,使得主机可与卫星机、外部设备并行工作。
1.10 实时系统的特点是什么,它与分时相似和不同之处在哪里?答:实时系统的特点是对时间的严格限制和要求。
与分时相似和不同之处主要在4个方面:1)实时系统通常属于专用系统,是面向特定领域、特定任务的。
而分时系统一般都是通用的系统,面向众多领域,因而它们面向的对象不同。
2)交互性不同;分时系统具有较强的交互作用,而实时系统则相对要差的多,提供的交互命令较简单,它仅仅允许终端操作员访问数量有限的专用服务程序。
也不存在分时系统的资源共享。
3)对系统响应时间要求不同;虽然实时信息系统与分时系统对系统响应时间具有类似的要求,但在实时控制方面,实时系统要求实时性,对时间要求严格,一般都联系一个截止时间,所面向的对象是所监测或控制的外部设备,而不是一般的终端用户。
4)可靠性不同;虽然分时系统也要求系统可靠,但实时系统要求的可靠性更高,实时系统中通常都进行硬件和软件方面的冗余(如双主机的硬件冗余,多份程序、数据拷贝的软件冗余等)。
1.23 你认为并行与并发有何不同,在单处理机中,下面并行和并发现象哪些可能发生,哪些不可能发生。
(1)用户程序与用户程序之间的并行;(2)用户程序与用户程序之间的并发;(3)处理机与设备之间的并行;(4)设备与设备之间的并行;答:并行指的在时间一点上的多个进程的执行。
并发指的在一段时间上多个进程的执行。
(2)(3)(4)可以。
第3章3.2 操作系统通过什么概念来刻画程序的并发执行、资源分配及随机性?答:进程2. 5 有下面的5条语句,试画出前趋图;S1:a = x+10;S2:b = a + 10;S3:c = 4*x;S4:d = b + c;S5:e = d + 5;并根据Bernstein 条件,证明S2和S3 是可以并发执行的,而S4和S5语句是不能并发执行的。
第75课:线程同步问题的产生原因 买票程序伪算法: if (票数大于零); { 买一张票; 票数减1; } 如果ABC三个线程去卖票,某一时刻CPU可以任意切换如果线程去切换可能一张票同时卖给几个人。这如何避免? 是因为上面的代码是分隔的CPU才可以去切换,如果是一个整体就切换不了。数据库里有一个事物就是所有操作都成功最终结果才是成功的,如果通过一种机制A执行上面代码的时候,BC不可以执行,除非A执行完BC才可以任意执行。只是最关键的两步同步:票数大于零 和票数减这两步只能有一个线程执行时,其它不能执行。一个线程里最核心的步骤只有一个线程去访问,计算机特别快让其它人感觉不到。 举例:一个站点卖10张票 class A implements Runnable{ public static int tickets = 10;//假设10张票 public void run() //ren能不能访问属性tickets,能。 重写类库里的run()方法 { while (true){ if (tickets > 0){ System.out.printf("%s线程正在卖出第%d张票\n", Thread.currentThread().getName(), tickets);//返回线程一个引用或叫句柄,取它的名字 --tickets; } else{ break; } } } } public class TestTickets{ public static void main(String[] args){ A aa1 = new A(); Thread t1 = new Thread(aa1);//不能写aa1.start(),因为aa1里就没有run()方法 t1.start(); } } 例2出现同时卖第10张票,说明很多代码对同一代码进行访问才有顺序和互斥,所以关键步骤必须保持互斥。 结论:如果存在ABCDE五个站点卖票只要保证在同一时刻只有一个站点在执行if()if (票数大于零);{买一张票;票数减1;}这个程序就不会出现卖同一张票。要保证卖同一数据库中的票,需要在定义票的属性前加static静态的。 第76节课复习:例2的程序逻辑上有问题,new Thread(aa1)和new Thread(aa2)感觉不是在买同一数量的票。 第77节课:正确卖票程序 第二种方式创建线程 class A implements Runnable{ public int tickets = 10;//上节课我们在int前加static但这样不是很合适 String str = new String(); //str名字是任意的。但必须得有这行,因为synchronized (str)必须调用类对象名。 public void run() { while (true) { synchronized (str)//利用语法规则保证一个线程执行另一个线程就不能执行,所以加上这句synchronized (str),此句的含义是if..else关键代码只能是一个线程使用,synchroni须()是库函数实现并规定str必须是类对象名。 {//当站点A执行synchronized()语句时,即锁定了str,如果CPU切换到了B站点,那么B站点就要判断是否锁定str对象,synchronized (str)里面有个锁定器,当A执行了这行后就霸占了if.else代码,即使切换到别的站点也因为需要先执行synchronized (str)代码,而这行语句的意思是如果A站点执行已经执行就代表霸占住str这个对象,就能执行if else语句。而B站点由于CPU切换到 B了,但因为没能霸占住str就不能执行if..else语句,而str只能被一个线程霸占,所以导致只有A站点执行完后其它站点才能执行。 if (tickets > 0) { System.out.printf("%s线程正在卖出第%d张票\n", Thread.currentThread().getName(), tickets); --tickets; } else { break; } }//执行到这行时,霸占结束也就是synchronized (str)作用效果结束,在由下个站点或CPU切换到任意站点来执行。 }//以上代码说明只允许一个线程执行,cpu可以来回切换,但因为有synchronized (str)语句造成当前站点执行这个线程没完时别的线程是不允许来执行的。 } } public class TestTickets_2{ public static void main(String[] args) {//以下利用语法规则保证两个线程调用一个run()方法 A aa = new A();//定义aa对象,
Thread t1 = new Thread(aa);//用aa构造了一个线程t1 t1.start(); //启动t1就是启动了aa的run()方法
Thread t2 = new Thread(aa);//用aa构造了一个线程t2 t2.start(); //启动了t2也是启动了aa的run()方法,这样t1和t2同时启动一个run()方法,从逻辑上讲就更清析了但因run()方法里synchronized (str)语句的存在谁先执行就霸占关键代码,谁就能执行关键代码。 }// public int tickets = 10;//上节课我们在int前加static但这样不是很合适因为Thread t1 = new Thread(aa1); Thread t1 = new Thread(aa2);aa1和aa2就不是同一个资源逻辑上讲不通,所以按上面的写法。 } 举例1: void Synchronied run() 表示修饰方法 此时不能加对象名,此时Synchronied锁定的是this,谁调用run()就锁定谁。 { 代码。。。 } 举例2:修饰方法内的某个代码块 void run() { Synchronied(类对象名)对方法内部修饰时需要加上对象名 { 代码块。。。。。 } } 下面分析具体代码: class A implements Runnable { public int tickets = 10; String str = new String(); public void run() {
} }
public class TestTickets_2{ public static void main(String[] args) { A aa = new A();//定义一个aa对象,
Thread t1 = new Thread(aa); t1.start(); Thread t2 = new Thread(aa); t2.start(); } 你会想为什么一个aa会创建两个线程,其实Thread类是sun公司设计好的可以提供一种机制对Runnable接口的对象创建N个线程。也就是说当你new Thread(aa) 时就是创建Runnable对象,也就是模型到实物的操作,所以记住这样创建就是一个对象开启了两个线程。也就是main()里的代码实现了两个线程同时执行一个run()中的代码,而synchronied实现了不管哪个线程谁先执行这个就霸占了它里面的代码直到执行完毕。当一个在执行关键代码时另外的线程就处在就绪等待的状态。同步就是互斥的意思。 } 下面讲创建线程的两种区别:上面是第二种方式创建线程。下面讲用第一种方式创建线程并实现卖票程序 用创建线程的第一种方式 来买票 本程序运行OK 结果都是两个线程分别买10张票。最好用第二种方式来创建一个对象,在一个对象上可以创建N个线程共享一个资源。 第一种方式是创建N个对象,用静态来实现 第78课:复习线程 线程:是一个程序里的不同执行路径。 第79课:复习上节课卖票程序—9个例子 例1:第二种创建线程:容易出错误的卖票程序的几个地方。 class A implements Runnable 第二种创建线程的方式 { public static int tickets = 100; String str = new String(“你好”)//括号里可以没有任何内容也是可以的。第四种错误将这行放入run()里,使用synchronied锁定的不是同一个对象。 public void run(){第二种错误:void后不能加Synchronied 锁定了run方法即锁定一个站点卖票,只到卖完。 while (true){//第一种错误:没用Synchronied(类对象名)来霸占关键代码需要填加绿色的代码 synchronied(str){第三种错误:不能将synchronied()将while写反,将成死循环不退出while循环。 if (tickets > 0){ System.out.printf("%s线程正在卖出第%d张票\n", Thread.currentThread().getName(), tickets); --tickets; } else{break;} } } } } public class TestTickets{ public static void main(String[] args){ A aa = new A(); Thread t1 = new Thread(aa); t1.start();
Thread t2 = new Thread(aa); t2.start(); } } 例2:第一种创线程的方式 :来买票 class A extends Thread { public int tickets = 100; //因为这里没有加static,所以导致每张票被卖了两次 public static String str = new String("哈哈");//这里不加static锁定不是同一个对象。 public void run() { while (true){ synchronized (str){ if (tickets > 0){ System.out.printf("%s线程正在卖出第%d张票\n", Thread.currentThread().getName(), tickets); --tickets; } else{ break; } } } } } public class TestTickets_4{ public static void main(String[] args){ A aa1 = new A(); aa1.start();