操作系统两种观点:资源管理、硬件扩展
操作系统的核心:可处理的系统调用集
进程:运行程序的抽象,进程表用以保存进程信息
进程系统调用:进程创建、进程终止
每个进程:供用户启动的UID
进程创建场合:
系统初始化
执行了正在运行进程所调用的进程创建系统调用
用户请求创建一个新进程
一个批处理作业的初始化
进程创建本质:新进程都是由已存在的进程执行一个用于创建进程的系统调用
前台进程、后台进程(守护进程)
UNIX创建进程:fork
windows创建进程:win32调用createprocess,既处理进程创建,也负责把正确的程序装入新的进程。win32大概有100个函数处理进程管理
进程层次关系:
windows中进程是平等关系,之间联系是“句柄”
unix存在层次,构成树结构,每个进程只有一个父进程,但可以有多个子进程
进程状态:就绪态、运行态、阻塞态
引入线程:
减少进程中断、定时器、上下文切换的耗时空
轻量级
进程有地址空间和控制线程
进程:容器,用以聚集资源包括地址空间、线程、打开的文件、保护许可等
为隐避中断的影响,允许动态创建和终止进程,每个进程都有自己的地址空间
对某些应用,尽量多使用控制线程,每个线程有自己的堆栈
进程间通信通过消息原语,包括信号量、管道等,原语确保同一时刻不会有两个进程在临界区
进程进通信(IPC):
围绕问题:1 如何传递信息 2 传递信息时不出现交叉 3 顺序
竞争条件: race condition 两个或以上进程共享数据,结果取决于进程运行的精确时序
临界区:互斥mutual exclusion,共享内存进行访问的程序片段
临界区特点:
临界区不可能同时有两个或两个以上进程
不应对CPU的速度和数量做任何假设
临界区外运行的进程不得阻塞其他进程
不得使进程无限制等待进入临界区
互斥方法:屏蔽中断(使用于单CPU)、锁变量、严格轮换法、peterson解法、TSL指令
信号量:semaphore计数能力
PV 操作,p减1,v加1 等于0表示没有等待的进程
互斥量:mutex 信号量的简化版本
0表示解锁,此时可以访问临界区,其他值表示加锁
mutex_lock mutex_unlock
Pthread中的互斥:多个同步线程的函数
系统调用:用户在编程时调用操作系统功能
使CPU从用户态陷入内核态
系统调用机制:
中断/异常机制-->陷入指令(引发异常,完成用户态和内核态切换)-->
系统调用号和参数--->系统调用表(存放系统调用服务的入口地址)
用户与系统间参数传递方法:陷入指令自带参数,通用寄存器传递,内存汇总开辟堆栈
系统调用执行过程:当CPU执行到特殊陷入指令时,
中断/异常(保存现场,查找中断向量表,控制权转给系统调用总入口程序) -->
系统调用总入口程序(保存参数,将参数保存在内核栈里,通过系统调用表将控制权转让给对应的系统调用例程)-->
执行系统调用例程序-->
恢复现场,返回用户程序
并发环境:单处理器上有两个或两个以上的程序同时处于开始运行但尚未结束的状态,
并且次序是不确定的
并发环境下并发进程,引入了进程:CPU的抽象
PCB:进程描述信息(PID,进程名,UID,进程组关系),
进程控制信息(当前状态、优先级、代码入口地址、磁盘地址、同步通信、消息队列)
资源和使用情况
cpu现场信息(寄存器值、指向进程表的指针)
进程表:PCB集合,每个PCB对应一个进程
进程状态:创建 就绪 运行 阻塞、挂起、终止
进程控制:完成进程状态转换的原语
创建createProcess(PID PCB)-->为进程分配地址空间-->初始化PCB-->插入到相应的队列指针
撤销:回收进程所占用资源-->撤销该进程PCB
阻塞:由进程自己执行进程原语
线程进程