【操作系统】绪论、进程控制、处理机调度与死锁

第一章 绪论


1.1 操作系统的定义

操作系统是直接控制和管理计算机硬件和软件资源,合理地对各类作业进行调度,以方便用户使用的程序集合


1.2 操作系统的目标
  • 方便性 -> 作用(OS作为用户与计算机硬件系统之间的接口)
  • 有效性 ->作用(OS作为计算机系统资源的管理者)
  • 可扩充性
  • 开放性

1.3 操作系统的作用
  • OS作为用户与计算机硬件系统之间的接口
    • 联机命令接口
    • 程序接口(系统调用)
    • 图形界面接口
  • OS作为计算机系统资源的管理者
    • 处理机管理
    • 存储器管理
    • 文件管理
    • 设备管理
  • OS实现了对计算机资源的抽象

【例】 用户可以通过(B)两种方式来使用计算机

A、命令接口和函数

B、命令接口和系统调用

C、命令接口和文件管理

D、设备管理方式和系统调用


1.4 操作系统的发展过程
1.4.1 人工操作系统
1.4.2 批处理系统
  • 单道批处理系统

    • 自动性

      在顺利的情况下,磁带上的一批作业能自动地逐个完成,而无须人工干预

    • 顺序性

      先调入内存地作业先完成

    • 单道性

      内存中只有一道程序运行

  • 多道批处理系统

    从后备队列中选一批作业调入内存,内存中的多道程序轮流占用CPU、交替执行

优点

  • 资源利用率高
  • 系统吞吐量大

缺点

  • 用户响应时间长
  • 不提供人机交互能力
1.4.3 分时操作系统

把处理机的运行时间分成很短的时间片,按时间片轮流把处理器分配给各联机作业使用

特点

  • 同时性(多路性)

    允许多个终端用户同时使用一台计算机

  • 交互性

    用户通过终端采用人机对话的方式直接控制程序运行

  • 独立性

    系统中多个用户可以彼此独立地进行操作,互不干扰,单个用户感觉不到别人也在使用这台计算机

  • 及时性

    用户请求能在很短时间内获得响应。时间片轮转

1.4.4 实时操作系统

(快速的响应时间,有限的交互能力,高可靠性)

虽然分时操作系统能够使用户作业在短时间内得到响应,但是在一些特定场合,需要系统能对外部信号在规定的时间(比时间片还短的时间)内做出处理

  • 硬实时操作系统
  • 软实时操作系统
多路性独立性及时性交互性可靠性
批处理系统一般
分时系统多终端服务可靠
实时系统多路采集,多路控制最好一般高度可靠

【例】与单道程序系统相比,多道程序系统的优点是(D)

Ⅰ、CPU利用率高 Ⅱ、系统开销小 Ⅲ、系统吞吐量大 Ⅳ、I/O设备利用率高

A、仅Ⅰ、Ⅲ

B、仅Ⅰ、Ⅳ

C、仅Ⅱ、Ⅲ

D、仅Ⅰ、Ⅲ、Ⅳ

【例】有两个程序,程序A依次使用CPU计10s、设备甲计5s、CPU计5s、设备乙计10s、CPU计10s;程序B依次使用设备甲计10s、CPU计10s、设备乙计5s、CPU计5s、设备乙计10s。在单道程序环境下先执行程序A再执行程序B,CPU的利用率是多少?在多道程序环境下,CPU的利用率是多少?

单道下,CPU的运行时间为(10+5+10)s + (10+5)s = 40s,两个程序运行总时间为40s + 40s = 80s,因此利用率为40/80 = 50%

多道环境下,CPU运行时间为40s,两个程序运行总时间为45s,因此利用率为40/45=88.9%


1.5 操作系统的特征
  • 并发(最重要的特征):两个或两个以上的程序在同一时间间隔内得到执行。
  • 共享(以并发为条件的):指系统中的资源供内存中的多道程序所共同使用。具体又分为:互斥共享方式,同时访问方式。
  • 虚拟:指通过某种技术把一个物理实体变成若干个逻辑上的对应物。
  • 异步:多道程序环境下,各个进程是以不可预知的速度执行的,但只要运行环境不变,作业经多次运行都会有相同的结果,这就是进程的异步性。

简答题:请简述并发和并行的区别

并发是多个程序在同一时间间隔内执行的,这些任务在同一个处理器上交替运行,由于切换速度非常快,给人一种同时进行的错觉。并发的关键在于任务调度,它使得多个任务看似同时进行,但实际上是在互相抢占资源。

并行是多个程序是同一时刻真正的同时运行这通常要求系统具有多个处理器或者一个多核的CPU,每个任务在不同的处理器或CPU核心上运行,互不干扰,不共享同一资源。

【例】现代操作系统中最基本的两个特征是(B)

A、并发和不确定

B、并发和共享

C、共享和虚拟

D、虚拟和不确定

【例】单处理系统中,可并行的是(D)

Ⅰ、进程与进程 Ⅱ、处理机与设备 Ⅲ、处理机与通道 Ⅳ、设备与设备

A、Ⅰ、Ⅱ、Ⅲ

B、Ⅰ、Ⅱ、Ⅳ

C、Ⅰ、Ⅲ、Ⅳ

D、Ⅱ、Ⅲ、Ⅳ

1.6操作系统的用户态和和心态

用户态(目态):运行于用户态的代码要受到处理器的诸多检查,它们只能执行用户程序,只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址。

核心态(管态):在处理器的存储保护中,核心态,或者特权态是操作系统内核所运行的模式。运行在该模式的代码,可以无限制地对系统存储、外部设备进行访问。

用户态切换到和心态的3种方式

  • 系统调用

  • 异常

  • 外围设备的中断

其中,系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。


第二章 进程的描述与控制

程序顺序执行时的特征

  • 顺序性
  • 封闭性
  • 可再现性

程序并发执行时的特征

  • 间断性
  • 失去封闭性
  • 不可再现性
2.1 进程的描述
2.1.1进程的定义

程序关于某个数据集合的一次执行过程

2.1.2进程的特征
  • 结构特征(PCB + 程序 + 数据)
  • 动态性(最基本的特征)
  • 并发性
  • 独立性
  • 异步性

2.2进程的状态转换

在这里插入图片描述

2.2.1三态转换图:
2.2.2引入挂起态后的五态转换图

在这里插入图片描述

【例】系统进程所请求的一次I/O操作完成后,将使进程状态从(D)

A、运行态变为就绪态

B、运行态变为阻塞态

C、就绪态变为运行态

D、阻塞态变为就绪态

2.2.3引入挂起的原因
  • 终端用户的需要
  • 父进程的请求
  • 负荷调节的需要
  • 操作系统的需要

2.3PCB的作用
  • 作为独立运行的基本单位的标志
  • 能实现间断性运行方式
  • 提供进程管理所需要的信息
  • 提供进程调度所需要的信息
  • 实现与其他进程的同步与通信

2.4进程控制
2.4.1三对原语

创建过程

(1)申请空白PCB

(2)为新进程分配其运行所需要的资源

(3)初始化PCB

(4)插入就绪队列

终止过程

(1)根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态

(2)若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度表示为真

(3)若该进程还有子孙进程,还应将其所有子孙进程也都予以终止,以防它们成为不可控的进程

(4)若被终止进程所拥有的全部资源或者归还给其父进程,或者归还给操作系统

(5)将被终止进程(PCB)从所在队列中移出,等待其他程序来搜集信息

阻塞

引起阻塞的原因

(1)请求资源失败

(2)等待某种操作的完成

(3)新数据尚未到达

(4)等待新任务的到达

阻塞过程

(1)将PCB中的状态由执行改为阻塞,并将PCB插入对应的阻塞队列

(2)将CPU的调度置为真

唤醒

唤醒过程

(1)把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的状态由阻塞改为就绪

(2)将该PCB插入到就绪队列中去

挂起

(1)若为活动就绪,改为静止就绪,若为活动堵塞,改为静止阻塞

(2)把该进程的PCB复制到某指定的区域

(3)若被挂起的进程正在执行,转向调度程序重新调度

激活

(1)将进程从外存调入内存,检查该进程的状态,若为静止就绪,改为活动就绪;若为静止阻塞,改为活动阻塞

(2)插入就绪队列时检查是否被调度


2.5进程同步
2.5.1制约关系
  • 间接相互制约关系,互斥访问临界资源
  • 直接相互制约关系,相互合作
2.5.2信号量机制

同步机制应遵循的规则

  • 空闲让进
  • 忙则等待
  • 有限等待
  • 让权等待

【例】下列准则中,实现临界资源互斥机制的必须遵循的是(C)

Ⅰ、两个进程不能同时进入临界区

Ⅱ、允许进程访问空闲的临界区

Ⅲ、进程等待进入临界区的时间是有限的

Ⅳ、不能进入临界区的执行态进程立即方弃CPU

A、仅Ⅰ、Ⅳ B、仅Ⅱ、Ⅲ C、仅Ⅰ、Ⅱ、Ⅲ D、仅Ⅰ、Ⅲ、Ⅳ

记录型信号量

typedef struct{
    int value;
    struct process_control_block *list;
}semaphore;
wait(semaphore *S){
    S->value--;
    if(S->value < 0) block(S->list);
}
signal(semaphore *S){
    S->value++;
    if(S->value <= 0) wakeup(S -> list);
}

value 大于0时,表示可用资源数目

value 小于0时,其绝对值表示阻塞进程的数量

AND型信号量(一次性申请一次性释放)

Ssignal(S1, S2,, Sn){
	while(TRUE){    
		for (i=1; i<=n; i++) {
         		   Si++ ;
         		   Remove all the process waiting in the queue associated with Si into the ready queue
  		 }
	}
  }
Swait(S1,S2,...,Sn){
    while(TRUE){
        if(Si>= 1 &&...&& Sn >= 1){
            for(i = 1; i <= n; i++) Si--;
            break;
        }
        else{
            Place the process in the waiting queue associated with the first S1 found with Si < 1,and set the program count of this process to the beginning of Swait operation
        }
    }
}

信号量集

Swait(S1,t1,d1,...,Sn,tn,dn);
Ssignal(S1,d1,...,Sn,dn);

ti为下限值,要求Si >= ti,否则不予分配,一旦允许分配,进程对该资源的需求值为di

【例】有三个进程共享同一程序段,而每次只允许两个进程进入该程序段,若用PV操作同步机制,则信号量S的取值范围是(A)

A、2,1,0,-1

B、3,2,1,0

C、2,1,0,-1,-2

D、1,0,-1,-2

2.5.3信号量的应用
  • 利用信号量实现进程互斥

    semaphore mtuex = 1;
    
    Pa(){
        while(1){
            wait(mutex);
            临界区;
            signal(mutux);
            剩余区;
        }
    }
    
    Pb(){
        while(1){
            wait(mutex);
            临界区;
            signal(mutux);
            剩余区;
        }
    }
    
  • 利用信号量实现前驱关系

在这里插入图片描述

p1(){S1;signal(a);signal(b);}
p2(){wait(a);S2;signal(c);signal(d);}
p3(){wait(b);S3;signal(e);}
p4(){wait(c);S4;signal(f);}
p5(){wait(d);S5;signal(g);}
p6(){wait(e);wait(f);wait(g);S6;}
main(){
    semaphore a,b,c,d,e,f,g;
    a.value = b.value = c.value = d.value = e.value = f.value = g.value = 0;
    cobegin
        p1();p2();p3();p4();p5();p6();
    coend
}
2.5.4 三个经典问题
  • 生产者-消费者问题

用记录型信号量解决

Int in=0,out=0;
Item buffer[n];
Semaphore mutex=1,empty=n,full=0;
Void producer(){ 
 	do{
        生产一个产品放入nextp;
        wait(empty);
        wait(mutex);
        buffer[in]=nextp;
        in=(in+1) % n;
        signal(mutex);
        signal(full);
	}while(TRUE)
}

Void consumer(){ 
    do{
           wait(full);
           wait(mutex);
           nextc =buffer[out];
           out =(out+1) mod n;
           signal(mutex);
           signal(empty);
           消费 nextc中的产品;                        
        }while(TRUE)
}

Void main(){
	cobegin
	    proceducer();
 	    consumer();
	coend
}

利用AND型信号量解决

Int in=0, out= 0;
Item buffer[n];
semaphore  mutex=1,empty=n,full=0;
Void producer(){ 
 	do{
        生产一个产品放入nextp;Swait(empty, mutex);
        buffer[in]=nextp;
        in=(in+1) mod n;
        Ssignal(mutex, full);
	}while(TRUE)
}

Void consumer(){ 
    do{
		Swait(full, mutex);
        nextc:=buffer[out];
        out=(out+1) mod n;
        Ssignal(mutex, empty);
        消费产品nextc;                        
      }while(TRUE)
}

Void main(){
	cobegin
	    proceducer();
 	    consumer();
	coend
}

【例】进程A和进程B通过共享缓冲区协作完成数据处理,进程A负责产生数据并放入缓冲区,进程B从缓冲区读数据并输出。进程A和进程B之间的制约关系是©

A、互斥关系

B、同步关系

C、互斥和同步关系

D、无制约关系

  • 哲学家进餐问题

利用记录型信号量解决

semaphore chopstick[5]={1,1,1,1,1};
第i 位哲学家的活动可描述为:
      do{
          wait(chopstick[ i]);
          wait(chopstick[ ( i +1) mod 5] );
     …
     eat;signal(chopstick[ i ]);
          signal(chopstick[(i +1)mod 5]);
     …
     think;
      }while(TRUE);

假如五位哲学家同时饥饿而各自拿起左边的筷子,会使五个信号量均为0,都等待右手边哲学家释放筷子,因此会引起死锁

解决方案:①至多只允许四位哲学家同时去拿左边的筷子

​ ②仅当哲学家的左右筷子均可用时,才允许他拿起筷子进餐

​ ③规定奇数号哲学家先拿左边的筷子,再拿右边的筷子,偶数号哲学家相反

奇偶号哲学家用记录型信号量实现

philosopher(int i){
    if(i % 2 == 0){
        wait(chopstik[i]);
        wait(chopstick[(i + 1) % 5]);
    }else{
        wait(chopstick[(i + 1) % 5]);
        wait(chopstik[i]);
    }
    eat();
    signal(chopstick[i]);
    signal(chopstick[(i + 1) % 5]);
}

利用AND信号量解决

semaphore chopstick[5]={1,1,1,1,1};
Philosopher i
      do{
         think;
         Swait(chopstick[(i+1)mod 5],chopstick[i ]);
         eat;
         Ssignal(chopstick[(i+1)mod 5], chopstick[i ] );     
     }while(TRUE)
  • 读者-写者问题

    读读共享、写写互斥、写读互斥

    利用记录型信号量解决

    semaphore rmutex=1, wmutex =1;
    int readcount =0;
    Void Reader(){
    	do{
            wait(rmutex);
            if (Readcount==0) 
    			wait(wmutex);
            Readcount ++;
            signal(rmutex);
            …
            读;wait(rmutex);
            Readcount - -;
            if (Readcount==0) 
    			signal(wmutex);
             signal(rmutex);
          }while(TRUE);
    }
    Void writer(){
         do{
             wait(wmutex);;
             signal(wmutex);
         }while(TRUE);
    }
    
    Void main(){
       Cobegin
           reader();  writer();
       Coend
    }
    

    第一次读要wait(wmutex)为了把写进程排除在外,只要有一个读者进程,写进程就无法进入

    但该程序对读进程优先,对写进程是不公平的

    利用信号量集解决

int RN;
semaphore  L=RN, mx= 1;
Void reader() {
    do{
        Swait(L, 1, 1);
        Swait(mx, 1, 0);
        …
        读;Ssignal(L, 1);
     }while(TRUE)
 }
Void writer(){ 
   do{
       //前半句mx,1,1,写进程分配一个信号量,之后的写进程无法再执行;后半句L,RN,0,一旦有读进程度过,L就会小于下限值RN,写进程无法进行
       Swait(mx, 1, 1; L, RN, 0);;
       Ssignal(mx, 1);
   }while(TRUE)
}
Void main(){
   cobegin
   reader();  writer();
   Coend
}

2.6进程通信
  • 低级通信(对用户不透明)

  • 高级通信

    • 共享存储器系统

      在存储器中划出一块共享存储区,诸进程间实现通信

    • 消息传递系统

      进程间的数据交换以格式化的消息(Message)为单位,程序员利用系统提供的一组通信命令进行通信

    • 管道通信

      从管道读数据是一次性操作,数据一旦被读取,就释放空间以便写更多数据。普通管道只允许单向通信,若要实现父子进程双向通信,则需要定义两个管道


2.7线程

线程可以与同属一个进程的其他线程共享所拥有的全部资源

注意:

进程可以申请和拥有系统资源,线程只能共享所属进程的资源

【例】下面的说法中,正确的是©

A、不论是系统支持的线程还是用户级线程,其切换都需要内核的支持

B、线程是资源分配的单位,进程是调度和分派的单位

C、不管系统中是否有线程,进程都是拥有资源的独立单位

D、再引入线程的系统中,进程仍是资源调度和分派的基本单位

关于A的理解:假如一个内核级线程映射为多个用户线程,那么其切换不需要内核的支持


第三章 处理机调度与死锁

3.1处理机调度的层次
  • 高级调度

    又称作业调度、长程调度、接纳调度

    作用于批处理系统中作业从后备队列调入内存

  • 中级调度

    又称内存调度,将内存中暂时不用的进程调至外存等待,当内存又稍有空闲时,将外存中的已具备条件的就绪进程再调入内存

  • 低级调度

    又称进程调度或短程调度,调度对象为进程

    引起进程调度的原因

    • 非抢占方式
      • 执行完毕
      • 自我阻塞
      • 被迫阻塞
      • 执行某种原语
    • 抢占方式
      • 优先权原则
      • 短作业优先原则
      • 时间片原则

3.2衡量指标

CPU的利用率 = CPU有效工作时间 / (CPU有效工作时间 + CPU空闲等待时间)

周转时间:外存后备队列的等待时间 + 就绪队列的等待时间 + CPU上的运行时间 + 阻塞队列上的等待时间

平均周转时间: 周转时间总和 / 进程数

带权周转时间:周转时间 / 运行时间

平均周转时间:带权周转时间总和 / 进程数


3.3作业调度
  • 先来先服务调度算法(FCFS)

    利于CPU繁忙型作业,不利于I/O繁忙型作业

    不区分抢占和非抢占

  • 短作业优先调度算法(SJF)

    短作业指运行时间的长短

    对长作业非常不利

    必须预知作业的运行时间

    区分抢占和非抢占

  • 优先级调度算法(PSA)

    确定优先权的依据

    ​ 进程类型

    ​ 进程对资源的需求

    ​ 用户需求

  • 高响应比优先调度算法(HRRN)

    非抢占式调度算法

    响应比 = (等待时间 + 要求服务时间) / 要求服务时间

【例】
在这里插入图片描述

在这里插入图片描述


3.4进程调度
  • 轮转调度算法

    让就绪队列上的每个进程每次仅运行一个时间片

  • 优先级调度算法

    • 非抢占式优先级调度算法
    • 抢占式优先级调度算法
  • 多队列调度算法

    不同队列采取不同的调度策略

  • 多级反馈队列调度算法

    设置多个就绪队列,在优先级越高的队列中,其时间片越小

    每个队列都采用FCFS算法

    按队列优先级调度

先来先服务短作业优先高响应比优先时间片轮转多级反馈队列
能否是可抢占
能否是不可抢占不能
优点公平,实现简单,利于CPU繁忙型平均等待时间最少,效率最高兼顾长短作业兼顾长短作业兼顾长短作业,有较好的响应时间,利于终端型作业和短批处理作业
缺点不利于短作业,不利用I/O繁忙型长作业会饥饿,估计时间不易确定,未考虑紧迫程度计算响应比的开销大平均等待时间较长,上下文切换浪费时间
尤其适用于作业调度,批处理系统分时系统相当通用
能否用于作业调度
能否用于进程调度

【例】为什么说多级反馈队列调度算法能较好的满足各类用户的需要?

对终端型用户来说,由于它们提交的作业大多属于交互型作业,作业通常较小,系统只能能使这些作业在第一级队列规定的时间片内完成,便可使终端型作业用户感到满意;对于短批处理作业用户而言,它们的作业就像终端型作业一样,若仅在第一级队列中执行一个时间片即可完成,便可获得与终端型作业一样的响应时间,对于稍长的作业,通常也只需在第二级队列和第三级队列各执行一个时间片即可完成,其周转时间仍然较短;对于长批处理作业用户而言,它们的长作业将依次在第1,2,…,n级队列中运行,然后按时间片轮转方式运行,用户不必担心其作业长期得不到处理


3.5实时调度
  • 非抢占式调度算法
  • 抢占式调度算法
    • 基于时钟中断的抢占式优先级调度算法
    • 立即抢占的优先级调度算法

最早截止时间优先EDF

最低松弛度优先LLF(用于抢占调度方式)

松弛度 = 必须完成时间 - 本身需要运行时间 - 当前时间

当松弛度为0或时间片完时才切换进程


3.6产生死锁的必要条件
  • 互斥条件
  • 请求和保持条件
  • 不可抢占条件
  • 循环等待条件
3.7处理死锁的方法
  • 预防死锁(破坏四个必要条件中一个或多个)

  • 避免死锁

    银行家算法

    【例】雪梨作业

  • 检测死锁

    • 死锁定理

      S状态为死锁状态的充分条件是:当且仅当S状态的资源分配图是不可完全简化的。

  • 解除死锁

    • 剥夺资源
    • 撤销进程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值