KYLO操作系统知识总结

什么是操作系统

操作系统是管理硬件和软件的一种应用程序。操作系统是运行在计算机上最重要的一种软件,他管理计算机的资源和进程以及所有硬件和软件。它为计算机硬件和软件提供了一种中间层,使应用软件和硬件进行分离,让我们无需关注硬件的实现,把关注点更多放在软件应用上。

通常情况下,计算机上会运行着许多应用程序,它们都需要对内存和CPU进行交互,操作系统的目的就是为了保证这些访问和交互能够准确无误的进行。

操作系统的主要功能

  • 进程管理(处理器管理):进程管理的主要作用就是任务调度,在单核处理器下,操作系统会为每一个进程分配一个任务,进程管理的工作十分简单;而在多核处理器下,操作系统除了要为进程分配任务外,还要解决处理器的调度、分配和回收等问题。
  • 内存管理:内存管理主要使操作系统负责管理内存的分配、回收,在进程需要时分配内存以及在进程完成时回收内存,协调内存资源,通过合理的页面置换算法进行页面的换入换出
  • 设备管理:根据确定的设备分配原则对设备进行分配,使设备与主机能够并行工作,为用户提供良好的设备使用界面
  • 文件管理:有效的管理文件和存储空间,合理地组织和管理文件系统,为文件访问和文件保护提供更有效的方法即手段
  • 提供用户接口:操作系统提供了访问应用程序和硬件的接口,使用户能够通过应用程序发起系统调用从而操纵硬件,实践想要的功能。

软件访问硬件的几种方式

软件访问硬件其实就是一种IO操作,软件访问硬件的方式,也就是I/O操作的方式有哪些。

硬件在I/O上大致分为并行和串行,同时也对应串行接口和并行接口。

随着计算机技术的发展,IO控制方式也在不断发展。选择和衡量I/O控制方式有如下三条规则

  1. 数据传送速度足够快,能满足用户的需求但是又不丢失数据
  2. 系统开销小,所需的处理控制程序少
  3. 能充分发挥硬件资源的能力,使I/O设备尽可能忙,而CPU等待时间尽可能少

根据以上控制原则,I/O操作可以分为4类

  • 直接访问:直接访问由用户进程控制主存或CPU和外围设备之间的信息传送。直接程序控制方式又称为忙/等待方式
  • 中断驱动:为了减少程序直接控制方式下CPU的等待时间以及提高系统的并行程度,系统引入了中断机制,中断机制引入后,外围设备仅当操作系统正常结束或者异常结束时才向CPU发起中断请求。在I/O设备输入每个数据的过程中,由于无需CPU的干预一定程度上实现了CPU和I/O设备的并行工作

上述两种方法的特点都是以CPU为中心,数据传送通过一段程序来实现,软件的传送手段限制了数据传送的速度。接下来这两种I/O控制的方式采用硬件的方式来显式I/O的控制

  • DMA直接内存访问:为了进一步减少CPU对I/O操作的干预,预防因并行操作设备过多使CPU来不及处理或因速度不匹配造成的数据丢失现象,引入DMA控制方式
  • 通道控制方式:通道,独立于CPU的专门负责输入输出控制的处理机,它控制设备与内存直接进行行数据交换。有自己的通道指令,这些指令由CPU启动,并在操作结束时向CPU发出中断信号。

操作系统的主要目的是什么

操作系统是一种特殊的软件,它的主要目的有三种

  • 管理计算机资源,CPU,内存,硬件,文件等等
  • 提供一种图形界面,提供了用户和计算机之间的桥梁
  • 为其他软件提供服务,操作系统与软件进行交互,以便为其分配运行所虚的任何必要资源(屏蔽底层硬件的实现)

什么是用户态和内核态

用户态和内核态是操作系统的两种运行状态

  • 内核态:处于内核态的CPU可以访问任意的数据,包括外围设备,比如网卡、硬盘等,处于内核态的CPU可以从一个程序切换到另外一个程序,并且占用CPU不会发生抢占情况,一般处于特权级0的状态我们称之为内核态
  • 用户态:处于用户态的CPU只能受限的访问内存,并且不允许访问外围设备,用户态下的CPU不允许独占,也就是说CPU能被其他程序获取

为什么要有用户态和内核态

这个主要是访问能力的限制的考量,计算机中有一些比较危险的操作,比如说设置时钟,内存清理,这些都需要在内核状态下完成,如果随意进行这些操作,系统会出现崩溃。

用户态和内核态是如何切换的

所有的用户进程都是运行在用户态的,但是用户程序的访问能力有限,一些比较重要的比如从硬盘读取数据,从键盘获取数据的操作则是内核态才能做的事情,而这些数据确有堆用户程序来说非常重要。所以就书记到两种模式下的转换,即用户态->内核态->用户态,而唯一能够做这些操作的只有系统调用,而能够执行系统调用的就只有操作系统。

 一般用户态->内核态的转换我们都称之为trap进内核,也被称之为陷阱指令

什么是内核

在计算机中,内核是一个计算机程序,它是操作系统的核心,可以控制操作系统中所有的内容。内核通常实在boot loader装载程序之前加载的第一个程序

使用多线程的好处是什么

  • 能够提高对用户的响应顺序
  • 在流程中的资源共享
  • 比较经济适用
  • 能够对多线程架构有深入了理解

进程终止的方式

进程在创建之后,它就开始运行并完成任务。进程最终会停止,通常由以下情况触发

  • 正常退出
  • 错误退出
  • 严重错误
  • 被其他进程杀死

正常退出

多数进程是由于完成了工作而终止。当编译器完成了所给定程序的编译之后,编译器会执行一个系统调用高所操作系统它完成了工作。

错误退出

发生严重错误时,进程会发生终止

严重错误

这个错误通常时由进程引起的错误,通常是由于程序中的错误所导致的,例如执行了一条非法指令,引用不存在的内存,或者除数是0等。

被其他进程杀死

某个进程执行系统调用告诉操作系统杀死某个进程。

进程间的通信方式

进程间的通信方式比较多,首先要理解以下几个概念

  • 竞态条件:即两个或多个线程同时对一共享数据进行修改,从而影响程序运行的正确性时,这种就被称为竞态条件
  • 临界区:不仅共享资源会造成竞态条件,事实上共享文件、共享内存也会造成竞态条件、那么该如何避免呢?禁止一个或者多个进程在同一时刻对共享资源(包括共享内存、共享文件等)进行读写。换句话说,我们需要一种互斥条件,这也就是说,如果一个进程在某种方式下使用共享变量和文件的话,除该进程之外的其他进程就禁止做这件事。

一个好的方法,应该包含下面四种条件

  1. 任何时候两个进程不能同时处于临界区
  2. 不应对CPU的速度和数量做任何假设
  3. 位于临界区外的进程不得阻塞其他进程
  4. 不能时任何进程无限等待进入临界区
  • 忙等互斥:当一个进程在对资源进行修改时,其他进程必须等待,进程之间要具有互斥性,我们讨论的解决方案其实都是基于忙等互斥提出的。

进程间的通信即Inter Process Communication IPC,主要有以下几种通信方式

  • 管道/匿名管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程中使用,比如父子进程之间。
  • 有名管道:有名管道也是一种半双工的通信方式,他和匿名管道的区别在于,有名管道运行在非亲缘关系的进程间通信。
  • 消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列客服了信号传递信号少、管道只能承载无格式字节流以及缓冲区大小受限等缺点
  • 共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但是多个进程都可以访问。共享内存是最快的IPC方式,他是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信方式比如信号量配合使用,来实现进程间的同步和通信
  • 信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
  • 信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它长作为一种锁机制,防止进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段
  • 套接字:套接字也是一种进程间的通信机制,与其他通信机制不同的是,它可以用于不同进程间的进程通信

进程间状态模型

进程的三态模型

  • 运行态:运行态指的就是进程实际占用CPU时间片运行时
  • 就绪态:就绪态指的是可运行,但因为其他进程正在占用CPU而处于就绪状态
  • 阻塞态:阻塞态又被称为睡眠态,它指进程不具有运行条件,正在等待被CPU调度

三种状态会涉及四种状态间的切换,在操作系统发现进程不能继续执行时会发生状态1的转变,即有运行态转到阻塞态。转换2和转换3都是由进程调度程序引起的,进程本身不知道调度程序的存在。转换2的出现说明进程调度器认定当前进程已经运行了足够长的事件,是时候让其他进程运行CPU时间片了。当所有其他进程都运行过后,这时候该让第一个进程重新获得CPU时间片的时候就会发生转换3

当进程等待一个外部事件发生时(如从外部输入一些数据后),就会发生转换4.如果此时没有其他进程在运行,则立刻触发转换3,该进程便开始运行,否则该进程会处于就绪阶段,等待CPU空闲,再到他运行

进程的五态模型

在三态模型的基础上加了新建和终止状态。

  • 新建态:进程的新建态就是进程刚创建出来的时候
  • 终止态:进程的终止状态就是指进程执行完毕,到达结束点,或者因为错误而不得不终止进程

调度算法都有哪些

调度算法分为三大类:批处理中的调度,交互系统中的调度,实时系统中的调度

批处理中的调度

先来先服务 

非抢占式调度算法,使用此算法,将按照请求顺序分配CPU。最基本的,会有一个就绪进程的等待队列。当第一个任务从外部进入系统时,将会启动并允许运行任意长的事件,它不会因为运行的事件太长而中断。当其他任务进入时,它们拍到就绪队列尾部。当正在运行的进程阻塞,处于等待队列的进程就开始运行。第一个阻塞的进程重新处于就绪态时,他会重新排在队列尾部。

这种算法的优点是设计简单,易于实现。缺点是现实情况下几乎不能使用,假设有100个IO进程正在排队,第101个是一个CPU密集型进程,那岂不是需要等100个IO进程才会等到一个CPU密集型进程运行,这在实际情况下根本不可能。

最短作业优先

当输入队列中有若干个同等重要的作业被启动时,调度程序应使用最短作业优先算法

当运行若干个同等重要的作业时,使用最短作业优先算法会使平均周转时间明显减少,需要注意的时,在所有进程都可以运行的情况下,最短作业优选的算法才是最优的。

最短剩余时间优先

最短作业优先的抢占式版本,使用这个算法,调度程序总是选择剩余运行时间最短的那一个进程运行,当一个新作业到达时,和其他进程的剩余时间做比较,如果新进程的运行时间短,就挂起当前进程,运行新进程。

交互系统中的调度

轮询调度

一种最古老最公平并且最广泛使用的算法就是轮询算法。每个进程都会被分配一个时间段,称为时间片,在这个时间片运行进程运行。如果时间片结束时进程还在运行,则抢占CPU并将其分配给另一个进程。如果在时间片内进程被阻塞或者结束,则提前将CPU分配给其他进程

轮询算法比较容易实现。调度程序所做的就是维护一个可运行进程的列表,一个进程用完时间片后就被移到队列的末尾。

优先级调度

事实情况不是所有进程的优先级都是相同的。

这个算法的思想很明确,每个算法都被赋予了一个优先等级,优先级高的进程优先运行。

但是也不是意味着高优先级的进程就能永远运行下去,调度程序会在每个时钟中断期间减低当前进程的优先级,这个操作很可能导致进程的调度。

最短进程优先

影响调度程序的指标是什么

  • CPU使用率:CPU正在执行任务(即不处于空闲状态)的时间百分比
  • 等待时间:这是进程轮流执行的时间,也就是进程切换花费的时间
  • 吞吐量:单位时间内完成进程的数量
  • 响应时间:从提交流程到获得有用输出所经过的时间
  • 周转时间:从提交流程到完成流程所经过的时间

内存管理

操作系统的内存管理主要是负责内存的分配和回收,同时也负责地址的转换,也就是把逻辑地址转换为物理地址。

什么是按需分页

在操作系统中,进程是以页为单位加载到内存中的,按需分页是一种虚拟内存的管理方式。在使用请求分页的系统中,只有尝试访问页面所在的磁盘并且该页面尚未在内存中时,也就发生了雀跃异常,操作系统才会将磁盘页面复制到内存中。

什么是虚拟内存

虚拟内存是一种内存分配方案,是一项可以用来辅助内存分配的机制。我们知道,应用程序时按页装载进内存中的。但并不是所有的页都会装载到内存中,计算机硬件和软件会将数据从RAM临时传输到磁盘中来弥补内存的不足。如果没有虚拟内存的话,一旦你将计算机内存填满后,计算机就无法加载任何应用程序了,需要关闭另一个应用程序才能加载新的应用程序。对于虚拟内存,计算机可以执行操作是查看内存中最近未使用过的区域,将其复制到硬盘上。虚拟内存通过复制技术实现了使用有限内存空间运行更多应用程序的能力。

虚拟内存的实现方式

虚拟内存中,允许将一个作业分多次调入内存。采用连续分配方式时,会使相当一部分内存空间都处于暂时或者永久的空闲状态,造成内存资源的严重浪费,而且也无法从逻辑上扩大内存容量。因此,虚拟内存的实现需要建立在离散分配的内存管理方式的基础上。虚拟内存的实现又以下三种方法

  • 请求分页存储管理
  • 请求分段存储管理
  • 请求段页式存储管理

不管哪种方式,都需要一定的硬件支持。一般需要的支持有以下几个方面

  • 一定大小的内存和外存
  • 页表机制,或者段表机制,作为主要的数据结构
  • 中断机制,当用户程序要访问的部分尚未调入内存,则产生中断
  • 地址转换机制,从逻辑地址到物理地址的转换

页面置换算法有哪些

在地址映射中,如果页面中发现所要访问的页面不在内存中,那么就会产生一条缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,那么操作系统必须在内存中选择一个页面将其移除内存,以便将调入的页面让出空间。

  • 最优算法:在当前页面中置换最后要访问的页面,这种方法无法实现,只能作为衡量其他算法的标准
  • NRU:最近未使用算法,
  • FIFO:先进先出算法,当出现需要移除页面时,先移除先进入的页面
  • 第二次机会算法:对FIFO算法的改进,在移除页面时,检查这个页面是否仍然在使用,如果还在使用就会保存页面。
  • LRU:最近最少使用算法,会将一个最长时间未使用的页面移除
  • NFU:最不经常使用算法,和LRU类似
  • 老化算法:一种更接近LRU算法的实现,并且可以更好的实现
  • 时钟算法:第二次机会算法的另一种实现
  • 工作集算法:开销较大
  • WSClock:工作集算法的变体,性能很好

最好的算法时老化算法和WSClock算法。它们分别时基于LRU和工作集算法。性能很好

死锁

死锁描述的是这样一种情况:多个线程/进程被同时阻塞,它们中的一个或者多个都在等待某个资源被释放,并且因为该资源无法被释放,导致多个进程/线程被一直阻塞。程序无法终止。

产生死锁的四个必要条件

  • 互斥条件:资源必须处于非共享状态,一个资源同时只能被一个进程持有,请求该资源的其他进程保持阻塞,等待该资源释放
  • 请求并保持条件:持有了资源的进程因为无法得到其他资源被阻塞时,不释放已经持有的资源
  • 非抢占条件:进程无法抢占其他进程持有的资源,只能由进程主动释放
  • 循环等待条件:进程和资源之间形成一种相互引用请求的关系。

死锁恢复的方法

针对检测出来的死锁,我们要对其进行恢复

通过抢占进行恢复

在某些情况下,可能会临时将某个资源从他的持有者转移到另一个进程。使用完后送回。这种恢复方式一般比较困难而且有些简单,并不可取

通过回滚进行恢复

如果系统设计者和机器操作员知道有可能发生死锁,那么就可以定期检查流程。进程的检测点意味着进程的状态可以被写入到文件以便后面进行恢复。检测点不包含存储映像,还包含资源状态,一种更有效的解决方式是不要覆盖原有的检测点,而是每出现一个检测点都要把它写入到文件中,这样当进程执行时,就会有一些列的检查文件被积累起来。

为了进行恢复,要从上一个较早的检查点开始,这样所需要资源的进程会回滚到上一个时间点,在这个时间点上,死锁还没有获取所需要的资源,可以在此时对其进行资源分配。

杀死进程恢复

最简单有效的解决方案就是直接杀死一个死锁进程。但是杀死一个进程可能一样行不通,这就需要继续杀死别的进程进行恢复。

如何破坏死锁

破坏死锁只需要破坏死锁的四个必要条件之一即可

破坏互斥条件

使得资源是可以同时访问的,多个进程可以同时持有资源,就不存在死锁的问题了,但是这种方法往往不能解决问题,因为很多资源是不允许直接访问的。

破坏保持并等待条件

一种方法是在运行前一次性申请全部的资源,这之后就不用在申请资源了,也就不存在死锁。第二种方法是,允许进程在请求其他资源被阻塞时,先释放全部的资源,之后再一次性申请全部资源。

破坏非抢占条件

采用剥夺式调度算法,但剥夺式调度算法目前一般仅适用于主存资源和处理器资源,会导致资源利用率下降,不推荐使用。

破坏循环等待条件

将资源分层,申请资源时按层申请,释放资源时按层释放。即可预防死锁的发生。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KYLO_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值