学习操作系统,看这一篇就够了!

1 什么是操作系统

操作系统是管理和控制计算机系统中各种硬件和软件资源,合理地组织计算机工作流程的系统软件,是用户与计算机之间的接口。

2 操作系统的作用

  1. 存储管理:提高利用率,方便用户使用,同时提供足够的存储空间,方便进程并发运行,例如存储分配与回收,存储保护(防止进程间互相干扰),地址映射(进程逻辑地址到内存物理地址的映射),存储扩充
  2. 处理机管理:说到底其实就是对进程的管理,例如进程调度(为进程分配处理机),进程控制,进程同步,进程通讯
  3. 设备管理:分配和回收设备,响应 IO 请求,例如缓冲管理(解决 CPU 与 IO 速度不匹配),设备分配与回收(在多用户之间共享 IO 资源)
  4. 文件管理:解决软件资源之间的存储,共享,保密和保护,例如文件存储空间管理,目录管理(信息检索问题),文件读写和存取控制,对文件操作的管理
  5. 用户接口:提供友好的用户访问操作系统的接口,主要包括三种接口,分别为命令接口(键盘命令,供用户组织和控制自己的作业运行),程序接口(系统调用,供用户程序和系统程序调用操作系统功能),图形接口(用户利用鼠标,图标等图形用户界面工具使用各种应用程序)

3 操作系统的特征

  1. 并发:指两个或多个事件在同一时间间隔内发生,微观上还是程序在分时地交替执行
  2. 共享:指系统中的资源可供内存中多个并发执行的进程共同使用,主要包括两个方式,一种为互斥共享方式,例如如打印机,在一段时间内只允许一个进程访问该资源;另一种为同时访问方式,例如磁盘设备
  3. 虚拟:指把一个物理上的实体变为若干个逻辑上的对应物,例如虚拟处理器,虚拟内存,虚拟外部设备
  4. 异步:在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底,而是走走停停,以不可预知的速度向前推进

操作系统最基本的特征是并发和共享。

4 进程

4.1 进程的定义

进程是指一个具有独立功能的程序对某个数据集在处理机上的执行过程和分配资源的基本单位。每个进程包含独立的地址空间,进程各自的地址空间是私有的,只有执行自己地址空间中的程序,且只能访问自己地址空间中的数据,相互访问会导致指针的越界错误。

进程是操作系统进行资源分配的基本单位。

4.2 进程与程序的区别

  1. 进程是动态的,是程序的一次执行过程,具有一定的生命期;程序是静态的,可长期存在
  2. 进程具有并发特征,是一个能够独立运行的单位,是作为资源申请和调度单位存在的,能与其他进程并发执行;程序不能作为一个独立进行的单位而并发执行
  3. 程序和进程之间没有一一对应的关系,一个程序可对应多个进程,一个进程也可包括多个程序
  4. 进程在并发执行的过程中存在互相制约的关系,但是程序没有

4.3 进程的状态

进程的状态包括以下五种,分别为运行态,就绪态,阻塞态,新建态,退出态。

就绪态的进程通过调度算法从而获得 CPU 时间,转为运行态;而运行态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪态,等待下一次调度;阻塞态是缺少需要的资源从而由运行态转换而来,但是该资源不包括 CPU,缺少 CPU 会让进程从运行态转换为就绪态。

5 线程

5.1 线程的定义

线程是独立调度的基本单位,一个进程中可以有多个线程。

线程是一个“轻量级进程”,是一个基本的 CPU 执行单元,也是程序执行流的最小单元。它可以减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。

线程共享进程拥有的全部资源,它不拥有系统资源,但是它可以访问进程所拥有的系统资源。线程没有自己独立的地址空间,它共享它所属的进程的空间。

5.2 线程的实现方式

线程的实现方式有两种,一种是用户级线程,另一种是内核级线程。

5.3 进程与线程的区别

  1. 资源:进程是资源分配的基本单位;线程不拥有资源,线程可以访问所属进程的资源
  2. 调度:线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换
  3. 系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、IO 设备等,因此操作系统所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置。而线程切换时只需保存和设置少量寄存器内容,开销很小。此外,由于同一进程内的多个线程共享进程的地址空间,因此,这些线程之间的同步与通信非常容易实现,甚至无需操作系统的干预
  4. 通信:进程间通信需要进程同步和互斥手段的辅助,以保证数据的一致性,而线程间可以通过直接读/写进程数据段(如全局变量)来进行通信

6 调度

6.1 调度的层次

  1. 作业调度,又称高级调度。就是内存与辅存之间的调度
  2. 中级调度,又称内存调度。引入中级调度是为了提高内存利用率和系统吞吐量,使那些暂时不能运行的进程,调至外存等待,把此时的进程状态称为挂起状态。当他们具备运行条件且内存又稍有空闲时,由中级调度来决定,把外存上的那些已具备运行条件的就绪进程再重新调入内存
  3. 进程调度,又称为低级调度。按照某种方法和策略从就绪队列中选取一个进程给 CPU

6.2 调度算法

  1. 先来先服务调度算法(FCFS):调度最先进入就绪队列的作业。有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长
  2. 短作业优先调度算法(SJF):调度估计运行时间最短的作业。长作业有可能会饿死,处于一直等待短作业执行完毕的状态。如果一直有短作业到来,那么长作业永远得不到调度
  3. 短进程优先调度算法(SPF):从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行
  4. 优先级调度算法:根据能否抢占进程,可将调度算法分为非剥夺式优先级调度算法和剥夺式优先级调度算法;根据进程创建后其优先级是否可以改变,可分为静态优先级(优先级在创建进程时确定,且在进程的整个运行期间保持不变)和动态优先级(可动态调整优先级)
  5. 高响应比优先调度算法:把响应比作为优先权,其中响应比 = (等待时间 + 要求服务时间) / 要求服务时间 = 响应时间 / 要求服务时间,主要是为了解决 SJF 中长作业可能会饿死的问题,因为随着等待时间的增长,响应比也会越来越高
  6. 时间片轮转调度算法:将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 分配给队首的进程。时间片轮转算法的效率和时间片有很大关系。因为每次进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太短,进程切换太频繁,在进程切换上就会花过多时间
  7. 多级反馈队列调度算法:设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权越高的队列中,为每个进程所规定的执行时间片就越小。当一个新进程进入内存后,首先将它放入第一队列的末尾,按 FCFS 原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入下一个队列的队尾。仅当前 i -1 个队列均空时,才会调度第 i 队列中的进程运行。

7 进程同步

7.1 临界资源与临界区

临界资源即一次仅允许一个进程使用的资源,临界区即对临界资源进行访问的代码。为了互斥访问临界资源,每个进程在进入临界区之前,需要先进行检查。

7.2 同步与互斥

同步即多个进程按一定顺序执行;互斥即多个进程在同一时刻只有一个进程能进入临界区。同步是在对临界区互斥访问的基础上,通过其它机制来实现有序访问的。

7.3 信号量

信号量是一个整型变量,可以对其执行 down 和 up 操作。所谓 down 操作,即如果信号量大于 0 ,执行 - 1 操作;如果信号量等于 0,将进程睡眠,等待信号量大于 0;up 操作即对信号量执行 + 1 操作,并且唤醒睡眠的进程,让进程完成 down 操作。

down 和 up 操作需要被设计成原语,不可分割,通常的做法是在执行这些操作的时候屏蔽中断。如果信号量的取值只能为 0 或者 1,那么就成为了互斥量(Mutex),0 表示临界区已经加锁,1 表示临界区解锁。

7.4 管程

管程是由一组数据以及定义在这组数据之上的对这组数据的操作组成的软件模块,这组操作能初始化并改变管程中的数据和同步进程。事实上,管程是一个抽象类,拥有成员变量,以及对成员变量进行操作的成员函数。

在一个时刻只能有一个进程使用管程。进程在无法继续执行的时候不能一直占用管程,必须将进程阻塞,否者其它进程永远不能使用管程。

管程引入了条件变量以及相关的操作:wait() 和 signal() 来实现同步操作。对条件变量执行 wait() 操作会导致调用进程阻塞,把管程让出来让另一个进程持有。signal() 操作用于唤醒被阻塞的进程。

8 进程通信

8.1 管道

管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的首端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。

管道提供了简单的流控制机制,进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样地,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。

8.2 信号量

信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其它进程也访问该资源。因此,信号量主要作为进程间以及同一进程内不同线程之间的同步手段。

8.3 共享内存

共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。

8.4 套接字

套接字也是一种进程间通信机制,与其它通信机制不同的是,它可用于不同机器间的进程通信。

9 死锁

9.1 死锁的定义

多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

9.2 死锁的条件

  1. 互斥
  2. 请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放
  3. 不可抢占
  4. 环路等待

9.3 死锁的处理策略

9.3.1 预防死锁

预防死锁即在程序运行之前预防发生死锁。

设置某些限制条件,破坏产生死锁的四个必要条件中的一个或几个,以防止发生死锁。例如破坏环路等待,给资源统一编号,进程只能按编号顺序来请求资源;又或者破坏请求与保持条件,规定所有进程在开始执行前请求所需要的全部资源。

9.3.2 避免死锁

在程序运行时避免发生死锁。

可以采用银行家算法,所谓银行家算法,其主要思想为避免系统进入不安全状态,每次进行资源分配时,他首先检查系统是否有足够的资源满足要求,如果有则先进行分配,并对分配后的新状态进行安全性检查。如果新状态安全,则正式分配上述资源,否则拒绝分配上述资源。这样,它保证系统始终处于安全状态,从而避免死锁现象的发生。

9.3.3 死锁的检测及解除

通过系统的检测机构及时地检测出死锁的发生,然后采取某种措施解除死锁。

一旦检测出死锁,就应立即采取相应的措施,以解除死锁,死锁解除的主要方法有:

  1. 资源剥夺法:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态
  2. 撤销进程法:强制撤销部分甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行
  3. 进程回退法:让一个或多个进程回退到足以回避死锁的地步。进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点

10 存储器管理

10.1 程序执行过程

  1. 编译:由编译程序将用户源代码编译成若干个目标模块
  2. 链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块
  3. 装入:由装入程序将装入模块装入内存运行

10.2 逻辑地址与物理地址

  1. 逻辑地址:编译后,每个目标模块都是从0号单元开始编址,称为该目标模块的相对地址(或逻辑地址)。当链接程序将各个模块链接成一个完整的可执行目标程序时,链接程序顺序依次按各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间。用户程序和程序员只需知道逻辑地址,而内存管理的具体机制则是完全透明的,它们只有系统编程人员才会涉及。不同进程可以有相同的逻辑地址,因为这些相同的逻辑地址可以映射到主存的不同位置
  2. 物理地址:物理地址空间是指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据最后都要通过物理地址从主存中存取。当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址,这个过程称为地址重定位

10.3 虚拟内存

每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一 页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。

当程序引用到一部分在物理内存中的地址空间时,由硬件立即执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。

10.4 分页

用户程序的地址空间被划分为若干固定大小的区域,称为“页”。相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配,由一个页表来维护它们之间的映射关系。

10.5 分段

如果使用分页系统的一维地址空间,由于其动态递增的特点,可能导致覆盖问题的出现。分段的做法是把每个表分成段,一个段构成一个独立的地址空间。每个段的长度可以不同,可以动态改变。每个段都需要程序员来划分。

10.6 段页式

用分段方法来分配和管理虚拟存储器。程序的地址空间按逻辑单位分成基本独立的段,而每一段有自己的段名,再把每段分成固定大小的若干页。

用分页方法来分配和管理实存。即把整个主存分成与上述页大小相等的存储块,可装入作业的任何一页。程序对内存的调入或调出是按页进行的。但它又可按段实现共享和保护。

10.7 分页与分段的区别

  1. 对程序员的透明性:分页透明,但是分段需要程序员显示划分每个段
  2. 地址空间的维度:分页是一维地址空间,分段是二维的
  3. 大小是否可以改变:页的大小不可变,段的大小可以动态改变
  4. 出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护

10.8 页面置换算法

在程序运行过程中,若其所要访问的页面不在内存而需要把它们调入内存,但是内存已无空闲空间时,系统必须从内存中调出一个页面到磁盘对换区中,并且将程序所需要的页面调入内存中。页面置换算法的主要目标是使页面置换频率最低(也可以说缺页率最低)。

  1. 最佳:将最长时间内不再被访问的页面换出,可以保证获得最低的缺页率。它是一种理论上的算法,因为无法知道一个页面多长时间会被再访问到
  2. 先进先出:将最先进入的页面换出,将导致那些经常被访问的页面也被换出,从而使缺页率升高
  3. 最近最久未使用:将最近最久未使用的页面换出
  4. 时钟:该算法需要一个访问位,当一个页面被访问时,将访问位置为 1。首先将内存中的所有页面链接成一个循环队列,当缺页中断发生时,检查当前指针所指向页面的访问位,如果访问位为 0,就将该页面换出;否则将该页的访问位设置为 0,移动指针继续检查

11 文件管理

11.1 什么是文件

文件是以计算机硬盘为载体存储在计算机上的信息集合,文件可以是文本文档、图片、程序等。

11.2 磁盘调度算法

当多个进程同时请求访问磁盘时,需要进行磁盘调度来控制对磁盘的访问。磁盘调度的主要目标是使磁盘的平均寻道时间最少。

  1. 先来先服务(FCFS):根据进程请求访问磁盘的先后次序来进行调度。公平,简单,但由于未对寻道做任何优化,平均寻道时间可能较长
  2. 最短寻道时间优先(SSTF):根据访问的磁道与当前磁头所在磁道距离最近的优先进行调度。该算法并不能保证平均寻道时间最短,但是比 FCFS 好很多
  3. 扫描(SCAN):SSTF 会出现进行饥饿现象。考虑以下情况,新进程请求访问的磁道与磁头所在磁道的距离总是比一个在等待的进程来的近,那么等待的进程会一直等待下去。SCAN 算法在 SSTF 算法之上考虑了磁头的移动方向,要求所请求访问的磁道在磁头当前移动方向上才能够得到调度。因为考虑了移动方向,那么一个进程请求访问的磁道一定会得到调度。当一个磁头自里向外移动时,移到最外侧会改变移动方向为自外向里,这种移动的规律类似于电梯的运行,因此又常称 SCAN 算法为电梯调度算法
  4. 循环扫描(CSCAN):CSCAN 对 SCAN 进行了改动,要求磁头始终沿着一个方向移动

参考:操作系统学习总结(超赞!!!)
操作系统基础知识复习总结

发布了127 篇原创文章 · 获赞 237 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Geffin/article/details/104252328