进程概念
操作系统的管理CPU资源的功能叫进程功能
基本概念
操作系统功能:并发/分时环境
并发环境
运行过程不确定
结果不可再现
解决:对运行过程施加相互制约
进程:描述和管理程序的运行过程
进程是程序在某个数据集合上的一次运行活动
数据集合:软硬件环境,多个进程共存的环境
特征:动态性、并发性(宏观上同时运行)、异步性、独立性
程序
指令或语句序列
封闭性、顺序性、可再现性
进程与程序区别
动态和静态,暂存和长存,程序和进程的对应(一个程序有多个进程),程序:指令集,进程:程序在某个数据集合上的一次运行活动
进程类型
使用资源、对cpu的依赖、其他
进程:动态、暂存、一个程序有多个进程
程序:静态、长存。
进程特征:动态性、并发性、异步性(相互交替运行)、独立性(资源分配和使用)
异步性就是描述进程这种以不可预知的速度走走停停、何时开始何时暂停何时结束不可预知的性质。
进程状态
运行状态:进程已经占用CPU
就绪状态:具备运行条件没有cpu
阻塞状态:等待某项服务完成或信号不能运行
就绪->运行:进程调度,运行->就绪:时间片到、被抢占
运行->阻塞:请求服务、等待信号,阻塞->就绪:服务完成、信号到来
可运行态:就绪、运行
阻塞态:浅度、深度。能不能被其他进程的信号或时钟唤醒
僵死态:进程终止执行
挂起态:进程被挂起
阻塞过后应该是就绪,程序必须经过就绪状态后再到运行;就绪后应是运行,程序运行后才能阻塞
进程执行完成I/O指令后,由阻塞态转换为就绪态
进程控制块
PCB:描述进程状态、资源和相关进程关系的数据结构
PCB是进程的标志
创建进程时创建PCB,进程撤销后撤销PCB
进程=程序+PCB,Linux:task_struct
基本成员:进程名称、状态、、、、、
Linux:task_struct
linux进程的标识
进程的切换
进程的上下文:context,进程运行环境,cpu环境
进程切换:从栈上来,到栈上去
进程控制概念
进程生存全期间,对其全部行为的控制
进程创建
功能:创建一个具有指定标识的进程
过程:创建一个空白PCB,获得并赋予进程标识符,为进程分配空间,初始化PCB,插入进程队列
进程撤销、
撤销指定进程
收回进程占用资源,撤销进程的PCB
正常结束、异常结束、外界干预
参数:标识符
实现:检索,获取进程状态,如果进程运行 终止进程,释放进程占用资源,撤销
进程阻塞
功能:停止进程执行,变为阻塞
请求系统服务,启动某种操作,新数据未到达,无新工作可做
不同原因构建不同阻塞队列
实现:停止运行,将PCB“运行态”-阻塞态,插入相应的阻塞队列,转调度程序
进程唤醒
唤醒阻塞队列的进程
时机:系统服务由不满足到满足,I/O完成,新数据到达,进程提出新请求
参数:进程标识
进程控制原语
原语:由若干指令构成具有特定功能的函数。特点:具有原子性,操作不可分割。必须全部完成
四个原语
进程调度:就绪态->运行态(狭义),进程状态间的切换
进程控制:控制进程切换的载体
windows进程控制
启动exe程序创建进程方法:点击,编程(函数)
system,winexe,shellexecute,createprocess
CreateProcess()创建进程
创建进程内核对象,创建虚拟地址空间
装载exe代码或dll的代码和数据到地址空间
创建主线程和线程内核对象
启动主线程,进入主函数
进程结束
ExitProcess
TerminateProcess:任务管理器强制结束进程
Linux进程控制
fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
创建进程fork()
可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
pid_t(整形) fork(void)
pid_t pid=fork()
pid在子进程中,pid=0;父进程中,pid>0(子进程id)出错:pid=-1;
新进程是当前进程子进程
子进程是父进程的复制
子进程与父进程并发运行,看谁运行速度更快
父进程创建子进程后,子进程从调用函数后执行
i=1
It is a parent process!
i=0
It is a child process!
或者
i=0
It is a child process!
i=1
It is a parent process!
进程执行与父进程不同的功能
exec函数簇,使子进程与父进程完全不同的功能,装入一个指定的可执行程序
线程
线程是系统调用的基本单位
一个函数先执行,另一个函数后执行
概念:线程是可由CPU直接运行的实体
一个进程可以创建多个线程
多个线程共享CPU可以实现并发运行
创建线程
CreateThread()
单线程程序:进程只有一个线程,windows缺省只有一个线程
多线程程序:至少两个线程,一个主线程,至少一个运行线程
线程应用
1.程序多个功能需要并发运行
2.提高窗口程序的交互性;
3.改善程序结构
4.多核CPU上的应用,充分发挥多核性能
win32:CreateThread
MFC:AfxbeginThread
、、、
linux:pthread_create()
单线程程序:后台计算的特点:很耗时的函数,窗口交互性差
把后台计算函数创建为线程
后台的文件拷贝使独立的线程
麻烦
程序难以调试
并发过程难以控制
线程安全问题
临界区与临界资源
进程并发运行时防止出错:程序设定一个特定区域不让两程序同时进入。
临界资源:一次只允许一个进程独占访问资源
临界区:进程中访问临界资源的程序段
访问特点:具有排他性,并发进程不同同时进入临界区
临界区设置太大会导致其它进程等待事件太长
设置太小会导致达不到设置临界区的目的
访问四个原则
1.忙则等待:当临界区忙时,其它进程必须在临界区外等待
2.空闲让进:当无进程处于临界区时,任何有权进程课进入临界区
3.有限等待:进程进入临界区请求在有限时间满足,临界区不能过大或过小
4.让权等待,等待进程放弃CPU,让其他进程有机会得到CPU
锁机制不满足让权等待 原则
锁机制
设置一个标志:S,表明临界资源是否可用
进入临界区前检查,进去退出时需要更改标志
S 0,不可用,1,可用
上锁操作
1.检测S
2.S=0,返回第一步
3.S=1,置S=0
原语
开锁操作
1.S=1
开锁原语
访问临界区
1.初始化锁状态S=1
2.进入临界区上锁
3.出去临界区开锁
同步和P/V操作
进程的互斥:多个进程共享独占性资源,必须协调存取关系,确保没有两个或疑似的进程同时存取
互斥和资源共享有关
同步关系:多个合作进程完成一个共同的任务,需要相互协调,一个进程开始前另一进程必须完成操作,否则只能等待
司机与乘客的关系
合作进程某些操作需要满足先后关系或某个操作能否进行需要满足前提条件,否则只能等待
进程的互斥是特殊的同步关系
P/V操作的概念
信号灯的概念
Dijkstra提出
进程运行过程中受信号灯空值,并改变信号灯状态
进程受控制:信号灯状态可以阻塞或唤醒金
改变信号灯:信号灯状态可以被进程改变
数据结构
s:信号量
q:队列
操作
P:通过
V:释放
p操作:s值减1,若差大于或等于0,进程继续,若小于0,该进程阻塞并加入到队列中,并转调度函数
p操作可能使进程阻塞
v操作:s值加1,若差大于0,进程继续,若小于等于0,该进程继续同时从队列q中唤醒一个进程
P-V操作解决互斥问题
共享资源
进入临界区执行p操作:阻塞当前进程
离开临界区执行v操作:唤醒进程
P-V操作解决同步问题
运行条件不满足时,让进程暂停,满足时进程继续
暂停:关键操作之前执行p操作
继续:关键操作之后执行v操作
合理的信号量初值
关键操作:需要前提条件,其它进程的前提
经典同步问题
生产者和消费者的问题
互斥和同步混合
有一本书问题
互斥
乘客和司机
同步
linux信号通信
信号向进程发送一个通知,通知某个事件已发生
收到信号的进程可以立即执行指定的操作
信号的发出可以是进程,也可以是系统,含硬件
ctrl+c=sigint,挂起(暂停)进程
kill-9=sigkill,杀死一个进程
键盘输入特殊组合按键,执行终端命令,程序调用函数,硬件异常或内核产生相应信号
linux定义了64种信号
signal(SIGINT,handle),注册信号处理函数的函数
handle()自定义信号函数
kill()发送信号
中断和信号通信
相同(1)采用了相同的异步通信方式; (2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;
(3)都在处理完毕后返回到原来的断点; (4)对信号或中断都可进行屏蔽。 区别: (1)中断有优先级,而信号没有优先级,所有的信号都是平等的;
(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行; (3)中断响应是及时的,而信号响应通常都有较大的时间延迟。
进程概念及状态
进程控制
程序:指令集合,是顺序的
特征:顺序性,封闭,可再现
多道程序系统:同时处理多个独立程序,独立性,随机性,资源共享
并发执行的程序:并发,两个或多个事件再统一事件间隔之内同时发生,串行,时间片短,宏观并行,微观串行。并行,两个或多个事件同一时刻同时发生。随机性,失去了程序顺序执行所具有的封闭性和可再现性
进程特征:动态,并发,独立,异步,结构
进程和程序:进程动态,程序静态;进程并发,程序没有;进程是资源竞争的基本单位。联系:一个程序可以有多个不同的进程。
进程更能真是的描述并发,程序不能;进程有程序和数据;进程有生命周期,程序相对长久,一个程序创建多个进程,进程可以创建进程
进程的层次结构:进程树,UNIX:进程组,Windows:所有进程地位相同
进程模型:多道程序顺序执行有资源浪费,多道程序并行执行需要有强大的CPU和硬件资源需要多个程序计数器;多道程序并发运行,时间片的概念
创建进程:系统初始化;执行了正在运行的进程调用进程创建系统调用,子进程;用户请求创建一个新进程;批处理作业的初始化
终止事件:正常退出;错误退出;严重退出;被其他进程杀死。前两种自愿,后两种非自愿
进程状态:运行态,阻塞态,就绪态。就绪不能到阻塞,阻塞不能直接到运行态
进程调度管理器
进程实现:PCB,进程控制块主要字段:进程表表项
中断发生时底层处理步骤:保护现场:堆栈,程序计数器保存;归置新的现场信息:放进新的值即程序计数器和堆栈;C中断服务例程选择进程投入运行
线程及应用场景
线程是轻量级的进程,调度快,使用方便,进程内的基本调度单位
多线程允许多个线程共享进程文件和存储资源
线程模型
线程实现:TCB
伪并行,提高并发,更小的系统开销,更高的性能,有利于在多CPU系统种实现真正的并行
进程通信
并发进程间接制约(同步),直接制约(互斥)
互斥:关中断法,锁机制法
严格的轮转法:用标准严格控制
TSL指令进入和离开临界区
doen原语,up原语
信号量法:私有信号量
临界资源及临界区
因为资源需要共享
临界资源:一次只允许一个进程独占访问资源
临界区:进程中访问临界资源的程序段
PV操作及同步互斥
死锁
概念
哲学家
思考,休息,吃饭
每个哲学家同时取完左手边的筷子,都取不到右手边的筷子,陷入死锁状态
定义:两个或多个进程无限期的等待永远不会发生的条件的一种系统状态
每个进程都陷入阻塞状态
可抢占性资源
不可抢占性资源:抢占后,相关计算失败
死锁起因
系统资源有限
资源数目不足,进程对资源产生竞争产生死锁
并发进程的推进顺序不当
不正确的P-V操作也可能会带来死锁
参与死锁的进程至少是两个
至少有两个已经占用资源
所有进程都在等待资源
参与死锁的进程是当前系统中所有进程的子集
死锁会浪费大量系统资源,甚至导致系统崩溃
死锁预防策略
必要条件
互斥条件
进程互斥使用资源,资源具有独占性
不剥夺条件
进程再访问完资源前不能被其他进程强行剥夺
部分分配条件
进程便运行编申请资源,临时也需要临时分配
环路条件
已占用资源被前一进程申请,申请资源被环中后一进程占用
预防死锁
设置限制条件,破坏死锁四个必要条件中的一个或多个
导致资源利用率和吞吐量降低
避免死锁
资源分配是,用算法评估是否分配资源
银行家算法
算法不好实现
检测和恢复死锁
检测死锁状态,清楚死锁
实现难度大
预先静态分配法
破坏部分分配条件
将进程资源一次性分配
特点:执行可能被延迟,应用开销大,资源利用率低
资源分配单位有进程改为进程步
有序资源分配法
破坏环路条件
每个资源分配有唯一组好
只能申请序号更大的资源
分配时检查资源序号是否符合递增规定
实际中没有死锁解决方案
鸵鸟策略
从死锁恢复
通过抢占恢复,通过回滚恢复,通过杀死进程恢复
银行家算法:评估是否应该再分配资源,防止全部进程都无法满足
进程调度概念
在合适的时候以一定策略选择一个就绪程序运行
目标
1.响应速度尽可能快
2.进程处理时间尽可能短
3.系统吞吐量尽可能大
4.资源利用率尽可能高
5.对所有进程公平
6.避免饥饿
7.避免死锁
目标自相矛盾
批处理系统更注重系统吞吐量尽可能大和资源利用率尽可能高,分时系统更注重对所有进程公平,实时系统更注重响应速度尽可能快
周转时间
进程提交给计算机到最终完成的时间
平均周转时间越短,吞吐量大,资源利用率高
带权周转时间
自身大小:进程运行时间
进程在系统中相对停留时间
调度算法
先来先服务调度
按照作业进入系统的 时间先后
容易实现,效率不高
短作业
短作业优先调度
选取时间最短
忽视了作业等待时间
响应比高者优先调度算法
响应比=响应时间/运行时间
短作业和等候时间长的作业
优先数调度
进程优先数=静态优先数+动态优先数
静态(进程创建时确定):资源多少,运行时间长短,进程类型
动态:改变,使用CPU超过一定时长,进行I/O操作后(需要交互),进程等待超过一定时长
循环轮转调度
先进先出,进程以时间片轮流使用CPU
公平性
交互性:每个进程等待一段时间就可以重新获得CPU
改进:时间片大小可变,组织多个就绪队列
linux进程调度
普通进程
动态优先级
调度程序周期性的修改优先级
实时进程
采用静态优先级来调度
由用户预先指定,以后不会改变
先进先出
时间片轮转
中断处理过程中调用schedule()中断
中断处理过程返回用户态时直接调用schedule()
内核线程可直接调用schedule()
用户态进程陷入内核后再中断处理
进程切换
内核挂起CPU上的进程并恢复之前挂起的进程
进程上下文:用户地址空间,控制信息,硬件上下文
两个进程切换A,B
1.运行A
2.发生中断,保存当前进程上下文
3.保存现场,进入内核中断处理
4.调用函数schedule()
5.运行B
6.恢复现场
7.中断返回
8.运行B
进程调度
进程调度:进程就绪态-运行态
交换调度:运行-阻塞,阻塞-就绪
作业调度
调度时机:执行结束,进程阻塞,执行原语、、、
进程上下文切换
调度方式:可剥夺式,不可剥夺