引论
什么是操作系统
- 自上而下:提供基本抽象(提供用户接口)
- 自下而上:资源管理者(分配调度软硬件资源)
操作系统功能
- 进程管理 *(核心两点)
- 内存管理 *(核心两点)
- 设备管理
- 文件管理
操作系统历史
分时操作系统
中断技术:CPU收到中断信号,停止当前工作去处理外部事件,处理结束后还可以回到原来的工作中断处(断点)继续原来的工作
通道技术:专门处理外设与内存之间的数据传输
UNIX(BSD4、System V)第一个实用化的分时操作系统
- 实现操作系统的可移植性
- 实现了硬件无关性
- 引进了“特殊文件”概念(把外设看做文件)
操作系统的进一步发展(分时操作系统的衍化)
- 微机操作系统(个人计算机,BIOS把操作系统和硬件分隔):CP/M、MS DOS、Macintosh
- 实时操作系统:要求某些任务要优先紧急处理
- 嵌入式操作系统(可裁剪):Android
- 网络操作系统(透明存储、存储控制):普通操作系统+网络通信+网络服务
硬件简介
略
- RAM(Random Access Memory)
- ROM(Read Only Memory)
- SATA(Serial Advanced Technology Attachment)
- PCIe(Peripheral Component Interconnect Express)
基本概念
略
操作系统的逻辑结构
- 整体式结构:以模块为基本单位构建
- 层次式结构
- 微内核结构(C/S结构):微内核+核外服务器
微内核:小,提供OS最基本的核心功能和服务
核外服务器:完成OS的绝大部分的服务功能,等待应用程序提出请求
支持操作系统的最基本硬件结构
- CPU
- 内存
- 中断
- 时钟
CPU
CPU态:CPU的工作状态(对资源和指令使用权限的描述)
特权指令
- 核态(Kernel mode)
- 管态(Supervisor mode):介于核态和用户态之间
- 用户态(目态)
硬件和OS对于CPU的观察:
- 硬件按“态”来区分CPU的状态
- OS按“进程”来区分CPU的状态
内存
中断
外部事件
中断的目的
- 实现并发活动
- 实现实时处理
- 故障自动处理
中断的一些概念
中断源
断点:将要执行的下一条指令的地址CS:IP
现场:程序正确运行所依赖的信息集合:相关寄存器
两个处理过程:现场保护(进入中断服务前),栈,现场恢复(退出中断服务后)
中断类型:
- 强迫性中断(没有预期)和自愿中断(例如执行访管指令)
- 外中断(中断)和内中断(俘获)
- 外中断:可屏蔽和不可屏蔽
操作系统的用户界面
操作系统的启动过程
- 实模式
8086寻址、1MB内存空间、20位物理地址=段地址:偏移地址、单任务运行 - 保护模式(内存保护模式)
IDE(Integrated-Drive-Electronics)是现在普遍使用的外部接口,主要接硬盘和光驱。采用16位数据并行传送方式,体积小,数据传输快。一个IDE接口只能接两个外部设备。IDE代表着硬盘的一种类型,但在实际的应用中,人们也习惯用IDE来称呼最早出现IDE类型硬盘ATA-1,这种类型的接口随着接口技术的发展已经被淘汰了,而其后发展分支出更多类型的硬盘接口,比如ATA、Ultra ATA、DMA、Ultra DMA等接口都属于IDE硬盘。目前硬件接口已经向SATA转移,IDE接口迟早会退出舞台。
BIOS
Basic I/O System(Firmware,固件)
不是硬件,不是软件
位置:F0000 - FFFFF
- 系统启动配置
- 基本的设备I/O服务
- 系统加电自检(POST,Power On Self-Test)
MBR
主启动记录 放在外存的首扇区(512Bytes),以0xAA55结束
分区启动记录PBR
操作系统的启动
从加电到用户工作环境准备好的过程
-
初始引导
把OS核心接入内存,接管计算机系统
启动程序
引导程序:ntldr、GRUB、bootmgr、LILO
系统内核 -
核心初始化
-
系统初始化
系统调用
操作系统内核为应用程序提供的服务/函数
进程管理
进程的概念
进程的状态
进程控制块(PCB,Process Control Block)
是一个数据结构,用于OS感知、管理进程。
所以 抽象为
进程 = 程序 + PCB
Linux 0.1 task_struct 结构
Linux 相关的成员变量
进程的切换 就是 上下文的切换
进程控制
进程的创建
进程撤销
进程阻塞
进程唤醒
进程控制原语
Windows进程控制
Linux进程控制
线程的概念(Thread)
- 线程是可以直接由CPU运行的实体
- 一个进程可以创建多个线程
- 多个线程共享CPU可以实现并发运行
进程和线程的区别
进程拥有两个基本的属性:资源的拥有者和独立调度单位。
进程是资源分配和独立运行的基本单位,每一个进程都完成一个特定的任务。
线程的引入进一步提高了程序并发执行的程度,从而进一步提高了资源的利用率和系统的吞吐量。引入线程目的是减少并发执行时的时空开销。因为进程的创建、撤销、切换较费时空,它既是调度单位,又是资源拥有者。线程是系统独立调度和分派的基本单位,基本上不拥有系统资源,只需要少量的资源(指令指针IP,寄存器,栈),但可以共享其所属进程所拥有的全部资源。
一个进程可以创建一个或多个线程;一个线程可以创建一个或多个线程;一个进程可以创建一个或多个进程;但是线程不可以创建进程。
进程与线程的比较:
(1)引入线程后,线程是处理机调度的基本单位,进程是资源分配的基本单位,而不再是一个可执行的实体。在同一进程中线程的切换不会引起进程的切换,但从一个进程中的线程切换到另一个进程中的线程时。将会引起进程的切换。
(2)引入线程后,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间也可以并发执行。多个线程会争夺处理机,在不同的状态之间进行转换。线程也是一个动态的概念,也有一个从创建到消亡的生命过程,具有动态性。
(3)进程是资源分配的单位,一般线程自己不拥有系统资源,但可以访问其隶属进程的资源。同一进程中的所有线程都具有相同的地址空间(进程的地址空间)。
(4)同进程的不同线程间的独立性要比不同进程间的独立性低得多。多个线程共享进程的内存地址空间和资源。
(5)创建、撤销一个新线程系统开销小。两个线程间的切换系统开销小。
(6)同进程的不同线程可以分配到多个处理机上执行,加快了进程的完成。
线程共享的资源包括:
(1) 进程代码段
(2) 进程的公有数据(利用这些数据,线程很容易实现相互之间的通讯)
(3) 进程的所拥有资源。
线程独立的资源包括:
(1)线程ID:每个线程都有自己唯一的ID,用于区分不同的线程。
(2)寄存器组的值:当线程切换时,必须将原有的线程的寄存器集合的状态保存,以便重新切换时得以恢复。
(3)线程的堆栈:堆栈是保证线程独立运行所必须的。
(4)错误返回码:由于同一个进程中有很多个线程同时运行,可能某个线程进行系统调用后设置了error值,而在该线程还没有处理这个错误,另外一个线程就在此时被调度器投入运行,这样错误值就有可能被修改。所以,不同的线程应该拥有自己的错误返回码变量。
(5)线程优先级:线程调度的次序(并不是优先级大的一定会先执行,优先级大只是最先执行的机会大)。
临界区和锁机制
临界区和临界资源
临界区访问机制
- 忙则等待
- 空闲让进
- 有限等待
- 让权等待
锁机制
实现临界区互斥
上锁原语
开锁原语
同步和互斥
互斥关系属于特殊的同步关系
信号灯P-V操作
信号与信号量的区别:
1.信号:(signal)是一种处理异步事件的方式。信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程外,还可以发送信号给进程本身。
2.信号量:(Semaphore)进程间通信处理同步互斥的机制。是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。
实现互斥
将S设为1,可以得到和锁机制一样的效果,实现进程之间互斥
实现同步
关键操作:需要条件、或者是别的操作的条件
在前置条件后面使用V操作,在后置关键操作前使用P操作
经典同步问题
生产者消费者问题
Windows同步机制
进程间的通信(IPC,Interprocess communication)
管道通信
管道,通常指无名管道
匿名管道
匿名管道智能用于父子兄弟进程之间