《现代操作系统》01章 基本概念


作为一个要搞嵌入式研究的小菜鸡,用博客的方式复习最近所学习《现代操作系统》的一章内容,如有错误,欢迎指正!

1 操作系统概念

1.1 概述

操作系统将丑陋的硬件进行抽象,变成一些美丽的接口供程序员调用:

应用程序
美丽的接口
操作系统
丑陋的接口
硬件

操作系统的客户(user)是程序(员)

1.2 任务

为应用程序调配CPU、内存、IO等资源的角色

模式 内容
空间复用 内存的分割,多个程序共享内存
时间复用 多个应用轮流使用某一资源

2 操作系统历史(简述)

时间段 发展状况 举例
1945-1955 真空管 穿孔卡片 -
1955-1965 晶体管 批处理 大型机,大多使用Fortran语言和汇编语言 典型系统FMS IBSYS
1965-1980 集成电路芯片 多道程序设计 Unix Linux
1980-今天 个人计算机 带有GUI的Unix、Windows OS、Macintosh OS

分布式操作系统:一个应用在多个设备上运行,使用者不知道文件存放在哪个设备上,靠操作系统调度

3 计算机硬件简介

3.1 处理器

3.1.1 执行过程

内存取指令
解码-->类型和操作数

每种CPU都有自己专用的指令集

3.1.2 寄存器

名称 构成 作用
通用寄存器 - 保存关键变量和临时数据
专用寄存器 - 对程序员可见
- 程序计数器(PC) 指向下一条指令地址
- 堆栈指针 内存中当前栈顶
- 程序状态字(PSW 条件码位、CPU优先级、模式(内核、用户)、其他控制位、在系统调用和IO中起关键作用

内核态可以访问所有硬件,执行所有指令集
用户模式只能执行指令集的一个子集,调用硬件的一个子集,IO、内存保护修改、状态修改都被禁止

3.1.3 其他的概念

流水线:可以对多条命令同时进行执行、编码、读取操作,一旦取入流水线必须执行完毕,即使前一条指令是条件转移
超标量CPU:有多个运算单元,分别负责不同类型的运算,同时工作,也会导致程序不按顺序执行
系统调用:一种特别的调用指令,使用陷阱执行系统调用,陷入内核调用操作系统,陷阱多数由硬件引起,用于警告异常

3.2 多线程、多核芯片

3.2.1 多线程

CPU保持多个不同的线程状态,在纳秒尺度来回切换
(线程是一种轻量级进程)
线程可以认为是进程的组成部分,线程间可以进行资源数据共享

3.2.2 多核芯片

一个芯片中包含多个独立的CPU,现在许多PC的CPU都是多核的

3.3 存储器

3.3.1 分层存储

理想情况存取速度要快于指令执行速度、容量大、成本低这样不拉胯,但三点很难同时满足,于是出现分层存储结构

速度 介质 典型容量 成本
1ns 寄存器 <1K 成本高
2ns 高速缓存 4M
10ns 内存 512-2048M
10ms 磁盘 200-1000G
100ms 磁带 400-800G 成本低

(这本书09年出版,有些数据已经不适用了,仅供参考)

3.3.2 寄存器

32位 容量32X32
64位 容量64X64
几乎无时延
应用程序必须自己管理这些寄存器

3.3.3 高速缓存

多数硬件控制
被分割为cache line:典型大小64字节
AD:0-63	cache line 0
AD:64-127	cache line 1
...
常用的高速缓存行放在CPU内或非常接近CPU的位置
先找缓存,找到了叫缓存命中,未命中则访问内存
有些机器中有多级高速缓存
高速缓存中存放频繁使用的程序,类似内存存放频繁使用的程序部分:如URL对应的IP地址,文件路径对应的磁盘地址

高速缓存的管理:

何时放入新内容
新内容放在哪一行
何时把内容移除
移除的内容放在下一级的何处

L1、L2缓存:

现代计算机的CPU中两级缓存,LI和L2
L1总是在CPU中,用于存放已解码的指令,典型16KB
L2存放近来所使用的若干兆字节的内存字(有1-2个时钟周期延时),有些设计为多核共享,有些为一核一个

3.3.4 主存

名称 描述
RAM 存储的主力
ROM 存放机器的启动引导
EEPROM、FLASH 保存程序并且可修改,但写入时间长,FLASH速度介于RAM和磁盘区间,擦除次数过多磨损
CMOS存储器(易失性存储器) 功耗极低、存储时间日期、保存配置参数

3.3.5 磁盘

访问速度低
多个盘面,盘面内有磁道,磁道分为扇区(典型512B)
MMU(Memory Management Unit):
	将磁盘空间映射为虚拟内存
	实现多道程序系统中程序(上下文)切换

3.3.6 磁带

成本低、读取慢(线性存储)、一般用于数据备份

3.4 IO设备

3.4.1 设备控制器

每类设备控制器的程序不同——设备驱动程序
控制器一般都有少量的控制寄存器

3.4.2 IO设备调用方式

忙等待——持续占用CPU
中断响应——设备完成任务通知中断控制芯片

CPU接收中断后,PC、PSW入栈,
CPU进入用户态
跳转到中断向量
中断程序取走并保存PC、PSW
执行中断程序
返回PC处继续执行

DMA传输——很少的CPU干预、数据的搬运工

3.5 总线

名称 描述
ISA总线(Industry standard architecture) 并行2字节、8.33MHz、16.67MB/s(max)、由南桥控制芯片控制
PCI总线(peripheral component Interconnect) 并行8字节、66MHz、528MB/s(max)、与主存通信、由北桥控制芯片控制
IDE总线 磁盘、CD-ROM
USB总线(Universal serial bus) 1.0——1.5MB/s、2.0——60MB/s、3.0——625MB/s、USB设备共享USB驱动器(热插拔)
SCSI总线(small computer system interface) 高速总线320MB/s

总线

3.6 启动

3.6.1 BIOS(basic I/O system):

用于计算机启动
包含底层IO软件,读键盘、写屏幕等
存放在闪速ROM中,非易失的,可修改和更新 

3.6.2 启动过程

BIOS检查RAM数量,键盘和基本外设是否正确安装与响应
BIOS扫描ISA和PCI总线并连接设备并记录信息,如设备更换则重新配置新设备
BIOS按照CMOS存储器的设备清单启动设备,设备刚启动时可以进入BIOS修改设备清单和配置参数
BIOS查找软盘、CD-ROM尝试启动,若无则从硬盘启动
硬盘第一扇区被加载到内存运行,操作系统启动
操作系统向BIOS询问设备信息和参数,检查驱动程序是否存在,不存在提示插入驱动盘(或装有驱动安装程序的U盘)、驱动程序完整后被调入内核并初始化相关表格,创建需要的背景进程
终端启动登录程序或GUI

4 操作系统分类

大型机操作系统

主要三类服务:批处理、事务处理、分时处理
现在主要是Unix的变体

服务器操作系统

打印、文件、web服务
常见Solaris FreeBSD Linux Windowsserver

多处理器操作系统
个人计算机操作系统
掌上计算机操作系统

SymbianOS plamOS

嵌入式操作系统\

定制化应用程序,具有专门作用

传感器节点操作系统

TinyOS

实时操作系统

工业控制、民用航空、军事等对实时性要求极高的场景

智能卡操作系统

有单一功能、多功能,有些面向Java

5 操作系统基本概念

5.1 进程

进程结构

本质:正在执行的一个程序
每个进程都有自己的地址空间(address space)

包括可执行程序
数据
程序堆栈

进程资源集

寄存器(包含程序计数器、堆栈指针)
打开文件的清单
突出的报警
相关进程清单

进程表(process table)

存放除去进程各自地址空间内的和进程相关的数据
数组或链表结构
每个存在的进程都要占用一项

进程管理

创建进程、终止进程的系统调用
申请(释放)内存
等待进程结束
进程覆盖

进程树

一个进程生成子进程,子进程再创建子进程
只有父进程能控制和访问子进程

进程间通信(interprocess communication)

多进程协同完成任务,进程间彼此通信以同步他们的行为

进程UID

系统管理器授权给每个进程的标识
子进程UID同父进程
UID可以是某个group的成员,group拥有GID
系统管理员拥有超级进程UID,有高级权限

5.2 地址空间

要对内存采取保护、防止程序间相互干扰
内存保护由硬件实现、由操作系统掌控,也就是内存管理(MMU)
如果程序大小超过了主存大小,就要用到虚拟内存技术

5.3 文件系统

文件的创建、读取、写入、删除对应相应系统调用
一般操作系统都有文件目录(directory)
有层次的文件构成文件系统(树状结构)
每个文件都有自己的绝对路径,从根目录开始用’/‘或'\'隔开
在工作目录下可以不使用绝对路径,工作目录可以切换

读写文件

打开文件
检查访问权限
允许访问,返回一个小整数——文件描述符(file descriptor)
禁止访问,返回错误码

特殊文件(special file)

块特殊文件(block)
字符特殊文件(character)

管道(pipe)

一种虚文件
用于连接两个进程
写管道需要特殊的系统调用

5.4 输入输出

有些是通用IO
有些是特有的驱动程序驱动的

5.5 保护

Unix对文件赋予九位二进制码管理访问权限
wrx w-x --x (x对于目录而言是允许查询的意思)
所有者可读写与执行、同组成员可读、执行、其他人只能执行

5.6 Shell

Unix的命令解释器
终端用户与操作系统的交互界面

5.7 轮回的思想

有些思想或算法可能现在过时了,但在之后新的领域中又会重现
不停地轮回与发展,创造出新的理念

6 系统调用

在这里插入图片描述POSIX
POSIX标准

与系统调用并非一一对应,
提供了构造系统必须的一套过程

6.1 进程管理系统调用

fork:

在UNIX中,唯一可以在POSIX中创建进程的方法
fork创建原有进程的精确副本
fork后父子进程不再相互影响,共用一个程序正文
返回的pid为子进程pid
子进程一般与父进程执行不同的代码

waitpid:

父进程等待子进程结束
等待特定的子进程结束或任意(pid=-1)一个子进程结束
结束后statloc设置为子进程退出状态(正常、异常、退出值)

concve:(是一类系统调用的代表)

让子进程执行用户命令
参数:name:执行文件名称
	argv:指向变量的数组指针
	environp:指向环境数组的指针

6.2 目录和文件系统管理

link/unlink:

是一种共享文件的机制
使用link可以让两个用户共享同一个文件(文件在磁盘上仅有一份,任何一个用户修改都会被另一个用户看到),两个用户文件系统中对于这个文件可以有不同的名字(但文件的编号是相同的,系统中每一个文件的编号是唯一的)
当其中一个用户删除了目录中的这个共享文件,使用unlink解除链接,文件并不会被删除,在另一个用户的目录中还可以找到这个文件,当两个用户都删除了这个文件,文件才会被系统从磁盘上删除

mount:

用以合并目录,将CD-ROM或U盘或移动硬盘(或一部分)目录合并入根目录
使用文件时不用考虑文件在哪个存储器上,只要按照文件目录树结构访问即可

unmount:

要拔出移动存储设备时,调用此命令即可将目录分离

7 操作系统结构

单体系统、层次系统、微内核、客户机服务器系统、虚拟机、exokernels

7.1 单体系统

整个系统在内核态以单一程序方式运行
所有的驱动程序都在内核中运行
可能有一些结构存在(如栈)
系统结构:

一个主程序:负责处理任务过程请求
一套服务过程:负责执行系统调用
一套实用过程:用来辅助服务过程

单体系统

7.2 层次系统

上层软件在下层软件的基础上构建
THE操作系统示例:
THE操作系统示例

0层:提供基本CPU多道程序更能
1层:内存管理,分配主存空间
2层:控制进程与控制台通信(每个进程都有自己的操作员控制台)
3层:进程与具有抽象的IO设备通信
4层:用户程序不需要考虑进程、内存、控制台或IO
5层:系统操作员进程

MULTICS系统使用环形设计,内部级别高于外部级别,外层访问内层要经过严格参数审查,就像古代的皇城,一层一层,并且有警卫看守

7.3 微内核

  • 传统结构的系统,代码中的错误会影响整个系统稳定性
  • 为实现高可靠,将操作系统划分为小的、良好定义的模块,只有其中一个叫做微内核的模块运行在内核态,其他模块作为普通用户进程运行,这样一个设备的驱动文件故障不会使整个系统宕机
  • 知名微内核:
    integrity、K42、L4,PikeOS、QNX、Symbian、MINIX
    MINIX微内核只有3200行C代码和800行汇编
    微内核
  • 微内核层:含有时钟的驱动,因为与调用密切关联
  • 驱动程序层:这种结构更加安全,驱动程序在未经内核允许的情况下无法进行IO操作
  • 服务器:含有文件管理系统、进程管理器、检查其他服务器和驱动是否正常(再生服务器,检测到错误就会取代这个错误的服务器,提高系统可靠性)
  • 机制策略分离思想:例如:机制为运行优先级最高进程(在内核中完成),策略由用户程序给出(在用户态完成),用以缩小内核

7.4 客户机-服务器模式

将进程划分为:

服务器:提供各种服务
客户端:使用这些服务

客户端与服务器间进行消息传递
是一种可以应用在单机和网络上的抽象

7.5 虚拟机

7.5.1 第一类虚拟机

  • 在裸机运行,具备多道程序功能
  • 向上层提供若干台虚拟机(仅为裸机硬件复制品,包含内核态、用户态、IO功能、中断等)
    第一类虚拟机

7.5.2 第二类虚拟机

第二类虚拟机
上图的Linux称为宿主机操作系统

7.5.3 Java虚拟机

7.6 外核

外核在内核态运行
负责将硬件资源划分几份,分给不同的虚拟机,每个虚拟机可以运行自己的操作系统
确保不同的虚拟机互不干扰,互不冲突
不需要传统虚拟机对硬件克隆的映射
将外核内的多道程序与用户空间中操作系统代码分离

8 依靠 C 的世界

8.1 C与Java的区别

java基于C
C有显示指针,java没有
C中没有内建字符串、线程、包、类、对象、类型安全、垃圾回收等
C的内存分配可完全由程序员操控,调用malloc和free并使用指针管理内存
操作系统基本都是实时系统,当中断发生时,操作系统希望去执行中断(以免丢失信息)而不是启动垃圾回收
C没有类似于java字节代码的东西,直接将C文件编译为O文件(目标机器的二进制码,可直接在CPU运行)

8.2 头文件

变量函数声明
宏定义、宏函数
条件编译
#include 引入头文件

8.3 大型工程

C的编译
C预处理器:

读入每个C文件
遇到include,取来对应的h文件,处理、扩展宏、处理条件编译

编译:

编译得到O文件(目标机器的二进制码)
(当工程过大(500W行代码很常见),仅仅修改一个文件而重新编译是不可接受的,使用make程序读入Makefile(存放哪个文件与哪个文件有关联的说明),当编译时仅编译那些与修改文件相关联的文件,并对Makefile进行相应修改,大大缩短编译时间,已经有很多自动生成Makefile的软件)

Link:

得到的O文件传递给Linker程序
Linker将这些O文件组合成单个可执行的二进制文件a.out(所有调用的库函数包括在内,函数间引用也以解决,机器地址也已按需分配)

操作系统都运行在硬件上而不是解释运行或即时编译

欢迎交流学习,这里是海小皮,我们一同进步!

猜你喜欢

转载自blog.csdn.net/weixin_42464904/article/details/113544521