操作系统之哲学思想
一、基础原理篇
1、操作系统是介于硬件平台和应用程序之间的一层软件
2、程序和程序之间无非就是调用和被调用的关系
3、CPU即进程管理,进程管理的主要目的:
- 公平:即每个程序都有机会使用CPU
- 非阻塞:即任何程序不能无休止地阻扰其他程序的正常推进
- 优先级:优先级高的程序运行,则优先级低的程序就需要让出资源
4、内存管理主要是:管理缓存、主存、磁盘、磁带等存储介质所形成的内存架构
两个目的:将物理内存扩充到外部存储介质上;让很多程序共享同一个物理内存
5、文件系统的主要目的:将磁盘变成一个很容易使用的存储媒介以提供给用户使用
I/O管理(设备管理)两个目的:屏蔽不同设备的差异性(即用户用同样的方式访问不同的设备,从而降低编程的难度);提供并发访问
6、Windows将操作系统划分成内核(kernel)、执行体(executive)、视窗和图形驱动和可装入模块。Windows执行体又划分为:I/O管理、文件系统缓存、对象管理、热插拔管理器、能源管理器、安全监视器、虚拟内存、进程与线程、配置管理器、本地过程调用等。而且,Windows还在用户层设置了数十个功能模块,可谓功能繁多,结构复杂
7、中断的基本原理:设备在完成自己的任务后向CPU发送中断,CPU判断优先级,然后确定是否响应,如果响应则执行中断服务程序,并在中断服务程序执行完成后继续执行原来的程序。还可以有软中断(软件发出的终端)。
8、所谓的抽象:就是再根本上存在但现实中不存在的东西;比如人的具体属性,将肉体和骨架全部剥离,剩下的就是抽象(人的灵魂)
9、内核态与用户态
内核态:就是拥有的资源多或者访问资源多的状态(特权态)
-
- 牵扯到计算机本体根本运行的事情都应在内核态下执行
- 对时序要求特别高的操作,也需在内核态完成
- CPU的管理和内存管理都应该在内核态实现
- 输入输入管理、诊断与测试程序
- 文件系统的宏数据部分的管理必须放在内核态
用户态:访问的资源将受到限制(非特权态)
那计算机如和知道现在正在运行的程序是内核态还是用户态呢?
处理器的一个状态位,这个状态位是CPU状态字里面的一个字位,即所谓的用户态、内核态实际上是处理器的一种状态。
一个程序运行时,CPU是什么态,这个程序就运行在什么态。
10、进程:一个运动中的程序(指令+数据)
内存:它是进程的存放场所。如何对内存进行管理,使得数据的读写具有高效率、高安全、高空间利用率和位置透明的特性是内存管理所要达到的目的
11、操作系统是一个系统程序,即为别的程序提供服务的程序
操作系统的服务是通过系统调用(system call)方式提供的
系统调用:就是操作系统提供的应用程序界面(API
-
- 进程控制类
- 文件管理类
- 设备管理类
- 内存管理类
- 信息维护类
- 通信类
系统调用分为三个阶段:
-
- 参数准备阶段
- 系统调用识别阶段
- 系统调用执行阶段
12、壳
fork功能:创建一个子进程,并将自己的一切数据复制到子进程(fork完成的实际上是自我复制)
execve功能:用另外一个程序的内容覆盖自己,即执行新的程序
二、进程原理篇
进程从根本上说是操作系统对CPU进行的抽象和装扮
因为要并发,所以发明了进程
进程管理、内存管理和文件管理是操作系统的三大核心功能
2.1、一个程序加载到内存后就变为进程:进程=程序+执行
同时存在于计算机内存的程序就称为进程,进程让每个用户感觉到自己独占CPU。
2.2、并发和并行的区别是什么
并发是一个人同时吃三个馒头
并行是三个人同时吃三个馒头
2.3、进程模型
从物理内存的分配来看,每个进程占用一片内存空间,从这点上说,进程就是内存的某片空间。由于任意时刻,CPU只能执行一条指令,
因此任意时刻的CPU上执行的进程只有一个,而到底执行哪条指令由物理程序计数器指定。总的来说,在物理层面上,所有进程共用一个程序计数器
从逻辑层面上看,每个进程可以执行,也可以暂时挂起让别的进程执行,之后又可以接着执行。
从时间上看,每个进程都必须往前推进。
操作系统如何实现进程呢?
任何抽象都需要有一个物理基础。对于进程来说,其物理基础就是程序。操作系统通过内存管理解决:由于多个可能同时并存,因此进程的存储需要考虑如何让多个进程共享同一个物理内存而不发生冲突的问题。
如何将CPU在多个进程之间进行切换呢?
操作系统解决此问题的手段:进程调度
2.4、进程的产生和消亡
进程产生的主要事件有:
- 系统初始化(神创造人)
- 正在运行的程序执行了创建进程的系统调用(人生子)
- 用户请求创建一个新进程 (试管婴儿)
造成进程消亡的事件则分为四种:
- 寿终正寝:进程运行完成而退出
- 自杀:进程因错误而自行退出
- 他杀:进程被其他进程所终止
- 处决:进程因异常而被强行终结
2.5、进程的状态
进程挂起有哪些原因呢?
- 一种自身原因:进程运行过程中执行了某种阻塞操作,比如磁盘I/O
- 一种是操作系统原因:一个进程执行的事件太长,为了公平,操作系统将其挂机,让其它进程执行
2.6、进程的层次结构
一个进程在执行过程中通过系统的调用创建新的进程(子进程),这样子子孙孙创建下去就形成了所谓的进程树。UNIX称这个进程树里的所有进程为一个进程组,从而形成一个层次架构。
windows没有进程组的概念,而是所有进程均地位平等。
2.7、进程与地址空间
进程空间也称地址空间。地址空间就是进程要有的所有资源。
地址空间的特点是被动的,只提供支持。打个比方,有个舞台,那些道具和舞台就是地址空间,这些空间本身不能发生任何动作。做动作的只是演员,而每一个演员就是一个线程。
进程与地址空间研究的主要内容是如何让多个进程空间共享一个物理内存。
2.8、进程管理
当一个进程产生时,操作系统需要为其创造记录。操作系统用于维护进程记录的结构就是进程表或是进程控制块(PCB)。它们中存放的就是有关该进程相关的资料。信息应当包括寄存器,程序计数器,状态字,栈指针,优先级,进程id,信号,创建时间等等。而采纳的数据结构主要是线性表,链表和结构(struct),也用树和图(网络)结构。
这个进程表保存在操作系统的内核里。
psw,状态字寄存器。包括允许中断标志位,跟踪标志位。
2.9、进程的创建过程
进程创建在不同的操作系统方法也不是一样的。UNIX将进程创建分为两个步骤:第一步是fork,创建与自己完全一样的新进程;第二步是exec,将新的进程的地址空间用另一个程序的内容覆盖,然后跳转到新程序的起始地址,从而完成新程序的启动。而windows使用creatprocess这个系统调用就可以完成进程的创建。在调用该函数时我们把欲执行的程序名称作为参数传递过来,创建新的页表,而不需要复制别的进程。
UNIX的创建过程要灵活一些,因为我们既可以自我复制,也可以启动新的程序。而自我复制在很多情况下都是有用的。例如,web服务器在没收到一个用户请求后,就创建新的一模一样的进程来服务用户请求。
2.10、进程调度
调度是操作系统实现进程模型的根本手段
调度的目的:就是单位时间内能完成的工作数量,即整个系统运行效率;保持系统各个功能部件繁忙就是让CPU和输入输出均处于忙碌状态
对于实时系统来说,调度就是要在截止时间前完成所应该完成的任务和提供性能可预测性
进程调度时操作所执行的操作大概:
- 因时序或外部中断或进程挂起而导致操作系统获得CPU控制权
- 操作系统在所有就绪得进程中按照某种算法遴选进程
- 如果选中得是非当前进程,则操作系统将当前进程(中断或挂起的进程)状态予以保护
- 将选中的进程的环境布置好(设置寄存器、栈指针,状态字等)
- 跳转到选中的进程
2.11、调度算法种类
先来先服务调度算法
隐含条件就是不能抢占,一个程序一旦启动就一直运行到结束或者受阻塞为止
短任务优先算法(STCF)
一种是非抢占(寿终正寝):非抢占短任务优先算法得原理---是让已经在CPU上运行得程序执行到结束或阻塞,然后在所有候选的程序中选择需要执行时间最短的进程执行
一种是抢占:每增加一个新的进程就需要对所有的进程(包括正在CPU上运行的进程)进行检测,谁的时间短谁运行
实时系统调度算法:
- EDF调度算法(动态优先级调度即最早截止任务优先)
- EDF调度算法就是最早截止的任务先做。如新的工作来了,比正在运行的 程序的截止时间更靠前,那么就抢占当前进程。
- RMD算法(静态优先级调度即最短周期优先)
2.11、进程通信
- 管道;记名管道;
- 虫洞:套接字;
- 进程电报:信号;
- 信号旗语:信号量;
- 进程拥抱:共享内存;
- 信件发送:消息队列;其他通信机制
信号:是一个内核对象,或者说是一个内核数据结构。
信号量不只是一种通信机制,更是一种同步机制