赞
踩
这是我的期末复习,从网上找到了很多资料,有链接的直接使用了,在这真心谢谢那些优秀的博主,真心感谢,为孩子的期末属实送去了救心丸,呜呜呜。
大佬的笔记直达↓
期末复习
第一章
(1) 掌握多道批处理系统的定义;
为了进一步提高资源的利用率和系统吞吐量,充分利用系统中的所有资源,在20世纪60年代中期又引入了多道程序设计技术,由此而形成了多道批处理系统.
理解其特点;
掌握多道环境下,多个程序之间的并行操作及其执行总时间。
(2)掌握分时系统的定义;理解其特点。
分时操作系统是使一台计算机采用时间片轮转的方式同时为几个、几十个甚至几百个用户服务的一种操作系统。
(3)理解实时系统的定义;理解其特点。
实时操作系统(Real Time Operating System,简称RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。
(4)掌握操作系统的定义
(5)掌握操作系统的四大特征:
①并发的定义,并发和并行的区别。
并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。
区别于并行:指两个或多个事件在同一时刻同时发生。
②互斥共享和同时共享的举例和区别。
③异步性的定义。
异步是指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的, 而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。
④虚拟性的定义。
虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的。
第二章
(1)掌握进程的定义
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
(2)理解进程的特征;掌握进程与程序的区别。
(3)掌握进程实体的组成部分;
程序,数据,进程控制块
掌握PCB的作用;
理解PCB中需要存储的信息。
在不同的操作系统中对进程的控制和管理机制不同,PCB中的信息多少也不一样,通常PCB应包含如下一些信息。
1、进程标识符信息
每个进程都必须有一个唯一的标识符,可以是字符串,也可以是一个数字。UNIX系统中就是一个整型数。在进程创建时由系统赋予。进程标识符用于唯一的标识一个进程。一个进程通常有以下两种标识符。
外部标识符。由创建者提供,通常是由字母、数字组成,往往是用户(进程)访问该进程使用。外部标识符便于记忆,如:计算进程、打印进程、发送进程、接收进程等。
内部标识符:为了方便系统使用而设置的。在所有的OS中,都为每一个进程赋予一个唯一的整数,作为内部标识符。它通常就是一个进程的符号,为了描述进程的家族关系,还应该设置父进程标识符以及子进程标识符。还可以设置用户标识符,来指示该进程由哪个用户拥有。
2、处理机状态信息
说明进程当前所处的状态。为了管理的方便,系统设计时会将相同的状态的进程组成一个队列,如就绪进程队列,等待进程则要根据等待的事件组成多个等待队列,如等待打印机队列、等待等。处理机状态信息主要是由处理机各种寄存器中的内容所组成。
通用寄存器。又称为用户可视寄存器,可被用户程 序访问,用于暂存信息。
指令寄存器。存放要访问的下一条指令的地址。
程序状态字PSW。其中含有状态信息。(条件码、 执行方式、中断屏蔽标志等)
用户栈指针。每个用户进程有一个或若干个与之相 关的系统栈,用于存放过程和系统调用参数及调用地址。栈指针指向该栈的栈顶。
3.进程调度信息
在PCB中还存放了一些与进程调度和进程对换有关的信息。
(1)进程状态。指明进程当前的状态,作为进程调度和对换时的依据。
(2)进程优先级。用于描述进程使用处理机的优先级别的一个整数,优先级高的进程优先获得处理机。
(3)进程调度所需要的其他信息。(进程已等待CPU的时间总和、进程已执行的时间总和)
(4)事件。这是进程由执行状态转变为阻塞状态所等待发生的事件。(阻塞原因)
进程上下文:
是进程执行活动全过程的静态描述。包括计算机系统中与执行该进程有关的各种寄存器的值、程序段在经过编译之后形成的机器指令代码集、数据集及各种堆栈值和PCB结构。可按一定的执行层次组合,如用户级上下文、系统级上下文等。
进程存在的唯一标志:
在进程的整个生命周期中,系统总是通过PCB对进程进行控制的,亦即,系统是根据进程的PCB而不是任何别的什么而感知到该进程的存在的,所以说,PCB是进程存在的唯一标志 。
(4)掌握进程的基本状态的定义、转化、转化原因。
进程的三种基本状态:
1、就绪状态:当进程被分配到除了cpu以外的资源的时候,就会处于就绪状态。
2、运行状态:当获得足够资源之后,通过cpu调度,使得程序运行之后,称为运行状态。
3、阻塞状态:正在执行的进程,由于等待某个事件(等待IO、等待信号等等)发生而无法执行,放弃处理及而处于阻塞状态。
转换及其原因:
(5)掌握原语的意义;
是由若干机器指令构成用以完成特定功能的一段程序,并在执行中不可分割的,称为原语
掌握原子操作。
在一个操作中的所有动作,要么全做,要么全不做。
(6)掌握(重点+难点):进程同步:wait,signal代码体、具体应用(星座转化、打印机使用、火车站卖票、吃水果、生产者和消费者、哲学家进餐)。
(7)掌握引入线程的目的;线程的定义;进程与线程的举例和区别。
1)为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。
2)线程是进程的子任务,是CPU调度和分派的基本单位。
3)
(8)理解进程(管道、共享存储器)通信的基本过程。
进程通信(管道、共享内存)_机械狗pp的博客-CSDN博客_共享内存 管道
第三章
(1)理解调度算法的多个性能指标;
掌握多个调度算法及其具体场景的调度过程(先来先服务、短作业优先(非抢占式)、高响应比优先(非抢占式)、时间片轮转)。
调度算法——先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN) 例题详细!!!_TEST_陈胖子的博客-CSDN博客_先来先服务调度算法例题详解
(2)掌握死锁的定义;理解死锁的场景设计。
如果一个进程集合中的 每个进程 都在等待 只能由进程集合中的其他进程 才能引发的事件,那么,该进程集合就是死锁的。
(3)掌握死锁的四个必要条件。
1、互斥条件:一个资源每次只能被一个进程使用;
2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;
3、不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺;
4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系;
(4)掌握预防死锁的方法,及其具体场景中的应用。
1、避免一个线程同时获取多个锁。
2、避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
3、尝试使用定时锁,使用Lock.tryLock(timeout)来替代使用内部锁机制。
4、对于数据库锁,加锁和解锁须在一个数据库连接里,否则会出现解锁失败的情况。
(5)理解安全状态的意义;掌握安全状态的判别;
安全状态是指系统能按某种顺序如<P1,P2,...,Pn>(称<P1,P2,...Pn>序列为安全序列),来为每个进程分配其所需资源,直到最大需求,使每个进程都可顺序完成。若系统不存在这样一个安全序列,则称系统处于不安全状态。
虽然并非所有不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进而进入死锁状态;反之,只要系统处于安全状态,系统便可避免进入死锁状态。
如果不按照安全顺序分配资源,则系统可能由安全状态进入不安全状态。
掌握银行家算法过程及其具体场景中如何避免死锁。
银行家算法要求,每个新进程在进入系统时,它必须申明在运行过程中,可能需要每种资源类型的最大单元数目,其数目不应超过系统所拥有的的资源总量。当进程请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程。若有,在进一步的检测将这些资源分配给进程后,是否会是系统处于不安全状态;如果不会,才将资源分配给该进程,否则让进程等待。
(6)掌握资源分配图;掌握具体场景中的死锁检测过程。
第四-五章
(1)掌握动态分区分配的管理方法中的多种分配算法(首次适应分配算法、最佳适应算法、最坏适应算法)及具体场景中的分配过程;掌握动态分区分配的多种类型的回收过程。
(2)掌握基本分页存储管理思想;掌握其地址结构(组成部分、位数的设置和意义);掌握页表的作用;掌握逻辑地址到物理地址的转换;理解多级页表的作用;掌握快表的作用;掌握快表下的页表访问过程及有效访问时间。
(3)掌握基本分段存储管理思想;掌握其地址结构(组成部分、位数的设置和意义);掌握段表的作用;掌握逻辑地址到物理地址的转换。
(4)理解分页和分段的意义;掌握分页和分段的区别
(1) 页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。段则是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好地满足用户的需要。
(2) 页的大小固定且由系统决定;而段的长度却不固定,决定于用户所编写的程序。
(3) 分页的地址空间是一维的,程序员只需利用一个记忆符,即可表示一个地址;而分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
(5)掌握段页式存储管理中的分段和分页思想。
(6)掌握虚拟存储器的定义和意义。
(7)掌握请求分页存储管理思想;掌握其地址结构(组成部分、位数的设置和意义);掌握页表的多个组成部分及其作用;掌握缺页中断的判别;掌握逻辑地址到物理地址的转换;掌握和对比不同的置换算法及其具体场景中的置换过程。
第六章
(1)掌握I/O层次的四个组成部分;掌握设备无关性的意义;掌握驱动程序的作用。
(2)理解buffer的意义;掌握单、双buffer的管理方式及并行时间段。
缓冲区就是在内存中预留出指定大小的存储空间,然后对输入/输出(简称i/o)进行数据的临时存储,这部分区域就称为缓冲区 也叫Buffer。
(3)理解假脱机技术的定义和作用。
(4)掌握磁盘调度策略(先来先服务、最短寻道时间优先算法、扫描算法(电梯算法)、循环扫描算法)的思想及其具体场景的应用。
第七--八章
(1)掌握文件的逻辑结构定义。
文件的逻辑结构是用户可见结构。逻辑文件从结构上分成二种形式:一种是无结构的流式文件,是指对文件内信息不再划分单位,它是依次的一串字符流构成的文件。一种是有结构的记录式文件, 是用户把文件内的信息按逻辑上独立的含义划分信息单位,每个单位称为一个逻辑记录(简称记录)。
(2)掌握文件的逻辑组织形式:顺序文件、索引文件、索引顺序文件,并且对比其不同点。
(3)掌握文件的物理结构定义。
(4)掌握文件物理结构及其组织形式:连续组织方式、链接组织方式、索引组织方式,并且对比其不同点,理解不同组织方式下,文件的存储方式和容量。
顺序文件就是按记录的主关键字的值来排序的一种文件;分为升序和降序两种
索引文件是在顺序文件的基础上外加若干级索引文件而成,可分为索引顺序文件和索引无序文件两种。
索引无序文件不要求主文件按关键字值顺序排列,但在索引中是按关键字值的顺序排列。
(5)掌握FCB的定义和作用;掌握索引结点的定义及其作用;掌握目录及其组织结构。
FCB(文件控制块):存放控制文件需要的各种信息的数据结构,以实现按名存取。FCB的有序集合称为文件目录,一个FCB就是一个文件目录项。
FCB包含了文件的基本信息、存取控制信息、使用信息。最重要还是文件名信息和物理存放外存地址的信息,实现了文件名和文件之间的映射关系。
索引节点是指在许多类Unix文件系统中的一种数据结构。每个索引节点保存了文件系统中的一个文件系统对象的元信息数据,但不包括数据内容或者文件名。
目录结构
1.单级目录结构:整个系统建立一张目录表,每个文件占一个文件项,实现了按名存取但是不允许文件重名。不适用于多用户操作系统。
2.两级目录结构:早期的多用户操作系统,主要分为两个部分,主文件目录(记录用户名,以及相应用户文件信息存放位置)和用户文件目录。允许不同用户的文件重名,提高检索速度,可以在目录上实现访问限制。但缺乏灵活性,用户不能对自己的文件进行分类。
3.多级目录结构(树形目录结构):两级目录的推广,从根目录出发的路径称为绝对路径,从当前目录出发的为相对路径(与绝对路径相比可减少访问I/O的次数,提高效率)。方便对文件分类,层析结构清晰,更能有效的进行文件的管理与保护,但是不便实现文件的共享。
4.无环图目录结构:在树形目录结构的基础上增加了指向同一节点的有向边,使目录成为一个有向无环图。设置一个共享技术器来表示指向该共享文件的链数,当共享计数器为0时,才真正删除该结点,否则仅删除用户请求的共享链。
索引结点:FCB的改进,将文件名和文件信息分开,使文件信息单独形成一个称为索引结点的数据结构,简称i结点。在文件目录中的每个目录项仅有目录名和指向该文件所对应结点的指针构成。FCB必须连续存放,大大节省了系统开销。
1.磁盘索引结点:存放在磁盘上的索引结点。每个文件有一个唯一的磁盘索引结点
2.内存 索引结点:存放在内存中的索引结点
这个大佬说的更详细
(6)掌握位示图的作用及其管理过程。
第九章
(1)理解系统调用的作用和调用过程。
“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务。会使处理器从用户态进入核心态
(2)掌握用户态、核心态。
实验一: 银行家算法
实验二:多级队列调度和多级反馈队列调度算法
实验三:动态分区式内存管理
实验四:linux下的多进程通信
实验五:进程通信的三种方式
实验六:Linux文件系统实验
实验七: 磁盘调度算法
实验八: 请求分页系统中的置换算法
学习笔记:学习笔记
实验self:
进程和线程的基本操作
- #include<stdio.h>
- #include<stdlib.h>
- #include<unistd.h>
- int main(void)
- {
- int i;
- for(i=0;i<5;i++)
- {
- printf("we chat\n");
- sleep(2);
- execl("./listen","listen",NULL);//填空1:execl 填空2:listen/chat
- printf("we don't chat\n");
- sleep(1);
- }
- return 0;
- }
-
-
- 2)chatlisten1.c
- #include<stdio.h>
- #include<stdlib.h>
- #include<unistd.h>
- int main(void)
- {
- int ret;
- int process;
- int i=0;
- process=fork();//填空1:fork()
- if(process==-1)
- {
- printf("create process failure.");
- }
- else
- {
- if(process==0)
- {
- ret=execl("./listen","chat",NULL);//填空2:execl 填空3:chat
- if(ret==-1)
- {
- printf("execl error");
- }
- }
- else
- {
- for(i=0;i<5;i++)
- {
- printf("we chat\n");
- sleep(2);
- printf("we don't chat\n");
- sleep(1);
- }
- }
- }
- return 0;
- }
-
-
- 5)Word.c
- #include<stdio.h>
- #include<pthread.h>
- #include<stdlib.h>
- #include<unistd.h>
-
- void input(void)
- {
- int i=0;
- for(i=0;i<200;i++)
- {
- printf("input.\n");
- sleep(1);
- }
- }
-
- void check(void)
- {
- int i=0;
- for(i=0;i<200;i++)
- {
- printf("check.\n");
- sleep(1);
- }
- }
-
- int main(void)
- {
- pthread_t id1,id2;
- int ret;
- ret=pthread(&id1,NULL,(void *)input,NULL);//填空1:pthread 填空2:input
- if(ret!=0)
- {
- printf ("Create input pthread error!\n");
- exit (1);
- }
- ret=pthread(&id2,NULL,(void *)check,NULL);//填空3:pthread 填空4:check
- if(ret!=0)
- {
- printf ("Create check pthread error!\n");
- exit (1);
- }
- pthread_join(id1,NULL);//填空5:id1
- pthread_join(id2,NULL);
- return 0;
- }
进程通信和同步操作
- a.c
-
- #include<stdio.h>
- #include<unistd.h>
- #include<sys/types.h>
- #include<sys/ipc.h>
- #include<sys/shm.h>
- #include<sys/sem.h>
- #define SHM_KEY 100
- #define SEM_KEY 52
- union semun
- {
- int setval;
- struct semid_ds *buf;
- unsigned short *array;
- };
- int main( )
- {
- int shmid;
- int *addr;
- int semid;
- union semun semvalue;
- unsigned short array[2]={0,1};
- shmid=shmget(SHM_KEY,getpagesize(),IPC_CREAT| 0666);//填空1 shmid填空2 shmget
- addr=shmat(shmid,NULL,SHM_RND);//填空3 shmat
- semid =semget(SEM_KEY, 2, IPC_CREAT | 0666);//填空4 semget
- semvalue.array = array;
- semctl(semid, 1, SETALL, semvalue);//填空5 semctl
- struct sembuf semwait1= {0, -1, SEM_UNDO};
- struct sembuf semsignal1 = {0, 1, SEM_UNDO};
- struct sembuf semwait2= {1, -1, SEM_UNDO};
- struct sembuf semsignal2 = {1, 1, SEM_UNDO};
- while(1)
- {
- semop(semid, &semwait2, 1);//填空6 semwait2
- printf(" enter your birthday,first input month,second input day:\n");
- scanf("%d%d",addr,addr+1);
- semop(semid, &semsignal1, 1);
- if(*addr==0||*(addr+1)==0 )
- break;
- }
- shmdt(addr);
- shmctl(shmid,IPC_RMID,NULL);//填空7 shmctl
- return 0;
- }
-
- b.c
- #include<stdio.h>
- #include<unistd.h>
- #include<sys/types.h>
- #include<sys/ipc.h>
- #include<sys/shm.h>
- #include<sys/sem.h>
- #define SHM_KEY 100
- #define SEM_KEY 52
- union semun
- {
- int setval;
- struct semid_ds *buf;
- unsigned short *array;
- };
- int main( )
- {
- int shmid;
- int *addr;
- int month,day;
- char cons[12][30]={"水瓶座Aquarius","双鱼座Pisces","白羊座Aries","金牛座Taurus","双子座Gemini","巨蟹座Cancer","狮子座Leo","处女座Virgo","天瓶座Libra","天蝎座Scorpio","射手座Sagittarius","魔羯座Capricorn"};
- int semid;
- union semun semvalue;
- unsigned short array[2]={0,1};
- shmid=shmget(SHM_KEY,getpagesize(), IPC_CREAT | 0666); //填空1)shmid填空(2)shmget
- addr =shmat(shmid,NULL,SHM_RND);//填空(3)shmat
- semid = semget(SEM_KEY, 2, IPC_CREAT | 0666);//填空(4)semget
- semvalue.array = array;
- semctl(semid, 1, SETALL, semvalue);//填空(5)semctl
- struct sembuf semwait1= {0, -1, SEM_UNDO};
- struct sembuf semsignal1= {0, 1, SEM_UNDO};
- struct sembuf semwait2= {1, -1, SEM_UNDO};
- struct sembuf semsignal2= {1, 1, SEM_UNDO};
- while(1)
- {
- semop(semid, &semwait1, 1);//填空 6 semwait1
- month=*addr;
- day=*(addr+1);
- printf("month=%d day=%d \n",month,day);
- if(month==0|| day==0)
- break;
- switch(month)
- {
- case 1:printf("你是 %s\n",day>=20?cons[0]:cons[11]);break;
- case 2:printf("你是 %s\n",day>=19?cons[1]:cons[0]);break;
- case 3:printf("你是 %s\n",day>=21?cons[2]:cons[1]);break;
- case 4:printf("你是 %s\n",day>=20?cons[3]:cons[2]);break;
- case 5:printf("你是 %s\n",day>=21?cons[4]:cons[3]);break;
- case 6:printf("你是 %s\n",day>=22?cons[5]:cons[4]);break;
- case 7:printf("你是 %s\n",day>=23?cons[6]:cons[5]);break;
- case 8:printf("你是 %s\n",day>=23?cons[7]:cons[6]);break;
- case 9:printf("你是 %s\n",day>=23?cons[8]:cons[7]);break;
- case 10:printf("你是 %s\n",day>=24?cons[9]:cons[8]);break;
- case 11:printf("你是 %s\n",day>=23?cons[10]:cons[9]);break;
- case 12:printf("你是 %s\n",day>=22?cons[11]:cons[10]);break;
- }
- semop(semid, &semsignal2, 1);//填空7 semsignal2
- }
- shmdt(addr);
- shmctl(shmid,IPC_RMID,NULL);//填空8 shmctl
- return 0;
- }
- //银行家算法
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include<unistd.h>
- # define m 2
- int processnum=2; //进程数//(1)1
- int resourcetype=2; //资源数种类
- int safe; //表示是否为安全状态
- int max[m][m],allocation[m][m],need[m][m],available[m]; // 最大需求资源数,已分配资源数目,还需要资源数目,可用资源数目,
- int banker(int choiceprocess,int request[2]) //银行家算法,第1个参数是请求分配资源进程号,第2个参数是进程请求的资源
- {
- void check(); //安全性检查函数的声明
- void print();//输出当前系统资源分配情况函数对声明
- void filesave();//保存当前系统中资源分配情况函数的声明
- void fileread(); //读取当前系统中资源分配情况函数的声明
- int i,j,p=0,q=0;
- char c;
- int allocation1[m][m],need1[m][m],available1[m];
- fileread();//从save.txt中读取当前资源分配情况。
- for(i=0;i<processnum;i++)
- for(j=0;j<resourcetype;j++)
- need[i][j]=max[i][j]-allocation[i][j]; //根据输入的两个数组计算出need矩阵的值
- printf("banker computing.....\n");
- sleep(3);
- printf("now resource is");
- print(); //输出已知条件
- q=0;
- p=0;
- for(j=0;j<resourcetype;j++)
- if(request[j]>need[choiceprocess][j]) //判断进程请求是否超过该进程所需要的资源数
- p=0; // (2)0
- if(p)
- {
- sleep(3);
- printf("first step 1,request>need!\n\n");
- }
- else
- {
- sleep(3);
- printf("first step 1,request<=need\n\n");
- for(j=0;j<resourcetype;j++)//判断进程请求是否超过可用资源数
- if(request[j]>available[j]) //(3)available[j]
- q=1;
- if(q)
- {
- sleep(3);
- printf("second step 2, request>available\n\n");
- }
- else //请求满足条件
- {
- sleep(3);
- printf("second step 2,request<=available\n\n");
- sleep(3);
- printf("third step 3,try allocate\n");
- for(j=0;j<resourcetype;j++)
- {
- available1[j]=available[j];
- allocation1[choiceprocess][j]=allocation[choiceprocess][j];
- need1[choiceprocess][j]=need[choiceprocess][j]; //保存原已分配的资源数,仍需要的资源数和可用的资源数
- available[j]-=request[j];//(4)request[j]
- allocation[choiceprocess][j]+=request[j];//(5)choiceprocess
- need[choiceprocess][j]-=request[j];//系统尝试把资源分配给请求的进程
- }
- sleep(3);
- printf("resoure after allocate\n");
- print();
- check(); //检测分配后的安全性
- sleep(3);
- printf("forth step 4,safe check\n\n");
- if(safe==0) //如果分配后系统不安全
- {
- sleep(3);
- printf("status is not safe,not allocate,resoure return,as follows\n\n");
- for(j=0;j<resourcetype;j++)//还原已分配的资源数,仍需要的资源数和可用的资源数
- {
- available[j]=available1[j];
- allocation[choiceprocess][j]=allocation1[choiceprocess][j]; //(6)allocation1[choiceprocess][j]
- need[choiceprocess][j]=need1[choiceprocess][j];
- }
- print();
- }
- }
- }
- filesave();
- if(safe==1)
- {
- sleep(3);
- printf("the status is safe,allocate\n");
- return 1;
- }
- else
- return 0;
- }
- void check() //安全算法函数
- {
- int k,f,v=0,i,j;
- int work[m],a[m];
- int finish[m];
- safe=1;
- for(i=0;i<processnum;i++)
- finish[i]=0; // 初始化进程均没得到足够资源数并完成//(7)0
- for(i=0;i<resourcetype;i++)
- work[i]=available[i];//work[i]表示可提供进程继续运行的各类资源数
- k=processnum;
- do{
- for(i=0;i<processnum;i++)
- {
- if(finish[i]==0)
- {
- f=1;
- for(j=0;j<resourcetype;j++)
- if(need[i][j]>work[j])
- f=0;//(8)0
- if(f==1) //找到还没有完成且需求数小于可提供进程继续运行的资源数的进程
- {
- finish[i]=1;//(9)1
- a[v++]=i; //记录安全序列号
- for(j=0;j<resourcetype;j++)
- work[j]+=allocation[i][j]; //释放该进程已分配的资源,可用资源数增加//(10)allocation
- }
- }
- }
- k--; //每完成一个进程分配,未完成的进程数就减1//(11)k--
- }while(k>0);
- f=1;
- for(i=0;i<processnum;i++) //判断是否所有的进程都完成
- {
- if(finish[i]==0)
- {
- f=0;
- break;//跳出//(12)break
- }
- }
- if(f==0) //若有进程没完成,则为不安全状态
- {
- safe=0;
- }
- else
- {
- //printf("\nsafe order is ");
- //for(i=0;i<processnum;i++)
- //printf("p%d ",a[i]); //输出安全序列
- }
- }
- void print() //输出函数
- {
- int i,j;
- printf("\n");
- printf("*************resource use*********************\n");
- printf("process | Max |Allocation| Need |\n");
- for (i = 0; i < processnum; i++)
- {
- printf(" p%d/%d ",i,i);
- for (j = 0; j < resourcetype; j++)
- {
- printf("%d ",max[i][j]);
- }
- for (j = 0; j < resourcetype; j++)
- {
- printf(" %d ",allocation[i][j]);
- }
- for (j = 0; j < resourcetype; j++)
- {
- printf(" %d ",need[i][j]);
- }
- printf("\n");
- }
- printf("\n");
- printf("process available:");
- for (j = 0; j < resourcetype; j++)
- {
- printf(" %d",available[j]);
- }
- printf("\n");
- }
- void filesave() //保存当前系统中资源分配情况
- {
- int fp;
- fp=open("save.txt",O_CREAT|O_WRONLY,0600);
- write(fp,&allocation[0][0],1);
- write(fp,&allocation[0][1],1);
- write(fp,&allocation[1][0],1);
- write(fp,&allocation[1][1],1);
- write(fp,&max[0][0],1);
- write(fp,&max[0][1],1);
- write(fp,&max[1][0],1);
- write(fp,&max[1][1],1);
- write(fp,&available[0],1);
- write(fp,&available[1],1);
- close(fp);
- }
- void fileread() //读取当前系统中资源分配情况
- {
- int fp;
- fp=open("save.txt",O_RDWR,0600);
- lseek(fp,0,SEEK_SET);
- read(fp,&allocation[0][0],1);
- read(fp,&allocation[0][1],1);
- read(fp,&allocation[1][0],1);
- read(fp,&allocation[1][1],1);
- read(fp,&max[0][0],1);
- read(fp,&max[0][1],1);
- read(fp,&max[1][0],1);
- read(fp,&max[1][1],1);
- read(fp,&available[0],1);
- read(fp,&available[1],1);
- close(fp);
- }
- #include<stdio.h>
- #include<stdlib.h>
- #define processcount 20 //最多进程数
- #define freezonecount 200 //空闲区最多分区数
- #define freezonemax 200 //空闲区初始容量
- struct freezonetype//空闲区
- {
- int freezoneno;//空闲分区号
- int freezonesize ; //空闲区大小
- int freezonestartaddr; //起始地址
- int flag;// 是否记录信息(是否空闲,空闲为1)
- };
-
-
- struct processtype//进程
- {
- int processno;//进程号
- int processsize;//进程大小
- int processstartaddr;//起始地址
- int processflag;//是否存在进程,存在为1,
- };
-
- void createprocess();//创建进程
- void allocate(struct processtype *processnumber,int locate);//给进程分配空间
- void printprocess();//输出所有进程
- void printfreezone();//输出所有空闲区
- void recycle(struct processtype *processnumber,int locate);//回收进程空间
- void killprocess();//结束进程
- void sort();//回收空间时每次分区号排序
- struct freezonetype freezone[freezonecount];//存放系统空闲区
- struct processtype process[processcount];//存放进程
-
- void createprocess()//创建进程
- {
- int number; //进程号
- int size;
- int i,j;
- int loop=0;
- printf("输入进程号\n");
- while(loop==0)//判断进程号是否重复
- {
- scanf("%d",&number);
- for(i=0;i<processcount;i++)
- {
- if(process[i].processflag==1)
- {
- if(process[i].processno==number)//1)number
- {
- printf("进程号重复,请重新输入");
- break;
- }
- }
- }
- if(i>=processcount)
- loop=1;
- }
- for(j=0;j<processcount;j++)
- {
- if(process[j].processflag==0)// 如果该位置没进程,则存放进程信息 2)0
- {
- process[j].processno=number;//3)number
- printf("输入进程大小,<=100\n");
- scanf("%d",&size);
- process[j].processsize=size;//4)size
- allocate(process,j);//给进程分配空间 //5)allocate
- if(process[j].processflag==0)
- printf("进程创建失败\n");
- else
- printf("进程创建成功\n");
- break;
- }
- }
- }
-
-
- void allocate(struct processtype *processnumber,int locate)//给进程分配空间,
- {
- int i;
- for(i=0;i<freezonecount;i++)
- {
- if(freezone[i].flag==1) //有空闲分区
- {
- if(processnumber[locate].processsize<=freezone[i].freezonesize)//6)<=
- //对每个空闲区的大小进行比较,找到满足大小的空间即退出;
- {
- break;
- }
-
- }
- }
- if(i>=freezonecount) //没有足够的空间分配给进程
- {
- printf("空间不够,分配不成功");
- processnumber[locate].processflag=0;//进程分配空间不成功,创建不成功
- }
- else
- {
- processnumber[locate].processstartaddr= freezone[i].freezonestartaddr;//确定进程首地址//7)freezonestartaddr
- freezone[i].freezoneno=i;
- freezone[i].freezonesize=freezone[i].freezonesize-processnumber[locate].processsize; //分配给进程空间,空闲分区减少 //8)processsize;
- freezone[i].freezonestartaddr=freezone[i].freezonestartaddr+processnumber[locate].processsize;//空闲分区起始地址变化 //9)processsize
- if(freezone[i].freezonesize==0)
- freezone[i].flag=0;//空闲分区空间为0,该空闲区使用完,
- processnumber[locate].processflag=1;//进程分配空间成功 ,创建成功
- }
- }
-
- void killprocess()//结束进程
- {
- int number;//进程号
- int i;
- int loop=0;
- int locate;
- printf("输入撤销的进程号\n");
- scanf("%d",&number);
- while(loop==0) //判断进程号输入是否正确
- {
- for(i=0;i<processcount;i++)
- {
- if(process[i].processflag==1)
- {
- if(process[i].processno==number)//如果进程号输入正确,
- {
- process[i].processflag=0;//撤销进程
- recycle(process,i);//回收空间 //10)recycle
- printf("撤销进程成功\n");
- break;
- }
- }
- }
- if(i>=processcount)//如果进程号输入不正确,
- {
- printf("找不到该进程,请重新输入进程号\n");
- scanf("%d",&number);
- }
- else
- {
- loop=1;
- }
- }
- }
-
- void sort()//回收空间时每次分区号排序
- {
- int nownumber=0;
- int nownumbersort;
- int i,j,k;
- struct freezonetype f[freezonecount];//递增排序时,中间数组分区
- struct freezonetype temp;//排序时,中间变量
- for(i=0;i<freezonecount;i++)//记录当前系统分区数
- {
- if(freezone[i].flag==1)
- {
- f[nownumber]=freezone[i];
- nownumber++;
- }
- }
- nownumbersort=nownumber-1;
- for(i=0;i<nownumbersort;i++) //将空闲区(flag==1)复制到中间数组按地址递增排序
- {
- for(j=0;j<nownumbersort-i;j++)
- {
- if(f[j].freezonestartaddr>f[j+1].freezonestartaddr)
- {
- temp=f[j+1];
- f[j+1]=f[j];
- f[j]=temp;
- }
- }
- }
- for(i=0;i<freezonecount;i++)//将按地址递增次序排好的中间数组复制到空闲区数组中,
- {
- if(i<nownumber)//这部分记录着是空闲区,
- {
- freezone[i]=f[i];
- }
- else
- {
- freezone[i].flag=0;//不是空闲区
- }
-
- }
- for(k=0;k<freezonecount;k++)//重新记录空闲区号
- {
- if(freezone[k].flag==1)
- {
- freezone[k].freezoneno=k;
- }
- }
- }
-
- void recycle(struct processtype *processnumber,int locate)//回收空间
- {
- int i,j,k;
- int nownumber;//当前系统的空闲分区数
- int addr;
- int addr1;
- for(i=0;i<freezonecount;i++) //创建一个空闲分区
- {
- if(freezone[i].flag==0)
- {
- freezone[i].freezoneno=i;
- freezone[i].freezonestartaddr=processnumber[locate].processstartaddr;//11).processstartaddr
- freezone[i].freezonesize=processnumber[locate].processsize;
- freezone[i].flag=1;
- break;
- }
- }
- sort();
- for(k=0;k<freezonecount;k++)//记录当前系统分区数
- {
- if(freezone[k].flag==1)
- {
- nownumber++;
- }
- }
- for(i=0;i<nownumber;i++)
- {
- if(nownumber>=2)
- {
- if(freezone[i].flag==1)
- {
- if(i>=1&&i<nownumber-1)//中间空闲区的判断
- {
- addr=freezone[i-1].freezonestartaddr+freezone[i-1].freezonesize;
- addr1=freezone[i].freezonestartaddr+freezone[i].freezonesize;
- if(addr==freezone[i].freezonestartaddr)//上有邻接区 //12)addr
- {
- if(addr1==freezone[i+1].freezonestartaddr)//上有邻接区 ,下有邻接区
- {
- freezone[i-1].freezonesize=freezone[i-1].freezonesize+freezone[i].freezonesize+freezone[i+1].freezonesize;//13)freezonesize
- freezone[i].flag=0;
- freezone[i+1].flag=0;
- }
- else//上有邻接区,下无邻接区
- {
- freezone[i-1].freezonesize=freezone[i-1].freezonesize+freezone[i].freezonesize;
- freezone[i].flag=0;
- }
- }
- else//上无邻接区
- {
- if(addr1==freezone[i+1].freezonestartaddr)//上无邻接区 ,下有邻接区
- {
- freezone[i].freezonesize=freezone[i].freezonesize+freezone[i+1].freezonesize; //14)freezone[i+1]
- freezone[i+1].flag=0;
- }
- else//上无邻接区,下无邻接区 ,这段可删除
- {
- ;
- }
-
- }
- }
- else
- {
- if(i==0)//第一个空闲分区的判断
- {
- addr=freezone[i].freezonestartaddr+freezone[i].freezonesize;
- if(addr==freezone[i+1].freezonestartaddr)
- {
- freezone[i].freezonesize=freezone[i].freezonesize+freezone[i+1].freezonesize;
- freezone[i+1].flag=0;
- }
-
- }
- else
- {
- if(i==nownumber-1)//最后一个空闲分区的判断
- {
- addr=freezone[i-1].freezonestartaddr+freezone[i-1].freezonesize;
- if(addr==freezone[i].freezonestartaddr)
- {
- freezone[i-1].freezonesize=freezone[i-1].freezonesize+freezone[i].freezonesize;
- freezone[i].flag=0;
- }
- }
- }
- }
- }
- }
- sort();
- }
- }
-
-
- void printprocess()//输出进程
- {
- int i,j;
- printf(" 进程号 进程大小 进程起始地址\n");
- for(i=0;i<processcount;i++)
- {
- if(process[i].processflag==1)
- {
- break;
- }
- }
- if(i>=processcount)
- printf("暂时无进程");
- else
- for(j=0;j<processcount;j++)
- {
- if(process[j].processflag==1)
- {
- printf(" %d %d %d \n",process[j].processno,process[j].processsize,process[j].processstartaddr);
- }
- }
- }
-
-
- void printfreezone()//输出空闲区
- {
- int i;
- for(i=0;i<freezonecount;i++)
- {
- if(freezone[i].flag==1)
- {
- break;
- }
- }
- if(i>=freezonecount)
- printf("暂时无空间");
- else
- {
- printf(" 分区号 分区大小 分区起始地址\n");
- for(i=0;i<freezonecount;i++)
- {
- if(freezone[i].flag==1)
- {
-
- printf(" %d %d %d \n",freezone[i].freezoneno,freezone[i].freezonesize,freezone[i].freezonestartaddr);
- }
- }
- }
- }
-
-
- int main()
- {
- int choice;
- int i;
- for(i=0;i<processcount;i++)
- {
- process[i].processflag=0;
- }
- for(i=0;i<freezonecount;i++)
- {
- freezone[i].flag=0;
- }
- printf("1 创建进程,分配空间 \n");
- printf("2 结束进程,回收空间 \n");
- printf("3 输出所有进程 \n");
- printf("4 输出所有空闲分区 \n");
- printf("0 退出系统 \n");
- freezone[0].freezoneno=0;
- freezone[0].freezonesize=freezonemax;//初始空闲分区的大小
- freezone[0].freezonestartaddr=0;//初始空闲分区的初始地址
- freezone[0].flag=1;
- do//界面选择操作
- {
- scanf("%d",&choice);
- switch(choice)
- {
- case 1:createprocess();break;
- case 2:killprocess();break;
- case 3:printprocess();break;
- case 4:printfreezone();break;
- case 0:break;
- }
- printf("\n1 创建进程,分配空间 \n");
- printf("2 结束进程,回收空间 \n");
- printf("3 输出所有进程 \n");
- printf("4 输出所有空闲分区 \n");
- printf("0 退出系统 \n");
- }
- while(choice!=0) ;
- }
掌握实验中的知识点。
1.设计现代OS的主要目标是什么?
方便性,有效性,可扩充性和开放性。
方便性:系统可以使用编译命令将用户采用高级语言书写的程序翻译成机器代码,或者直接通过OS所提供的各种命令操作计算机系统。
有效性:提高系统资源的利用率;提高系统的吞吐量
可扩充性:能方便地增添新的功能和模块,以及对原有的功能和模块进行修改
开放性:使得不同厂家按照标准生产的软、硬件都能在本国范围内很好地相互兼容
2.OS的作用可表现在哪几个方面?
作为用户与计算机硬件系统之间的接口:OS处于用户与计算机硬件系统之间。用户通过OS来使用计算机系统。
作为计算机系统资源的管理者:资源:处理机、存储器、I/O设备以及文件(数据和程序)。
实现了对计算机资源的抽象。
3.为什么说操作系统实现了对计算机资源的抽象?
裸机向用户提供的仅是硬件接口,用户必须对物理接口十分熟悉,使物理机器难于广泛使用。
在裸机上铺设的I/O软件隐藏了I/O 设备的具体细节,向上提供了一组抽象的I/O设备。I/O设备管理软件实现了对计算机硬件操作的第一个层次的抽象;文件管理软件实现了对硬件资源操作的第二个层次的抽象;再覆盖一层面向用户的窗口软件。
4.试说明推动多道批系统形成和发展的主要动力是什么?
不断提高计算机资源利用率;方便用户;器件的不断更新换代;计算机体系结构的不断发展;不断提出新的应用要求。
5.何谓脱机I/O和联机I/O?
脱机I/O:程序和数据的输入和输出都是在外围机的控制下完成的。在脱离主机的情况下进行的。
联机I/O:是指程序和数据的输入输出都是在主机的直接控制下进行的。
假脱机:在联机情况下实现的同时操作的技术。
6.试说明推动分时系统形成和发展的主要动力是什么。
为了满足用户对人-机交互的需求。
7.实现分时系统的关键问题是什么?应如何解决?
及时接收:在系统中配置一个多路卡即可。多路卡的作用:实现分时多路复用,即主机以很快的速度周期性地扫描各个终端,在每个终端处停留很短的时间。
及时处理:作业直接进入内存;采用轮转运行方式。
8.为什么要引入实时操作系统?
如果嵌入式系统的功能比较复杂,需要网络功能、存储器管理、进程/线程管理等,则通过嵌入式操作系统的帮助,可加快嵌入式系统软件的开发进度和可靠性。
9.什么是硬实时任务和软实时任务?试举例说明。
硬实时任务:系统必须满足任务队截止时间的要求,否则可能出现难以预测的后果。用于工业和武器控制的实时系统。
软实时任务:对于截止时间不严格,即使错过了,对系统的影响也不太大。信息查询系统和多媒体系统中的实时系统。
10.试从交互性、及时性以及可靠性方面将分时系统与实时系统进行比较。
交互性:在信息查询系统中,人与系统的交互性仅限于访问系统中某些特定的专用服务程序。它并不像分时系统那样,能向终端用户提供数据处理、资源共享等服务。而多媒体系统的交互性也仅限于用户发送某些特定的命令,如开始、停止、快进等,由系统立即响应。
及时性:信息查询系统对实时性的要求是依据人所能接受的等待时间确定,而多媒体系统实时性的要求是,播放出来的音乐和电视能令人满意。实时控制系统的实时性则是以控制对象所要求的截止时间来确定的,一般为秒级到毫秒级。
可靠性:分时系统要求系统可靠,实时系统要求系统高度可靠,因为任何差错都可能带来无法预料的后果。因此,在实时系统中,往往都采取了多级容错技术来保障系统的安全性及数据的安全性。
11.OS有哪几大特征?其最基本的特征是什么?
并发性,共享性,虚拟性和异步性。
最基本:并发性
并行是指两个或多个时间在同一时刻发生。
并发是指两个或多个事件在同一时间间隔内发生。
共享:系统中的资源可供内存中多个并发执行的进程共同使用。
虚拟:通过某种技术将一个物理实体变为若干个逻辑上的对应物的功能。(时分复用技术和空分复用技术)
时分复用技术:利用某设备为一用户服务的空闲时间,又转去为其他用户服务,使设备得到最充分的利用。
空分复用技术:利用存储器的空闲空间分区域存放和运行其他的多道程序,以此来提高内存的利用率。
异步:进程是以人们不可预知的速度向前推进的。
12.在多道程序技术的OS环境下的资源共享与一般情况下的资源共享有何不同?对独占资源应采取何种共享技术?
一般情况下的共享只是说明某种资源能被大家使用,只要通过适当的安排,用户之间并不会产生对资源的竞争,因此资源管理是比较简单的。
而在OS环境下的资源共享或称为资源复用,是指系统中的资源可供内存中多个并发执行的进程共同使用。
对独占资源应采取互斥式共享。
13.什么是时分复用技术?举例说明它能提高资源利用率的根本原因是什么。
时分复用技术:利用某设备为一用户服务的空闲时间,又转去为其他用户服务,使设备得到最充分的利用。
举例:虚拟处理机技术:利用多道程序设计技术(时分复用技术),可将一台物理上的处理机虚拟为多台逻辑上的处理机,在每台逻辑处理机上运行一道程序。
14.是什么原因使操作系统具有异步性特征?
对于内存中的每个进程,在何时能获得处理机运行,何时又因提出某种资源请求而暂停,以及进程以怎样的速度向前推进,每道程序总共需要多少时间才能完成等,都是不可预知的,进程是以人们不可预知的速度向前推进的,此即进程的异步性。
15.处理机管理有哪些主要功能?其主要任务是什么?
进程控制;进程同步;进程通信;调度
主要功能:创建和撤销进程,对诸进程的运行进行协调,实现进程之间的信息交换,以及按照一定的算法把处理机分配给进程。
16.内存(存储器)管理有哪些主要功能?其主要任务是什么?
内存分配;内存保护;地址映射;内存扩充
主要任务:是为多道程序的运行提供良好的环境,提高存储器的利用率,方便用户使用,并能从逻辑上扩充内存。
17.设备管理有哪些主要功能?其主要任务是什么?
缓冲管理;设备分配;设备处理
主要任务:完成用户进程提出的I/O请求,为用户进程分配所需的I/O设备,并完成指定的I/O操作。
提高CPU和I/O设备的利用率,提高I/O速度,方便用户使用I/O设备。
18.文件管理有哪些主要功能?其主要任务是什么?
主要任务:对用户文件和系统文件进行管理以方便用户使用,并保证文件的安全性。
文件存储空间的管理;目录管理;文件的读/写管理和保护
19.试说明推动传统OS演变为现代OS的主要因素是什么?
系统安全;网络的功能和服务;支持多媒体
20.什么是微内核OS?
从四个方面对微内核结构的操作系统进行描述:足够小的内核;基于客户/服务器模式;应用“机制与策略分离”的原理;采用面向对象技术
21.微内核操作系统具有哪些优点?它为何能有这些优点?
由于微内核OS结构是建立在模块化、层次化结构的基础上的,并采用了客户/服务器模式和面向对象的程序设计技术,因此,微内核结构的操作系统是集各种技术优点之大成,因而具有如下优点:
1)提高了系统的可扩展性
2)增强了系统的可靠性
3)可移植性强
4)提供了对分布式系统的支持
5)融入了面向对象技术
22.现代操作系统较之传统操作系统又增加了哪些功能和特征?
进程(线程)管理;低级存储器管理;中断和陷入管理
23.在微内核OS中,为什么要采用客户/服务器模式?
数据的分布处理和存储;便于集中管理;灵活性和可扩充性;易于改编应用软件
24.在基于微内核结构的OS中,应用了那些新技术?
采用面向对象的程序设计技术。
25.何谓微内核技术?在微内核中通常提供了哪些功能?
把操作系统中更多的成分和功能放到更高的层次(即用户模式)去运行,而留下一个尽量小的内核,用它来完成操作系统最基本的核心功能称这种技术为微内核技术。在微内核中通常提供了进程(线程)管理;低级存储器管理;中断和陷入管理等功能。
1.什么是前趋图?为什么要引入前趋图?
前趋图是一个有向无循环图,记为DAG,用于描述进程之间执行的先后关系。
2.试画出下面四条语句的前趋图:
S1:a=x+y;
S2:b=z+1;
S3:c=a-b;
S4:w=c+1;
3.为什么程序并发执行会产生间断性特征?
程序并发执行时,由于他们共享系统资源,为完成同一项任务需要相互合作,致使这些并发执行的进程之间,形成了相互制约关系,从而使得进程在执行期间出现间断性。
4.程序并发执行时为什么会失去封闭性和可再现性?
程序并发执行时,多个程序共享系统中的各种资源,因而这些资源的状态由多个程序改变,致使程序运行失去了封闭性,也会导致其失去可再现性。
5.在操作系统中为什么要引入进程概念?它会产生什么样的影响?
为了使程序在多道程序环境下能并发执行,并对并发执行的程序加以控制和描述,在操作系统中引入了进程的概念。
影响:使程序的并发执行得以实行。
6.试从动态性、并发性和独立性上比较进程和程序。
1)动态性是进程最基本的特性,表现为由创建而产生,由调度而执行,因得不到资源而暂停执行,由撤销而消亡。进程有一定的生命期,而程序只是一组指令的有序集合。是静态实体。
2)并发性是进程的重要特征,同时也是OS的重要特征,引入进程的目的正是为了使其程序能和其他进程的程序并发执行,而程序是不能并发执行的。
3)独立性是指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB的程序都不能作为一个独立的单位参与运行。
7.试说明PCB的作用,为什么说PCB是进程存在的唯一标志?
PCB是进程实体的一部分,是操作系统中最重要的记录型数据结构作用是使一个在多道程序环境下不能独立运行的程序,成为一个能独立运行的基本单位,成为能与其他进程并发执行的进程,OS是根据PCB对并发执行的进程进行控制和管理的。
8.PCB提供了进程管理和进程调度所需要的哪些信息?
进程管理:程序和数据的地址、进程同步和通信机制、资源清单、链接指针
进程调度:进程状态、进程优先级、事件、其他信息
9.进程控制块的组织方式有哪几种?
线性方式、链接方式、索引方式
10.何谓操作系统内核?内核的主要功能是什么?
通常将一些与硬件紧密相关的模块(如中断处理程序等)、各种常用设备的驱动程序以及运行频率较高的模块(如时钟管理、进程调度和许多模块所公用的一些基本操作),都安排在紧靠硬件的软件层次中,将它们常驻内存,即通常被称为的OS内核。
大多数OS内核包含这两大功能:支撑功能、资源管理功能。
11.试说明进程在三个基本状态之间转换的典型原因。
处于就绪态的进程,在调度程序为之分配了处理机之后便可执行,相应地,其状态就由就绪态转变为执行态;
正在执行的进程如果因分配给它的时间片已完而被剥夺处理机暂停执行时,其状态便由执行态转为就绪;
如果因发生某事件,致使当前进程的执行受阻,使之无法继续执行,则该进程状态将由执行转变为阻塞。
12.为什么要引入挂起状态?该状态有哪些性质?
终端用户的需要;父进程请求;负荷调节的需要;操作系统的需要。
性质:不能被处理机调度。
13.在进行进程切换时,所要保存的处理机状态信息有哪些?
通用寄存器、指令计数器、程序状态字、用户栈指针。
14.试说明引起进程创建的主要事件。
用户登录、作业调度、提供服务、应用请求。
15.试说明引起进程被撤销的主要事件。
正常结束、异常结束、外界干预。
16.在创建一个进程时所要完成的主要工作是什么?
申请空白PCB,为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB;
为新进程分配其运行所需的资源,包括各种物理和逻辑资源,如内存、文件、I/O设备和CPU时间等;
初始化进程控制块;
如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列。
17.在撤销一个进程时所要完成的主要工作是什么?
根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态;
若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度;
若该进程还有子孙进程,还应将其所有子孙进程也都予以终止,以防它们成为不可控的进程;
将被终止进程所拥有的全部资源或者归还给其父进程,或者归还给系统;
将被终止进程从所在队列中移出,等待其他程序来搜集信息。
18.试说明引起进程阻塞或被唤醒的主要事件是什么?
向系统请求共享资源失败;
等待某种操作的完成;
新数据尚未到达;
等待新任务的到达。
19.为什么要在OS中引入线程?
为了减少在并发执行时所付出的时空开销,使OS具有更好的并发性。
20.试说明线程有哪些属性?
轻型实体、独立运行和调度的基本单位、可以并发执行、可共享所属进程的资源。
21.试从调度性、开发性、拥有资源及系统开销方面对进程和线程进行比较。
调度性:在传统的操作系统中,拥有资源的基本单位和独立调度、分派的基本单位都是进程,在引入线程的OS中,则把线程作为调度和分派的基本单位,而把进程作为资源拥有的基本单位;
并发性:在引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程的多个线程之间,亦可并发执行,因而使OS具有更好的并发性;
拥有资源:无论是传统的操作系统,还是引入了线程的操作系统,进程始终是拥有资源的一个基本单位,而线程除了拥有一点在运行时必不可少的资源外,本身不拥有系统资源,但它可以访问其隶属进程的资源;
开销:由于创建或撤销进程时,系统都要为之分配和回收资源,如内存空间等,进程切换时所要保存和设置的现场信息也要明显地多于线程,因此,操作系统在创建、撤销和切换晋城市所付出的开销将显著的大于进程。
22.线程控制块TCB中包含了哪些内容?
线程标识符、一组寄存器、线程运行状态、优先级、线程专有存储区、信号屏蔽、堆栈指针。
23.何谓用户级线程和内核支持线程?
用户级线程是在用户空间中实现的,与内核无关。
内核支持线程是在内核支持下运行的。
24.试说明用户级线程的实现方法。
用户级线程都运行在一个中间系统上,有两种方式实现中间系统,运行时系统和内核控制系统。
25.试说明内核支持线程的实现方法。
系统在创建新进程时,分配一个任务数据区PTDA,其中包括若干个线程控制块TCB空间。创建一个线程分配一个TCB,有关信息写入TCB,为之分配必要的资源。当PTDA中的TCB 用完,而进程又有新线程时,只要所创建的线程数目未超过系统允许值,系统可在为之分配新的TCB;在撤销一个线程时,也应回收线程的所有资源和TCB。
26.多线程模型有哪几种类型?多对一模型有何优缺点?
多对一、一对一、多对多。
优点:线程管理的开销小,效率高;
缺点:如果一个线程在访问内核时发生阻塞,则整个进程都会被阻塞;此外,在任一时刻,只有一个线程能够访问内核,多个线程不能同时在多个处理机上运行。
1.高级调度与低级调度的主要任务是什么?为什么要引入中级调度?
高级调度(长程调度、作业调度)主要任务是根据某种算法,决定将外存上处于后备队列中的哪几个作业调入内存,为它们创建进程、分配必要的资源,并将它们放入就绪队列。
低级调度(短程调度、进程调度)主要任务是根据某种算法,决定就绪队列中的哪个进程应获得处理机,并由分派程序将处理及分配给被选中的进程。
引入中级调度(内存调度)的目的是,提高内存利用率和系统吞吐量。使那些暂时不能运行的进程不再占用内存资源,将它们调至外存等待,把进程状态改为就绪驻外存状态或挂起状态。
2.处理机调度算法的共同目标是什么?批处理系统的调度目标又是什么?
处理机调度算法的共同目标:资源利用率、公平性、平衡性、策略强制执行
批处理系统的调度目标:平均周转时间短、系统吞吐量高、处理机利用率高
3.何谓作业、作业步和作业流?
作业包含了通常的程序和数据,还配有一份作业说明书,系统根据该说明书来对程序的运行进行控制。
作业运行期间,每个作业都必须经过若干个相对独立,又相互关联的顺序加工步骤才能得到结果。我们把其中的每一个加工步骤称为一个作业步。
在操作系统的控制下,逐个作业进程处理,于是形成了处理作业流。
4.在什么情况下需要使用作业控制块PCB,其中包含了哪些内容?
每当作业进入系统时,系统便为每个作业建立一个作业控制块JCB,根据作业类型将它插入到相应的后备队列中。JCB 包含的内容通常有:
作业标识 2)用户名称 3)用户账户
4)作业类型(CPU繁忙型、I/O 芳名型、批量型、终端型)5)作业状态
6)调度信息(优先级、作业已运行) 7)资源要求 8)进入系统时间 9) 开始处理时间 10) 作业完成时间 11) 作业退出时间 12) 资源使用情况等
5.在作业调度中应如何确定接纳多少个作业和接纳哪些作业?
作业调度每次接纳进入内存的作业数,取决于多道程序度。应将哪些作业从外存调入内存,取决于采用的调度算法。最简单的是先来服务调度算法,较常用的是短作业优先调度算法和基于作业优先级的调度算法。
6.为什么要引入高响应比优先调度算法?它有何优点?
在批处理系统中,先来先服务算法(FCFS)所考虑的只是作业的等待时间,而忽视了作业运行时间。而短作业优先算法(SJF)正好与之相反,只考虑作业运行时间,而忽视了作业等待时间。高响应比优先调度算法则是既考虑了作业等待时间,又考虑作业运行时间的调度算法,因此既照顾了短作业,又不致使长作业的等待时间过长,从而改善了处理机调度的性能。
7.试说明低级调度的主要功能。
保存处理机的现场信息、按某种算法选取进程、把处理器分配给进程
8.在抢占调度方式中,抢占的原则是什么?
优先权原则、短进程优先原则、时间片原则
9.在选择调度方式和调度算法时,应遵循的准则是什么?
(1)面向用户的准则:周转时间短,响应时间快,截止时间的保证,优先权准则。
(2)面向系统的准则:系统吞吐量高,处理机利用率好,各类资源的平衡利用。
10.在批处理系统、分时系统和实时系统中,各采用哪几种进程(作业)调度算法?
批处理系统常用调度算法:
①、先来先服务:FCFS
②、最短作业优先
③、最短剩余时间优先
④、响应比最高者优先
分时系统调度算法:
①、轮转调度
②、优先级调度
③、多级队列调度
④、彩票调度
实时系统调度算法:
①、单比率调度
②、限期调度
③、最少裕度法
11.何谓静态和动态优先级?确定静态优先级的依据是社么?
静态优先级是在创建进程时确定的,在进程的整个运行期间保持不变。确定进程优先级大小的依据有三个:
进程类型、进程对资源的需求、用户要求。
动态优先级是指在创建进程之初,先赋予其一个优先级,然后其值随进程的推进或等待时间的增加而改变,以便获得更好的调度性能。
12.试比较FCFS和SJF两种进程调度算法。
相同:两种调度算法都可用于作业调度与进程调度。
不同点:FCFS调度算法每次都从后备队列中选择一个或多个最先进入该队列的作业,将它们调入内存、分配资源、创建进程、插入到就绪队列。该算法有利于长作业进程,不利于短作业进程。
SJF算法每次调度都从后备队列中选择一个或若干个运行时间最短的作业,调入内存中运行。该算法有利于长作业进程,不利于短作业进程。
13.在时间片轮转法中,应如何确定时间片大小?
略大于一次典型的交互所需要的时间。
14.通过一个例子来说明通常的优先级调度算法为什么不能适用于实时系统?
P102
15.为什么说多级反馈队列调度算法能较好地满足各方面用户的需要?
(1)终端型用户。由于终端型用户提交的作业多属于交互性作业,通常较小,系统只要能使这些作业在第一队列规定的时间片内完成,便可使终端型用户感到满意。
(2)短批处理作业用户。对于这类作业,如果可在第一队列中执行完成,便可获得与终端型作业一样的响应时间。对于稍长的短作业,也只需在第二和第三队列各执行一时间片完成,其周转时间仍然较短。
(3)长批处理作业用户。对于长作业,它将依次在第1,2,…,n个队列中运行,然后再按轮转方式运行,用户不必担心其作业长期得不到处理。
16.为什么说传统的几种调度算法都不能算是公平调度算法?
以上介绍的几种调度算法所保证的只是优先运行,如优先级算法是优先级最高的作业优先运行,但并不保证作业占用了多少处理机时间。另外也未考虑到调度的公平性。
17.保证调度算法是如何做到调度的公平性的?
保证调度算法是另外一种类型的调度算法,它向用户所做出的保证并不是优先运行,而是明确的性能保证,该算法可以做到调度的公平性。一种比较容易实现的性能保证是处理机分配的公平性。如果在系统中有n个相同类型的进程同时运行,为公平起见,须保证每个进程都获得相同的处理机时间1/n。
18.公平分享调度算法又是如何做到调度的公平性的?
在公平分享调度算法中,调度的公平性主要是针对用户而言,使所有用户能获得相同的处理机时间,或所要求的时间比例。
19.为什么在实时系统中,要求系统(尤其是CPU)具有较强的处理能力?
在实时系统中通常有多个实时任务,若处理机的处理能力不强,则有可能因处理机忙不过来,而致使某些实时任务不能得到及时处理,从而导致发生难以预料的后果。
20.按调度方式可将实时调度算法分为哪几种?
非抢占式和抢占式。非抢占式又分为非抢占式轮转调度算法和非抢占式优先调度算法,抢占式又分为基于时钟中断的抢占式优先级调度算法和立即抢占的优先级调度算法。
21.什么是最早截止时间优先调度算法?举例说明之。
根据任务的开始截止时间确定的任务优先级调度算法。截止时间越早则优先级越高。该算法要求在系统中保持一个实时任务就绪队列,该队列按各任务截止时间的先后排序。
22.什么是最低松弛度优先调度算法?举例说明之。
该算法是根据任务的紧急(或松弛)程度,来确定任务的优先级。任务的紧急程度越高,为该任务所赋予的优先级就越高,以使之优先执行。
例如,一个任务在200ms时必须完成,而它本身所需的运行时间就有100ms,因此,调度程序必须在100ms之前调度执行,该任务的紧急程度(松弛程度)为100ms。
又如,另一任务在400ms时必须完成,它本身需要运行150ms,则其松弛程度为250ms。
23.何谓“优先级倒置”现象,可采取什么方法来解决?
优先级倒置现象:高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞。
解决的方法:
(1)当进程进入临界区后,CPU就不能被剥夺;
(2)优先级继承:当优先级高的进程A被阻塞在资源X的临界区外时,已分配到资源X、优先级低的进程B自动继承A的高优先级,能尽早运行完毕,尽早释放资源X,使得A尽快有机会运行。
24.试分别说明竞争可重用资源和可消耗资源的性质。
可重用资源:
(1)每一个可重用性资源中的单元只能分配给一个进程使用,不允许多个进程共享。
(2)进程在使用可重用性资源时,须按照这样的顺序:①请求资源。如果请求资源失败,请求进程将会被阻塞或循环等待。②使用资源。进程对资源进行操作,如用打印机进行打印。③释放资源。当进程使用完后自己释放资源。
(3)系统中每一类可重用性资源中的单元数目是相对固定的,进程在运行期间即不能创建也不能删除它。
可消耗性资源:
(1)每一类可消耗性资源的单元数目在进程运行期间是可以不断变化的,有时它可以有许多,有时可能为0。
(2)进程在运行过程中,可以不断地创造可消耗性资源的单元,将它们放入该资源类的缓冲区中,以增加该资源类的单元数目。
(3)进程在运行过程中,可以请求若干个可消耗性资源单元,用于进程自己的消耗,不再将它们返回给该资源类中。
25.试举例说明竞争不可抢占资源所引起的死锁。
P105
26.为了破坏“请求和保持”条件而提出了两种协议,试比较这两种协议。
第一种协议在所有进程开始运行之前,必须一次性地申请其在整个运行过程中所需的全部资源,并且在分配资源时,只要有一种资源不能满足进程的要求,即使其他所需的各种资源都空闲也不分配给该进程,而让该进程等待。因此有资源被严重浪费、进程经常会发生饥饿现象等缺点。
第二种协议是对第一种协议的改进,它允许一个进程只获得运行初期所需的资源后,便开始运行。进程运行过程中再逐步释放已分配给自己的,且已用毕的全部资源,然后再请求新的所需资源。
27.何谓死锁?产生死锁的原因和必要条件是什么?
死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
产生死锁的原因:竞争资源和进程推进顺序非法。其必要条件是:互斥条件、请求和保持条件、不剥夺条件、环路等待条件。
在解决死锁问题的几个方法中,哪种方法最易于实现?哪种方法使资源利用率最高?
预防、避免、检测和解除死锁中,预防死锁最容易实现;避免死锁使资源利用率最高。
28.请详细说明可通过哪些途径预防死锁。
(1)摒弃请求和保持条件,就是如果系统有足够资源,便一次性把进程需要的所有资源分配给它;
(2)摒弃不剥夺条件,就是已经拥有资源的进程当它提出新资源请求而不能立即满足时,必须释放它已保持的所有资源,待以后需要时再重新申请;
(3)摒弃环路等待条件,就是将所有资源按类型排序标号,所有进程对资源的请求必须严格按序号递增的次序提出。
29.在银行家算法的例子中,如果P0发出的请求向量由Request(0,2,0)改为Request(0,1,0),问系统可否将资源分配给它?
本来编辑好表格了,结果被第四章覆盖了,辛辛苦苦。有心情了再弄吧
30.在银行家算法中,若出现下述资源分配情况,试问:
(1)该状态是否安全?
(2)若进程P2提出请求Request(1,2,2,2)后,系统能否将资源分配给它?
1.为什么要配置层次存储器?
(1)设置多个存储器可以使存储器两端的硬件能并行工作。
(2)采用多级存储系统,特别是Cache技术,这是一种减轻存储器带宽对系统性能影响的最佳结构方案。
(3)在微处理机内部设置各种缓冲存储器,以减轻对存储器存取的压力。增加CPU中寄存器的数量,也可大大缓解对存储器的压力。
2.可采用哪几种方式将程序装入内存?它们分别适用于何种场合?
(1)首先由编译程序将用户源代码编译成若干目标模块,再由链接程序将编译后形成的目标模块和所需的库函数链接在一起,组成一个装入模块,再由装入程序将装入模块装入内存;
(2)装入模块的方式有:绝对装入方式,可重定位方式和动态运行时装入方式;
(3)绝对装入方式适用于单道程序环境下;
(4)可重定位方式适用于多道程序环境下;
(5)动态运行时装入方式也适用于到多道程序环境下。
3.何谓静态链接?静态链接时需要解决两个什么问题?
在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的装配模块,以后不再拆开。这种事先进行连接的方式称为静态链接方式。
要解决两个问题:对相对地址进行修改;变换外部调用符号
4.何谓装入时动态链接?装入时动态链接方式有何优点?
这是指将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式。
优点:便于修改和更新;便于实现对目标模块的共享。
5.何谓运行时动态链接?运行时动态链接方式有何优点?
将某些模块的链接推迟到程序执行时才进行。
优点:加快程序的装入过程;节省大量的内存空间。
6.在动态分配方式中,应如何将各空闲分区链接成空闲分区链?
为了实现对空闲分区的分配和链接,在每个分区的起始部分设置一些用于控制分区分配的信息,以及用于链接各分区所用的前向指针,在分区尾部则设置一后向指针。通过前、后向链接指针,可将所有的空闲分区链接成一个双向链。
7.为什么要引入动态重定位?如何实现?
在动态运行时转入的方式中,作业装入内存后的所有地址仍然都是相对逻辑地址。而将相对地址转换为绝对(物理)地址的工作被推迟到程序指令要真正执行时进行。为使地址的转换不会影响到指令的执行速度,必须有硬件地址变换机构的支持,程序在执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的。
地址变换过程是在程序执行期间,随着对每条指令或数据的访问自动进行的,故称为动态重定位。当系统对内存进行了“紧凑”,而使若干程序从内存的某处移至另一处时,不需对程序做任何修改,只要用该程序在内存的新起始地址去置换原来的起始地址即可。
8.什么是基于顺序搜索的动态分区分配算法?它可分为哪几种?
依次搜索空闲分配分区链上的空闲分区,去寻找一个其大小能满足要求的分区,就是基于顺序搜索的动态分区分配算法。
分为四种:首次适应算法、循环首次适应算法、最佳适应算法、最坏适应算法。
9.在采用首次适应算法回收内存中,可能出现哪几种情况?应怎样处理这些情况?
1、回收区与插入点的前一个空闲分区F1相邻接,此时应将回收区与插入点的前一分区合并,不必为回收分区分配新表项,而只须修改其前一分区F1的大小。
2、回收区与插入点的后一个空闲分区F2相邻接,此时应将两分区合并,形成新的空闲分区,但用回收区的首址作为新空闲分区的首址,大小为两者之和。
3、回收区同时与插入点的前、后两个分区邻接,此时将三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和。
4、回收区既不与F1邻接,又不与F2邻接。这时应为回收区单独建立一新表项,添写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置。
10.什么是基于索引搜索的动态分区分配算法?它可分为哪几种?
我们把空闲分区按照某种属性(通常是大小)分类,把每一类都链接起来形成一个链表,建立一个表把每类链表的相关信息写进去以供索引,按照这个数据分配空闲分区的算法叫做基于索引搜索的动态分区分配算法。
它分为快速适应算法、伙伴系统、哈希算法。
11.令buddyk(x)为大小2k、地址为x的块的伙伴系统地址,试写出buddyk(x)的通用表达式。
P132
12.分区存储管理中常用哪些分配策略?比较它们的优缺点。
固定分区存储管理:
其基本思想是将内存划分为若干固定大小的分区每个分区中最多只能装入一个作业。当作业申请内存时系统按一定的算法为其选择一个适当的分区并装入内存运行。由于分区大小是事先固定的因而可容纳作业的大小受到限制而且当用户作业的地址空间小于分区的存储空间时造成存储空间浪费。
可变分区存储管理:
可变分区存储管理不是预先将内存划分分区而是在作业装入内存时建立分区使分区大小正好与作业要求的存储空间相等。这种处理方式使内存分配有较大的灵活性也提高了内存利用率。但是随着对内存不断地分配、释放操作会引起存储碎片的产生。
13.为什么要引入对换?对换可分为哪几种类型?
一方面,在内存中的某些进程由于事情尚未发生而被阻塞运行,但它却占用了大量的内存空间,甚至有可能出现内存中所有进程都被阻塞,而无可运行之进程,迫使CPU停止下来等待的情况;另一方面,却又有着许多作业,因内存空间不足,一直驻留在外存上,而不能进入内存运行。为此引入对换。
整体对换和页面(分段)对换。
14.对文件管理区的目标和对对换空间管理的目标有何不同?
对文件管理区的主要目标是提高文件存储空间的利用率,然后才是提高对文件的访问速度。
对对换空间管理的主要目标,是提高进程换入和换出的速度,然后才是提高文件存储空间的利用率。
15.为实现对换,系统应具备哪几方面的功能?
对对换空间的管理、进程的换入、进程的换出
16.在以进程为单位进行对换时,每次是否都将整个进程换出?为什么?
在选择换出进程后,在对进程换出时,只能换出非共享的程序和数据段,而对于那些共享的程序和数据段,只要还有进程需要它,就不能被换出。
17.基于离散分配时所用的基本单位不同,可将离散分配分为哪几种?
分页存储管理方式、分段存储管理方式、段页式存储管理方式。
18.什么是页面?什么是物理块?页面的大小应如何确定?
将用户程序的地址空间分为若干个固定大小的区域,称为“页”或“页面”。
19.什么是页表?页表的作用是什么?
在分页系统中,允许将进程的各个页离散地存储在内存的任一物理块中,为保证进程仍然能够正确地运行,即能在内存中找到每个页面所对应的物理块,系统又为每个进程建立了一张页面映像表,简称页表。
页表的作用是实现从页号到物理块号的地址映射。
20.为实现分页存储管理,需要哪些硬件支持?
地址变换机构。
21.在分页系统中是如何实现地址变换的?
利用地址变换机构实现从逻辑地址到物理地址的转变换,通过页表来实现从页号到物理块号的变换,将逻辑地址中的页号转换为内存中的物理块号。
22.具有快表时是如何实现地址变换的?
在CPU给出有效地址后,由地址变换机构自动地将页号P送入高速缓冲寄存器,并将此页号与高速缓存中的所有页号进行比较,若其中有与此所对应的物理块号,便表示索要访问的页表项在快表中。于是,可直接从快表中独处改也所对应的物理块号,并送到物理地址寄存器中。如在快表中未找到对应的页表项,则还需再访问内存中的页表,找到后,把从页表项中独处的物理块号送往地址寄存器;同时,再将此页表项存入快表的一个寄存器单元中,亦即,重新修改快表。但如果联想寄存器已满,则OS必须找到一个老的且已被认为是不再需要的页表项,将它换出。
23.较详细地说明引入分段存储管理是为了满足用户哪几方面的需要?
方便编程、信息共享、信息保护、动态增长、动态链接。
24.在具有快表的段页式存储管理中,如何实现地址变换?
P151
25.为什么说分段系统比分页系统更易于实现信息的共享和保护?
分页系统的每个页面是分散存储的,为了实现信息共享和保护,页面之间需要一一对应,为此需要建立大量的页表项;而分段系统的每个段都从0编址,并采用一段连续的地址空间,在实现共享和保护时,只需为要共享和保护的程序设置一个段表项,将其中的基址与内存地址一一对应就能够实现。
26.分页和分段存储管理有何区别?
(1)页是信息的物理单位,分页是为了实现离散分配方式,以削减内存的外部零头,提高内存的利用率。段则是信息的逻辑单位,它含有一组相对完整的信息。
(2)页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机械硬件实现的,因而在系统中只能有一种大小的页面;而段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对原程序进行编译时,根据信息的性质来划分。
(3)分页的作业地址空间是一维的,而分段作业地址空间则是二维的。
27.试全面比较连续分配和离散分配方式。
(1)连续分配是指为一个用户程序分配一个连续的地址空间,包括单一和分区两种分配方式。单一方式将内存分为系统区和用户区,最简单,只用于单用户单任务操作系统;分区方式分固定和动态分区。
(2)离散分配方式分为分页、分段和段页式存储管理。分页式存储管理旨在提高内存利用率,分段式存储管理旨在满足用户(程序员)的需要,段页式存储管理则将两者结合起来,具有分段系统便于实现、可共享、易于保护和动态链接等优点,又能像分页系统很好解决外部碎片及为各段可离散分配内存等问题,是比较有效的存储管理方式。
1.常规存储器管理方式具有哪两大特征?它对系统性能有何影响?
一次性和驻留性。
一次性及驻留性特征使得许多在程序中不用或暂时不用的程序(数据)占据了大量的内存空间,而一些需要运行的作业又无法装入运行,显然,这是在浪费宝贵的内存资源。
2.什么是程序运行时的时间局限性和空间局限性?
时间局限性:如果程序中的某条指令被执行,则不久之后该指令可能再次执行;如果某数据被访问过,则不久以后该数据可能再次被访问。产生时间局限性的典型原因是在程序中存在着大量的循环操作。
空间局限性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址可能集中在一定的范围之内,其典型情况便是程序的顺序执行。
3.虚拟存储器有哪些特征?其中最本质的特征是什么?
多次性、对换性、虚拟性。虚拟性。
4.实现虚拟存储器需要哪些硬件支持?
分页请求系统:请求分页的页表机制、缺页中断机构、地址变换机构。
请求分段系统:请求分段的段表机制、缺段中断机构、地址变换机构。
5.实现虚拟存储器需要哪几个关键技术?
(1)在分页请求系统中是在分页的基础上,增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统。允许只装入少数页面的程序(及数据),便启动运行。
(2)在请求分段系统中是在分段系统的基础上,增加了请求调段及分段置换功能后形成的段式虚拟存储系统。允许只装入少数段(而非所有段)的用户程序和数据,即可启动运行。
6.在请求分页系统中,页表应包括哪些数据项?每项的作用是什么?
(1)状态位(存在位)P:它用于指示该页是否已调入内存,供程序访问时参考。
(2)访问字段A:用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,提供给置换算法(程序)在选择换出页面时参考。
(3)修改位M:标识该页再调入内存后是否被修改过。
(4)外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考。
7.试比较缺页中断机构与一般的中断,它们之间有何明显的区别?
(1)在指令执行期间产生和处理中断信号。通常,CPU都是在一条指令执行完后,才检查是否有中断请求到达。然而,缺页中断是在指令执行期间,若发现所要访问的指令或数据不在内存时,便立即产生和处理缺页中断信号,一边能及时将所缺之页面调入内存。
(2)一条指令在执行期间可能产生多次缺页中断。
8.试说明请求分页系统中的地址变换过程。
在进行地址变换时,首先检索快表,试图从中找出所要访问的页。若找到,便修改页表项中的访问位,供置换算法选换出页面时参考。对于写指令,还需将修改位置成“1”,表示该页再调入内存后已被修改。然后利用页表项中给出的物理块号和页内地址形成物理地址。地址变换过程到此结束。
9.何谓固定分配局部置换和可变分配全局置换的内存分配策略?
(1)固定分配局部置换。所谓固定分配,是指为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。所谓局部置换,是指如果进程在运行中发现缺页,则只能从分配给该进程的n个页面中选出一页换出,然后再调入一页,以保证分配给该进程的内存空间不变。
(2)可变分配全局置换。所谓可变分配,是指先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。所谓全局置换,是指如果进程在运行中发现缺页,则将OS所保留的空闲物理块(一般组织为一个空闲物理块队列)取出一块分配给该进程,或者以所有进程的全部物理快为标的,选择一块换出,然后将所缺之页调入。
10.在请求分页系统中,应从何处将所需页面调入内存?
(1)系统拥有足够的对换区空间,这时可以全部从对换区调入所需页面,以提高调页速度。
(2)系统缺少足够的对换区空间,这时凡是不会被修改的文件,都直接从文件区调入;而当换出这些页面时,由于他们未被修改,则不必再将它们重写到磁盘(换出),以后再调入时,仍从文件区直接调入。但对于那些可能被修改的部分,在将它们换出时便须调到对换区,以后需要时再从对换区调入。
(3)UNIX方式。由于与进程有关的文件都放在文件区,故凡是未运行过的页面,都应从文件区调入。而对于曾经运行过但又被换出的页面,由于是被放在对换区,因此在下次调入时应从对换区调入。
11.试说明在请求分页系统中页面的调入过程。
每当程序所要访问的页面未在内存时(存在位为“0”),便向CPU发出一缺页中断,中断处理程序首先保留CPU环境,分析中断原因后,转入缺页中断处理程序。
该程序通过查找页表,得到该页表在外存的物理块后:
如果此时内存能容纳新页,则启动磁盘I/O,将所缺之页调入内存,然后修改页表。
如果内存已满,则须先按照某种置换算法,从内存中选出一页准备换出;如果该页未被修改过(修改位为“0”),可不必将该页写回磁盘;但如果此页已被修改(修改位为“1”),则必须将它写回磁盘,然后再把所缺的页调入内存,并修改页表中的相应表项,置其存在位为“1”,并将此页表项写入快表中。
在缺页调入内存后,利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。整个页面的调入过程对用户是透明的。
12.在请求分页系统中,常采用哪几种页面置换算法?
答:采用的页面置换算法有:最佳置换算法和先进先出置换算法,最近最久未使用(LRU)置换算法,Clock置换算法,最少使用置换算法,页面缓冲算法等。
13.在一个请求分页系统中,采用先进先出FIFO页面置换算法时,假如一个作业的页面走向为4、3、2、1、4、3、5、4、3、2、1、5,当分配给该作业的物理块数M分别为3和4时,试计算在访问过程中所发生的缺页次数和缺页率,并比较所得结果。
M=3时,采用FIFO页面置换算法的缺页次数为9次,缺页率为75%;M=4时,采用FIFO页面置换算法的缺页次数为10次,缺页率为83%。
由此可见,增加分配给作业的内存块数,反而增加了缺页次数,提高了缺页率,这种现象被称为是Belady现象。
14.实现最近最久未使用LRU算法所需的硬件支持是什么?
需要寄存器和栈等硬件支持。寄存器用于记录某进程在内存中各页的使用情况,栈用于保存当前使用的各个页面的页面号。
15.试说明改进型Clock置换算法的基本原理。
因为修改过的页面在换出时付出的开销比未被修改过的页面大,在改进型Clock算法中,既考虑页面的使用情况,还要增加置换代价的因素;在选择页面作为淘汰页面时,把同时满足未使用过和未被修改过作为首选淘汰页面。
16.影响页面换进换出效率的若干因素是什么?
(1)页面置换算法:影响页面换进换出效率最重要的因素,直接影响进程在运行过程中的缺页率,影响页面换进换出的开销。
(2)写回磁盘的频率:如果是采取每个页面换出时,就将它写回磁盘的策略,这意味着每换出一个页面,便需要启动一次磁盘。
但如果在系统中建立了一个已修好换出页面链表,对每一个要被换出的页面(已修改),系统可暂不把它们写回磁盘,而是将它们挂在已修改换出页面链表上,仅当被换出页面数目达到一定值时,再将它们一起写回到磁盘上,这样就显著地减少了磁盘I/O的操作次数。
(3)读入内存的频率:在设置了已修改换出页面链表后,在该链表上就暂时有一批装有数据的页面,如果需要再次访问这些页面时,就不需从外存上调入,而直接从已修改换出页面链表获取,这样也可以减少将页面从磁盘读入内存的频率,减少页面换进的开销。或者说,只需花费很小的开销,便可使这些页面,又回到该进程的驻留集中。
17.页面缓冲算法的主要特点是什么?它是如何降低页面换进换出的频率的?
特点:(1)显著地降低了页面换进、换出的频率,使磁盘I/O的操作次数大为减少,因而减少了页面换进换出的开销;
(2)由于换入还出的开销大幅度减小,才能使其采用一种较简单的置换策略,如先进先出算法,它不需要特殊硬件的支持,实现起来非常简单。
在该系统中,内存分配策略上采用了可变分配和局部置换方式。为了能显著地降低页面换进换出的频率,在内存中设置了如下两个链表:
(1)空闲页面链表:是一个空闲物理块链表,用于分配给频繁发生缺页的进程,以降低该进程的缺页率。当有一个未被修改的页要换出时,实际上并不将它换出到外存,而是把它们所在的物理块,挂在空闲链表的末尾。
(2)修改页面链表:由已修改的页面所形成的链表。设置该链表的目的,是为了减少已修改页面换出的次数。降低将已修改页面写回磁盘的频率,以及降低将磁盘内容读入内存的频率。
18.什么是抖动?产生抖动的原因是什么?
抖动就是指当内存中已无空闲空间而又发生缺页中断时,需要从内存中调出一页程序或数据送磁盘的对换区中,如果算法不适当,刚被换出的页很快被访问,需重新调入,因此需再选一页调出,而此时被换出的页很快又要被访问,因而又需将它调入,如此频繁更换页面,使得系统把大部分时间用在了页面的调进换出上,而几乎不能完成任何有效的的工作,我们称这种现象为“抖动”。
产生抖动的原因是由于CPU的利用率和多道程序度的对立统一矛盾关系引起的,为了提高CPU利用率,可提高多道程序度,但单纯提高多道程序度又会造成缺页率的急剧上升,导致CPU的利用率下降,而系统的调度程序又会为了提高CPU利用率而继续提高多道程序度,形成恶性循环,我们称这时的进程是处于“抖动”状态。
19.何谓工作集?它是基于什么原理确定的?
工作集(或驻留集)是指在某时间间隔内,进程要访问的页面集合。经常被使用的页面需要在工作集中,而长期不被使用的页面要从工作集中被丢弃。为了防止系统出现抖动现象,需要选择合适的工作集大小。
工作集模型的原理是:
让操作系统跟踪每个进程的工作集,并为进程分配大于其工作集的物理块。如果还有空闲物理块,则可以再调一个进程到内存以增加多道程序数。如果所有工作集之和增加以至于超过了可用物理块的总数,那么操作系统会暂停一个进程,将其页面调出并且将其物理块分配给其他进程,防止出现抖动现象。正确选择工作集大小,对存储器的利用率和系统吞吐量的提高,都将产生重要影响。
20.当前可以利用哪几种方法来防止“抖动”?
(1)采取局部置换策略(2)把工作集算法融入到处理机调度中(3)利用“L=S”准则调节缺页率(4)选择暂停的进程
21.试试说明如何利用“L=S”准则来调节缺页率,以避免“抖动”的发生?
P172
22.为了实现请求分段式存储管理,应在系统中增加配置哪些硬件结构?
请求段表机制、缺段中断机制和地址变换机构。
23.在请求段表机制中,应设置哪些段表项?
段名、段长、段基址、存取方式、访问字段、修改位、存在位、增补位、外存始地址。
24.说明请求分段系统中的缺页中断处理过程。
(1)根据当前执行指令中的逻辑地址查页表,判断该页是否在主存储器中;
(2)该页标志为“0”形成缺页中断,中断装置通过交换PSW让操作系统的中断处理程序占用处理器;
(3)操作系统处理缺页中断的办法是查主存分配表找一个空闲的主存块,查页表找出该页在磁盘上的位置,启动磁盘读出该页信息。
(4)把从磁盘上读出的信息装入找到的主存块中。
(5)当页面住处被装入主存后,应修改页表中对应的表目,填上该页所占用的主存块把标志置为“1”,表示该页已在主存储器中
(6)由于产生缺页中断时的那条指令并没执行完,所以在把页面装入之后应重新执行被中断指令。
25.请对共享段表中的各项作简要说明。
在系统中配置一张共享段表,所有各共享段都在共享段表中占有一表项。在表项的上面记录了共享段的段号、段长、内存始址、状态(存在)位、外存始址以及共享计数等信息,接下来就是记录了共享此分段的每个进程的情况。
①共享进程计数count:记录有多少进程正在共享该分段。
②存取控制字段:对于一个共享段,应为不同的进程赋予不同的存储权限。
③段号:每个进程可用自己进程的序号,去访问该共享段。
26.如何实现共享分段的分配和回收?
答:①共享段的分配:在为共享段分配内存时,对第一个请求使用该共享段的进程,由系统为该共享段分配一物理区,当又有其它进程需要调用该共享段时,无须再为该段分配内存。
②共享段的回收:当共享此段的某进程不再需要该段时,若无其他进程使用该段,则由系统回收该共享段的物理内存,否则只是取消调用者进程在共享段表中的有关记录。
1.试说明I/O系统的基本功能。
隐藏物理设备的细节、与设备的无关性、提高处理机和I/O设备的利用率、对I/O设备进行控制、确保对设备的正确共享、错误处理
2.简要说明I/O软件的4个层次的基本功能。
中断处理程序:用于保存被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完后恢复现场,并返回到被中断的进程
设备驱动程序:与硬件直接有关,用来具体实现系统对设备发出的操作指令,驱动I/O设备工作
设备独立性软件:用于实现用户程序与设备驱动器的统一接口、设备命令、设备保护,以及设备分配与释放等。
用户层I/O软件:用于实现用户与I/O设备交互
3.I/O系统接口与软件/硬件(RW/HW)接口分别是什么接口?
I/O系统接口是I/O系统与上层系统之间的接口,向上层提供对设备进行操作的抽象I/O命令,以方便高层对设备的使用;
软件/硬件(RW/HW)接口的上面是中断处理程序和用于不同设备的设备驱动程序,它的下面是各种设备的控制器。
4.与设备无关性的基本含义是什么?为什么要设置该层?
答:为了提高OS的可适应性和可扩展性,在现代OS中都毫无例外地实现了设备独立性,也称设备无关性。
基本含义:应用程序独立于具体使用的物理设备。为了实现设备独立性而引入了逻辑设备和物理设备两概念。在应用程序中,使用逻辑设备名称来请求使用某类设备;而系统在实际执行时,还必须使用物理设备名称。
优点:1. 设备分配时的灵活性
2.易于实现I/O重定向(用于I/O操作的设备可以更换(即重定向),而不必改变应用程序。
5.试说明设备控制器的组成。
答:设置控制器与处理机的接口;设备控制器与设备的接口;I/O逻辑。
6.为了实现CPU与设备控制器之间的通信,设备控制器应该具备哪些功能?
答:基本功能:接收和识别命令;数据交换;标识和报告设备的状态;地址识别:数据缓冲;差错控制。
7.什么是内存映像I/O?它是如何实现的?
驱动程序将抽象I/O命令转换出的一系列具体的命令、参数等数据装入设备控制器的相应寄存器,由控制器来执行这些命令,具体实施对I/O设备的控制。
方式:利用特定的I/O指令、内存映像I/O。
8.为什么说中断是OS赖以生存的基础?
答:中断在操作系统中有着特殊重要的地位,它是多道程序得以实现的基础,没有中断,就不可能实现多道程序,因为进程之间的切换是通过中断来完成的。
另一方面,中断也是设备管理的基础,为了提高处理机的利用率和实现CPU和I/O设备并执行,也必需有中断的支持。中断处理程序是整个I/O系统中最低的一层。
9.对中断源的两种处理方式分别用于哪种场合?
答:1) 屏蔽(禁止)中断:当处理机正在处理一个中断时,将屏蔽掉所有的中断,直到处理机已处理完本次中断,再去检查是否有中断产生。所有中断按顺序处理,优点是简单,但不能用于实时性要求较高的中断请求。
2)嵌套中断:在设置了中断优先级的系统中,当同时有多个不同优先级的中断请求,CPU优先响应优先级最高的中断请求,高优先级的中断请求可以抢占正在运行的低优先级中断的处理机。
10.设备中断处理程序通常需完成哪些工作?
答:1、唤醒被阻塞的驱动进程。
2、保护被中断进程的CPU环境。
3、转入相应的设备处理程序。
4、中断处理。
5、恢复被中断进程的现场。
11.简要说明中断处理程序对中断进行处理的几个步骤。
答:1、测定是否有未响应的中断信号
2、保护被中断进程的CPU环境
3、转入相应的设备处理程序
4、中断处理
5、恢复CPU的现场并退出中断
12.试说明设备驱动程序具有哪些特点。
(1)驱动程序是实现在与设备无关的软件和设备控制器之间通信和转换的程序;
(2)驱动程序与设备控制器以及I/O设备的硬件特性紧密相关,对于不同类型的设备,应配置不同的驱动程序。但可以为相同的多个终端设置一个终端驱动程序;
(3)驱动程序与I/O设备所采用的I/O控制方式紧密相关,常用的I/O控制方式是中断驱动和DMA方式;
(4)由于驱动程序与硬件紧密相关,因而其中的一部分必须用汇编语言书写;
(5)驱动程序应允许可重入。
13.设备驱动程序通常需要完成哪些工作?
(1)接收由与设备无关的软件发来的命令和参数,并将命令中的抽象要求转换为与设备相关的低层操作序列;
(2)检查用户I/O请求的合法性,了解I/0设备状态,传递有关参数,设置设备工作方式;
(3)发出I/O命令,如果设备空闲,便立即启动I/O设备,完成指定的I/O操作;如果设备忙碌,则将请求者的请求块挂在设备队列上等待;
(4)及时响应由设备控制器发来的中断请求,并根据其中断类型,调用相应的中断处理程序进行处理。
14.简要说明设备驱动程序的处理过程可分为哪几步。
(1)将抽象要求转换为具体要求;
(2)对服务请求进行校验;
(3)检查设备的状态;
(4)传送必要的参数。
15.试说明I/0控制发展的主要推动因素是什么?
答:促使I/0控制不断发展的几个主要因素如下:
a.尽量减少CPU对I/O控制的干预,把CPU从繁杂的I/O控制中解脱出来,以便更多地去完成数据处理任务。
b.缓和CPU的高速性和设备的低速性之间速度不匹配的矛盾,以提高CPU的利用率和系统的吞吐量。
c.提高CPU和I/O设备操作的并行程度,使CPU和I/O设备都处于忙碌状态,从而提高整个系统的资源利用率和系统吞吐量。
16.有哪几种I/O控制方式?各适用于何种场合?
程序I/O方式:适用于早期的计算机系统中,并且是无中断的计算机系统;
中断驱动I/O控制方式:普遍用于现代的计算机系统中;
DMA I/O控制方式:适用于I/O设备为块设备时在和主机进行数据交换的一种I/O控制方式;
I/O通道控制方式:当I/O设备和主机进行数据交换是一组数据块时通常采用I/O通道控制方式,但此时要求系统必须配置相应的通道及通道控制器。
17.试说明DMA的工作流程。
以从磁盘读入数据为例,说明DMA的工作流程。当CPU要从磁盘读入数据块时,先向磁盘控制器发送一条读命令。该命令被送到命令寄存器CR中。同时还发送本次要读入数据的内存起始目标地址,送入内存地址寄存器MAR;本次要读数据的字节数送入数据计数器DC,将磁盘中的源地址直接送DMA控制器的I/O控制逻辑上。然后启动DMA 控制器传送数据,以后CPU便处理其它任务。整个数据传送过程由DMA控制器控制。
18.为什么要引入与设备的无关性?如何实现设备的独立性?
引入设备独立性,可使应用程序独立于具体的物理设备,使设备分配具有灵活性。另外容易实现I/0重定向。为了实现设备独立性,必须在设备驱动程序之上设置一层设备独立性软件,用来执行所有I/0设备的公用操作,并向用户层软件提供统一接口。
19.与设备的无关的软件中,包括了哪些公有操作的软件?
答:1、设备驱动程序的统一接口
2、缓冲管理
3、差错控制
4、对独立设备的分配与回收
5、独立于设备的逻辑数据块
20.在考虑到设备的独立性时,应如何分配独占设备?
(1)进程以逻辑设备名提出I/0请求。
(2)根据逻辑设备表相应表项获得I/0请求的逻辑设备对应类型的物理设备在系统设备表中的指针。
(3)从指针所指位置起顺序检索系统设备表,直到找到一个属于对应I/0请求所用类型、空闲可用且基于设备分配安全性算法验证为安全分配的设备的设备控制表,将对应设备分配给请求进程;
如果未找到安全可用的空闲设备,则把请求进程的进程控制块挂到相应类型设备的等待队列上等待唤醒和分配。
(4)系统把设备分配给I/0请求进程后,再到该设备的设备控制表中找出与其相连接的控制器的控制器控制表,根据其状态字段判断该控制器是否忙碌,若忙则把请求进程的进程控制块挂到该控制器的等待队列上;否则将该控制器分配给进程。
(5)系统把控制器分配给I/0请求进程后,再到该控制器的控制器控制表中找出与其相连接的通道的通道控制表,根据其状态字段判断该通道是否忙碌,若忙则把请求进程的进程控制块挂到该通道的等待队列上:否则将该通道分配给进程。
(6)只有在设备、控制器和通道三者都分配成功时,这次的设备分配才算成功,然后便可启动设备进行数据传送。
21.何谓设备虚拟?实现设备虚拟式所依赖的关键技术是什么?
答:通过虚拟技术可将一台独占设备变换成若干台逻辑设备,供若干个用户(进程)同时使用,通常把这种经过虚拟技术处理后的设备称为虚拟设备。其实现所依赖的关键技术是SPOOLING技术。
22.在实现后台打印时,SPOOLing 系统应为请求I/0的进程提供哪些服务?
答:1、由输出进程在输出井中为之申请一空闲盘块区,并将要打印的数据送入其中;
2、输出进程再为用户进程申请一张空白的用户打印表,并将用户的打印要求填入其中,再将该表挂到请求打印队列上。
3、一旦打印机空闲,输出进程便从请求打印队列的队首取出一张请求打印表,根据表中的要求将要打印的数据从输出井传送到内存缓冲区,再由打印机进行打印。
23.假脱机系统向用户提供共享打印机的基本思想是什么?
答:对每个用户而言,系统并非即时执行其程序输出数据的真实打印操作,而只是即时将数据输出到缓冲区,这时的数据并未真正被打印,只是让用户感觉系统已为他打印;
真正的打印操作,是在打印机空闲且该打印任务在等待队列中已排到队首时进行的;以上过程是对用户屏蔽的,用户是不可见的。
24.引入缓冲的主要原因是什么?
答:缓和CPU与I/0设备之间速度不匹配的矛盾;减少对CPU的中断频率:放宽对中断响应时间的限制:解决数据力度不匹配的问题;提高CPU和I/0设备之间的并行性。
25.在单缓冲情况下,为什么系统对一块数据的处理时间为max(C,T)+M?
答:在块设备输入时,假定从磁盘把一块数据输入到缓冲区的时间为T;操作系统将缓冲区数据传送给用户区的时间为M;而CPU对这一块数据进行计算得时间为C。
在单缓冲情况下,由于设备的输入操作和CPU的处理操作可以并行,所以系统对每一整块数据的处理时间为max(C,T)+M。
26.为什么在双缓冲情况下,系统对一块数据的处理时间为max(C,T)?
答:该方式又称缓冲对换方式,在设备输入时,先将数据送入第一缓冲区,装满后便转向第二缓冲区。此时操作系统可以从第一缓冲区移出数据,并送入用户进程。
接着由CPU对数据进行计算。在双缓冲区中,不仅设备的输入操作和CPU的处理操作可以并行,设备的输入操作和数据的传送操作也可以并行,因此耗时大约为max(C+M,T)。考虑到M是内存中数据块的“搬家”耗时,非常短暂可以省略,因此近似地认为是:max(C,T)。
27.试绘图说明把多缓冲用于输出时的情况。
P211
28.试说明收容输入工作缓冲区和提取输出工作缓冲区的工作情况。
答:①收容输入工作缓冲区的工作情况为:在输入进程需要输入数据时,调用GetBuf(EmptyQueue)过程,从EmptyQueue队列的队首摘下一个空缓冲区,作为收容输入工作缓冲区Hin。
然后把数据输入其中,装满后再调用PutBuf(InputQueue,Hin)过程,将该缓冲区挂在输入队列InputQueue的队尾。
②提取输出工作缓冲区的工作情况为:当要输出数据时,调用GetBuf(OutputQueue)过程,从输出队列的队首取得一装满输出数据的缓冲区作为提取输出工作缓冲区Sout。在数据提取完后,再调用PutBuf(EmptyQueue,Sout)过程,将该缓冲区挂到空缓冲队列EmptyQueue的队尾。
29.何谓安全分配方式和不安全分配方式?
答:①安全分配方式是指每当进程发出I/0请求后,便进入阻塞状态,直到其I/0操作完成时才被唤醒。
在采用这种分配策略时,一旦进程已获得某种设备资源后便阻塞,使它不可能再请求任何资源,而在它运行时又不保持任何资源。这种分配方式已经摒弃了造成死锁的“请求和保持”条件,分配是安全的。缺点是进程进展缓慢,CPU与I/0设备串行工作。
②不安全分配方式是指进程发出I/0请求后仍继续执行,需要时又可发出第二个I/0请求、第三个I/0请求。仅当进程请求的设备已被另一个进程占有时,进程才进入阻塞状态。
优点是一个进程可同时操作多个设备,进程推进迅速。缺点是分配不安全,可能具有“请求和保持”条件,可能造成死锁。因此,在设备分配程序中需增加一个功能,用于对本次的设备分配是否会发生死锁进行安全性计算,仅当计算结果表明分配安全的情况下才进行分配。
30.磁盘访问时间由哪几部分组成?每部分时间应如何计算?
答:磁盘访问时间由寻道时间Ts、旋转延迟时间Tr、传输时间Tt三部分组成。
(1)Ts是启动磁臂时间s与磁头移动n条磁道的时间和,即Ts=m×n+s。
(2)Tr是指定扇区移动到磁头下面所经历的时间。硬盘15000r/min时Tr为2ms;软盘300或600r/min时Tr为50~100ms。
(3)Tt是指数据从磁盘读出或向磁盘写入经历的时间。Tt的大小与每次读/写的字节数b和旋转速度有关:Tt=b/rN。
31.目前常用的磁盘调度算法有哪几种?每种算法优先考虑的问题是什么?
答:目前常用的磁盘调度算法有先来先服务、最短寻道时优先级扫描等算法。
(1)先来先服务算法优先考虑进程请求访问磁盘的先后次序;
(2)最短寻道时间优先算法优先考虑要求访问的磁道与当前磁头所在磁道距离是否最近:
(3)扫描算法考虑欲访问的磁道与当前磁道间的距离,更优先考虑磁头当前的移动方向。
1.何谓数据项、记录和文件?
数据项:是最低级的数据组织形式,可以分为两种类型:基本数据项和组合数据项。基本数据项是用于描述一个对象的某种属性的字符集,是数据组织中可以命名的最小逻辑数据单位,又称为字段。组合数据项是由若干个基本数据项组成的,简称组项。
记录:记录是一组相关数据项的集合,用于描述一个对象在某方面的属性。
文件:文件是指由创建者所定义的、具有文件名的一组
2.文件系统的模型可分为三层,试说明其每一层所包含的基本内容。
最底层是对象及其属性,文件管理系统管理的对象如下:文件,目录,磁盘(磁带)存储空间。
中间层是对对象进行操纵和管理的软件集合,最高层是文件系统提供给用户的接口。
3.与文件系统有关的软件可分为那几个层次?
I/O控制层、基本文件系统层、基本I/O管理程序、逻辑文件系统。
4.试说明用户可以对文件施加的主要操作有哪些?
创建、删除、读、写、设置文件的读/写位置、打开、关闭。
允许用户直接设置和获得文件的属性:改变已存文件的文件名、改变文件的拥有着、改变对文件的访问权、查询文件的状态。
对目录的操作:创建一个目录、删除一个目录、改变当前目录和工作目录等。
实现文件共享的系统调用,以及用于对文件系统进行操作的系统调用等。
5.为什么在大多数OS中都引入了“打开”这一文件系统调用?打开的含义是什么?
当用户要求对一个文件实施多次读/写或其他操作时,每次都要从检索目录开始。为了避免多次重复地检索目录,在大多数OS中都引入了“打开”这一文件系统调用。
所谓“打开”,是指系统将指名文件的属性(包括该文件在外存上的物理位置),从外存拷贝到内存打开文件表的一个表目中,并将该表目的编号(或称为索引号)返回给用户。换而言之,“打开”就是在用户和指定文件之间建立起一个链接。此后,用户可通过该链接直接得到文件信息,从而避免了再次通过目录检索文件,即当用户再次向系统发出文件操作请求时,系统根据用户提供的索引号可以直接在打开文件中查找到文件信息。
6.何谓文件的逻辑结构?何谓文件的物理结构?
文件的逻辑结构:这是从用户观点出发所观察到的文件组织形式,即文件是由一系列的逻辑记录组成的,是用户可以直接处理的数据及其结构,它独立于文件的物理特性,又称为文件组织。
文件的物理结构:又称为存储结构。这是指系统将文件存储在外存上所形成的一种存储组织形式,是用户不能看见的。
7.按文件的组织形式可将文件分为哪几种类型?
顺序文件、索引文件、索引顺序文件。
8.如何提高对变长记录顺序文件的检索速度?
为变长记录文件建立一张索引表,为主文件中的每个记录在索引表中分别设置一个表项,记录指向记录的指针(即记录在逻辑地址空间的首址)以及记录的长度L,索引表按关键字排序,因此其本身也是一个定长记录的顺序文件,这样就把对变长记录顺序文件的顺序检索转变为对定长记录索引文件的随机检索,从而加快对记录检索的速度,实现直接存取。
9.通过哪两种方式来对固定长记录实现随机访问?
隐式寻址方式和显示寻址方式。
10.可以采取什么方法来实现对变长记录文件进行随机检索?
为变长记录文件建立一张索引表,索引表中记录每一个变长记录项的地址。因为检索索引表是对定长文件进行检索,就可以实现随机检索。
11.试说明索引顺序文件的几个主要特征。
(1)记录是按关键字的顺序组织起来的;
(2)引入了文件索引表,通过该表可以实现对索引顺序文件的随机访问;
(3)增加了溢出文件,用它来记录新增加的、删除的和修改的记录。
12.试说明对索引文件和索引顺序文件的检索方法。
对索引文件进行检索时,可以根据用户(程序)提供的关键字利用折半查找法去检索索引表,从中找到相应的表项。再利用该表项中给出的指向记录的指针去访问所需的记录。
对索引顺序文件进行检索时,首先也是利用用户(程序)所提供的关键字以及某种查找算法去检索索引表,找到该记录所在记录组中第一个记录的表项,从中得到该记录组第一个记录在主文件中的位置。然后,再利用顺序查找法去查找主文件,从中找到所要求的记录。
13.试从检索速度和存储费用两方面来比较两级索引文件和索引顺序文件。
两级索引文件:存储费用高,检索速度较快。
索引顺序文件:存储费用不高,检索速度快。
14.对目录管理的主要要求是什么?
(1)实现“按名存取”;(2)提高对目录的检索速度;(3)文件共享;(4)允许文件重名。
15.采用单级目录能否满足对目录管理的主要要求?为什么?
它只能满足按名存取。
(1)查找速度慢。(2)不允许重名。(3)不便于实现文件共享。
16.目前广泛采用的目录结构形式是哪种?它有什么优点?
树形结构目录。明显提高了对目录的检索速度和文件系统的性能。
17.何谓路径名和当前目录?
路径名:在树形结构目录中,从根目录到任何数据文件都只有一条唯一的通路。在该路径上,从树的根(即主目录)开始,把全部目录文件名与数据文件名依次地用“/”连接起来,即构成该数据文件唯一的路径名。
当前目录:当一个文件系统有多级时,每访问一个文件,都要使用从树根开始,直到数据文件为止,是相当麻烦的事,可为每个进程设置一个“当前目录“,又称“工作目录“。
假设用户B的当前目录是F,则此时文件J的相对路径名仅是J本身。
18.Hash检索法有何优点?又有何局限性?
优点:显著提高检索速度。
局限:对于使用了通配符的文件名,此时系统便无法利用Hash法检索目录,还是需要利用线性查找法查找目录。
19.在Hash检索法中,如何解决“冲突”问题?
(1)在利用Hash法索引查找目录时,如果目录表中相应的目录项是空的,则表示系统中并无指定文件。
(2)如果目录项中的文件名与指定文件名相匹配,则表示该目录项正是所要寻找的文件所对应的目录项,故而可从中找到该文件所在的物理地址。
(3)如果在目录表的相应目录项中的文件名与指定文件名并不匹配,则表示发生了“冲突”,此时须将其Hash值再加上一个常数(该常数与目录的长度值互质),形成新的索引值,再返回到第一步重新开始寻找。
20.试说明在树形目录结构中线性检索法的检索过程,并给出相应的流程图。
P239
21.基于索引结点的文件共享方式有何优点?
优点是建立新的共享链接时,不改变文件拥有者关系,仅把索引结点共享计数器加1,系统可获悉了由多少个目录项指向该文件。缺点是拥有者不能删除自己的文件否则会出错。
22.什么是主父目录和链接父目录?如何利用符号链实现共享?
利用符号链接实现文件共享的基本思想,是允许一个文件或子目录有多个父目录,但其中仅有一个作为主父目录,其他的几个父目录都是通过符号链接方式与之相链接的(简称链接父目录)。
P243
23.基于符号链的文件共享方式有何优点?
在利用符号链方式实现文件共享时,只是文件主才拥有指向其索引结点的指针;而共享该文件的其他用户则只有该文件的路径名,并不拥有指向其索引结点的指针。这样,就不会发生在文件主删除一共享文件后留下一悬空指针的情况。
24.什么是保护域?进程与保护域之间存在着的动态联系是什么?
进程对一组对象访问权的集合,进程只能在指定区域内执行操作,域也就规定了进程所能访问的对象和能执行的操作。
进程和域之间,可以是一对多的关系,即一个进程可以联系着多个域。在此情况下,可将进程的运行分为若干个阶段,其每个阶段联系着一个域,这样便可根据运行的实际需要来规定在进程运行的每个阶段中所能访问的对象。
25.试举例说明具有域切换权的访问控制矩阵。
P245
26.如何利用拷贝权来扩散某种访问权?
P246
27.如何利用拥有权来增、删某种访问权?
P247
28.增加控制权的主要目的是什么?试举例说明控制权的应用。
用于改变在不同域中运行的进程对同一对象的访问权的。
29.什么是访问控制表?什么是访问权限表?
访问控制表是指对访问矩阵按列划分,为每一列建立一张访问控制表ACL。
访问权限表是如果把访问矩阵按行(即域)划分,便可由每一行构成一张访问权限表。这是由一个域对每一个对象可以执行的一组操作所构成的表,表中的每一项权限即为该域对某对象的访问权限。
30.系统如何利用访问控制表和访问权限表来实现对文件的保护?
当进程第一次试图访问一个对象时,必须先检查访问控制表,查看是否有权访问该对象。
如果无则拒绝访问,并构成一个例外异常事件;否则便允许访问,并为之建立访问权限,以便快速验证其访问的合法性。当进程不再访问该对象时便撤销该访问权限。
1.按网络拓扑结构可以把计算机网络分为哪几类?试画出它们的网络拓扑图。
答:计算机网络可分为星形、环形、总线形、树形和网状形网络。它们的网络拓扑图如下:
2.试说明分组交换网的组成。
答:由分组交换机、网路管理中心、远程集中器、分组装拆设备以及传输设备等组成。
3.何谓帧交换方式及信元交换方式?
答:帧交换方式是在传统分组交换的基础上发展起来的,传输基本单位是帧,长度可变,采用“存储转发”方式,即帧交换器每接到一个新帧时,都将该帧送帧缓冲区排队,按照该帧中的目标地址,将该帧转发给相应路径的下一个帧交换器。
信元交换方式是改进了的帧中继交换方式。当源帧交换器收到用户设备发来的帧,便分割为多个定长信元,在整个帧中继器网络中传输和交换时,都以信元为基本单位,到达目标帧交换器后,被重组为帧。
4.局域网可分为基本型和快速型两大类,每一类中包括哪几种局域网?
答:基本型局域网有:(1)以太网(2)令牌环网
快速局域网有: (1)FDDI光纤环网(2)快速以太网100 BASE-T。
5.为实现同构LAN网络互连,应采用什么样的网络互连设备?应具有哪些功能?
答:同构LAN 网络互连设备与功能:
(1) 网桥。功能:帧的发送和接受、缓冲处理、协议转换。
(2) 路由器。功能:拆包和打包、路由选择、协议转换、分段和重组
6.为实现异构型网络互连,应采用什么样的网络互联设备?它又应具有哪些功能?
答:采用网关。实现异构LAN 互连、LAN 与WAN互连、WAN 互连、LAN 与主机互连。
7.网络层向传输层提供了哪两类数据传输服务?试对它们做简要的说明。
答:(1)数据包服务。发方网络层从传输层接收报文,为它配上完整的目标地址,作为独立信息单位传送出去。数据包每经过一个中继节点都根据当时当地情况,按一定算法选择一条最佳传输路径转发出去。采用数据包服务的收、发双发无需建立连接。
(2)虚电路服务。通信前由源主机发送呼叫报文分组,包含源和目标主机的全网地址。
目标主机同意通信,便由网络层在双方间建立一条虚电路。在以后通信中只需填上虚电路的
逻辑信道号;通信结束拆除该虚电路。
8.传输层所起的桥梁作用具体表现在哪几方面?
答:(1)传输出错率和建立连接的失败率。(2)数据传输速率、吞吐量和传输时延。
(3)分段和组段功能。
9.TCP/IP模型中包含了哪几个层次?简要说明每个层次的主要功能。
答:TCP/IP模型中包含4个层次。
(1)应用层。对应于OSI高层,为用户提供需要的服务。如FTP、Telnet、DNS等。
(2)传输层。对应于OSI传输层,为应用层实体提供端到端的通信功能。定义了面向连接的TCP和无连接的用户数据报协议UDP这两个主要协议。
(3)网络互联层。对应于OSI网络层,解决主机到主机的通信问题。有网际协议IP、
地址解析协议ARP、互联网组管理协议IGMP和互联网控制报文协议ICMP四个主要协议。
(4)网络访问层。对应OSI的物理层和数据链路层。
10.网络互联层IP协议的主要作用是什么?为什么在有了IP协议之后还要配置TCP协议?
答:(1)IP 协议主要用于异构网络间的相互连接和路由选择。IP 提供的是不可靠、面向无连接的数据报传递服务。
(2)TCP协议提供面向连接、可靠的端端通信机制。TCP比IP可以确保数据传输的可靠性,即使网络层出错,TCP仍能正确控制建立连接、数据传输和连接释放。
11.试说明在介质访问控制MAC子层中,IEEE 802.2、IEEE802.3、IEEE 802.3u、IEEE802.2z、IEEE 802.5、IEEE802.6都是些什么标准?
答:IEEE 802.2是逻辑链路控制的标准。 IEEE 802.3是以太网的标准。
IEEE 802.3u 是以太网的标准。 IEEE 802.2z是以太网的标准。
IEEE 802.5是令牌环的标准。 IEEE 802.6是城域网的标准。
12.何谓网络体系结构?OSI/RM由哪几部分组成?
答:网络体系结构是指通信系统的整体设计,为网络硬件、软件、协议、存取控制和拓扑提供标准。OSI/RM 从低到高分七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
13.什么是网络协议?扼要说明其所含的三要素。
答:网络协议是为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
计算机网络协议主要由语义、语法和交换规则三部分即协议三要素组成。
语义:规定通信双方彼此讲什么,确定协议元素类型,如规定通信双方发什么控制信息,
执行的动作和返回的应答。
语法:规定通信双方彼此如何讲,确定协议元素格式,如数据和控制信息的格式。
交换规则:规定信息交流的次序。
14.ISO将OSI/RM分成几层?各层的主要用途是什么?
答:OSI/RM分7层。各层的主要用途是:
物理层:规定了网络设备间物理连接标准,在网络设备间透明地传输比特流。
数据链路层:提供相邻节点间可靠的数据传输功能。
网络层:在通信子网中进行路由选择和通信控制。
传输层:提供两个端系统间的可靠通信。
会话层:建立和控制两个应用实体间的会话过程。
表示层:提供统一的网络数据表示。
应用层:提供网络用户间的分布式应用环境(普通用户)和应用开发环境(网络程序员)。
15.客户/服务器模式得以广泛流行的主要因素是什么?
答:(1)模块化与应用的分布特性 (2)充分利用资源,提高网络效率
(3)便与系统维护,扩充性强 (4)并发特性
16…试说明客户与服务器之间的交互情况。
答:C/S 模式的两层结构系统是:第一层在客户机系统上结合表示与业务逻辑;第二层通过网络结合了数据库服务器。C/S 模式主要由客户应用程序、服务器管理程序和中间件三部分组成。
17.两层C/S模式有哪些局限性?如何解决?
答:(1)不能适应应用不断增多的情况。
(2)需要在客户机与服务器上安装特定的网络软件,实现C/S间的互用性。
(3)客户机直接与服务器交互。
解决办法:设法使C 与提供数据等服务的S无关,在C/S间增设中间实体。
18.为什么在大型信息系统和Internet环境下,应采用三层客户/服务器模式?
答:因为Internet 发展极为迅速,三层客户/服务器模式更适合发展。把客户机作为Web浏览器,从而形成了Web浏览器、Web服务器和数据库服务器三层的C/S 模式。
19.试比较两层和三层的C/S模式。
答:三层与两层模式相比的优点:(1)增加了系统的灵活性和可扩展性。
(2)简化了客户机,降低了系统费用。(3)使客户机安装、配置和维护更为方便。
三层的缺点:(1)软件开发难度大,开发周期长。(2)访问效率低。
20.现代计算机网络有哪些主要功能。
答:计算机网络的主要功能是数据通信和资源共享、系统容错、网络管理、应用互操作功能。
21.试说明在层次式结构的网络中进行数据通信时,信息的流动过程。
答:请求信息从客户机到应用服务器,再到数据服务器,然后数据服务器根据要求向应用服务器传送信息,再由应用服务器找到客户机。
22.为实现数据通信,计算机网络应有哪些具体功能?
答:连接的建立和拆除、报文的分解和组装、传输控制、流量控制、差错检测与纠正。
23.试说明当前实现文件和数据共享的两种主要方式。
答:以虚拟软盘方式和以文件服务方式实现的数据共享方式。
24.网络管理的主要目标是什么?
答:A.增强网络的可用性。 B.提高网络运行质量。 C.提高网络资源利用率。
D.保障网络的安全性 E.提高网络和社会经济效益。
25.网络管理包括哪几方面的具体功能?
答:配置管理、故障管理、性能管理、安全管理、计费管理。
26.何谓信息“互通性”和信息“互用性”?
答:信息的互通性是指在不同网络结点间实现通信。目前主要利用TCP/IP实现信息互通。
信息的互用性是指在不同网络中的站点间实现信息的互用,即一个网络中的用户能访问另一个网络文件系统或数据库系统中的文件或数据。
27.何谓电子邮件?它可分为哪几种类型?
答:电子邮件E-mail,标志@,又称电子信箱、电子邮政,是用电子手段提供信息交换的通信方式。电子邮件服务器分为两种类型,MIME 协议和SMTP 协议。现代E-mail 中可包含多种不同类型的文件,如文本、图像、音频和视频信息等。
28.文件传输的复杂性表现在哪几方面?如何解决?
答:异构网络下的文件传输,需要在Internet 中建立了统一的文件传输协议FTP。
(1)内部用户FTP。只允许在文件服务器上拥有账户的用户使用FTP服务。
(2)匿名FTP。在Internet 上实现资源共享的重要手段,允许非注册用户拷贝文件。
29.试比较电子邮件服务和文件传输服务。
答:电子邮件服务借助于E-mail设施与世界上所有国家和地区的网络用户通信。
文件传输服务是在Internet 中建立统一的文件传输协议FTP,实现用户在不同主机间的文件拷贝功能。
30.网络环境下的目录服务有何特点?
答:规模小的局域网不需要提供目录服务,对于大型企业网必须对网络管理员和用户提供目
录服务,发挥网络的应有作用。目录服务还应能对每台物理设备提供的网络服务进行管理。
对服务器提供的网络服务可以是文件/打印服务、数据库服务等。
31. 目录服务包括哪些主要功能?
答:(1)用户管理。保证核准用户能方便地访问各种网络服务,禁止非法用户访问。
(2)分区和复制。将庞大目录库分成若干个分区,并分别复制到多台服务器,使每个分区被复制的位置尽量靠近最常使用这些对象的用户,有的目录服务还允许一台服务器上存放多个不同分区的拷贝。
(3)创建扩充和继承功能。创建是在目录中创建新的对象,并设置属性。扩充指对原有目录服务功能的扩充。继承是指目录对象继承其他对象的属性和权力的能力。
(4)多平台支持功能。由于目录服务存在着管理对象的差异,要求具有跨越平台能力。
32. Internet 具有哪些特征?
答:(1)广域性 (2)广泛性 (3)高速性(4)综合性
33.何谓WWW?它与一般的信息检索工具有何不同?
答:WWW(Word Wide Web)称为万维网或Web,是当前最为流行的信息服务类型。
它与一般信息检索工具不同表现在:一般检索工具每次只能从一台主机上查找需要的文件,且文件数据类型单一;而Web检索可以一次从多台主机中查找需要的数据,允许类型各异,并将这些数据形成一份文件。
34.何谓BBS?它何以会受到广大网络用户的欢迎?
答:BBS(Bulletin BoardSystem)即电子公告板。BBS用户已经扩展到各行各业,BBS可以交换各种文件。通过BBS系统可随时取得国际最新软件及信息,可以和别人讨论计算机软件、硬件、Internet、多媒体、程序设计以及医学等各种有趣话题,可以利用BBS刊登征友、廉价转让及公司产品等启事。只要拥有1 台计算机和上网设备就能立刻进入“超时代”BBS领域,享用它无比的威力!因此BBS 受到了广大网络用户的欢迎。
35.什么是域名服务?Internet的域名是由几段构成的?
答:域名是Internet 网络上的一个服务器或一个网络系统的名字。域名的形式是以若干个英文字母和数字组成,由".“分隔成几部分,如cctv.com就是一个域名。
一个完整的域名由两个或两个以上词段组成,部分之间用英文句号”.“分隔,最后一个”.“的右边部分称为顶级域名(TLD)或一级域名,最后一个”."的左边部分称为二级域名(SLD),二级域名的左边部分称为三级域名,以此类推,每一级的域名控制它下一级域名的分配。
36.什么是域名解析?最基本的一种域名解析方式是如何实现的?
答:域名解析是将域名重新转换为对应IP地址的过程。一个域名只对应一个IP地址,多个域名可以同时解析到一个IP地址。域名解析需要由专门的域名解析服务器DNS完成。
域名解析的过程:当应用过程需要将一个主机域名映射为IP 地址时,就调用域名解析函数将待转换的域名放在DNS 请求中,以UDP 报文方式发给本地域名服务器。查到域名后将对应IP 地址放在应答报文中返回。若域名服务器不能回答该请求,则此域名服务器向根域名服务器发出请求解析,找到下面的所有二级域名服务器,以此类推,直到查询到所请求的域名并赋IP值返回。
37.为能支持Internet所提供的服务,在操作系统中应配置哪些软件?
答:应配置WEB 浏览器,如IE、firefox、Chrome等,特殊的服务可以根据需要安装对应的软件。
38.何谓浏览器/服务器模式?浏览器和服务器的基本功能是什么?
答:浏览器/服务器模式即B/S 结构或Browser/Server 结构。只安装维护一个服务器Server,客户端采用浏览器Browse 软件。利用成熟的WWW技术,结合多种Script语言(VBScript、JavaScript…)和ActiveX技术,是全新的软件系统构造技术。
在B/S体系结构系统中,浏览器向分布在网络上的许多服务器发出请求,服务器对浏览器的请求进行处理,将用户所需信息返回到浏览器。而数据请求、加工、结果返回及动态网页
生成、数据库访问和应用程序执行等工作全部由Web Server完成。随着Windows将浏览器技术植入操作系统内部,这种结构已成为当今应用软件的首选体系结构。
B/S 结构的主要特点是分布性广、维护方便、开发简单、共享性强、总体成本低。但数据安全性、服务器要求高、数据传输慢、软件个性化特点明显降低,难以实现传统模式下的特殊功能要求。
浏览器是指可以显示网页服务器或者文件系统的HTML 文件内容,并让用户与这些文件交互的一种软件。服务器是网络上为客户端计算机提供各种服务的高可用性计算机。
有很多不对或者不全的地方,多去搜搜吧,如果孩子有错一定要告诉我呀,我的期末
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。