Featured image of post 操作系统引论笔记

操作系统引论笔记

快期中了

操作系统引论笔记

平时不做笔记的,但是考虑到我之后想往操作系统发展就好好学习整理了一下,顺便发个博客,好久没研究漏洞了(╥﹏╥)

操作系统的定义

计算机系统可以分成五个部分:硬件、操作系统、系统程序、应用程序和用户

系统程序是更接近系统底层,硬件,运行环境的程序,可以用来使用和管理操作系统,比如驱动,shell

其中操作系统是计算机系统中的一个系统软件,他是这样一些程序模块的集合——它们管理和控制计算机系统中的硬件及软件资源,合理的组成计算机工作流程,以便有效利用这些资源,为用户提供一个功能强大,使用方便和可拓展的工作环境, 从而在计算机与其用户之间起到接口作用

  • 用户的角度:操作系统是用户和计算机硬件之间的接口
  • 系统的角度:操作系统是计算机系统资源的管理者

操作系统的目标

  • 方便性:用户和程序可以通过系统程序间接调用底层资源
  • 有效性:操作系统通过自身设计,可以提高系统资源的利用率和系统吞吐量
  • 可拓充性:系统能够适应硬件和应用需求的发展,方便增加新功能、支持新设备和改进原有机制。它通常通过模块化结构、分层设计、统一接口和抽象机制来实现。
  • 开放性:操作系统向外提供公开、规范的接口,便于第三方软件开发和系统互联互通。

操作系统的作用

  1. 对应用
  • 生命周期的管理:应用的加载,迁移,销毁等操作
  • 计算资源的分配:
    • CPU: 线程的调度机制
    • 内存:物理内存的分配
    • I/O设备:设备的复用和分配
  • 应用间通信:提供管道,信号,共享内存,socket
  • 安全与隔离:
    • 应用内部:访问控制机制
    • 应用之间:隔离机制
  1. 对资源

负责管理:处理机,存储器,I/O设备,文件系统

  1. 抽象

裸机:只有硬件没有软件 虚拟机:裸机包一层模型,把扇区,块,物理地址之类的抽象成文件,目录,路径等等方便使用的模型

操作系统的发展历程

单道批处理系统

批处理是指把一批作业集中起来,交给计算机系统自动连续处理的工作方式。批处理系统是采用批处理方式工作的操作系统,核心思想是不要让机器闲着: 把原本需要人一个个手动提交、手动启动、手动等待的零散任务,提前组织成一个“作业”或一批“作业”,交给系统自动连续执行,从而减少人工干预,让计算机尽量不要空等。这种交互非常适合计算机但是对于人类无交互,如果出错必须等程序跑完才能知道代码写错了 这里作业(job)和你ctrl + z 中断然后通过jobs看的job不是一个东西

单道批处理系统是指内存中一次只装入一个作业,系统按顺序自动执行作业。它比人工操作效率高,但当作业等待 I/O 时,CPU 可能空闲,资源利用率较低。

多道批处理系统

多道批处理系统是指内存中同时装入多个作业,操作系统在多个作业之间进行调度。当一个作业等待 I/O 时,CPU 可以转去执行其他作业,从而提高 CPU 利用率、设备利用率和系统吞吐量。但是由于资源被分散给不同作业使用导致每个作业的周转时间更长

分时系统

分时系统的出现引入了批处理模式做不到的人机交互和共享主机,核心思想是把 CPU 时间分成很短的时间片,轮流分配给多个用户或多个程序。

想象在一台主机上连接了多个带有显示器和键盘的终端,同时允许多个用户共享主机中的资源,每个用户都可通过自己的终端以交互方式使用计算机

特征如下:

  • 多路性:允许将多台终端同时连接到一台主机,并分时使用
  • 独立性:感觉用户独占主机。
  • 及时性:用户的请求能在很短时间内获得响应(1~3秒)。
  • 交互性:用户可通过终端与系统进行广泛的人机对话。

实时系统

该系统能及时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致地运行。

关键在于:任务是否在截止时间 deadline 之前完成

实时系统分为两类:

硬实时系统:

硬实时系统要求非常严格,超过截止时间,就算系统失败。

比如: 汽车安全气囊 飞机控制系统 高铁控制系统 工业机器人控制 医疗设备中的生命维持系统

软实时系统:

软实时系统允许偶尔迟到,但迟到会降低体验或质量。

比如: 视频播放 音频播放 直播 游戏 视频会议

微机操作系统

就是给个人电脑用的操作系统

嵌入式操作系统

比如智能手表,路由器,摄像头里面的系统,不一定长得像电脑,但是里面有CPU,内存,程序和操作系统,这个系统就是嵌入式OS,是为专用设备设计的操作系统,它通常体积小、稳定、低功耗,负责控制设备硬件并完成特定功能。

网络操作系统

在计算机网络环境下对网络资源进行管理和控制,实现数据通信及对网络资源的共享,为用户提供与网络资源接口的一组软件和规程的集合

设计的目的是资源共享,网络里的各个系统还是独立的,本质就是一块小型计算机主板,只是它的外设不是键盘、鼠标、显示器,而是: 网口,无线模块,交换芯片,光口,串口,专用转发芯片

例子是公司用的文件共享服务器

分布式系统

基于软件实现的一种多处理机系统,是多个处理机通过通信线路互连而构成的紧密耦合系统。 目的是将多台计算机整合成一个单一、强大的计算系统,共同完成一个任务。

角度 网络操作系统 分布式操作系统
多台机器关系 各自独立,通过网络通信 多台机器被整合成一个整体
用户是否知道远程机器存在 通常知道 尽量隐藏
典型操作 ssh、文件共享、远程打印、NAS 自动调度任务、统一存储、统一资源池
重点 网络服务和资源共享 透明协作和统一管理
例子 Windows Server、OpenWrt、TrueNAS、Samba Kubernetes、Hadoop、Spark、Ceph、Borg

操作系统的基本特征

并发

并发性: 看起来有很多事情在同时进行,但本质上是 CPU 在它们之间快速切换。分时系统通过“时间片轮转”让多个用户或多个程序轮流使用 CPU,从而表现出并发性。 并行性: 多个任务真的在同一时刻一起执行,通常需要多个 CPU 核心或者多个处理器。

共享

共享是指操作系统中的资源可被多个并发执行的进程共同使用。

资源共享的方式:

  1. 互斥访问:系统中的某些资源虽然可提供给多个进程使用,但在同一时间内却只允许一个进程访问这些资源。仅当该进程访问完毕并释放资源后,才允许另一进程访问该资源。
  2. 同时访问:允许同一时间内多个进程对它们进行访问

虚拟

就像之前说的抽象,把操作系统把真实的硬件资源“包装”成一种更好用、看起来更多、更方便的资源,让每个任务看起来都有自己的资源

异步

异步性,也称随机性、不确定性。指在操作系统控制下多个进程的执行次序和每个进程的执行时间是不确定的。 操作系统表现出的这种异步性是因为在多道程序环境中,允许多个进程并发执行。但由于资源有限而进程众多,多数情况下,进程的执行不是一贯到底,而是“走走停停”。

操作系统的运行环境

操作系统内核

内核在系统启动后,需要直接管理硬件,会一直保留在内存中,不会像普通程序那样用完就退出。

负责中断处理,时钟管理,原语操作这些支撑功能,叫“支撑功能”,是因为它们不一定是用户直接感受到的功能,但它们是整个操作系统能正常工作的基础。

中断处理

中断就是:

硬件或软件(通常是硬件)打断 CPU 当前正在做的事情,让 CPU 先去处理一件更紧急的事。

比如你正在打字,CPU 本来可能正在运行浏览器。你按下键盘一个键,键盘硬件会发出一个中断信号,告诉 CPU:

有键盘输入了,先处理一下。

CPU 收到中断后,会暂停当前程序,进入内核,执行对应的 中断处理程序。

中断处理常见场景: 键盘输入 鼠标移动 磁盘读写完成 网卡收到数据包 定时器到时间 程序除零错误 系统调用进入内核

时钟管理

时钟管理就是内核利用定时器来管理时间

操作系统里面很多事情都依赖时钟,比如: 记录当前时间 设置定时任务 计算程序运行了多久 实现进程调度 实现时间片轮转 让某个程序 sleep 一段时间

原语操作

普通操作看起来像一步,其实在 CPU 里面可能是多条指令。比如x = x + 1;实际是需要:

  1. 先从内存中读出 x
  2. 然后把 x 加 1
  3. 最后把结果写回内存

如果两个进程同时执行 x = x + 1,就可能出问题,假设一开始,x = 0

两个进程同时加 1则:

1
2
3
4
进程 A 读到 x = 0
进程 B 读到 x = 0
进程 A 写回 x = 1
进程 B 写回 x = 1

最后结果是: x = 1, 但正确结果应该是: x = 2

这就是并发带来的问题, 所以操作系统需要一些特殊操作,保证在并发环境下保护关键数据,防止多个程序同时改同一个东西时把系统状态改乱,这类操作就叫原语或原子操作。

原子操作:要么不做,要么全做,不可分割。避免资源共享导致的竞争状态问题

CPU的两种工作模式

CPU 至少有两种运行状态,也就是用户态 和 内核态

这个设计的核心目的是:保护操作系统和硬件,不让普通程序随便乱动系统核心资源。写在CPU 内部的一个标志位,不能随便改动 内核态(0) ,用户态(1)

内核负责执行一些很危险的特权指令,比如

1
2
3
4
5
6
启动或关闭中断
修改 CPU 状态寄存器
修改内存管理相关寄存器
访问 I/O 设备
设置页表
让 CPU 停机

特权指令不仅能访问用户空间,还能访问系统空间 对应的非特权指令仅能访问用户空间

如果普通程序想用它,可能会直接把整个系统搞崩溃,

想这样把浏览器,QQ这种普通应用的运行状态设置为权限较低的用户态的好处在于,他能触及的范围有限,哪怕自己崩了其他程序也能运行

用户程序不能直接操作硬件,但它确实需要很多系统资源,比如:

1
2
3
4
5
6
7
读文件
写文件
创建进程
申请内存
访问网络
获取时间
等待键盘输入

这些事情最后都离不开内核。

所以操作系统提供了系统调用这一入口,让用户程序可以请求内核帮忙完成这些事情,让CPU从用户态切换到内核态,比如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
用户程序
调用库函数,比如 printf/read/write/open
库函数内部准备系统调用参数
执行特殊指令,陷入内核
CPU 从用户态切换到内核态
内核检查请求是否合法
内核执行对应服务
把结果返回给用户程序
CPU 从内核态切回用户态

中断,异常,陷阱也是走的内核态

碎碎念

百合好吃

五一拍的照片

你好,这是一个随便写写,随便看看的无聊而与我很重要的网站。
使用 Hugo 构建
主题 StackJimmy 设计