计算机操作系统 (王道考研)笔记(一)

2023-11-08

重点知识点

1 并发、并行

单核CPU采取的是并发技术,多核CPU采取的是并发和并行两种技术。
并发:在一个宏观时间内,同时运行多个程序。在微观尺度下,其实是不同程序交替运行。
并行:只有多核CPU才能实现,就是同一时间内运行多个程序。

拓展并发是让不用用户程序交替运行,操作系统中程序可以分为内核程序和应用程序两种,也就对应CPU的两种状态“内核态”和“外核态”,并发的实现需要CPU在两种状态中进行转换,内核态转换到用户态,需要执行一跳特权指令、用户态转换到内核态,需要由“中断”引发。

2 电脑开机过程

RAM:Random Assess Memory随机存取存储器,速度比硬盘快得多,也就是电脑中的内存,保存在其中的数据在电脑断电后就会消失。
ROM:Read-Only Memory只读存储器,一般集成在电脑主板上。被用于存储固化的程序和数据,例如BIOS,固件。
BIOS:Basic Input/Output System基本输入输出系统。存储在ROM(只读存储器)中。

在这里插入图片描述

3 程序 进程

程序:是静态的,就是存储在磁盘中的可执行文件,二进制。
进程:是动态的,是程序的一次执行过程。(如果一个程序运行了多个,那么此时操作系统通过PID“Process ID”对不同进程进行区分)


拓展程序是如何运行的

在这里插入图片描述

4 进程

4.1 进程的组成与控制、进程的状态与转换

4.1.1 进程的组成

进程由:PCB(进程控制块,是进程存在的唯一标识,当进程被创建时,操作系统为其创建PCB,结束时,操作系统回收)、程序段(程序的代码:指令序列)、数据段(运行过程中产生的各种数据,如,程序中定义的变量)组成。

拓展:当通过三个相同的程序被执行时,会对应三个不同PCB数据段,但是程序段的内容是相同的。

在这里插入图片描述

4.1.2 进程控制

原语:首先了解一下原子操作,就是不能再划分的操作,可以理解为操作的最小单元。那么原语就可以理解为一个代码执行逻辑的最小单元,不会被中断。

在这里插入图片描述

4.1.3 进程的状态与转换

在这里插入图片描述

4.1.4 程序的切换

在这里插入图片描述

4.2 进程通信

进程通信是指两个进程之间产生数据交互(例如,把微博的文章分享给微信程序)。
进程之间通信有以下几种方式:

在这里插入图片描述

4.2.1 共享存储

进程向操作系统申请一个共享存储区,同时为避免出错,各个进程对共享存储器的访问应该是互斥的。

在这里插入图片描述


两种共享方式的优缺:

在这里插入图片描述

4.2.2 消息传递

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


4.2.3 管道通信

管道通信和共享存储的方法很像,只不过管道通信的数据传送是有顺序的,按照队列的顺序读写FIFO。就和水流一样,下游接受上游的水是有严格顺序的。First In First Out

在这里插入图片描述

5 线程

5.1 基本知识

知识总览:

在这里插入图片描述


5.1.1 线程定义,为什么要有线程

如果没有并发技术,那么单核CPU电脑一次只能运行一个进程
如果没有线程技术,那么一个进程不能同时实现多个功能(例如,QQ程序要同时开启视频聊天,文字聊天,传输数据等功能。)

可以把线程理解为“轻量级进程”,线程是一个基本的CPU执行单元,也是程序执行流的最小单位。

在这里插入图片描述

5.1.2 引入线程,有什么变化

在这里插入图片描述

5.1.3 线程属性

在这里插入图片描述

5.1.4 线程的实现方式

线程实现方式有:用户级线程、内核级线程

(1)用户级线程(User-Level Thread, ULT)
早期操作系统不支持线程,所以很多编程语言提供了强大的线程库,可以实现线程的创建、销毁、调度等功能。

思考以下几个问题

  1. 线程的管理工作有谁来完成? 应用程序通过线程库来完成,而不是操作系统。
  2. 线程切换是否需要CPU转换工作状态? 不需要应该,线程库就是运行在用户态上。
  3. 操作系统是否能意识到用户级线程的存在? 不能意识到,应为这些工作都是在用户层级运行
  4. 用户级线程的优点: 线程的切换不需要CPU转换到内核态,线程管理的系统开销小,效率高。
  5. 用户级线程的缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。

在这里插入图片描述


(2)内核级线程(Kernel-Level Thread, KLT,又称“内核支持的线程”)


在这里插入图片描述

(3)多线程模型
上面介绍了用户级线程还有内核级线程,那么这两种线程能不能同时使用呢?答案是可以同时使用
所以根据用户级线程和内核级线程的映射关系,就可以划分为几种多线程模型

  1. 一对一线程模型

在这里插入图片描述

  1. 多对一线程模型

在这里插入图片描述

  1. 多对多模型

在这里插入图片描述

5.1.5 线程的状态与转换

与进程的状态与转换几乎一样

在这里插入图片描述


5.1.6 线程的组织与控制

进程是由进程PCB(Process Control Block)控制、线程是由TCB(Thread Control Block)控制。

在这里插入图片描述

5.2 调度

知识总览图:

在这里插入图片描述

5.2.1 基本概念

当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则决定处理这些任务的顺序,这就是“调度”研究的问题。

在这里插入图片描述

5.2.2 三个层次

(1)高级调度
当计算机内存不足,无法把所有需要启动的程序都装入内存时。这时候就需要高级调度作业调度),就是按一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只调入一次,调出一次。作业调入时会建立PCB,调出时才撤销PCB。

在这里插入图片描述

(2)低级调度
高级调度不同,**低级调度(进程调度/处理机调度)**是对已经加载到内存中的进程进行操作。就是按照某种策略从就绪队列中选取一个进程,将处理机(CPU)分配给他。(这也是实现并发的关键)

在这里插入图片描述

(3)中级调度
内存不够时,可将某些进程的数据调出外存。等内存空闲或者进程需要运行时再重新调入内存
暂时调到外存等待的进程状态为挂起状态。被挂起的进程PCB会被组织成挂起队列

在这里插入图片描述

拓展
可以发现进程又多了一种状态,那就是挂起状态。所以之前的进程的五状态模型可以拓展为七状态模型:

在这里插入图片描述

5.2.3三层调度的联系、对比

在这里插入图片描述

自我总结的三者区别

  1. 高级调度:外存到内存,创建一个新的进程。
  2. 低级调度:内存中的进程调度
  3. 中级调度:也是外存到内存,只不过是将挂起状态的进程重新调入内存。

5.2.1 进程调度(低级调度)的时机、切换与过程、方式

进程调度的时机

在这里插入图片描述

进程的调度方式

在这里插入图片描述

进程的切换与过程

在这里插入图片描述

6 进程同步、互斥

6.1 进程同步

进程同步讨论的就是如何解决进程异步性的问题(因为某些应用场景就需要某个进程比另一个进程先执行)

在这里插入图片描述

6.2 进程互斥

我们把一个时间段内只允许一个进程使用的资源称为临界资源。许多物理设备(比如摄像头、打印机)都属于临界资源。此外还有许多变量数据内存缓冲区等都属于临界资源。

临界资源的访问,必须互斥地进行。互斥,亦称间接制约关系。进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。

6.2.1 进程互斥的实现方法

1)软件实现方法

Peterson算法是将单标志法和双标志法的优点结合。在这里插入图片描述

2)硬件实现方法

在这里插入图片描述

6.2.2 锁

1.互斥锁

基本概念:
解决临界区最简单的工具就是互斥锁(mutex lock)。一个进程在进入临界区时应获得锁;在退出临界区时释放锁。函数acquire()获得锁,而函数release()释放锁
每个互斥锁有一个布尔变量available,表示锁是否可用。如果锁是可用的,调用acquire()会成功,且锁不再可用。当一个进程试图获取不可用的锁时,会被阻塞,直到锁被释放。

acquire()
{
	while(!available)
		;					//忙等待
	available = false;		//获得锁
}

release()
{
	available = true;		//释放锁
}

原理机制与特性:
原理acquire()或release()的执行必须是原子操作,因此互斥锁通常采用硬件机制来实现。
缺点:互斥锁的主要缺点忙等待,当有一个进程在临界区中,任何其他进程在进入临界区时必须连续循环调用acquire()。当多个进程共享统一CPU时,就浪费了CPU周期。因此,互斥锁通常用于处理器系统,一个线程可以在一个处理器上等待,不影响其他线程的执行。

拓展:需要连续循环忙等的互斥锁,都可控称为自旋锁(spin lock),如TSL指令swap指令单标志法

特性:

  1. 需忙等,进程时间片用完才下处理机,违反“让权等待”
  2. 优点:等待期间不用切换进程上下文,多处理器系统中,若上锁的时间短,则等待代价很低
  3. 常用于多处理器系统,一个忙核等,其他核照常工作,并快速释放临界区
  4. 不太适用于单处理机系统,忙等的过程中不可能解锁
    在这里插入图片描述

7 信号量机制

由来:1965年,荷兰学者Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法----信号量机制

概念:用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。

信号量:其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。

一对原语:wait(S)原语和signal(S)原语,可以把原语理解为我们自己写的函数,函数名分别为wait和signal,括号里的信号量S其实就是函数调用时传入的一个参数。

7.1信号量分类

在这里插入图片描述

1)整型信号量
在这里插入图片描述

2)记录型信号量(十分重要)

整型信号量的 缺陷是存在“忙等”问题,因此人们又提出了“记录型信号量”,即用记录型数据结构表示的信号量。
记录型信号量机制遵循了“让权等待”原则,不会出现忙等现象。

7.2 用信号量机制实现进程互斥、同步、前驱关系

回顾一下信号量机制的知识内容:
在这里插入图片描述

7.2.1 实现进程互斥

临界区的资源需要互斥访问
在这里插入图片描述

7.2.2 实现进程同步

问题:为什么需要进程同步???
进程同步:要让合并发进程按要求有序地推进。
因为程序的异步特性,两个进程在运行时的先后是不确定的,但是有些时候需要两个进程按照先后顺序执行,此时就需要进行进程同步。
在这里插入图片描述

如何实现同步
在这里插入图片描述

7.2.3 实现进程的前驱关系

前驱关系就是一个进程同步关系
在这里插入图片描述

7.2.4 总结

在这里插入图片描述

7.3 同步、互斥案例

7.3.1 生产者消费者问题

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7.3.2 多生产者-多消费者问题

这里的生产者生产多种类别商品,消费者消费不用类型的商品。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

7.3.3 吸烟者问题

7.3.4 读者写者问题

7.3.5 哲学家进餐问题

8 管程

8.1 为什么要引入管程

在这里插入图片描述

8.2 管程的定义和基本特性

在这里插入图片描述

拓展:用管程解决巨额生产者消费者问题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9 死锁

9.1 死锁的概念

各个进程都在等待别的进程手里的资源,同时自己手里也拥有着别人的资源。然后出现一直等待锁死。
在这里插入图片描述 在这里插入图片描述

9.2 进程死锁、饥饿、死循环的区别

  1. 死锁:各进程相互等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。
  2. 饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF)算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”。
  3. 死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑bug导致的,有时是程序员故意设计的。
    在这里插入图片描述

9.3 死锁产生的必要条件

产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。

  1. 互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备等)。像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待这种资源)。
  2. 不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放
  3. 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放
  4. 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。

注意:发送死锁时一定有循环等待,但是发生循环等待时未必死锁(循环等待是死锁的必要不充分条件)。
如果同类资源数大于1,则即使有循环等待,也未必发送死锁。但如果系统中每类资源都只有一个,那循环等待就是死锁的充分必要条件了。

9.4 什么时候会发送死锁

在这里插入图片描述

9.5 死锁的处理策略

在这里插入图片描述

9.5.1 预防死锁

这是一种静态策略。这种策略的思想就是破坏产生死锁的四个必要条件的一个或多个,死锁就不会发生。
在这里插入图片描述

  1. 破坏互斥条件
    在这里插入图片描述

  2. 破坏不剥夺条件
    在这里插入图片描述

  3. 破坏请求和保持条件
    在这里插入图片描述

  4. 破坏循环等待条件
    在这里插入图片描述

9.5.2 避免死锁

核心算法:银行家算法
安全序列:就是指系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。(如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况)
如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)
** 因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是“ 银行家算法”的核心思想
在这里插入图片描述

9.5.3 检测和解除

前面两种策略是不允许死锁发生,本策略是允许死锁发生,然后将系统从死锁状态中解脱出来。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机操作系统 (王道考研)笔记(一) 的相关文章

  • STL模板库 常用函数 vector向量容器

    STL模板库 STL是Standard Template Library缩写 中文名字叫标准模板库 由惠普实验室提供 共有三类内容 算法 以函数模板形式实现的常用算法 如 max min swap find sort 容器 以类模板形式实现
  • 做一个 加减运算 利用JavaScript

    首先做个运算需要用到三个文本框 显示数字 这里我用input做了3个框 并且赋值他们的属性值 id 并且做了一个button按钮来调动 接着调用button这个函数 接着我们需要获取第一个和第第二个input的值 为什么用 parseInt
  • 【Linux专题_05】Linux统计行数命令

    Linux统计行数几种常用命令 wc l 这是最常用的命令 用于统计文件中的行数 它会输出文件的行数以及文件名 示例 wc l filename txt nl 该命令会给文件中的每一行添加行号 并将结果输出到标准输出 通过查看行号的最后一个
  • LeetCode 220. 存在重复元素 III

    题目链接 点击这里 class Solution public boolean containsNearbyAlmostDuplicate int nums int k int t TreeSet

随机推荐

  • Android Studio解除全局搜索100条限制

    1 点击Help gt Find Action选项 2 输入Registry 并选中进入 3 将ide usages page size的value设置为自己想要的数值即可
  • 修改块的方法+AcGeMatrix3d+AcGeScale3d+两点之间的距离

    开发过程中 当从外部获取了一个 需要修改块中的实体时 有以下几种方法 1 第一个通过explode函数炸开AcDbBlockReference 获取块参照中的实体对象 然后遍历对象 找到修改的实体 完成修改后将所有的实体插入到模型空间 注意
  • 第四章CSS基础

    文章目录 学习CSS的目的 引入的三种方式 内部样式表 行内样式表 外部样式表 选择器的分类 基础选择器 标签选择器 类选择器 id选择器 通配符选择器 复合选择器 后代选择器 子选择器 并集选择器 伪类选择器 盒子模型 不同浏览器下盒子模
  • 深度学习 从零开始 —— 神经网络(四),二分类问题,IMDB数据集使用

    IMDB数据集 互联网电影数据 包含50000条严重两极分化的评论 正面和负面评论各占50 而该数据集也同样被内置于Keras库中了 其中的评论数据已经经过了预处理 评论 单词 被转化为了整数序列 每个整数都对应词典里面的一个单词 加载数据
  • HTML页面基本结构

    本文简要介绍HTML中的各种元素及其相关属性 读者需要有一个概念 HTML页面都是由基本元素及属性组成的 HTML页面的结构如下 doctype 声明 HTML 源文件中 首先出现的是 doctype 声明 该声明告诉浏览器 本页面使用何种
  • [hive]hive中查找表或者查看表的信息

    一 查找表 查看数据库中所有表 SHOW TABLES IN db name 使用正则表达式过滤表 USE db name SHOW TABLES employ 二 查看已创建的表信息 DESCRIBE EXTENDED db name t
  • C++ vector向量的查找和删除

    一 在vector中查找元素 1 代码 include
  • 枚举电脑上的终结点设备

    STDAPI CoCreateInstance REFCLSID rclsid 创建的Com对象的类标识符 CLSID LPUNKNOWN pUnkOuter 指向接口IUnknown的指针 DWORD dwClsContext 运行可执行
  • win下使用git-bash工具进行ssh免密登录服务器

    1 ssh keygen exe 生成公钥私钥 pub 2 ssh agent exe bash 指定工具 3 ssh add exe 添加私钥 OK
  • nacos注册中心的配置

    将nacos作为注册中心使用 使用的步骤 导入nacos依赖 这么导
  • 选路算法(计算机网络)

    目的 决定从源到目的地通过网络的 好的路径 一般指最小费用的路径 根据算法是静态的还是动态的进行分类 静态 路由随时间缓慢变化 手工配置 动态 路由更快地变化 周期的更新 适应链路费用和网络拓扑变化 根据算法是全局式的还是分散式的来加以区分
  • Python入门指南:从零开始学习Python编程

    文章目录 前言 安装Python 变量以及数据类型 总结 前言 Python是一种简单而又强大的编程语言 它在全球范围内广受欢迎 适用于各种应用场景 包括Web开发 数据分析 人工智能和科学计算等 本篇博客将为初学者提供一份Python入门
  • 【抗扰PID控制】干扰抑制PID控制器研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 Simulink 文章讲解 1 概述 文献来源 抗扰PI
  • 背景图片设置透明度

    div position relative background color eee background moz linear gradient 30deg eff8fd 0 f0f9fe 40 c4e2fe 80 9cbee6 100
  • 计算损失函数C语言,EAST 算法超详细源码解析(四)、损失函数

    Date 2020 05 19 Author CW 前言 EAST 的损失函数由三部分构成 对应预测输出的三个map score map loc map 以及 angle map 即分类损失 位置 点到文本框边界上下左右的距离 损失以及角度
  • stm32—通用定时器实验设计

    stm32定时器编写 stm32定时器编写 1 打开项目 2 在timer h中完成定时器中断实现步骤 a 使能定时器函数 b 初始化定时器 备注 c 开启定时器中断 配置NVIC d 使能定时器 3 写入中断服务函数 中断函数完成后 开始
  • 使用react脚手架快速搭建项目以及项目文件的介绍(目录文件的功能及作用)

    前言 本篇文章教大家使用脚手架搭建react的项目 对于新建的react项目 项目目录里的文件都是干什么的 有什么作用呢 下面一起来看看 react脚手架 使用yarn在本地安装create react app npm i g yarn 全
  • Easylogging++之配置功能

    要完成Easylogging 日志的配置功能 可以通过三种方式实现 而且每一种方法都非常简单 使用配置文件 这种方法的好处就是只要修改配置文件即可实现日志格式的重新配置 而不需要修改源程序代码 缺点就是发布程序时必须打包配置文件一起发布 否
  • 常见架构模式 #CSDN博文精选# #IT技术# #软件模式# #架构模式#

    大家好 小C将继续与你们见面 带来精选的CSDN博文 又到周一啦 上周的系统化学习专栏已经结束 我们总共一起学习了20篇文章 这周将开启全新专栏 放假不停学 全栈工程师养成记 在这里 你将收获 将系统化学习理论运用于实践 系统学习IT技术
  • 计算机操作系统 (王道考研)笔记(一)

    重点知识点 1 并发 并行 2 电脑开机过程 3 程序 进程 4 进程 4 1 进程的组成与控制 进程的状态与转换 4 1 1 进程的组成 4 1 2 进程控制 4 1 3 进程的状态与转换 4 1 4 程序的切换 4 2 进程通信 4 2