文章目录
操作系统的系统调用
例子:
#include <stdio.h>
int main(void){
printf("Hello World!!\n");
exit(0);
}
这是一个简单的C语言程序,在屏幕显示 Hello World!!
字符串,整个程序中调用了 printf()
exit()
函数,进行了系统的底层操作。他们都涉及到了外设(显卡)操作,涉及到进程操作。
系统调用
操作系统内核为应用程序提供的服务和函数。用户通过调用系统的服务和函数完成相应的功能的过程称为系统调用。
特点
- 涉及核心资源或硬件的操作
- 运行于核态
- 每个系统调用具有唯一的编号
- 调用过程会产生中断:自愿中断(程序员的安排)
系统调用的中断过程
操作系统的进程管理
背景
程序在并发的环境下运行会出现各种的问题:
- 运行过程不确定
- 结果不可再现(程序因为各种原因被干扰运行)
- 解决方案:对运行过程加以干涉,施加相互制约
操作系统必须很好的解决这类的并发问题。
进程
描述和管理程序的“运行过程”,进程是程序在某个数据集合上的一次运行活动。
数据集合:软/硬件环境,多个进程共享的环境
特点
- 动态性:进程是程序的一次执行过程,动态的产生和消亡。
- 并发性:进程和其他的进程一起运行,共同的向前推进程序执行过程。
- 异步性:各个进程之间的运行速度不一致,逻辑也不同。
- 独立性:进程是操作系统分配系统资源和调度CPU的基本单位。
程序和进程
动态和静态
- 进程:动态,它是程序的一次运行过程,可以动态的产生和消亡
- 程序:静态,它是一组存储在存储介质上的一组有序的指令集合
暂存和长存
- 进程在内存驻留,为暂存
- 程序在介质上长期驻留,为长存
进程的状态
进程在运行的过程中,他会与其他的进程共享CPU,对于一个进程来说,他都是断断续续地在CPU上运行。当进程需要使用IO或者系统调用的服务时,他就会停下来,所以就会出现进程的不同的状态。
运行状态(Running)
进程已经占用了CPU,正在运行
就绪状态(Ready)
运行的条件均已经具备,等待分配CPU,得到CPU资源后,便可以立即进行运行的进程状态。
阻塞状态(Block)【等待(wait)状态】
进程因为需要等待系统或者外设提供相应的服务后才能继续运行。比如等待系统调用,IO操作等
进程状态的转换
进程的状态是可以根据特定的规则和条件进行相互转化的。
简单的三态转化
具有新建和终止状态的进程转化
Linux的进程状态
转换图示
进程控制块(Process Control Block,PCB)
- 描述进程状态、资源和与相关进程关系的数据结构
- PCB是进程的标志,操作系统通过管理PCB管理进程
- 创建进程时创建PCB;进程撤销后PCB同时撤销
进程 = 程序 + PCB
PCB的数据结构
-
name (ID ) :进程名称(标识符)
-
status :状态
-
next :指向下一个PCB的指针
-
start addr :程序地址
-
priority :优先级
-
cpu status :现场保留区(堆栈)
-
comm_info :进程通信
-
process family :家族
-
own_resource :资源
进程控制
在进程生存的全期间,对进程的全部行为进行控制
有以下四个典型的控制行为:
进程创建
功能: 创建一个基友唯一指定标识ID的进程
创建流程:
创建的伪代码:
Create(Si,Mi,Pi){
p = get_new_pcb();
pid = get_new_pid();
p->ID = pid;
p->CPU_State = Si;//CPU的状态
p->Memory = Mi;//内存
p->Priority = Pi;//优先级
p->Status.Type = "Ready";//进程状态
p->Status.List = RL;//进程队列:RL:Ready List
.....
Insert(RL,p);//插入队列中
Scheduler();//调度程序
}
进程撤销
用于撤销一个指定的进程,收回进程所占有的资源,撤销该进程的PCB
撤销的时机/事件
- 正常结束
- 异常结束
- 外界干预
撤销的参数只需要ID即可。
撤销流程
进程阻塞
用于停止进程的执行,变为阻塞
阻塞的时机/事件
进程阻塞需要的参数
-
阻塞原因
本来阻塞一个进程不需要原因,但是为了方便进程的管理,我们按照阻塞的原因构建不同的阻塞队列,这样一来,对于一个特定的阻塞队列,我们采用统一策略去对待他们。
进程阻塞的流程
进程唤醒
功能:唤醒处于阻塞队列中的进程
引起进程唤醒的时机/事件
他与进程阻塞的时机/事件刚好对应。