2019-12-05 21:26:25 weixin_44749339 阅读数 32
  • S5PV210的时钟系统-1.6.ARM裸机第六部分

    本期课程主要讲述S5PV210的时钟系统,通过8节课的讲解和实战,希望大家能够彻底掌握S5PV210(以及类似复杂度的SoC)的时钟体系结构,理解MUX开关、DIV分频器、PLL倍频锁相工作电路等在时钟设置中的作用。

    7496 人正在学习 去看看 朱有鹏

P V操作是操作系统管理同步与互斥问题的一种重要方法,下面我们就P V操作做一些简析,如有问题,请多指正。

P V操作概念

明确一点 。P V操作是操作系统的原语(primitive),即在执行该语句的时候程序不会中断。P V操作中存在(s,q)一个二元数组,其中s代表信号量,q代表的是一个队列。
对信号灯的P深作记为P(s). P(s)是一个不可分制的原语操作,即取信号灯值减 1,若相减结果为负,则调用P(s)的进程使阻,并插入到该信号灯的等待队列中,否则可以维续执行 。

P操作主要完成以下三个事情

1 S的值减一
2 如果相减结果大于等于0 ,程序就继续执行
3 如果相减结果小于零 ,阻塞被插入到等待队列
算法描述如下:

{
S--
 if(S<0{
  保留进程调用PCB现场;
  将该进程PCB插入S的等待队列
  将进程设置为wait状态
  然后转移到进程调度
  }
 }  

V操作主要完成以下三件事情:

1 S++
2 相加结果大于0,程序继续执行
3 相加结果小于等于0,将在s队列上面的的阻塞的进程解除等待,然后继续执行,或者转到调度程序(两种都可以,主要看设计)
V操作算法描述如下:

{
 S++
if(s<=0)
 {
  选择S队列中的一个进程,解除等待状态,
  将其放入就绪队列;
 }
} 

同步中P V操作

例1:桌上有一个盘子,每次只能放一个水果,妈妈向盘中放苹果和橘子,儿子专等吃盘里的橘子,女儿专等吃盘里的苹果。只要盘子空,妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,请给出他们三人之间的同步关系,并用PV操作实现三人正确活动的程序。

分析:女儿和儿子各取所需,不存在争夺资源的问题,所以不存在互斥关系。女儿儿子需要获知苹果橘子是否产生信号,所以设苹果资源信号量为apple,橘子资源信号量为orange。而妈妈需要获知盘子是否为空的信号,所以需要设置资源信号量empty。

void mother()
{
	while(true)
	{
		wait(empty);
		produce fruit;
		if( fruit=='苹果'signal(apple);//apple++,告知女儿有苹果了
		else
			signal(orange);//orange++,告知儿子有橘子了
	}
}
void daughter()
{
	while(true)
	{
		wait(apple);
		//取水果
		signal(empty);//empty++,告知妈妈盘子空了
	}
}
void son()
{
	while(true)
	{
		wait(orange);
		//取水果
		signal(empty);//empty++,告知妈妈盘子空了
	}
}

例2:如果是爸爸放橘子,妈妈只负责放苹果,儿子和女儿角色不变,请给出他们四人之间的同步关系,并用PV操作实现四人人正确活动的程序。

分析:妈妈和爸爸对盘子的使用存在互斥关系,所以需要设互斥信号量mutex。父亲和儿子,母亲和女儿都是同步关系。
解:设mutex=1; orange=1; apple=1;

void mother()
{	
	while(true)
	{
		wait(mutex);//申请临界资源
		produce apple;
		signal(apple);//apple++,告知女儿有苹果了
	}
}
void father()
{
	while(true)
	{
		wait(mutex);
		produce orange;
		signal(orange);//orange++,告知儿子有苹果了
	}
}
void daughter()
{	
	while(true)
	{
		wait(apple);
		//取水果
		signal(mutex);//empty++,告知妈妈盘子空了
	}
}
void son()
{	
	while(true)
	{
		wait(orange);
		//取水果
		signal(mutex);//empty++,告知妈妈盘子空了
	}
}

**

互斥中的P V操作

**
互斥主要针对系统中某些共享的资源,不同进程必须互斥使用有关的问题。
例如 打印机必须互斥使用,当然还有一些软件资源也必须互斥使用。

十六字诀:

在这里插入图片描述

哲学家进餐问题

问题描述:有五个哲学家,他们的生活方式是交替地进行思考和进餐。他们共用一张圆桌,分别坐在五张椅子上。

在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐完毕,放下筷子又继续思考。
在这里插入图片描述

分析:筷子是临界资源,在一段时间内只允许一位哲学家使用,为实现筷子的互斥使`用,可以使用一个信号量来表示一只筷子,这五个信号量构成信号量数组

semaphore chopstick[5] = {1,1,1,1,1};
while(true)
{
	/*当哲学家饥饿时,总是先拿左边的筷子,再拿右边的筷子*/
	wait(chopstick[i]);
	wait(chopstick[(i+1)%5]);  //wait signal对应的就是PV操作。

	// 吃饭
 
	/*当哲学家进餐完成后,总是先放下左边的筷子,再放下右边的筷子*/
	signal(chopstick[i]);
	signal(chopstick[(i+1)%5]);
}

上述的代码可以保证不会有两个相邻的哲学家同时进餐,但却可能引起死锁的情况。假如五位哲学家同时饥饿而都拿起的左边的筷子,就会使五个信号量chopstick都为0,当他们试图去拿右手边的筷子时,都将无筷子而陷入无限期的等待。

为避免死锁,可以使用以下两种策略:

策略一:

至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。定义信号量count,只允许4个哲学家同时进餐,这样就能保证至少有一个哲学家可以就餐。

semaphore chopstick[5]={1,1,1,1,1};
semaphore count=4; // 设置一个count,最多有四个哲学家可以进来
void philosopher(int i)
{
	while(true)
	{
		think();
		wait(count); //请求进入房间进餐 当count为0时 不能允许哲学家再进来了
		wait(chopstick[i]); //请求左手边的筷子
		wait(chopstick[(i+1)%5]); //请求右手边的筷子
		eat();
		signal(chopstick[i]); //释放左手边的筷子
		signal(chopstick[(i+1)%5]); //释放右手边的筷子
		signal(count); //离开饭桌释放信号量
	}
}

策略二:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。可以利用AND 型信号量机制实现,也可以利用信号量的保护机制实现。(利用AND机制本文不再介绍,如想了解见https://blog.csdn.net/Yun_Ge/article/details/89177918)利用信号量的保护机制实现的思想是通过记录型信号量mutex对取左侧和右侧筷子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的出现。描述如下:

semaphore mutex = 1; // 这个过程需要判断两根筷子是否可用,并保护起来
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int i)
{
	while(true)
	{
		/* 这个过程中可能只能由一个人在吃饭,效率低下,有五只筷子,其实是可以达到两个人同时吃饭 */
		think();
		wait(mutex); // 保护信号量
		wait(chopstick[(i+1)%5]); // 请求右手边的筷子
		wait(chopstick[i]); // 请求左手边的筷子
		signal(mutex); // 释放保护信号量
		eat();
		signal(chopstick[(i+1)%5]); // 释放右手边的筷子
		signal(chopstick[i]); // 释放左手边的筷子
	}
}

P V操作中同步与互斥结合

经典例题:生产者消费者问题
在这里插入图片描述
消费者:消耗系统资源。
生产者:释放系统资源。

缓冲区未空:消费者就可以一直取资源。
缓冲区未满:生产者就可以一直生产资源。
因此,同步关系保证了上面两点的实现。

方法:用两个信号灯,分别说明缓冲区数目(full和empty)

main()
{
    int w = 0;        //满缓冲区的数目
    int empty = n;    //空缓冲区的数目
    int mutex = 1;    //对有界缓冲区进行操作的互斥信号灯
    cobegin
        P1();P2()……Pm();
        C1();C2()……Cn();
    coend
}

producer()                          consumer()         
{                                   {
    while(生产未完成)                    while(还要继续消费)       
    {                                   {
        .                                   p(full);
        .                                   p(mutex);       
        .                                   从有界缓冲区取产品;
        生产一个产品;                     v(mutex);
        p(empty);                           v(empty);
        p(mutex);                           .
        送一个产品到有界缓冲区;                .
        v(mutex);                           .
        v(full);                            消费一个产品;
                                        }
    }                               }

}                       

参考:
https://blog.csdn.net/qicheng777/article/details/77432129

https://blog.csdn.net/Yun_Ge/article/details/89177918

2019-12-28 18:06:32 weixin_43118073 阅读数 30
  • S5PV210的时钟系统-1.6.ARM裸机第六部分

    本期课程主要讲述S5PV210的时钟系统,通过8节课的讲解和实战,希望大家能够彻底掌握S5PV210(以及类似复杂度的SoC)的时钟体系结构,理解MUX开关、DIV分频器、PLL倍频锁相工作电路等在时钟设置中的作用。

    7496 人正在学习 去看看 朱有鹏

使用if语句判断

#define CHAIRS 100
semaphore mutex=1;
int readers=0;

void reader()
{
do
{
	P(mutex);
	if(readers<CHAIRS)
	{
		readers++;
		填表;
		V(mutex);//mutex用于访问readers和填表
--------------------------------------------
		阅读;
--------------------------------------------
		P(mutex);
		readers--;
		撤销登记;
		V(mutex);
	}
	else
	{
		V(mutex);
	}
}while(1);
}

椅子使用信号量

semaphore mutex=1;
semaphore reader=0;
semaphore emptyseats=100;


void getin()
{
-------------------------------------------------------
emptyseats用于两个线程的同步
如果满了,只有getout后才能有读者getin
-------------------------------------------------------
	P(emptyseats);
	P(mutex);
--------------------------------------------
    mutex用于互斥访问表这个临界变量
    填表;
--------------------------------------------
	V(mutex);
	V(reader);
}

void getout()
{
-------------------------------------------------------
reader用于两个线程的同步,getin后才会有读者getout
-------------------------------------------------------
	P(reader);
	P(mutex);
--------------------------------------------
    mutex用于互斥访问表这个临界变量
    撤销登记;
--------------------------------------------
	V(mutex);
	V(emptyseats);
}
2019-09-06 16:50:48 qq_40167046 阅读数 51
  • S5PV210的时钟系统-1.6.ARM裸机第六部分

    本期课程主要讲述S5PV210的时钟系统,通过8节课的讲解和实战,希望大家能够彻底掌握S5PV210(以及类似复杂度的SoC)的时钟体系结构,理解MUX开关、DIV分频器、PLL倍频锁相工作电路等在时钟设置中的作用。

    7496 人正在学习 去看看 朱有鹏

一、管程

1.采用封装的思想

2.解决信号量机制或者PV操作编程麻烦的、易出错等问题

3.可看做一个软件模块,将共享的变量和对于这些共享变量的操作封装起来,形成一个具有一定接口的功能模块,进程可以调用管程来实现进程级别的并发

4.管程的组成(封装):共享数据结构、对数据结构初始化的语句、一组用来访问数据的过程即是函数

    例如:enter过程、leave过程、条件型变量c、wait(c) 、signal(c)

5.基本特征:各外部进程/线程只能通过管程提供特定“入口”(接口)才能访问共享数据每次仅允许一个进程/线程在管程内执行某个内部过程

补充:各进程必须互斥访问管程由编译器实现的;可在管程中设置条件变量及等待wait/唤醒signal操作以解决同步问题

二、死锁和饥饿

1.死锁现象:某计算机系统中只有一台打印机和一台输出设备,进程P1正在占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。

2.死锁(各进程):并发环境下,互相等待,各进程都阻塞,无法继续向前推进

   饥饿(某进程):某进程无法继续向前推进

3.产生死锁必须同时满足4个条件:

                互斥条件;不剥夺条件(只能主动释放,不能由其他进程强行夺走);请求和保持条件;循环等待条件 

举例:如果你手上拿着一个苹果不吃,别人也无法抢走,这就是不可剥夺条件;如果你左手拿一个苹果,允许右手再去拿一个,这就是请求和保持条件。

4.产生死锁的时机:对不可剥夺资源的不合理分配

5.死锁的处理----不允许死锁发生----静态策略:预防(破坏4个必要条件)

破坏互斥条件:SPOOLing(假脱机)技术,允许设备共享使用;

破坏不剥夺条件:常用于状态易于保存和回复的资源,如CPU的寄存器及内存资源;

破坏请求和保护条件:采用预先静态分配,进程在运行前一次申请完它所需的全部资源,可能会导致系统资源浪费和饥饿现象;

破坏循环等待条件:采用顺序资源分配法,并对系统中的资源进行编号,必须按编号顺序申请。

6.死锁的处理----不允许死锁发生----动态策略:避免

银行家算法:n种进程,m种资源

检查此次申请是否超过之前声明的最大需求数------>检查此时系统剩余的可用资源是否还能满足这次请求(满足为安全,不满足为不安全)----> 试探分配,更改各数据结构---->用安全性算法检查此次分配是否会导致系统进入不安全状态

安全性算法

检查当前的剩余可用资源是否能满足某个进程的最大需求(满足为安全,不满足为不安全)---->如果满足,把该进程加入安全序列,并把该进程持有资源回收----->所有进程全部能加入安全序列即是安全状态,否则系统处于不安全状态

7.死锁的处理----允许死锁发生----死锁的检测和解除

检测

补充:数据结构(有向图):两结点:资源和进程;两边 (请求:进程--->资源,分配:资源----->进程)

死锁定理: 资源分配图中找出一条有向边与即不阻塞又不是孤点的进程Pi相连,且该邮箱变对应资源申请数小于等于系统空闲资源数,并简化,当且仅当资源分配图不可完全简化时会发生死锁。

解除

资源剥夺法(挂起某些死锁进程并抢夺它的资源)、终止进程法(强制撤销,剥夺资源)、进程回退法(让进程回退到足以避免死锁的地步)

2019-07-15 22:09:30 jianbai_ 阅读数 93
  • S5PV210的时钟系统-1.6.ARM裸机第六部分

    本期课程主要讲述S5PV210的时钟系统,通过8节课的讲解和实战,希望大家能够彻底掌握S5PV210(以及类似复杂度的SoC)的时钟体系结构,理解MUX开关、DIV分频器、PLL倍频锁相工作电路等在时钟设置中的作用。

    7496 人正在学习 去看看 朱有鹏

进程同步的经典问题——消费者问题

某系统中有一个缓冲区,进程P1不断地将数据写入缓冲区,进程P2不断地从缓冲区中取出数据进行处理。假设该缓存区只能容纳n个数据,且一开始缓冲区为空,试着用wait(),signal()语句描述其同步互斥关系(即PV操作)。

解:

  • 首先,我们来分析一下,该问题中的同步和互斥关系:
    同步(有序的关系):
    (1)数据缓冲区不满的时候才能写入数据(P1进程),否则只能等待。
    (2) 数据缓冲区不空的时候才能处理数据(P2进程),否则只能等待。
    互斥:进程之间必须以互斥方式访问缓冲区(也就是临界区)。
    此时,我们可以为这三对关系设置分别设置信号量。
    mutex:互斥信号量,实现互斥的访问缓冲区,初值为1;
    full:同步信号量,表示缓冲区中已经写入的数据数量,初值为0;
    empty:同步信号量,表示缓冲区中空闲缓冲区的数量,初值为n。
  • 明确了同步,互斥关系之后,进行编程(此处采用伪代码)。
// 信号量的声明如下
semaphore mutex=1;
semaphore  empty=n;
semaphore  full=0;
// P1进程(生产者)
P1(){
P1进程准备数据;
while(true){
wait(empty);
wait(mutex);
P1进程写入数据;
signal(mutex);
signal(full);
}
}
// P2进程(消费者)
P2(){
while(true){
wait(full);
wait(mutex);
P2进程取出数据;
signal(mutex);
signal(empty);
P2进程处理数据;
}
}

总结

从上面的代码我们可以清楚地将步骤分为三步:
(1)确定需要声明定义的信号量的对应的代表关系(同步or互斥)和初值 ;
(2)声明信号量——semaphore;
(3)完成具体的程序(生产者进程和消费者进程)
其实,很多问题的本质都是消费者、生产者问题,这种题,掌握一种方法就可以了。
需要注意的是:

  • 实现进程互斥的信号量的wait(),signal()操作位于同一进程中,而实现进程同步的信号量位于不同的进程中,一个执行wait()操作,另一个执行signal()操作。
  • 实现进程同步的wait()操作要实现进程互斥的wait()操作之前,因为缓冲区是临界资源,如果访问顺序不当会造成死锁的发生,然后所有进程都无法向前推进。
2015-08-19 09:43:15 lycnjupt 阅读数 5637
  • S5PV210的时钟系统-1.6.ARM裸机第六部分

    本期课程主要讲述S5PV210的时钟系统,通过8节课的讲解和实战,希望大家能够彻底掌握S5PV210(以及类似复杂度的SoC)的时钟体系结构,理解MUX开关、DIV分频器、PLL倍频锁相工作电路等在时钟设置中的作用。

    7496 人正在学习 去看看 朱有鹏

第一章

OS的发展过程----几类典型操作系统(多道批处理、分时、实时),每类操作系统的原理、特征(优缺点)

多道批处理系统:
原理:

      20世纪60年代中期引入多道程序设计技术,由此形成了多道批处理系统。在该系统中,用户所提交的作业都先存放在外存上并排成一个队列,称为“后备队列”;然后,由作业调度程序按一定的算法从后备队列中选择若干个作业调入内存,使它们共享CPU和系统中的各种资源。

特征(优缺点):

(1)资源利用率高
(2)系统吞吐量大
(3)平均周转时间长
(4)无交互能力

分时系统:
原理:

       分时系统是指在一台主机上连接了多个带有显示器和键盘的终端,同时允许多个用户通过自己的终端,以交互方式使用计算机,共享主机中的资源。

特征(优缺点):

(1)多路性
(2)独立性
(3)及时性
(4)交互性

实时系统:
原理:

       实时系统是指系统能及时(或即时)响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致的运行。

特征(优缺点):

(1)多路性
(2)独立性
(3)及时性
(4)交互性
(5)可靠性


 

OS的基本特性(并发、共享、虚拟、异步)----其中“并发”是最重要的特性

并发性、共享性、虚拟性和异步性四个基本特征;最基本的特征是并发性。

 

 

OS的主要功能----资源管理器和用户接口

资源管理功能:
处理机管理
存储器管理
设备管理
文件管理

操作系统和用户之间的接口:
用户接口:联机用户接口,脱机用户接口和图形用户接口
程序接口:该接口是为用户程序在执行中访问系统资源而设置的,它是由一组系统调用组成。

 

试说明推动多道批处理系统形成和发展的主要动力是什么?

主要动力来源于四个方面的社会需求与技术发展:

(1)不断提高计算机资源的利用率;
(2)方便用户;
(3)器件的不断更新换代;
(4)计算机体系结构的不断发展。

 

第二章

 进程的概念,进程与程序(作业)的区别

进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体。

进程实体:为使程序(含数据)能独立运行,应为之配置一进程控制块,即PCB;而由程序段、相关的数据段和PCB三个部分便构成了进程实体。进程的实质是进程实体的一次执行过程。

进程和程序区别:
(1)进程是一个动态概念,强调执行的过程,每个进程中包含了程序段和数据段两个部分,以及进程控制块PCB;而程序是一个静态概念,程序是指令的有序集合,无执行含义;
(2)进程具有并行特征(独立性,异步性),程序则没有;
(3)一个进程可以执行多个程序(如Linux中通过exec调用),同一程序的多次执行将产生多个不同的进程。同一个程序的一次执行也可产生多个进程(如在程序中多次调用Linux中的fork)。

进程和作业的区别在于:
      一个进程是一个程序对某个数据集的执行过程,是分配资源的基本单位。作业是用户需要计算机完成某项任务,而要求计算机所做工作的集合。一个作业的完成要经过作业提交、作业收容、作业执行和作业完成四个阶段。而进程是已提交完毕的程序所执行过程的描述,是资源分配的基本单位。其主要区别关系如下:

(1)作业是用户向计算机提交任务的任务实体。在用户向计算机提交作业之后,系统将它放入外存中的作业等待队列中等待执行;而进程则是完成用户任务的执行实体,是向系统申请分配资源的基本单位。任一进程,只要它被创建,总有相应的部分存在于内存中;
(2)一个作业可由多个进程组成。且必须至少由一个进程组成,但反过来不成立;
(3)作业的概念主要用在批处理系统中,像UNIX这样的分时系统中,则没有作业的概念;而进程的概念则用在几乎所有的多道程序系统中。

 

 

什么是PCB,PCB包含的主要信息,PCB的作用

为了描述和控制进程的运行,系统为每个进程定义了一个数据结构——进程控制块PCB(Process Control Block)。PCB中主要包括下述四方面的信息:

进程标识符:内部标识符,外部标识符
处理机状态
进程调度信息
进程控制信息
PCB的作用:
① PCB是系统只为每个进程定义的一个数据结构,是为了使程序(含数据)能独立运行,为之配置的一进程控制块(Process Control Block);

② PCB、程序段和相关的数据段三部分构成了进程实体,创建进程,实质上是创建进程和实体中的PCB,而撤销进程,实质上是撤销进程的PCB;PCB是为了保证程序的并发执行;

③ PCB使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。


进程的5种基本状态,状态间的转换已及引起状态转换的原因

进程的三种基本状态:就绪状态,执行状态,阻塞状态

还存在两种比较常见的进程状态,即创建状态和终止状态

 创建→就绪:在当前系统的性能和内存容量均允许的情况下,完成对进程创建的必要操作,相应的系统进程将进程的状态转换成活动就绪状态

执行→终止:当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,进程即进终止状态

(1) 就绪→执行

处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。

(2) 执行→就绪

处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。(时间片用完)

(3) 执行→阻塞

正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。(I/O请求)

(4) 阻塞→就绪

       处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。(I/O完成)

 

 

什么是临界资源

临界资源是指每次仅允许一个进程访问的资源。

 

进程间的两种相互制约关系--同步、互斥--的概念(是进程间的低级通信)

进程间的两种相互制约关系:

进程同步(直接相互制约关系):

它主要源于进程合作,是进程间共同完成一项任务时直接发生相互作用的关系。为进程之间的直接制约关系。在多道环境下,这种进程间在执行次序上的协调是必不可少的。

举例:有输入进程A 通过单缓冲向进程B 提供数据。当缓冲空时,计算进程因不能获得所需数据而阻塞,当进程A 把数据输入缓冲区后,便唤醒进程B;反之,当缓冲区已满时,进程A 因没有缓冲区放数据而阻塞,进程B 将缓冲区数据取走后便唤醒A。


进程互斥(间接相互制约关系):

它主要源于资源共享,是进程之间的间接制约关系。在多道系统中,每次只允许一个进程访问的资源称为临界资源,进程互斥就是保证每次只有一个进程使用临界资源。

举例:有两进程A 和B,如果A 提出打印请求,系统已把唯一的 一台打印机分配给了进程B,则进程A 只能阻塞;一旦B 释放打印机,A 才由阻塞改为就绪。

 

 

 什么是信号量

       信号量是Dijkstra提出的用于解决进程同步的有效工具。信号量是一个数据结构以及对其的操作。除初始化外,仅能通过两个标准的原子操作wait(S)he signal(S)来访问。两个语句在执行到一半的时候不能被中断。

 

 

什么是P操作、什么是V操作(P、V操作的处理流程,以记录型信号量为例)

P(S):wait(S)

每次wait操作,意味着进程请求一个单位的该类资源,使系统可供分配的该类资源数减少一个。
① 将信号量S的值减1,即S.value:=S.value-1;
② 当S.value<0时,表示该类资源分配完毕,进程调用block原语,进行自我阻塞,放弃处理机,并插入到信号量链表中。

V(S):signal(S)

每次signal操作,表示执行进程释放一个单位资源,使系统中可供分配的该类资源数增加一个
① 将信号量S的值加1,即S.value:=S.value+1;
② 如果S.value<=0,表示在该信号量链表中,仍有等待该资源的进程被阻塞,故还应调用wakeup原语,将链表中的第一个等待进程唤醒。

 

 

 

 

用信号量和P、V操作机制实现互斥和同步的方法,信号量取值的含义

利用信号量和PV操作实现进程互斥时应该注意的是:

(1)每个程序中用户实现互斥的P,V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。
(2)P,V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
(3)互斥信号量得初值一般为1
其中信号量S用于互斥,初值为1。

利用信号量和PV操作实现进程同步

PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。

使用PV操作实现进程同步时应该注意的是:
(1)分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,那些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置那些信号量。
(2)信号量的初值与相应资源的数量有关,也与P,V操作在程序代码中出现的位置有关。
(3)同一信号量的P,V操作要成对出现,但他们分别在不同的进程代码中。

 

 

什么是进程的(高级)通信,类型

进程通信,是指进程之间的信息交换,其所交换的信息量少者是一个状态或数值,多者则是成千上万个字节。高级进程通信,是指用户可直接利用操作系统所提供的一组通信命令高效地传送大量数据的一种通信方式。

高级通信机制可归结为三大类:
(1)共享存储器系统

a、基于共享数据结构的通信方式
b、基于共享存储区得通信方式
(2)消息传递系统
(3)管道通信系统。

 

 

 

消息传递通信的两种实现方法

(1)直接通信方式
发送进程利用OS所提供的发送命令,直接把消息发送给目标进程。
(2)间接通信方式
进程之间的通信需要通过作为共享数据结构的实体。

 

 

在操作系统为什么引入进程的概念?它会产生什么样的影响?

        为了使程序在多道程序环境下并发执行。并对并发执行的程序加以控制和描述,在操作系统为什么引入进程的概念。影响:使程序的并发执行得意实行。

 

为什么说PCB是进程存在的唯一标志?

PCB是进程存在的唯一标示,是因为:

① 在调度到某进程后,要根据其PCB中所保存的处理机状态信息,设置该进程恢复运行的现场,并根据其PCB中的程序和数据的内存地址,找到其程序和数据;进程在执行过程中,当需要和与之合作的进程实现同步、通信或访问文件时,也都需要访问PCB:当进程由于某种原因而暂停执行时,又需将器断点的处理机环境保存在PCB中。可见,在进程的整个生命期中,系统总是通过PCB对进程进行控制的,亦即系统是根据进程的PCB而不是任何别的什么而感知到该进程的存在的。所以PCB是进程存在的唯一标志。

 

 

 

试写出相应的程序来描述图2-17所示的前驱图。
进程管理相关内容

进程管理相关内容


进程管理相关内容

进程管理相关内容

 

 

第一个图:


 

Var a, b, c, d, e, f, g, h; semaphore:= 0, 0, 0, 0, 0, 0, 0, 0;  begin  parbegin  begin S1; signal(a); signal(b); end;  begin wait(a); S2; signal(c); signal(d); end;  begin wait(b); S3; signal(e); end;  begin wait(c); S4; signal(f); end;  begin wait(d); S5; signal(g); end;  begin wait(e); S6; signal(h); end;  begin wait(f); wait(g); wait(h); S7; end;  parend  end


 

第二个图:


 

Var a, b, c, d, e, f, g, h,i,j; semaphore:= 0, 0, 0, 0, 0, 0, 0,0,0, 0;  begin  parbegin  begin S1; signal(a); signal(b); end;  begin wait(a); S2; signal(c); signal(d); end;  begin wait(b); S3; signal(e); signal(f); end;  begin wait(c); S4; signal(g); end;  begin wait(d); S5; signal(h); end;  begin wait(e); S6; signal(i); end;  begin wait(f); S7; signal(j); end;  begin wait(g);wait(h); wait(i); wait(j); S8; end;  parend  end


 

在生产者-消费者问题中,如果将两个wait操作即wait(full)和wait(mutex)互换位置,或者将signal(mutex)与signal(full)互换位置,结果会如何?

var mutex,empty,full: semaphore:=1,n,0;

buffer: array[0,...,n-1] of item;

in,out: integer:=0,0;

begin

parbegin

producer: begin

repeat

.

.

produce an item in nextp;

.

.

wait(empty);

wait(mutex);

buffer(in):=nextp;

in:=(in+1) mod n;

/* ***************** */

signal(full);

signal(mutex);

/* ***************** */

until false;

end

consumer: begin

repeat

/* **************** */

wait(mutex);

wait(full);

/* **************** */

nextc:=buffer(out);

out:=(out+1) mod n;

signal(mutex);

signal(empty);

consume the item in nextc;

until false;

end

parend

end

a. wait(full)和wait(mutex)互换位置后,因为mutex在这儿是全局变量,执行完wait(mutex),则mutex

赋值为0,倘若full也为0,则该生产者进程就会转入进程链表进行等待,而生产者进程会因全局变量

mutex为0而进行等待,使full始终为0,这样就形成了死锁.

b. 而signal(mutex)与signal(full)互换位置后,从逻辑上来说应该是一样的.

 

 

试利用记录性信号量写出一个不会出现死锁的哲学家进餐问题的算法。

规定在拿到左侧的筷子后,先检查右面的筷子是否可用。如果不可用,则先放下左侧筷子,

等一段时间再重复整个过程。

分析:当出现以下情形,在某一个瞬间,所有的哲学家都同时启动这个算法,拿起左侧的筷

子,而看到右侧筷子不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子……如此

这样永远重复下去。对于这种情况,所有的程序都在运行,但却无法取得进展,即出现饥饿,

所有的哲学家都吃不上饭。

(2) 描述一种没有人饿死(永远拿不到筷子)算法。

考虑了四种实现的方式(A、B、C、D):

A.原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释

放出他所使用过的两支筷子,从而可使更多的哲学家进餐。以下将room 作为信号量,只允

许4 个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入

餐厅的哲学家进入room 的等待队列,根据FIFO 的原则,总会进入到餐厅就餐,因此不会

出现饿死和死锁的现象。

伪码:

semaphore chopstick[5]={1,1,1,1,1};

semaphore room=4;

void philosopher(int i)

{

while(true)

{

think();

wait(room); //请求进入房间进餐

wait(chopstick[i]); //请求左手边的筷子

wait(chopstick[(i+1)%5]); //请求右手边的筷子

eat();

signal(chopstick[(i+1)%5]); //释放右手边的筷子

signal(chopstick[i]); //释放左手边的筷子

signal(room); //退出房间释放信号量room

}

}

B.原理:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。

方法1:利用AND 型信号量机制实现:根据课程讲述,在一个原语中,将一段代码同时需

要的多个临界资源,要么全部分配给它,要么一个都不分配,因此不会出现死锁的情形。当

某些资源不够时阻塞调用进程;由于等待队列的存在,使得对资源的请求满足FIFO 的要求,

因此不会出现饥饿的情形。

伪码:

semaphore chopstick[5]={1,1,1,1,1};

void philosopher(int I)

{

while(true)

{

think();

Swait(chopstick[(I+1)]%5,chopstick[I]);

eat();

Ssignal(chopstick[(I+1)]%5,chopstick[I]);

}

}

方法2:利用信号量的保护机制实现。通过信号量mutex对eat()之前的取左侧和右侧筷

子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的出现。

伪码:

semaphore mutex = 1 ;

semaphore chopstick[5]={1,1,1,1,1};

void philosopher(int I)

{

while(true)

{

think();

wait(mutex);

wait(chopstick[(I+1)]%5);

wait(chopstick[I]);

signal(mutex);

eat();

signal(chopstick[(I+1)]%5);

signal(chopstick[I]);

}

}

 

 

 

第三章

对于本章内的基本调度算法:算法思想、就绪队列的组织、是抢占还是非抢占

FCFS先来先服务调度算法

算法思想:

当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪对垒中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。

FCFS是非抢占式的调度算法。


短作业(进程)优先调度算法

算法思想:

短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法则是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。

短作业调度算法是非抢占式的调度算法。


非抢占式优先权调度算法和抢占式优先权调度算法

算法思想:

非抢占式优先权调度算法:系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成,或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一个优先权最高的进程。

抢占式优先权调度算法:系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度就立即停止当前进程的执行,重新将处理机分配给新到的优先权最高的进程。


静态优先权和动态优先权

算法思想:

静态优先权是在创建进程时确定的,且在进程的整个运行期间保持不变。动态优先权是指在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的。


高响应比优先调度算法

算法思想:

为每个作业引入动态优先权,并使作业的优先级随着等待时间的增加而以速率a提高,则长作业在等待一定的时间后,必然后寄回分配到处理机。该优先权的变化规律可描述为:

优先权=(等待时间+要求服务时间)/ 要求服务事件


基于时间片的轮转调度算法

算法思想:

系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。


多级反馈队列调度算法


算法思想:

       设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之。

       当一个新进程进入内存后,首先将它放入第一个队列的末尾,按FCFS原则排队等待调度。如果一个时间片后进程尚未完成,调度程序便将该进程转入第二个队列的末尾,再同样地按FCFS原则等待调度执行。当一个长作业从第一个队列一次降到第n个队列后,在第n队列中便采取按时间片轮转的方式运行。

       仅当第一队列空闲时,调度程序才调度第二队列中的进程运行。

 

 

典型的动态优先权调度调度算法:高响应比优先度调度算法;典型的实时调度算法:最低松弛度优先调度算法;时间片轮转法中,时间片取值的影响

时间片取值的影响:

       如果选择很小的时间片将有利于短作业,因为它能较快地完成,但会频繁地发生中断、进程上下文的切换,从而增加系统的开销;反之,如果选择太长的时间片,使得每个进程都能在一个时间片内完成,时间片轮转算法便退化为FCFS算法,无法满足交互式用户的需求。

如何确定时间片的大小:

       时间片应略大于一次典型的交互需要的时间。这样可使大多数进程在一个时间片内完成。一般应考虑三个因素:系统对相应时间的要求、就绪队列中进程的数目和系统的处理能力。

 

 

什么是死锁,死锁产生的原因

      所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

      产生死锁的原因:可归结为如下两点:(1)竞争资源。(2)进程间推进顺序非法。

      产生死锁的必要条件:互斥条件,请求和保持条件,不剥夺条件和环路等待条件。

 

 

 死锁的避免----避免死锁的银行家算法,数据结构,算法思想

银行家算法中的数据结构:
① 可利用资源向量 Available
② 最大需求矩阵Max
③ 分配矩阵 Allocation
④ 需求矩阵 Need

三个矩阵间存在下述关系:

Needp[i,j] = Max[i,j] –Allocation[i,j]


算法思想:
(1)如果Request i[j] <= Need[i,j],便转向步骤(2);否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request i[j] <= Available[j],便转向步骤(3);否则,表示尚无足够资源,Pi须等待。
(3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的值:


Available[j]:=Available[j] – Request i[j];
Allocation[i,j]:=Allocation[i,j] + Request i[j];
Need[i,j]:=Need[i,j] – Request i[j];

(4)系统执行安全性算法,减产此次算法分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
安全性算法:
(1)设置两个向量:


① 工作向量Work,表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work:=Available。
② Finish,表示系统是否有足够的资源分配给进程,使之运行完成。开始时限做Finish[i]:=false;当有足够资源分配给进程时,再令Finish[i]:=true。

(2)从进程集合中找到一个能满足下述条件的进程:


① Finish[i] = false;
② Need[i,j] <= Work[j];

若找到,执行步骤(3),否则,执行步骤(4)

(3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:


Work[j]:=Work[j] + Allocation[i,j];
Finish[i]:=true;
go to step 2;
         4)如果所有进程的Finish[i] = true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。

 

 

 

死锁的检测和解除----资源分配图,检测方法、解除方法

资源分配图:

系统死锁可利用资源分配图来描述。改图是由一组节点N和一组边E所组成的一个对偶G=(N1E)。用圆圈代表一个进程,用方框代表一类资源。


检查方法:

我们可以利用把资源分配图加以简化的方法,来检查当系统处于S状态时是否为死锁状态。简化方法如下:

① 在资源分配图中,找出一个既不阻塞又非独立的进程结点Pi。分配资源使Pi运行再释放全部资源,相当于小区Pi所求的请求边和分配边,使之成为孤立的结点。
② Pi释放资源后,使其他进程获取资源运行。这样不断减缓资源分配图
③ 在进程一系列的简化后,若能消去图中所有的边,使所有的进程结点都成为孤立结点,则成该图是可完全简化的。

有关文件已经证明,所有的简化顺序,都将得到相同的不可简化图。S为死锁的充分条件是:当且仅当S状态的资源分配图是不可完全简化的。该充分条件被称为死锁定理。


解除方法:

        

常用解除死锁的两种方法是:① 剥夺资源; ② 撤销进程。

 

 

 

在银行家算法中,若出现下述资源分配情况:

Process Allocation Need Available
P0 0 0 3 2 0 0 1 2 1 6 2 2
P1 1 0 0 0 1 7 5 0
P2 1 3 5 4 2 3 5 6
P3 0 3 3 2 0 6 5 2
P4 0 0 1 4 0 6 5 6
试问:
⑴ 该状态是否安全?
⑵ 若进程P2提出请求Request(1,2,2,2)后,系统能否将资源分配给它?

⑴该状态是安全的,因为存在一个安全序列< P0P3P4P1P2>。下表为该时刻的安全序列表。

资源情况

进程

Work Need Allocation Work+Allocation Finish
P0

P3

P4

P1

P2

1 6 2 2

1 6 5 4

1 9 8 7

1 9 9 11

2 9 9 11

0 0 1 2

0 6 5 2

0 6 5 6

1 7 5 0

2 3 5 6

0 0 3 2

0 3 3 3

0 0 1 4

1 0 0 0

1 3 5 4

1 6 5 4

1 9 8 7

1 9 9 11

2 9 9 11

3 12 14 17

true

true

true

true

true

⑵若进程P2提出上述请求,系统不能将资源分配给它,因为分配之后系统将进入不安全状态。

P2请求资源:P2发出请求向量Request2(1,2,2,2),系统按银行家算法进行检查:
①Request2(1,2,2,2)≤Need2(2,3,5,6);
②Request2(1,2,2,2)≤Available(1,6,2,2);
③系统暂时先假定可为P2分配资源,并修改P2的有关数据,如下表:

Allocation Need Available
2 5 7 6 1 1 3 4 0 4 0 0

可用资源Available(0,4,0,0)已不能满足任何进程的需要。

 

 

 

第四章

逻辑地址和物理地址的概念

   逻辑地址(Logical Address)是指由程式产生的和段相关的偏移地址部分。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);

    物理地址(Physical Address)是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。(假如启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。假如没有启用分页机制,那么线性地址就直接成为物理地址了)

 

 

 

什么是地址重定位(地址变换),什么是静态地址重定位,什么是动态地址重定位

   重定位就是把程序中相对地址变换为绝对地址。通常是把在装入时对目标程序中指令和数据的修改过程称为重定位。有静态重定位和动态重定位两种重定位技术。

    因为地址变换通常是在装入时一次完成的,以后不再改变,故称为静态重定位。

    在运行过程中程序在内存中的位置可能经常要改变,此时就应采用动态运行时装入的方式。动态运行时的装入程序在把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址都仍是相对地址。为使地址转换不影响指令的执行速度,这种方式需要一个重定位寄存器的支持。

 

 

 

什么是虚拟存储器,引入的原因

所谓虚拟存储器,是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储系统。其逻辑容量由内存容量和外存容量之和所决定,其运行速度接近于内存速度,而每位的成本却又接近于外存。


引入的原因:

① 有的作业很大,要求的内存空间超过了内存总容量,不能装入内存,至使该作业无法运行。
② 有大量作业要求运行,但由于内存容量不足以容纳所有这些作业,只能将少数作业装入内存让它们运行,而将其他大量的作业驻留在外存上等待。
③ 常规存储器管理方式:一次性;驻留性
④ 局部性原理的提出:时间局限性;空间局限性。
一个解决方式是从逻辑上扩充内存容量,这正是虚拟存储技术所要解决的主要问题。

 

 

 

 对于分区、分页、分段、段页式(/请求)存储管理方式,掌握:

(1) 基本思想

(2) 存储管理使用的数据结构(空闲空间管理的/作业占用空间管理的)

(3) 逻辑地址的格式,地址变换的时间(动态/静态)、方法

(4) 存储分配和存储回收过程

(5) 是否能实现虚拟存储;如果能,如何实现

(6) 其他特点:是否存在碎片问题(原因);是否能实现存储保护(如何实现)

 

 

 

 

何为静态链接?何谓装入时动态链接和运行时动态链接?

a.静态链接是指在程序运行之前,先将各自目标模块及它们所需的库函数,链接成一个完整的装配模块,以后不再拆开的链接方式。

b.装入时动态链接是指将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的一种链接方式,即在装入一个目标模块时,若发生一个外部模块调用事件,将引起装入程序去找相应的外部目标模块,把它装入内存中,并修改目标模块中的相对地址。

c.运行时动态链接是将对某些模块的链接推迟到程序执行时才进行链接,也就是,在执行过程中,当发现一个被调用模块尚未装入内存时,立即由OS去找到该模块并将之装入内存,把它链接到调用者模块上。

 

虚拟存储器有哪些特征?最本质的特征是什么?

对换性,多次性,虚拟性三大特征。虚拟性是最本质的特征

 

第五章

  I/O系统的组成(I/O设备、控制器、通道、总线)

 

设备分类情况,什么是虚拟设备,引入的目的

按设备的使用特性分类:存储设备;输入/输出设备
按传输速率分类:低速设备;中速设备;高速设备
按信息交换的单位分类:块设备;字符设备
按设备的共享属性分类:独占设备;共享设备;虚拟设备

虚拟设备:通过虚拟技术将一台独占设备变换为若干台逻辑设备,供若干个用户(进程)同时使用。

引入的目的:将慢速的独占设备改造成多个用户可共享的同类设备,提高设备的利用率

 

 

   OS在设备管理中引入的相关技术--中断技术、DMA技术、通道技术、总线技术、缓冲技术、Spooling技术(Spooling系统,可以用来实现虚拟设备)--组成和工作原理

中断技术:


组成:

CPU,I/O控制器

工作原理:

① CPU:向控制器发出I/O命令,然后继续执行计算任务;
② I/O控制器:执行I/O命令,控制外部设备完成指定的I/O操作,然后向CPU发送中断信号;
③ CPU:暂停正在执行的任务,处理I/O中断,完成后再返回,继续执行原来的任务。

DMA技术:


组成:

CPU,内存,DMA控制器(主机与DMA控制器的接口;DMA控制器域块设备的接口;I/O控制逻辑;命令/状态寄存器CR;内存地址寄存器MAR;数据寄存器DR;数据计数器DC)


工作原理:

①当处理器需要读/写一整块数据时,给DMA控制单元发送一条命令,包含:一次读或写的指令、I/O设备的地址、开始读或写的主存地址、需要传送的数据长度等;
②处理器发送完命令后就可处理其它事情;
③DMA控制器自己独立管理整块数据的传送;
④当这个过程完成后,它会向处理器发一个中断请求。处理器只在一块数据开始传送和传送结束时关注一下I/O操作即可。
通道技术:


组成:

每条通道指令包含的信息是:操作码、内存地址、计数、程序结束位、记录结束位。


工作原理:

把DMA方式中CPU以数据块为单位对读/写任务的干预,减少为以一次读/写任务及有关的控制和管理为单位的干预。 同时,又可实现CPU、通道和I/O设备三者的并行操作,从而更有效地提高整个系统的资源利用率。

缓冲技术:


组成:

单缓冲,双缓冲,循环缓冲,缓冲池

工作原理:

在CPU与外设之间建立缓冲区,用于暂存CPU与外设间交换的数据,从而缓冲CPU与外设间速度不匹配的矛盾。

Spooling技术


组成:

? 在磁盘上开辟输入井和输出井;
? 在内存中开辟输入缓冲区和输出缓冲区;
? OS要有相关的管理进程:SPi,模拟脱机输入;SPo模拟脱机输出。


工程原理:

? 脱机输入和脱机输出
? 在多道环境下,可以用OS的一道管理程序实现从I/O设备输入数据并存放到磁盘上,模拟脱机输入;用OS的另一道管理程序将磁盘上的数据输出到I/O设备上,模拟脱机输出;这种假脱机I/O操作称为Spooling技术。

Spooling是一种虚拟设备技术、一种资源转换技术。

 

 

设备分配的原则,什么是设备独立性(与设备无关性)

原则:要充分发挥设备的使用效率,尽可能地让设备忙碌,但又要避免由于不合理的分配方法造成进程死锁;

        设备独立性,即应用程序独立于具体使用的物理设备。为了实现设备独立性而引入了逻辑设备和物理设备这两个概念。在应用程序中, 使用逻辑设备名称来请求使用某类设备;而系统在实际执行时, 还必须使用物理设备名称。因此,系统须具有将逻辑设备名称转换为某物理设备名称的功能,这非常类似于存储器管理中所介绍的逻辑地址和物理地址的概念。

 

 

什么是磁盘调度,磁盘调度的目标,磁盘调度算法(FCFSSSTFSCAN)的原理、优先考虑的因素

磁盘调度就是当有多个进程同时要求访问磁盘时,安排对磁道访问请求的执行顺序。
磁盘调度的目标是使磁盘的平均寻道时间最少。

先来先服务FCFS:

根据进程请求访问磁盘的先后次序进行调度。

最短寻道时间优先SSFT:

要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。

扫描算法SCAN:

不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。

 

 

为什么要引入设备独立性?如何实现设备独立性?

  引入设备独立性,可使应用程序独立于具体的物理设备,是设备分配具有灵活性。另外容易实现I/O重定向。

    为了实现设备独立性,必须在设备驱动程序之上设置一层设备独立性软件,用来执行所有I/O设备的公用操作,并向用户层软件提供统一接口。关键是系统中必须设置一张逻辑设备表LUT用来进行逻辑设备到物理设备的映射,其中每个表目中包含了逻辑设备名、物理设备名和设备驱动程序入口地址三项;当应用程序用逻辑设备名请求分配I/O设备时,系统必须为它分配相应的物理设备,并在LUT中建立一个表目,以后进程利用该逻辑设备名请求I/O操作时,便可从LUT中得到物理设备名和驱动程序入口地址。(OS实现设备独立性的方法:设置设备独立性软件(P164)、配置逻辑设备表,实现逻辑设备到物理设备的映射。)

 

 

什么是虚拟设备?其实现所依赖的关键技术有哪些?

   虚拟设备是指通过虚拟技术,可将一台独占设备变换成若干台逻辑设备,供若干个用户(进程)同时使用。由于多台逻辑设备实际上并不存在,而只是给用户的一种感觉,因此被称为虚拟设备。其实现所依赖的关键技术是SPOOLing技术。

 

试说明SPOOLing系统的组成。 
? 输入井和输出井;
? 输入缓冲区和输出缓冲区;
? 输入进程SPi和输出进程SPo。

第六章

什么是文件的逻辑结构,记录式文件的逻辑结构有哪几种

文件的逻辑结构:这是用用户观点出发所观察到的文件组织形式,是用户可以直接处理的数据及其结构,它独立于文件的物理特性,又称为文件组织。

记录式文件的逻辑结构:
1、有结构文件:
记录的长度可分为定长和不定长两类:定长记录;变长记录
根据用户和系统管理上的需要,可采用多种方式来组织这些记录,形成下述的几种文件:顺序文件;索引文件;索引顺序文件。
2、无结构文件:
流式文件,其长度以字节为单位。

 

什么是文件的物理结构,文件的物理结构(外存分配方式)有哪几种,每一种文件物理结构的实现方法,需要用到的数据结构,目录中如何记录文件地址

又称为文件的存储结构,是指文件在外存上的存储组织形式。这不仅与存储介质的存储性能有关,而且与所采用的外存分配方式有关。


外存的分配方式:


连续分配(P213)

实现方式:

为每个文件分配一组位置相邻接的盘块(物理地址连续的外存空间),文件中的逻辑页被顺序地存放到相邻的物理盘块中。这保证了文件中的逻辑顺序与文件占用盘块顺序的一致性。这样物理结构的文件称为顺序文件。

每个文件都从分配给它的一个盘块的第一个字节开始存放。


记录文件地址:

在文件的目录中,存放该文件的第一个记录所在的盘块号和文件的长度(共占多少块)


链接分配(P215)

实现方式:

为每个文件分配一组位置离散的盘块,每个盘块中存放文件的一个逻辑页。通过在每个盘块上设置一个指针,将属于同一个文件的盘块顺序地链接在一起,链接的顺序和文件的逻辑顺序一致。这样物理结构的文件称为链接文件。

链接方式有隐式链接和显式链接两种。


记录文件地址:

显示链接:每个文件的第一个盘块的编号存放在文件目录中;文件的其他盘块的编号存放在FAT中;

隐式链接:目录和FAT一起记录了哪些盘块分给了这个文件以及这些盘块中内容的逻辑顺序。


索引分配(P221)

实现方式:

    为每个文件分配一组位置离散的盘块,为每个文件建立一个物理结构的索引表,记录分配给该文件的物理盘块,以及这些盘块和文件逻辑顺序的对应关系。建立一个文件时,要初始化它的索引表,并将索引表的地址放到文件的目录中。打开一个文件时,文件的索引表也被同时读入内存。
记录文件地址:

    单级索引:每个文件一张索引表,这张索引表放在一个盘块中

    多级索引:对于一个长文件的索引表(内容同上,但单个盘块放不下),可以将它存放在若干个离散的盘块中。再为这些索引块建立一个索引表,存放在一个盘块中,这样就形成了一个文件的两级索引。

    混合索引:文件系统混合使用多种分配方式。文件的目录中可以存放不同形式的地址信息:
? 直接地址,文件数据的盘块号;
? 一次间接地址,文件索引块的盘块号;
? 二次间接地址,文件二级索引块的盘块号。

 

 

单级、两级和多级(树型)目录结构的构成,逐步能实现的功能(特点)

单级目录结构:
构成:
为整个文件系统建立一张目录表,每个文件占一个目录项。
功能:
单级目录的优点是简单且能实现目录管理的基本功能—-按名存取。
缺点:(1)查找速度慢;(2)不允许重名;(3)不便于实现文件共享。


两级目录结构:
构成:
    系统给每一个用户建立一张独立的用户目录表(UFD),用来存放该用户所有文件的FCB, UFD的结构与单级目录表相似,它以一个目录文件的形式存在磁盘上;

    整个文件系统有一张主目录表(MFD),其中的每一个表目(一行)用来存放一个UFD文件的名字、大小、存放位置等信息(目录文件的FCB)。这样就形成了两级目录。


功能:
? 优点:解决了文件的重名问题和文件共享问题,提高搜索速度,查找时间降低
? 缺点:妨碍了用户间的文件共享,增加了系统开销


多级目录结构:
构成:
将两级目录的这种层次结构推广,就形成多级目录。

在多级目录结构中,MFD演变为文件系统的根目录,在根目录中可以存放一般文件的FCB,也可以存放目录文件的FCB;每一个目录文件对应一张目录表,其中既可以存放一般文件的FCB,也可以存放目录文件的FCB。
功能:
? 优点:
层次结构清晰,便于管理和保护;有利于文件分类;解决重名问题;提高文件检索速度;能进行存取权限的控制
? 缺点:
查找一个文件按路径名逐层检查,由于目录文件和普通文件都放在外存,多次访盘,影响速度。

 

 

磁盘空间的组织管理方法--空白文件目录、空闲链表、位示图、成组链--每种方法的数据结构,存储分配和回收的方法

空闲表法:

为每个文件分配一块连续的存储空间按,即系统也为外存上的所有空闲区建立一张空闲表,每个空闲区对应于一个空闲表项,其中包括表项序号、该空闲区的第一个盘块号、该区的空闲盘块数等信息。

空闲链表法:

1、空闲块链法:将磁盘上所有的空闲块拉成一条链,在链首设一个分配指针,在链尾设一个回收指针。空闲块的分配与回收分别在链的首尾进行。
2、空闲区链法:将磁盘上所有的空闲区拉成一条链,空闲区中要记录本区包含的空闲块数。存储空间的分配与回收与内存的动态分区分配类似。

位示图法:

空闲块的组织:在内存中划出连续若干个字,为每一个文件存储器建立一张位示图。磁盘的每一个物理块都有一个二进制位与之对应。该位值是“0”为空闲、“1”为已分配。


存储空间的分配与回收

? 位示图需要多少个字,决定于盘块数。
? 申请物理块时,可以在位示图中顺序查找一个或一组其值为0的位,计算并返回每位对应的物理块号,分配物理块,并将位示图中对应的位置“1”; P130
? 回收物理块时,将回收的物理块号逆计算,得出块在位示图中的位置,并将对应的位置“0”。
成组链表法:
? 将系统的所有空白块每N个组成一组(例如N=100;这N个空白块位置不必连续);
? 将所有的空白块组链接起来。链接的方法是:每一组的第一个空白块存放前一组的盘块总数和包含的每一个盘块号;
 
 
什么是文件保护,文件保护的措施主要有哪些
  文件的保护是指防止文件主或其他用户无意或有意破坏文件内容。也指防止系统出现异常、病毒或其他自然因素对文件内容的破坏。
文件保护采取的主要措施有:
(1) 通过存取控制机制,来防止人为因素所造成的文件不安全性;
(2) 通过磁盘容错技术,来防止磁盘部分故障造成的文件不安全性;
(3) 通过后备系统,来防止自然因素造成的整个文件存储器的不安全性。
 
 
采用单级目录能否满足对目录管理的主要要求?为什么?
  采用单级目录不能完全满足对目录管理的主要要求,只能实现目录管理最基本的功能即按名存取。由于单级目录结构采用的是在系统只配置一张目录表用来记录系统中所有文件的相关信息,因此此目录文件可能会非常大,在查找时速度慢,另外不允许用户文件有重名的现象,再者由于单级目录中要求所有用户须使用相同的名字来共享同一个文件,这样又会产生重名问题,因此不便于实现文件共享。
 
 
 

有一计算机系统利用下图所示的位示图来管理空闲盘块。盘块的大小为1KB,现要为某文件分配两个盘块,试说明盘块的具体分配过程。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
3 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
4 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1
5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

盘块的具体分配过程如下:

(1)从位示图中顺序扫描空闲盘块,发现第一个为0的二进制数在行为i=3,列为j=3处;
(2)将上面找到的行列号转换为对应的盘块号:b=(3-1)*16+3=35;
(3)修改位示图,把map[3,3]处设置为1,并将盘块分配给文件;

重复上述步骤分配第二个空闲盘块,即map[4,7],算出对应的盘块号为55,设置map[i,j]=1并将盘块分配出去。

 

 

 

2,某操作系统的磁盘文件空间共有500块,若用字长为32位的位示图管理盘空间,试问:

(1)  位示图需要多少个字?

(2)  i字第j位对应的块号是多少?

(3)  并给出申请/归还一块的流程图

解:(1)设位示图需要x个字

32x=500

x=15.63

x=16

所以位示图需要16个字

2)第i字第j位对应的块号为:

    块号   =32i+ji=0,1,2……….15,j=0,1,2,……….31,M=0,1,2…….499

 

(3)申请/归还的流程图为:

申请流程图描述为:

设申请块号为M,则对应的位示图的位置为

i=M/32

j=M%32

所以块号M对应的是第i个字的第j位,若该位为1,表示已经分配,申请失败

若该位为0,表示没有分配,分配块号成功,分配之后将该位置位1

归还流程图表示为:

根据块号M计算出对应的i,j

i=M/32

j=M%32

将第i个字的第j位置为0,归还该块的物理空间

 

空闲磁盘空间的管理常采用哪几种方式?UNIX系统采用的是何种方式?
空闲磁盘空间的管理常采用以下几种方法:(1)空闲表法,属于连续分配方式,它与内存管理中的动态分区分配方式相似。(2)空闲链表法,将所有空闲盘区链接成一条空闲链。根据构成链的基本元素不同,可分为空闲盘块链和空闲盘区链。(3)位示图法,利用二进制的一位来表示磁盘中每一个盘块的使用情况,磁盘上的所有盘块都有一个二进制位与之对应,从而由所有盘块所对应的位构成一个集合,即位示图。(4)成组链接法,结合空闲表法和空闲链表法而形成。UNIX系统采用的是成组链接法。

没有更多推荐了,返回首页