目录
一. 操作系统概念
操作系统是管理计算机硬件的程序,是用户和计算机硬件间的中介。其核心目标是为了运行用户程序,让用户更方便使用计算机,让系统更高效使用计算机。
1.1 操作系统类型
类型 | 场景 | 例子 |
---|---|---|
大型机系统 | 简单批处理系统 多道程序系统 分时系统 | IBM AIX IBM z/OS HP-Unix |
桌面系统 | PC | Windows Linux Mac OS |
移动系统 | 手机、平板 | Apple iOS Google Android |
嵌入系统 | 单片机 | Redhat Linux |
分布式系统 | 网络分布设备 | P2P C-S |
1.2 操作系统操作和功能
1.2.1 操作系统操作
- 双重模式操作
双重模式包括用户模式(User mode)和内核模式(kernel mode)
用于解决软件错误或特定请求产生异常或陷阱,以及其他进程问题:如死循环等。
采用双重模式操作允许OS保护自身和其他系统部件,模式位由硬件提供。内核模式可运行特权指令,但可能会引起系统崩溃。
模式转换:如果用户程序需要用特权指令,采用系统调用(System Call),视为软件中断。
- I/O和内存保护
I/O保护:OS将所有I/O指令设计为特权指令,防止用户程序执行非法I/O,用户程序通过系统调用进行I/O操作。
内存保护:OS设计了存储保护机制,防止内存非法访问
- 定时器(Timer)
如果操作系统不能获得CPU控制权,就无法管理系统。
这会导致1.用户程序死循环;2.用户程序不调用系统调用。
定时器的设置让发生中断一段时间后,CPU控制权返回操作系统。定时器可采用固定时间和可变时间,具体利用时钟和计数器实现。
1.2.2 操作系统功能
- 进程管理
操作系统的核心目标是运行程序,而进程就是运行中的程序。
具体内容包括:创建和删除用户和系统进程、暂停和恢复进程、提供进程同步机制、提供进程通信机制、提供死锁处理机制。
- 内存管理
内存是程序运行必须的存储设备,CPU只能直接访问寄存器、高速缓存和内存,一般程序处理前和处理后的所有数据,包括程序执行的指令都在内存。
内存管理提供了内存的分配、回收、地址转换、共享和保护等功能。通过内存管理可以提高内存利用率和内存访问速度。
- 文件管理
文件管理以文件为单位,以目录为组织方式构建文件系统,解决信息在计算机中存储问题。
主要内容包括:文件逻辑结构、文件物理结构、文件检索方法、文件操作、空闲空间管理、存储设备管理。
- I/O设备管理
管理种类繁多的各种I/O设备,解决计算机中信息的输入和输出问题。操作系统管理I/O设备的关键是设备无关性。无关性体现在三个方面:1.所有物理设备按照物理特性抽象为逻辑设备;2.应用程序针对逻辑设备编程;3.应用程序和物理设备无关。
二. 操作系统结构
2.1 操作系统服务和接口
2.1.1 操作系统服务
操作系统以服务形式向程序和用户提供环境执行程序。
基本服务 | 用户界面、程序执行、I/O 操作、文件系统操作、通信、错误检测 |
增值服务 | 资源分配、统计、保护和安全 |
2.1.2 操作系统接口
下图展示了操作系统整体架构,除了基本服务和增值服务外,操作系统还提供了系统调用(System Call)、用户接口(User Interface)、系统程序(System Program)等操作接口。
以系统调用为例,操作系统服务提供了面向程序的编程接口,支持C or C++进行编写,程序通过应用程序接口(API)访问。
下图为Win32 API中ReadFile()方法 ,从文件读取内容。
2.2 操作系统结构
早期操作系统的结构单一简单,功能有限。随着时代发展,操作系统逐渐成长,规模越来越大,功能越来越丰富。
2.2.1 层次结构
操作系统划分为若干层,在低层上构建高层,底层(0层)为硬件,最高层( N层)为用户层,并且每层只使用低层次的功能和服务。优点:简化了系统设计和实现,便于调试和升级维护;缺点:层定义困难,效率差。
2.2.2 微内核结构
微内核主要解决内核越来越大,越来越难管理的问题。微内核即内核微型化,核内移出尽可能多功能到用户空间。
微内核结构的几点好处:
- 便于扩充
- 便于移植操作系统到新架构系统上
- 更稳定安全 (更少的代码运行在核心态)
内核微缩也会带来一个坏处:用户空间和内核空间通信的系统开销增加。
2.2.3 模块结构
大部分现代操作系统都采用模块结构,模块化使用面向对象方法,每个核心部件分开,模块间通过接口进行会话,每个模块在需要时被加载到内核。相比于层次结构,模块化的设计更加灵活。
2.3 虚拟机
虚拟机是一种通过软件模拟实现,具有完整硬件系统功能,并运行在一个完全隔离环境中的完整计算机系统。虚拟机建立在物理计算机资源共享的基础上,并且虚拟机之间相互独立。按照使用场所和目的的不同,虚拟机可以大致分类为三类:高级语言虚拟机、工作站虚拟机、服务器虚拟机。虚拟机有两种连接模式:1.软件形式,eg.远程桌面;2.硬件模式,eg.虚拟机终端。
2.3.1 Java虚拟机
可运行Java代码的假想计算机,只要根据JVM规格将解释器移植到特定的操作系统上,就能运行经过编译的任何Java代码
2.3.2 工作站虚拟机
工作站虚拟机是操作系统上的虚拟机。按照安装位置可分为:宿主操作系统(Host OS)和客户操作系统(Guest OS)。其中宿主OS安装在硬件上,客户OS安装在操作系统上。
工作站虚拟机安装在宿主OS上,在工作站虚拟机中可以安装客户OS。常见的虚拟机工作站软件有:VMWare Station、Virtual Box、Virtual PC、Parallels Desktop。
如下图所示,使用工作站虚拟机可以同时在一个计算机上使用多个操作系统,一个宿主操作系统,若干个客户操作系统。
2.3.3 服务器虚拟机
服务器虚拟化:将服务器物理资源抽象成逻辑资源,让一台服务器变成几台甚至上百台相互隔离的虚拟服务器。
常用的服务器虚拟模式有两种:
- 一虚多:一台服务器虚拟成多台服务器虚拟机
- 多虚一:多个独立物理服务器虚拟为一个服务器虚拟机
服务器虚拟化的优点有以下几点:安全性好、资源共享、可扩展性好、便于隔离、相价比高。
三. 进程(Process)
3.1 进程概念
进程是指OS执行的各种程序,比如批处理系统中的作业(Job)、分时系统中的任务(Task)。作业即被组装成一个整体运行的一组计算步骤;任务指进程或线程。也有说法表示进程是一个程序在一个数据集上的一次运行。进程的执行必须以顺序方式进行。
3.1.1 内存中的进程内容:
- 代码(Text)
- 当前活动:
- 程序计数器(PC)-指向当前要执行的指令(地址)
- 堆栈(Stack):存放函数参数、临时变量等临时数据
- 数据(Data):全局变量,处理的文件
- 堆(Heap):动态内存分配
Tips:进程与程序的关系
- 进程是程序的一个实例,是程序的一次执行
- 一个程序可对应一个或多个进程,同样一个进程可对应一个或多个程序
- 程序是进程的代码部分
- 进程是活动实体,程序静止(被动)实体
- 进程在内存,程序在外存
3.1.2 进程的状态
进程在执行的过程中,状态会发生多次转变。进程的状态一共可分为5类。不同状态间的转换逻辑如变化图所示。
- 新建(new):在创建进程
- 运行(running):指令在执行
- 等待(waiting):进程等待某些事件发生
- 就绪(ready):进程等待分配处理器
- 终止(terminated):进程执行完毕
3.1.3 进程控制块(PCB)
进程状态 | Process state |
程序计数器 | Program Counter (PC) |
进程号 | Process number |
CPU寄存器 | CPU register |
内存管理信息 | memory limits |
计账信息 | list of open files |
I/O状态信息 | I/O condition |
3.2 进程操作
3.2.1 进程创建
上图是由一个父进程"Sched"创建子进程,并不断轮流创建进程下去,构成的一棵进程树。
Tips : 父子进程的关系
资源共享
- 父进程子进程共享所有的资源
-
子进程共享父进程资源的子集
-
父进程和子进程无资源共享
执行
- 父进程和子进程并发执行
- 父进程等待,直到子进程终止
3.2.2 进程终止
正常进程执行最后一项并退出(exit)。如果是子进程,则从子进程向父进程输出数据(通过wait);如果不是子进程,操作系统收回进程的资源。
父进程可中止(abort)子进程的执行。中止的原因有以下几点:1. 子进程超量分配资源;2. 赋予子进程的任务不再需要;3. 父进程结束,所有子进程终止——级联终止。
父进程可以调用wait()系统等子进程结束。
3.3 进程通信(IPC)
独立进程:不会影响另一个进程的执行或被另一个进程执行影响。
协同进程:可能影响另一个进程的执行或被另一个进程执行影响。
进程协同的优点:信息共享、加速运算、模块化
进程通信可以同步进程间的活动,具体有两种基本模式:共享内存、消息传递。
3.3.1 共享内存(生产&消费)
场景:一块内存在多个进程间共享,通信由应用程序自己控制。
实现手段:文件映射、管道、剪贴板
P进程生产供C进程消费的信息。对缓冲区大小限制的有无可分为:无界缓冲和有界缓冲。下面将介绍内存共享通信的经典案例——生产者-消费者问题
有界缓冲设有缓冲区大小buffer_size,缓冲区空位指针,和缓冲区非空位指针,最多可以填满buffer_size-1个项。
#define BUFFER_SIZE 10 //设置有界缓冲
Typedef struct {
. . .
} item;
item buffer[BUFFER_SIZE];
int in = 0; //in指向缓冲区中下一个空位
int out = 0; //out指向缓冲区中第一个非空位
生产者进程,一边生产信息,一边观察缓存区产品数量是否溢出。
item nextProduced
while (true) {
/* Produce an item in nextProcuded */
while (((in = (in + 1) % BUFFER SIZE count) == out);
/* do nothing -- no free buffers */
buffer[in] = nextProduced;
in = (in + 1) % BUFFER SIZE;
}
消费者进程,一边观察缓存区是否还有产品,一边消费产品。
item nextConsumed
while (true) {
while (in == out);
// do nothing -- nothing to consume
// remove an item from the buffer
nextConsumed = buffer[out];
out = (out + 1) % BUFFER SIZE;
/* consume the item in nextConsumed*/
}
3.3.2 消息传递
远程通信无法采用共享内存,需要通过发送&接受两个操作来完成进程间的通信。
若进程P与Q要通信,需要1.建立通信连接,2.通过send/receive交换消息。
通信连接的实现可通过物理的(如共享存储,硬件总线)和逻辑的(如逻辑特性)。
直接通信
进程以显式的命名进行通信,如
- send (P, message) ——向进程P发消息
- receive(Q, message) ——从进程Q收消息
直接通信的特点:1.连接自动建立; 2.连接精确地与一对通信进程相关
3.在每一对通信进程间存在一个连接; 4. 连接可单向,但通常双向
间接通信
消息导向至信箱并从信箱接收,每一个信箱有一个唯一的id,仅当共享一个信箱时进程才能通信。
- send(A, message) – 发送消息到信箱 A
- receive(A, message) – 从信箱 A接收消息
间接通信的特点:1.仅当进程共有一个信箱时连接才能建立; 2.连接可同多个进程相关
3.每一对进程可共享多个通信连接; 4.连接可是单向或双向的
Tips : 消息传递可阻塞(blocking)或非阻塞(non-blocking)
阻塞——同步:
- 阻塞send:发送进程阻塞,直到消息被接收
- 阻塞receive:接受者进程阻塞,直到有消息可用
非阻塞——异步:
- 非阻塞send:发送进程发送消息并继续操作
- 非阻塞receive: 接收者收到一个有效消息或无效消息
四. 线程(Thread)
OS引入线程有三方面的原因,一是性能角度,进程操作系统开销太大,需要进一步加速进程的运行;二是应用角度,存在进程代码并发执行的需求,eg.PPT编辑需要同时进行输入/拼写检查/存盘;三是硬件角度,多核处理器的出现为线程提供了物理土壤。
4.1 线程概念
线程是可在CPU上运行的基本执行单位,进程内的一个代码片段可以被创建称为一个线程。
线程状态:就绪、运行、等待
线程操作:创建、撤销、等待、唤醒
需要注意的是进程依旧是资源分配的基本单位,线程自己不拥有系统资源,通过进程申请资源。
4.1.1 线程和进程区别
比较角度 | 进程 | 线程 |
---|---|---|
代码 | 进程包含线程 | 线程是进程中的一段代码 |
资源 | 进程是资源分配基本单位 | 线程不拥有资源,共享使用进程的资源 |
调度 | 同一进程中的线程切换不会引起进程切换 | 线程是基本调度单位 |
切换 | 进程:重量级上下文切换,代价大 | 线程:轻量级切换,代价小 |
生命期 | 进程撤销会导致它的所有线程被撤销 | 线程撤销不会影响进程 |
4.1.2 线程结构
代码、数据以及各类资源都来自进程。
线程控制块(Thread Control Block,TCB),包括:线程ID、程序计数器PC、寄存器集、栈空间
- 单线程:一个进程只有一个线程
- 多线程:一个进程有多个线程
Windows 线程数据结构
- 执行线程块(Executive thread block):对应程序地址、指向KTHREAD指针、内核空间
- 核心线程块(Kernel thread block):线程调度和同步信息、内核空间
- 线程环境块(Thread environment block):用户空间的数据结构,线程本地存储
4.1.3 线程优点
- 响应度高,线程创建开销小。
- 资源共享,进程中的线程可以共享进程资源。
- 经济性高,线程创建、上下文切换比进程快。
4.2 多线程模型
4.2.1 线程类别
用户线程:由用户线程库进行管理的线程
用户线程有以下特点:1.内核看不到用户线程;2.用户线程的创建和调度在用户空间中,不需要内核的干预;3.应用于传统的只支持进程的操作系统。
内核线程:内核进行管理的线程
内核线程有以下特点:1.需要内核支持; 2.由内核完成线程调度;3.由内核进行创建和撤销。
4.2.2 模型类别
按照内核与线程数量的对应关系可分为:一对一模型、多对一模型、多对多模型
一对一模型:用户线程映射到内核线程,操作系统管理这些线程。
优点:并发性好,多个线程可并行运行在多个处理器上。
缺点:内核开销大。
多对一模型:内核只有进程,并且只看到一个进程。应用在比较落后的OS上。
多对多模型:多个用户线程映射为相等或更小数目的内核线程
优点:并发性和效率兼顾。 缺点:复杂度增加。
4.3 线程库
线程库为程序员提供API来创建和管理线程。
- 用户库(用户线程):存在于用户空间,没有内核支持,调用线程库不会产生系统调用。
- 内核库(内核线程):存在于内核,内核支持,调用线程库会产生系统调用。
复习资料二:操作系统复习2
复习资料三:操作系统复习3
复习资料四:操作系统复习4