一、操作系统(Operating System / OS)
多用户—多任务场景 OS的主要职责就是协调——专门的软件来作协调工作
1、当硬件(资源)会被多个任务“同时”访问
OS协调不同的任务对硬件资源的访问
OS管理着硬件资源,分配给不同的任务去使用
注:OS是一个管理(硬件/软件)资源的软件,是一个协调者(管理的含义就是做协调),是一个分配者,分配的主体就是任务,站在任务的角度,就是一切硬件资源都需要找OS申请后才能被授权使用。
OS原来主要研究的就是“管理学”,如何高效,公平,低耗,稳定的进行资源的分配,协调工作以及在其中遇到的种种问题。
二、进程(Process)
1、什么是程序?
一套做数据处理的步骤。程序 = 指令 + 数据
是一套静态的步骤——菜谱
什么是进程?
进程是程序的一次执行进程——按照菜谱的一次的做菜的过程(动态)
进程是程序在“运行阶段”的视角主体
2、站在OS实现的角度看什么是进程
进程是OS进行资源分配的基本单位
进程是OS进行资源分配的最小实体
简单的说,同一过程中的资源是共享的,如果存在比进程更低级的单位,是共享的,不同进程之间的资源是隔离的。例:A进程只能访问A进程自己的资源(这里主要讨论内存),A进程无法访问B进程的资源(内存),更无法访问被OS直接管理的资源。
注:
(1)OS的职责:协调者/管理者
(2)资源:被OS管理的资源(硬件资源、软件资源)
(3)分配的实体/单位:分配的时候,只考虑这一层次
(4)基本/最小:允许有更高层次的单位,但最低到进程
3、理解程序
(1)动态过程
(2)绑定着一个程序
(3)允许同时存在
(4)OS内部进行资源申请的最小个体
4、OS的职责划分
OS要管理进程,把OS的职责做个简单的划分:
(1)OS进行CPU协调的模块——进程管理模块:主要负责进程的调度工作,主持不同进程在CPU运行的时间划分。实践中,OS需要负责把进程A从CPU上拿下来,把进程B放到CPU上via修改PC寄存器的值。
(2)OS进行内存协调的模块——内存管理模块:主持内存空间的分配工作,进程通信的问题
(3)OS进行硬盘上数据的协调的模块(硬盘是主要的二级存储,是比较重要的一个 IO 设备) ——文件管理模块:OS一般不直接管理硬盘上的数据,一般是委托文件系统(Filesystem)进行抽象管理,把硬盘上的数据抽象为文件(包含文件夹/目录)的概念。
(4)网络管理模块
(5)其他硬件——以文件驱动的形式进行管理——驱动管理
5、要做好进程调度,我们面临哪些问题?
(1)需要把进程(程序执行的过程)这个抽象的概念,用数据表示处理——面向对象的思想,变成数据,才能被计算机进行处理(才能被OS这个软件进行处理)
6、进程状态转移图
新建(进程处于正在创建中) 就绪(万事俱备,只欠CPU)
运行(进程的指令真正在CPU运行着) 阻塞(进程由于等待外部条件,所以暂时无法继续)
结束(进程的所有指令执行结束,但PCB暂时保留,OS还需要做一下其他工作的时候)
注:所有运行状态必须是从就绪状态过去的
进程的CPU必须经过OS系统分配才能得到
—> 新建:随着程序的启动运行
新建 —> 就绪:进程的初始化工作完全完成(这个工作是由OS的指令完成的)
就绪 —> 运行:进程被OS选中,并分配了CPU之后
运行 —> 结束:进程的最后一条指令执行结束(粗略的理解就是main方法执行结束)
运行 —> 就绪:1、被高优先级的进程抢占了 2、时间片耗尽 3、进程可以执行一些OS提供的系统调用,主动放弃
运行 —> 阻塞:等待一些外部条件;等待IO设备;进程休眠一段时间......
阻塞 —> 就绪:外部条件满足;IO数据来了;休眠时间到了......
结束 —>:进程PCB彻底被OS回收了
站在OS角度,同一时刻,处于不同的状态下进程不止一个
处于新建,有n1个
处于就绪,有n2个(就绪队列一般就一个)
处于运行,只有1个(单CPU单核的情况下)
处于结束,有n3个
处于阻塞,有n4个(阻塞队列一般每个条件都可以有一个)
7、如何选择就绪队列中的哪个进程上CPU
要有消息、要保证公平性,要让更紧急的任务被更紧急的处理,低成本解决......
8、OS什么时候会介入进程调度:需要选择一个新的进程,进行CPU分配
(1)一个新的进程刚处于就绪状态时,当该进程的优先级较高时——具备这种能力的OS被成为抢占式(实时)
(2)运作状态的进程 —> 结束,一个进程结束了
(3)OS每隔一段时间,会调度一次:进程的时间片耗尽
(4)进程主动放弃CPU:运行 —> 阻塞、运行 —> 就绪
9、OS具体怎么进程切换:通过上下文切换——保护上一个进程的上下文(Context) + 恢复下一个进程的上下文 Context Switch CS
保护上下文:把寄存器中的值保存到内存的某个位置
恢复上下文:把内存中之前保护的值,写入寄存器
10、并行(parallel) vs 并发(concurrent)
并行:进程真的同时在执行(微观角度的同一时刻,是有多个指令在执行的,所以只会在多CPU多核场景下)
并发:进程假的同时在执行(微观上,表现为一次只执行一个进程,但宏观上,多个进程在“同时”进行)
11、用户态(user space) vs 内核态(kernel space)
CPU正在执行的是OS的指令时,就进入到内核态,反之,正在执行的是普通进程的指令时,就在用户态
管理的核心就是权限的划分
内核态的指令权限高(所有的硬件都能访问),可以访问所有内存;用户态的指令权限低(只能访问OS规定的资源),只能访问进程自己的内存。CPU本身就有权限开关,所以可以做到
注:用户态的性能较好,内核态的性能较差
12、执行流(execution)
拥有独立pc的一套指令,不同的执行流从现象上看起来是完全独立的
13、线性地址 vs 物理地址
物理地址:真实的内存中的地址
线性地址:物理地址被OS进行转换后的一个地址
OS分配出来的空间只是线性地址空间,实际的物理内存,可以延迟到,要访问这段内存的时候再分配
14、进程间通信(Inter-Process Communication/IPC)
(1)进程A 进程B
理论上,进程之间是独立的,但实际上,往往是多个进程之间互相配合,来完成复杂的工作,所以就有了进程之间交换数据的必要性
所以OS需要提供一套机制,用于让A、B进程之间进行必要的数据交换——进程间通信
(2)进程间通信的常见方式
①管道(pipe)
②消息队列(message queue)
③信号量(semaphore)
④信号(signal)
⑤共享内存(shared memory)
⑥网络(network)
15、再研究OS实现的时候,可能面临的一些问题:
在分配内存的时候,如何避免出现死锁(dead lock)的问题