《操作系统》期末复习 第一、二章 引论、进程管理

本文详细介绍了操作系统的作用、进程管理的核心概念,包括进程实体、状态转换、控制、调度、同步机制(如信号量、临界区),以及经典的进程同步问题(如生产者-消费者、读者-写者)的解决方案。
摘要由CSDN通过智能技术生成

目录

第一章 操作系统引论

操作系统的作用

脱机输入输出的基本原理和作用

多道程序的概念和作用

分时操作系统的目的

操作系统特性

操作系统的接口

常用的系统调用

第二章 进程管理

进程实体的组成

一些概念解释

进程的特征(与程序的区别与联系)

进程的基本状态及其转换

进程控制

进程的组织形式

进程的创建与终止

进程的阻塞与唤醒

进程的挂起与激活

进程同步

临界资源与临界区

进程互斥算法

进程同步机制准则(重要!)

信号量机制

进程同步经典问题

生产者-消费者问题

读者-写者问题

读者优先解决方案

写者优先解决方案

哲学家进餐问题

同步问题程序设计要领

PV操作题


第一章 操作系统引论

操作系统的作用

1. 用作扩充机器(或虚拟机)

2. 用户与计算机硬件系统之间的接口

  • 命令方式(操作系统外壳,如命令行)、系统调用方式(操作系统内核)

3. 计算机系统资源的管理者

  • 管理对象:处理器、存储器、外围设备以及信息
  • 管理内容:资源的分配、回收和访问操作 共享、保护

脱机输入输出的基本原理和作用

多道程序的概念和作用

  • 单道批处理: 因内存中只有一个作业,当该作业启动I/O操作等待时,CPU也处于等待状态。 CPU和I/O是串行操作的。
  • 多道批处理中断技术的引入为多道批处理提供了技术基础。 因内存中有多个作业,当一个作业因启动I/O操作等待时,CPU可执行其他的作业。其有多道性、无序性、调度性(作业调度、进程调度)的特点。优点:系统资源利用率高,系统吞吐量大

分时操作系统的目的

目的:及时处理。作业应直接进入内存、在不长的时间内就能使每个作业都运行一次

操作系统特性

现代操作系统通常是多道操作系统(Multi-programming Systems),虽然多道操作系统在通用计算机领域占据主导地位,但在一些特定的嵌入式系统或特定应用领域,可能会使用单道批处理系统、实时操作系统或单用户单任务系统。

多道os的特征:并发、共享、虚拟、异步(术语解释!)

  1. 并发性(Concurrency):操作系统能够管理多个同时运行的程序或任务。它通过时间片轮转、多线程、进程管理等技术来实现并发执行,提高系统资源利用率。

  2. 共享性(Sharing):操作系统允许多个用户或多个程序共同使用计算机系统的资源,如内存、CPU、文件等。它通过合理的资源分配和管理,确保资源在不同程序间共享并有效利用。

  3. 虚拟性(Virtualization):操作系统可以创建虚拟的资源,如虚拟内存、虚拟CPU等,使得每个程序都觉得自己独占一部分资源,从而提高了系统的灵活性和效率。

  4. 异步性(Asynchrony):操作系统能够处理来自不同设备或程序的不同时间间隔的事件,并且能够对这些事件进行有效的处理和响应。

操作系统的接口

  • 基于接口表现形式划分:用户接口、程序接口
  • 基于接口使用者类型划分:本地用户接口、网络用户接口

常用的系统调用

进程控制

  • 进程的创建、结束、等待子进程结束
  • 进程属性设置与获取
  • 执行一个文件(进程映像替换)

文件操纵

  • 文件的创建、打开、关闭、读/写

进程通信

  • 连接打开与关闭、消息发送与接收

系统信息维护

  • 时间设置与获取、文件访问/修改时间设置

第二章 进程管理

进程实现:cpu虚拟化

  • 进程分时共享CPU
  • CPU上下文切换
  • 关键数据结构:PCB进程控制块

PCB详细信息:

进程实体的组成

进程实体由PCB、程序段和数据段组成。

一些概念解释

  • 进程:进程是操作系统中资源分配和调度和分派的一个独立单位(基本单位)
  • 调度:从候选进程中选择一个进程以进行CPU分配的过程。把CPU分配给这个选中的进程就是“分派

进程的特征(与程序的区别与联系)

  1. 结构特征 程序段、数据段及进程控制块
  2. 动态性 生命周期及“执行” 本质
  3. 并发性 共存于内存、宏观同时运行
  4. 异步性 推进相互独立、速度不可预知
  5. 独立性 调度、资源分配、运行

进程的基本状态及其转换

引发挂起状态的可能原因

  • 终端用户/父进程的请求
  • 操作系统/负载调节的需要

具有挂起状态的进程状态图:

进程控制

进程的组织形式

  • 链接方式:按进程状态将PCB分为多个队列
  • 索引方式:按照进程状态建立几张索引表,各表项指向一个PCB

进程图(进程树):描述进程家族关系的有向树

进程的创建与终止

进程控制函数的实现方法:原语,具有类似事务的原子性。进程控制内核函数必须采用原语实现,否则并发执行就会导致错误。

相关事件与过程

进程的阻塞与唤醒

相关事件与过程

进程的挂起与激活

相关过程

进程同步

并发的最小粒度:机器指令

计算:进程1:m条机器指令;进程2:n条机器指令

同一进程中的机器指令次序不变,并发执行序列数目:C_{m+n}^{n}

临界资源与临界区

  • 临界资源:一段时间内只允许一个进程访问的资源
  • 临界区:每个进程中访问临界资源的那段代码称为临界区

注:访问不同临界资源的两类临界区无需互斥

进程互斥算法

关键:保障同一类临界区的互斥执行

用户程序中的软件解决方法

基本思路:在进入区检查和设置一些标志,如果已有进程在临界区,则在进入区通过循环检查进行等待;在退出区修改标志(关键在:设置什么标志和如何检查标志

进程互斥的硬件解决方法

机器指令是并发的最小粒度,一条机器指令就是原子操作

“开关中断”指令 :

  • 进入临界区前执行:执行“关中断”指令  
  • 离开临界区后执行:执行“开中断”指令

“测试并设置”指令

“交换”指令

优点
  • 适用于任意数目的进程、单处理器或多处理器上
  • 简单、容易验证其正确性
  • 可以支持进程有多个临界区
缺点
  • 等待时要耗费CPU时间。
  • 可能“饥饿”:从等待进程中随机选择一个进入临界区,有的进程可能一直选不上。
  • 可能死锁。

进程同步机制准则(重要!)

  • 空闲让进(效率) 当无进程处于临界区时,可允许一个请求进入临界区的进程立即进入自己的临界区
  • 忙则等待(正确性) 当已有进程进入自己的临界区时,所有企图进入临界区的进程必须等待
  • 有限等待(公平性) 对要求访问临界资源的进程,应保证该进程能在有限时间内进入自己的临界区
  • 让权等待(效率) 当进程不能进入自己的临界区时,应释放处理机

信号量机制

两个原语操作P、V

整型信号量相对于记录型信号量存在一些限制和弱点:

  1. 缺乏进程信息记录: 整型信号量不能记录等待资源的进程信息。这可能导致在竞争条件下,进程等待资源时难以管理和调度。

  2. 有限的控制能力: 整型信号量的操作相对简单,仅限于增加和减少值。它们不能提供关于等待进程的更多信息,也不能支持更复杂的同步和通信需求。

  3. 可能导致死锁: 由于整型信号量缺乏进程信息记录,因此在复杂的并发环境中,可能出现死锁的风险。当多个进程争夺同一资源时,缺乏细致的控制可能导致死锁情况的发生。

进程同步经典问题

生产者-消费者问题

如:读键盘进程是数据的生产者,应用进程是数据的消费者。

读者-写者问题

读者—写者问题是指保证任何写者进程必须与其它进程互斥地访问共享数据对象(数据文件或记录)的同步问题。

  • 多个进程共享一个数据对象
  • 只要求对该对象读的进程称为读者进程
  • 包括写操作的其他进程称为写者进程 只写,读写。

读者—写者问题常用于测试新同步原语

同步要求

  1. 读读进程可并发访问数据。
  2. 读写、写写进程互斥。
读者优先解决方案
int readCount = 0;  // 记录当前正在读取的读者数量
Semaphore mutex = 1; // 用于对 readCount 进行互斥访问
Semaphore wrt = 1;   // 用于对写操作进行控制

读者进程:
while (true) {
    P(mutex);
    readCount++; // 增加正在读取的读者数量
    if (readCount == 1) {
        P(wrt); // 阻止写者访问共享资源
    }
    V(mutex);

    // 读取操作
    // 读取数据

    P(mutex);
    readCount--; // 减少正在读取的读者数量
    if (readCount == 0) {
        V(wrt); // 允许写者访问共享资源
    }
    V(mutex);
}
写者进程:
while (true) {
    P(wrt); // 阻止其他写者和读者访问共享资源

    // 写入操作
    // 修改数据

    V(wrt); // 允许其他写者和读者访问共享资源
}
写者优先解决方案
共享资源 resource
整数型变量 read_count = 0
信号量 mutex = 1  // 控制 read_count 的访问
信号量 write_lock = 1  // 控制写者访问资源

Procedure Reader():
    while True:
        P(mutex)
        read_count += 1
        if read_count == 1:
            P(write_lock)  // 阻止写者访问
        V(mutex)
        
        // 读取数据
        
        P(mutex)
        read_count -= 1
        if read_count == 0:
            V(write_lock)  // 允许写者访问
        V(mutex)

Procedure Writer():
    while True:
        P(write_lock)  // 阻止其他写者和读者访问资源
        
        // 写入数据
        
        V(write_lock)  // 允许其他写者和读者访问资源

哲学家进餐问题

哲学家进餐问题是典型的同步问题

  • 五个哲学家共用一张圆桌,分别坐在环桌均匀摆放的五张椅子上,并全部执行同为交替地进行思考和进餐的生活方式
  • 圆桌上放有五支筷子,均匀排放在哲学家之间的位置上
  • 哲学家饥饿时便试图去取用圆桌上最靠近他左右两端的两支筷子,且只有在同时拿到两支筷子时方可进餐,进餐完毕则把筷子放回原处,并继续进行思考

同步问题程序设计要领

PV操作题

1. 假设有两个进程 P1 和 P2 需要访问共享资源 A 和 B。两个进程分别执行以下代码片段:

P1:
while (true) {
    P(A);
    // 访问资源 A
    // 临界区代码
    V(A);

    P(B);
    // 访问资源 B
    // 临界区代码
    V(B);
}

P2:
while (true) {
    P(B);
    // 访问资源 B
    // 临界区代码
    V(B);

    P(A);
    // 访问资源 A
    // 临界区代码
    V(A);
}

问题:

  1. 这两个进程可能发生什么样的竞争条件?
  2. 如何使用信号量操作 PV(A) 和 PV(B) 来避免竞争条件并实现正确的资源访问顺序?

解答:

  1. 在上述代码中,两个进程 P1 和 P2 分别尝试以不同的顺序访问资源 A 和资源 B。如果两个进程同时获得了一个资源,但在尝试获取另一个资源时被阻塞,就可能发生死锁,因为它们都在等待对方释放资源。

  2. 为了避免竞争条件和死锁,可以使用 PV 操作(信号量)来调整资源的访问顺序。例如,可以使用额外的两个信号量,比如 mutex_Amutex_B 来控制资源 A 和 B 的访问顺序。修改后的代码如下:

P1:
while (true) {
    P(mutex_A);
    P(A);
    // 访问资源 A
    // 临界区代码
    V(A);
    V(mutex_A);

    P(mutex_B);
    P(B);
    // 访问资源 B
    // 临界区代码
    V(B);
    V(mutex_B);
}
P2:
while (true) {
    P(mutex_B);
    P(B);
    // 访问资源 B
    // 临界区代码
    V(B);
    V(mutex_B);

    P(mutex_A);
    P(A);
    // 访问资源 A
    // 临界区代码
    V(A);
    V(mutex_A);
}

2. 有若干个生产者进程和消费者进程共享一个有限的缓冲区。生产者负责将产品放入缓冲区,而消费者则负责从缓冲区取出产品。

现在假设有一个缓冲区和两个信号量 emptyfullempty 表示缓冲区的空闲空间数量,full 表示缓冲区中已经被占用的空间数量。

问题:

  1. 使用 PV 操作(信号量)描述生产者和消费者的操作过程,并确保它们在访问缓冲区时避免竞争条件和缓冲区溢出/空闲。

解答:

缓冲区初始化:
empty = 缓冲区的大小
full = 0

生产者进程:
while (true) {
    // 生产产品
    product = produce();

    P(empty); // 等待缓冲区有空闲空间
    // 临界区代码
    put_product_into_buffer(product);
    V(full); // 增加已占用空间数量
}

消费者进程:
while (true) {
    P(full); // 等待缓冲区有产品可消费
    // 临界区代码
    product = get_product_from_buffer();
    V(empty); // 增加空闲空间数量
    // 消费产品
    consume(product);
}

3. 有一阅览室,读者进入时必须先在一张登记表上登记。该表中每个表项代表阅览室中的一个座位。读者离开时要消掉其登记信息。阅览室共有50 个座位。登记表每次仅允许一位读者进行登记或注销。读者登记时,如果座位已满,他在阅览室外等待,直至有空位再登记进入。试用伪代码和信号量,描述读者进程之间的同步互斥的行为。

整数型变量 seats_available = 50  // 可用座位数量
信号量 mutex = 1  // 用于控制对登记表的访问
信号量 waiting = 0  // 用于等待读者进入阅览室的数量
信号量 seat_available = 1  // 每次仅允许一个读者登记或注销

Procedure Reader():
    while True:
        P(seat_available)  // 申请座位
        P(mutex)
        if seats_available > 0:
            seats_available -= 1
            V(seat_available)  // 释放座位许可,其他读者可以尝试登记
            V(mutex)
            // 登记进入阅览室
            // 读者在阅览室内进行阅读等操作
            
            P(mutex)
            seats_available += 1  // 读者离开,座位数增加
            V(mutex)
        else:
            V(seat_available)  // 释放座位许可,让下一个读者尝试登记
            V(mutex)
            // 等待阅览室有空位再尝试登记进入
            P(waiting)

在上述代码中,seats_available 表示可用座位数量,mutex 用于对登记表的互斥访问,waiting 用于记录正在等待进入阅览室的读者数量,seat_available 用于控制每次仅允许一个读者登记或注销。读者进程在登记时,如果座位还有空位,则可以进入阅览室;否则,会等待直到有空位为止。读者离开时,释放座位,并通知等待的读者有座位可用。

  • 47
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值