《操作系统》

文章目录

  • 操作系统
    • 1. 操作系统的特征
    • 2. 中断和异常
    • 3. 系统调用
    • 4. 进程
      • 4.1 进程的基本概念
      • 4.2 进程的状态
      • 4.3 进程通信
      • 4.4 线程
      • 4.5 进程调度
      • 4.6 进程同步
    • 5. 死锁
    • 6. 内存
      • 6.1 逻辑地址和物理地址
      • 6.2 分页存储
      • 6.3 分段存储
      • 6.4 分页和分段的区别
      • 6.5 虚拟内存

操作系统

1. 操作系统的特征

① 并发

并发: 指两个或多个事件在同一时间间隔内发生。 这些事件宏观上是同时发生的, 但微观上是交替发生的。
常考易混概念——并行: 指两个或多个事件在同一时刻同时发生。
《操作系统》_第1张图片

单核CPU同一时刻只能执行一个程序, 各个程序只能并发地执行
多核CPU同一时刻可以同时执行多个程序, 多个程序可以并行地执行

② 共享

共享即资源共享, 是指系统中的资源可供内存中多个并发执行的进程共同使用。

《操作系统》_第2张图片

所谓的“同时” 往往是宏观上的, 而在微观上, 这些进程可能是交替地对该资源进行访问的(即分时共享)
生活实例:
互斥共享方式: 使用QQ和微信视频。 同一时间段内摄像头只能分配给其中一个进程。
同时共享方式: 使用QQ发送文件A, 同时使用微信发送文件B。 宏观上看, 两边都在同时读取并发送文件,
说明两个进程都在访问硬盘资源, 从中读取数据。 微观上看, 两个进程是交替着访问硬盘的。

③ 虚拟

虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。 物理实体(前者) 是实际存在的, 而逻辑上
对应物(后者) 是用户感受到的。

④ 异步

异步是指, 在多道程序环境下, 允许多个程序并发执行, 但由于资源有限, 进程的执行不是一贯到底的,
而是走走停停, 以不可预知的速度向前推进, 这就是进程的异步性。

如果失去了并发性, 即系统只能串行地运行各个程序, 那么每个程序的执行会一贯到底。 只有系统拥有并发性, 才有可能导致异步性。

2. 中断和异常

通常,操作系统提供的主要功能都是由操作系统内核程序实现的,CPU在运行上层程序时唯一能进入内核程序运行的途径就是通过中断或异常。当中断或异常发生时,运行用户模式程序的CPU会马上进入操作系统内核程序并运行。

CPU 上会运行两种程序, 一种是操作系统内核程序(是整个系统的管理者), 一种是应用程序

在合适的情况下, 操作系统内核会把CPU的使用权主动让给应用程序,“中断” 是让操作系统内核夺回CPU使用权的唯一途径,如果没有“中断” 机制, 那么一旦应用程序上CPU运行, CPU就会一直运行这个应用程序

在这里插入图片描述

“中断” 会使CPU由用户态变为内核态, 使操作系统重新夺回对CPU的控制权

内核态到用户态: 执行一条特权指令——修改PSW的标志位为“用户态” , 操作系统将主动让出CPU使用权
用户态到内核态: 由“中断” 引发, 硬件自动完成变态过程 触发中断信号意味着操作系统将强行夺回CPU的使用权

3. 系统调用

两个进程并发运行, 打印机设备交替地收到 WPS 和 Word 两个进程发来的打印请求, 结果两篇论文的内容混杂在一起了…
解决方法: 由操作系统内核对共享资源进行统一的管理, 并向上提供“系统调用” , 用户进程想要使用打印机这种共享资源, 只能通过系统调用向操作系统内核发出请求。 内核会对各个请求进行协调处理。

应用程序通过系统调用请求操作系统的服务。 而系统中的各种共享资源都由操作系统内核统一掌管, 因此凡是
与共享资源有关的操作, 都必须通过系统调用的方式向操作系统内核提出服务请求, 由操作系统内核代为完成。 这样可以保证系统的稳定性和安全性, 防止用户进行非法操作。

4. 进程

4.1 进程的基本概念

PCB是进程存在的唯一标志, 当进程被创建时, 操作系统为其创建PCB, 当进程结束时, 会回收其PCB。

PCB 是给操作系统用的。程序段、 数据段是给进程自己用的。

程序段、 数据段、 PCB三部分组成了进程实体 ,进程是进程实体的运行过程, 是系统进行资源分配和调度的基本单位。
《操作系统》_第3张图片

4.2 进程的状态

《操作系统》_第4张图片

创建态—就绪态:系统完成创建进程相关的工作

就绪态—运行态:进程被调度

运行态—就绪态:时间片到,或CPU被其他优先级高的进行抢占

运行态—阻塞态:等待系统资源分配,或等待某件事情发生(主动行为)

阻塞态—就绪态:资源分配到位,等待的事件发生(被动行为)

运行态—终止态:进程运行结果,或运行过程中遇到不可修复的错误

4.3 进程通信

进程通信就是指进程之间的信息交换。进程是分配系统资源的单位(包括内存地址空间) , 因此各进程拥有的内存地址空间相互独立。

① 共享内存

它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。

  1. 共享内存是最快的一种 IPC,因为进程是直接对内存进行存取
  2. 因为多个进程可以同时操作,所以需要进行同步
  3. 信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问

《操作系统》_第5张图片

② 管道

  1. 管道只能采用半双工通信, 某一时间段内只能实现单向的传输。 如果要实现双向同时通信, 则需要设置
    两个管道。
  2. 各进程要互斥地访问管道。
  3. 数据以字符流的形式写入管道, 当管道写满时, 写进程的write()系统调用将被阻塞, 等待读进程将数据
    取走。 当读进程将数据全部取走后, 管道变空, 此时读进程的read()系统调用将被阻塞。
  4. 如果没写满, 就不允许读。 如果没读空, 就不允许写。
  5. 数据一旦被读出, 就从管道中被抛弃, 这就意味着读进程最多只能有一个, 否则可能会有读错数据的情
    况。

《操作系统》_第6张图片

③ 消息队列

消息队列是消息的链接表,具有写权限的进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限的进程则可以从消息队列中读取信息;

4.4 线程

思考:为什么要引入线程?

《操作系统》_第7张图片

进程是程序的一次执行。 这些功能显然需要用不同的几段程序才能实现, 并且这几段程序还要并发运行

《操作系统》_第8张图片

线程是进程的子任务,是 CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发。

引入线程带来的变化:

① 引入线程前, 进程既是资源分配的基本单位, 也是调度的基本单位。引入线程后, 进程是资源分配的基本单位, 线程是调度的基本单位。 线程也有运行态、 就绪态、 阻塞态。在多CPU环境下, 各个线程也可以分派到不同的CPU上并行地执行。

② 进程间并发, 开销很大;线程间并发, 开销小。引入线程机制后并发带来的系统开销降低, 系统并发性提升
注意: 从属于不同进程的线程间切换, 也会导致进程的切换! 开销也大!

③ 各个进程的内存地址空间相互独立,只能通过请求操作系统内核的帮助来完成进程间通信 进程间通信必须请求操作系统服务(CPU要切换到核心态) , 开销大;同一进程下的各个线程间共享内存地址空间, 可以直接通过读/写内存空间进行通信 同进程下的线程间通信, 无需操作系统干预, 开销更小;从属同一进程的各个线程共享进程拥有的资源。

4.5 进程调度

进程调度就是按照某种算法从就绪队列中选择一个进程为其分配处理机。 算法:先来先服务、最短作业优先、最高响应比优先;

临界资源: 一个时间段内只允许一个进程使用的资源。 各进程需要互斥地访问临界资源。
临界区: 访问临界资源的那段代码。
《操作系统》_第9张图片

先来先服务调度算法(FCFS): 作业调度算法或者进程调度算法,按作业或者进程到达的先后顺序依次调度,对于长作业比较有利,但是无法优先处理比较紧急的任务。

短作业优先调度算法(SJF): 是作业调度算法,从就绪队列中选择估计时间最短的作业进行处理,直到得出结果或者无法继续执行。所以缺点很明显不利于长作业,没有考虑到部分作业的重要性

高响应比算法(HRN): 根据响应比决定优先级,响应比=(等待时间+要求服务时间)/要求服务时间;

时间片轮转调度(RR): 按到达的先后对进程放入队列中,然后给队首进程分配CPU时间片,时间片用完之后计时器发出中断,暂停当前进程并将其放到队列尾部,以此循环。

多级反馈队列调度算法: 被公认较好的调度算法,设置多个就绪队列并为每个队列设置不同的优先级,第一个队列优先级最高,其余依次递减。优先级越高的队列分配的时间片越短,进程到达之后按FCFS放入第一个队列,如果调度执行后没有完成,那么放到第二个队列尾部等待调度,如果第二次调度仍然没有完成,放入第三队列尾部……只有当前一个队列为空的时候才会去调度下一个队列的进程。

4.6 进程同步

进程同步的任务就是对多个相关进程在执行顺序上进行协调,使并发执行的多个进程之间可以有效的共享资源和相互合作。

空闲让进: 当没有进程处于临界区(资源共享的代码块)的时候,应该许可其他进程进入临界区的申请。
忙则等待: 当前如果有进程处于临界区,如果有其他进程申请进入,则必须等待,保证对临界区的互斥访问。
有限等待: 对要求访问临界资源的进程,需要在有限时间内进入临界区,防止出现死等。
让权等待: 当进程无法进入临界区的时候,需要释放处理机,以防陷入忙等。

5. 死锁

死锁:在并发环境下,各进程因为竞争资源而造成的一种互相等待对方手里的源,导致各进程都阻塞,无法向前推进的现象,就是死锁,发生死锁后如果没有外力干涉,这些进程就无法向前推进。

死锁产生的四个必要条件:四个条件必须同时满足,只要有一个不满足,死锁就不会发生。

  • 互斥条件: 只有对必须互斥使用的资源的争抢才会导致死锁。
  • 不剥夺条件: 进程所获得的资源在未使用完之前, 不能由其他进程强行夺走, 只能主动释放。
  • 请求和保持条件: 进程已经保持了至少一个资源, 但又提出了新的资源请求, 而该资源又被其他进
    程占有, 此时请求进程被阻塞, 但又对自己已有的资源保持不放。
  • 循环等待条件: 存在一种进程资源的循环等待链, 链中的每一个进程已获得的资源同时被下一个进
    程所请求。

预防死锁

《操作系统》_第10张图片

  1. 破坏互斥条件

    如果把只能互斥使用的资源改造为允许共享使用, 则系统不会进入死锁状态。

    缺点:并不是所有的资源都可以改造成可共享使用的资源。 并且为了系统安全, 很多地方
    还必须保护这种互斥性。 因此, 很多时候都无法破坏互斥条件。

  2. 破坏不剥夺条件

    方式1:当某个进程请求新的资源得不到满足时, 它必须立即释放保持的所有资源, 待以后需要时再重新申请。 也就是说, 即使某些资源尚未使用完, 也需要主动释放, 从而破坏了不可剥夺条件。

    方式2:当某个进程需要的资源被其他进程所占有的时候, 可以由操作系统协助, 将想要的资源强
    行剥夺。 这种方式一般需要考虑各进程的优先级

    缺点:

    1. 实现起来比较复杂。

    2. 释放已获得的资源可能造成前一阶段工作的失效。 因此这种方法一般只适用于易保存和恢复状态
      的资源, 如CPU。

    3. 反复地申请和释放资源会增加系统开销, 降低系统吞吐量。

    4. 若采用方案一, 意味着只要暂时得不到某个资源, 之前获得的那些资源就都需要放弃, 以后再重
      新申请。 如果一直发生这样的情况, 就会导致进程饥饿。

  3. 破坏请求和保持条件

    可以采用静态分配方法, 进程在运行前一次申请完它所需要的全部资源, 在它的资源未满足前,不让它投入运行。 一旦投入运行后, 这些资源就一直归它所有, 该进程就不会再请求别的任何资源了

    该策略实现起来简单, 但也有明显的缺点:
    有些资源可能只需要用很短的时间, 因此如果进程的整个运行期间都一直保持着所有资源, 就会造成严重的资源浪费, 资源利用率极低。 另外, 该策略也有可能导致某些进程饥饿。 如C类资源需要同时等待大资源1和资源2后才能运行。

《操作系统》_第11张图片

  1. 破坏循环等待条件

    可采用顺序资源分配法。 首先给系统中的资源编号, 规定每个进程必须按编号递增的顺序请求资源,
    同类资源(即编号相同的资源) 一次申请完。

    原理分析: 一个进程只有已占有小编号的资源时, 才有资格申请更大编号的资源。 按此规则, 已持
    有大编号资源的进程不可能逆向地回来申请小编号的资源, 从而就不会产生循环等待的现象。

    该策略的缺点:

    1. 不方便增加新的设备, 因为可能需要重新分配所有的编号;
    2. 进程实际使用资源的顺序可能和编号递增顺序不一致, 会导致资源浪费;
    3. 必须按规定次序申请资源, 用户编程麻烦。
      《操作系统》_第12张图片

6. 内存

6.1 逻辑地址和物理地址

内存可存放数据。 程序执行前需要先放到内存中才能被CPU处理——缓和CPU与硬盘之间的速度矛盾

《操作系统》_第13张图片

逻辑地址(相对地址):编译时产生的指令只关心相对地址,实际放入内存中时再根据起始位置得到绝对地址

物理地址(绝对地址):实际存放的位置。

比如编译时确定变量x的相对地址为100(相对于进程中的起始地址而言的地址),CPU想要找到x在内存中实际存放的位置,只需要用进程的起始地址+100即可。
《操作系统》_第14张图片

6.2 分页存储

内存空间的分配:

① 连续分配: 为用户进程分配的必须是一个连续的内存空间。
② 非连续分配: 为用户进程分配的可以是一些分散的内存空间。

如果进程A大小为23M,但是每个分区只有10MB,如果进程只能占用内存中的一个分区,显然是放不下的。可以将进程拆分为10+10+3MB,然后将这三个部分放到三个分区中。那么进程A的最后一个分区为3MB,内存中就会产生7MB的内存碎片。如果我们将分区大小设为2MB,最后一个分区差生1MB的内存碎片,显然如果把分区设置的更小一些,内存碎片会更小,内存利用率会更高。

基于分页存储管理的思想:把内存分为一个个相等的小分区,再按照分区大小把进程拆分为一个个小部分。

将内存空间分为一个个大小相等的分区(比如: 每个分区4KB) , 每个分区就是一个“页框” (页框=页帧=内存块=物理块=物理页面) 。 每个页框有一个编号, 即“页框号” (页框号=页帧号=内存块号=物理块号=物理页号) , 页框号从0开始。
将进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分称为一个“页” 或“页面” 。 每个页面也有一个编号,即“页号” , 页号也是从0开始

③ 操作系统以页框为单位为各个进程分配内存空间。 进程的每个页面分别放入一个页框中。 也就是说, 进程的页面与内存的页框有一一对应的关系。各个页面不必连续存放, 可以放到不相邻的各个页框中。

进程的最后一个页面可能没有一个页框那么大。 也就是说, 分页存储有可能产生内部碎片, 因此页框不能太大, 否则可能产生过大的内部碎片造成浪费

《操作系统》_第15张图片

为了能知道进程的每个页面在内存中存放的位置, 操作系统要为每个进程建立一张页表:

① 一个进程对应一张页表
② 进程的每个页面对应一个页表项
③ 每个页表项由“页号” 和“块号” 组成
④ 页表记录进程页面和实际存放的内存块之间的映射关系
⑤ 每个页表项的长度是相同的

《操作系统》_第16张图片

《操作系统》_第17张图片

6.3 分段存储

进程的地址空间: 按照程序自身的逻辑关系划分为若干个段, 每个段都有一个段名(在低级语言中, 程序员使用段名来编程) , 每段从0开始编址
内存分配规则: 以段为单位进行分配, 每个段在内存中占据连续空间, 但各段之间可以不相邻。
《操作系统》_第18张图片

6.4 分页和分段的区别

页是信息的物理单位。 分页的主要目的是为了实现离散分配, 提高内存利用率。 分页仅仅是系统管理上的需要, 完全是系统行为, 对用户是不可见的。
段是信息的逻辑单位。 分段的主要目的是更好地满足用户需求。 一个段通常包含着一组属于一个逻辑模块的信息。 分段对用户是可见的, 用户编程时需要显式地给出段名。

页的大小固定且由系统决定。 段的长度却不固定, 决定于用户编写的程序。
分页的用户进程地址空间是一维的, 程序员只需给出一个记忆符即可表示一个地址。
分段的用户进程地址空间是二维的, 程序员在标识一个地址时, 既要给出段名, 也要给出段内地址。

《操作系统》_第19张图片

6.5 虚拟内存

在操作系统的管理下, 在用户看来似乎有一个比实际内存大得多的内存, 这就是虚拟内存

① 基于局部性原理, 在程序装入时, 可以将程序中很快会用到的部分装入内存, 暂时用不到的部分留在外存,
就可以让程序开始执行。
② 在程序执行过程中, 当所访问的信息不在内存时, 由操作系统负责将所需信息从外存调入内存, 然后继续
执行程序。
③ 若内存空间不够, 由操作系统负责将内存中暂时用不到的信息换出到外存。

《操作系统》_第20张图片

虚拟内存有一下三个主要特征:
多次性: 无需在作业运行时一次性全部装入内存, 而是允许被分成多次调入内存。
对换性: 在作业运行时无需一直常驻内存, 而是允许在作业运行过程中, 将作业换入、 换出。
虚拟性: 从逻辑上扩充了内存的容量, 使用户看到的内存容量, 远大于实际的容量

你可能感兴趣的:(计算机基础)