操作系统

2020-10-05  本文已影响0人  谭英智

定义

特征

演进

原因

步伐

内存管理

os-ram

CPU内部有寄存器和多级缓存,CPU和磁盘等外设之间有内存。

计算机通过对存储分级,是为了在一定性价比的情况下,使得CPU访问存储的速度尽可能快。

进程的地址

os-process-memory

内存管理的方式

进程的地址生成

连续内存分配

给进程分配一块指定大小的连续物理内存区域

内存碎片

由于程序是动态运行的,在运行的每个时刻,对内存的要求都是不一样的,如果每次分配时,都按最大要求来分配,那么会导致程序在不是高峰时刻,造成内存资源的浪费,而导致内存碎片

外部碎片

物理内存分配多个块后,有可能导致块与块之间存在小的块,随着内存分配的进行下去,会导致越来越多的这样的小块,而无法利用。

分配策略

碎片整理

通过调整进程占用的内存位置,以减少分区碎片

条件

所有的应用程序可以动态重定位

时机

被移动的进程,需要处于就绪态或者等待态才能移动。

分区对换
os-swap-process

如果计算机资源只能满足一个进程处于内存中,那么可以通过分区对换技术,把多个进程在内存和外存之间来回切换,交替使用CPU,来实现多道程序的目的。

伙伴系统

通过把内存划分为2^n大小,来分配内存

非连续内存分配

连续分配的缺点

非连续分配的设计目标

如果解决

段式存储

把程序分成多个段,段与段之间交互少,使得可以分散在内存的不连续区域。通过段加偏移来实现。

段:堆/栈/数据段/代码段

页式存储

页表
问题
如何解决
反置页表
段页式存储

通过在页前加上段,从而实现段页式存储访问

虚拟存储

由于对存储的要求越来越高,而硬件资源无法从价格和存储大小上跟上需求,这引出了虚拟存储的概念,让计算机把存储虚拟成可以支持比内存更大的地址空间,来满足更高的内存要求

手工

覆盖
os-memory-cover

由于程序在运行的过程中,没有必要在每个时刻都加载所有的程序到内存进行计算,这样程序员可以通过手工把程序划分成上图类似的结构,在程序运行的过程中,动态的加载和卸载模块,实现在有限内存中跑更大的程序的目的。

缺点:

交换

由于CPU在某一时刻可以处理的程序数是一定的,那么必然有大量的程序是处于非运行状态,此时,可以暂时把不运行的程序整个换出到外存中。从而腾出更多的空间,给运行中的程序。

需要程序支持动态重定位的功能

虚拟存储技术的目标

os-memory-close

局部性原理

虚拟存储的原理

实现方式

需要的支持

虚拟页式存储管理

置换算法

功能

设计目标

页面锁定

算法分类

局部页面置换算法
全局页面置换算法

算法

最优页面置换算法(OPT)

置换在未来最长时间不访问的页面

特征
先进先出算法

选择内存驻留时间最长的页面进行置换

特征
最久最近未使用算法(LRU)

选择最长时间没有被使用的页面进行置换

是OPT的一种近似

时钟置换算法

是LRU和FIFO的折中

把页面用一个环连起来

每个页面有一个访问位,如果访问过则为1

顺时针扫描页面,发现访问位为0,则置换,为1则赋值为0

最不常用算法(LFU)

统计每个页面的访问次数,置换访问次数最小的页面

Balady现象

当分配物理页面数增加时,缺页次数不降反升的现象

LRU/FIFO/Clock比较

全局置换算法

os-memory-cpu

随着进程数的增加,CPU的利用率会不断的上升

当进程数达到一定规模后,系统的缺页率会陡然上升

导致CPU利用率急速下降

缺页率置换算法

通过监控进程的缺页率,设置缺页率的阈值

如果高于阈值,则分配更多的物理页面

如果低于阈值,则分配更少的物理页面

使得进程的缺页率稳定在一定的区间

进程

进程是一个程序的动态执行

os-process

进程控制块PCB

是进程在操作系统的唯一标志

内容

数据结构

状态

多线程

引入原因

设计特性

进程与线程的比较

用户线程

不需要操作系统支持,在用户态通过函数库,实现线程功能的支持

优点
缺点

内核线程

操作系统实现线程机制,内核完成创建,终止和管理功能

优点
缺点

进程切换

要求

上下文包括寄存器,CPU状态,内存地址空间

进程创建

处理机调度

进程切换

调度

策略

算法的准则

在设计调度算法时,需要结合操作系统的使用需求,而对上述的准则作出不同比例的调整,因为计算机的资源是有限的,而这些准则在一定程度上存在矛盾,所以必须作出一些妥协,最大程度的满足使用者的需求

算法

先来先服务算法
短进程有限算法
最高响应比算法

通过计算等待时间和执行时间,可以得到响应比

时间片轮转算法
多级反馈队列算法

对不同的进程,使用不同的队列,不同的队列使用不同的算法来管理

公平共享调度算法

主要考量资源的公平性,有针对不同用户的公平,也有针对不同进程的公平。

实时调度

进程的正确性依赖时间和功能两方面

硬实时

错过任务的时限会导致灾难性的后果

在设计时必须考虑最坏情况下也能满足时限

多处理机调度

对称多处理机调度
静态进程分配
动态进程分配

优先级反置

os-cpu-revert

T1占有了资源

T2等待T1的资源

T3优先级比T1高而获得执行

导致T2优先级高,却需要等待

优先级继承

如果进程占有了资源,如果有更高优先级的进程在等待,则提高进程的优先级,保证在占用资源的期间,可以快速执行而释放资源

同步互斥

由于CPU在执行程度时,在很多时候会在不同进程/线程间切换运行,如果它们之间含有共享变量,那么有可能导致不确定和诡异不正确的结果,此时需要引入同步互斥,来把某段不可分割的代码封装成原子操作,却道结果的正确性

方法

禁用硬件中断

没有中断,没有上下文切换,因此没有并发

缺点:粒度太大,临界区如果太长,会导致其他进程处饥饿状态

硬件原子锁支持

bool test_and_set(bool *value) {
    bool orig = *value;
    *value = true;
    return orig;
}
/* shared variable */
bool lock = false;
 
/* arbitrations */
while (test_and_set(&lock));
// critical section ...
lock = false;

硬件引入testandset原子操作,这可以为上层应用提供原子机制,使得如果实现自旋锁,可以写一个循环,并不断的检测共享变量lock;如果实现线程切换,可以引入test失败,则进入等待状态,释放锁时,把所有等待锁的线程变为就绪状态,然后取竞争锁。

linux称为惊群

信号量

是进程/线程间的一种资源同步机制。

通过设定资源数量,再通过P(减一),V(加一)操作,实现资源信息的同步。

条件变量

死锁

处理方法

由于处理死锁的消耗非常大,一般的操作系统不处理死锁,而是把死锁的处理交给应用程序

进程间通讯

进程间通过内核关联一片共享资源,操作共享资源,达到信息沟通的目的。

分类

信号

通过软件中断来支持

操作如下

进程拥有默认的信号处理函数,操作系统会对信号处理函数注册,并在接收到外部程序对此进程的信号的时候,产生中断,并调用进程空间的信号处理函数,来处理信号。

进程可以通过注册信号处理函数,来覆盖系统默认的处理函数

管道

子进程继承父进程的文件描述符,通过在0,1描述符上,打开管道描述符,父子进程之间就可以进行读写操作。

在父子进程消亡后,管道资源自动释放

消息队列

资源的消亡跟进程不关联。

多个进程可以共享同一个消息队列

共享内存

进程间通过操作系统,开辟一片内存空间,并在进程内部的进程空间进行内存映射,进程可以通过读写映射的内存,达到通信的目的。

但是在读写的过程中,需要引入同步控制,防止错误的数据读写

文件系统

是操作系统中管理持久化数据的子系统。提供数据存储和访问功能。

需要考虑的问题

文件描述符

是操作系统识别打开文件的标志。

它包含

视图

用户视图

用户一般关系可视化的内容

系统视图

系统一般不关心文件的内容,它一般把文件为字节序列的集合

文件的访问模式

一致性

对于共享的文件,在多用户下,如何保证文件访问的一致性。

目录

目录是一种特殊的文件,它的内容是它下面的文件列表。

Unix系统呈现树状结构

操作

操作系统只允许内核修改目录

数据结构

文件别名

虚拟文件系统VFS

对不同的文件系统提供一个统一的访问接口。

文件分配

由于系统中的文件,大部分是小文件,有少数大文件。

所以在设置文件块的分配时,需要同时兼顾在小文件时能用尽量少的空间来存放,对于大文件需要比较快的访问到文件。

UFS的设计,通过对于建立多级索引,初始的索引用一级索引链接到数据块,如果一级索引用完,则用二级索引/三级索引来链接数据块。

冗余磁盘阵列RAID

为了提高磁盘的吞吐量和可靠可用性

在实际应用中,会用多种RAID的技术组合使用

IO系统

类型

访问方式

通过中断来通知操作系统

CPU与设备的通讯方式

读写

磁盘调度

通过在一定时间段内,对磁盘的读写序号排序,以环式的方法,扫描磁盘读写,可以达到最优性能

上一篇下一篇

猜你喜欢

热点阅读