进程 PCB 进程挂起
7-1 进程定义
OS系统从只能跑一个程序到能跑多个。进程可以描述程序的执行过程。
进程:一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
只有当一个程序被OS加载到内存中,cpu对其执行时,这个过程是动态的,称为进程。
7-2 进程的组成
包含了正在运行的一个程序的所有状态信息
程序的代码
程序处理的数据
要知道现在执行哪条指令,程序计数器中的值指示将运行的指令。
CPU寄存器会动态变化,一组通用寄存器的当前值,堆,栈等;
各种系统资源,内存,外存,网络
进程与程序的联系
程序是进程的基础,代码控制操作,可以多次执行程序,每次构成不同的进程;进程是程序功能的体现;多次执行——某一个程序对应多个进程;调用关系——某一个进程包括多个程序
多对多的映射关系
进程与程序的区别
程序静态,有序代码的集合;进程动态,执行中可以是核心态/用户态,写的代码都是用户态,但有些操作比如读写文件只能由OS完成,
OS代表进程在内核中执行,此时为核心态;
进程是暂时的,是状态变化的过程,程序永久;
组成不同,进程包括程序,数据(可能变化),进程控制块(进程状态信息)
7-3进程的特点
动态性;
并发性(在一段时间内有多个程序在执行,不同于并行,是一个时间点有多个在跑,需多个CPU即多核,进程可以被独立调度并占用处理机运行):
独立性,正确性不受影响(通过OS给不同的进程分配不同页表);
制约性,因访问共享数据/资源或进程间同步产生制约,要同步互斥;
描述进程的数据结构:进程控制块,PROCESS control block PCB
OS给每个进程都维护了一个PCB,保存与之有关的所有状态信息。
7-4 进程控制结构
PCB进程控制块:进程存在的唯一标识,操作系统管理控制进程运行所用的信息集合,描述进程的基本情况和运行变化的过程。
用PCB的生成,回收,组织管理来完成进程的创建、终止和管理。
PCB含有三大类信息:
(1) 进程标识,哪个程序在执行,执行了几次(本进程的标识),产生者标识(父进程标识),用户标识
(2) 处理机状态信息保存区,主要就是寄存器,保存进程的运行现场信息:
用户可见寄存器,程序使用的数据,地址控制和状态寄存器,程序计数器pc,程序状态字PSW栈指针,过程调用/系统调用/中断处理和返回时需要用到
(3) 进程控制信息
调度和状态信息,用于操作系统调度进程并占用处理机使用。运行状态?等待?进程当前的执行现状
进程间通信信息,各种标识、信号、信件等
进程本身的存储管理信息,即指向本进程映像存储空间的数据结构,内存信息,占了多少?要不要回收?
进程所用资源,打开使用的系统资源,如文件
有关数据结构连接信息,父进程,子进程,构成一个链,进程可以连接到一个进程队列,或链接到其他进程的PCB
PCB的组织方式:
链表(便于插删,用于通用的OS):同一状态的进程PCB为一链表,多个状态对应更多个不同的链表,就绪链表,阻塞链表
索引表(数组,不利于插删,使用于固定数目的进程,相对创建更快捷):同一状态的归入一个index表(每一个index指向PCB),就绪/阻塞索引表
7-5 进程状态
进程生命期管理:创建—>运行—>等待—>唤醒—>结束
引起进程创建的3个主要时间:系统初始化时,创建INIT进程,INIT再负责创建其他进程;用户请求创建一个NEW PROCESS,正在运行的进程执行了创建进程的系统调用。
运行:内核选择一个就绪的进程,让它占用处理机(cpu)并执行
调度算法—-如何选择?
等待(阻塞)的三种情况:请求并等待系统服务,无法马上完成;启动某种操作(和其他进程协调工作),无法马上完成;需要的数据没有到达
进程自己触发阻塞,因为只有自己才知道何时需要等待某事件
唤醒的情况:需要的资源可被满足,等待的事件到达,都意味着可将该进程的PCB插入到就绪队列
因为自身没有占用cpu执行,所以只能被OS或其他进程唤醒
结束的情形:自愿(正常退出,错误退出),强制性的(致命错误,被其他进程所杀)
7-6 进程状态变化模型
结束前的三种状态:运行态(running),就绪态(ready 获得除CPU即处理机之外的一切资源,一旦得到CPU就可以运行),等待状态(阻塞态,blocked)
进程状态变化模型
创建态(new) 已创建还没就绪
结束态(exit) 正在从OS中消失,PCB还存在
running to ready:分时-时间片到了,就切到另一个程序,这个转变为ready,由OS结合时钟完成。
new->ready:很快,只是生成pcb
进程挂起模型
7-7 进程挂起
不同于进程阻塞。挂起时没有占用该内存空间,而是映像在磁盘上。类似虚存中,有的程序段被放到了硬盘上。
Suspend:把一个进程从内存转到外存。
可以合理、充分地利用系统资源。
两种挂起状态:
阻塞挂起,进程在外存等事件blocked suspend
就绪挂起,进程在外存,但进了内存就能执行ready suspend
状态转换:
在内存中被挂起:
blocked to blocked suspend: 没有进程ready或ready进程要求更多内存时挂起,以提交新进程或运行就绪进程
ready to ready suspend: 多个就绪进程挂优先级低的,有高优先级阻塞(OS认为会很快就绪)进程和低优先ready进程时,挂低优先的就绪进程
running to ready blocked: 抢先式分时系统,空间不够或高优先级阻塞挂起进程进入就绪挂起时,正在运行的进程被就绪挂起
外存中:
blocked suspend to ready suspend: 相关事件出现时,转变为ready suspend但还在硬盘上。
解挂/激活 activate:外存到内存,需要运行该进程时
ready suspend to ready: 没有就绪进程或挂起就绪优先进程优先级高于当前就绪进程时
blocked suspend to blocked:当一个进程释放了足够内存时,OS把高优先级阻塞挂起(认为很快出现等待的事件)转换为阻塞进程
OS怎么通过PCB和定义的进程状态来管理?
以进程为基本结构的OS,底层为CPU调度程序(执行哪个?中断处理等),上面是各种进程。
OS要维护一组状态队列(重要的数据结构),表示系统中所有进程的当前状态。
就绪队列,各种类型的阻塞队列,挂起队列
PCB根据状态排入相应队列,状态变化加入和脱离队列
7-8进程的上下文切换 context switch
进程共享CPU,停止当前进程,并调度其他进程的切换叫做上下文切换。
必须切换前存储上下文,切换后恢复让进程不知道被暂停过,必须快速(上下文切换频繁),因为有时间开销所以也要尽量避免
要存储哪些context?
寄存器(pc,sp,…),CPU状态等
进程执行中要关注寄存器,PC(进程执行到了什么地方),栈指针(调用关系,相应的局部变量位置)等。
这些信息要被保存到PCB中,进程挂起时要把PCB的这些值重置,恢复到寄存器中去,使接下来进程可以继续在CPU上执行。
上下文切换的开销越小越好,且所有信息都与硬件紧密相连,所以OS中实现是用汇编代码。
需要知道哪些进程能切换?
PC为活跃进程准备了进程控制块PCB,OS将不同PCB放在不同的状态队列链表里便于选择
就绪队列
等待I/O队列—-分为每个设备的队列
僵尸队列
僵尸状态:
就是调用了EXIT但还没有wait返回的时候。将死,还没死。无法正常工作,只是等待被父进程回收。
执行EXEC()时,进程可以处于不同的状态。首先是runnig, 然后加载、运行,加载时间长要等running->blocked。
进程 PCB 进程挂起的更多相关文章
- 进程PCB
struct task_struct { volatile long state; //说明了该进程是否可以执行,还是可中断等信息 unsigned long flags; //Flage 是进程号, ...
- linux进程及进程控制
Linux进程控制 程序是一组可执行的静态指令集,而进程(process)是一个执行中的程序实例.利用分时技术,在Linux操作系统上同时可以运行多个进程.分时技术的基本原理是把CPU的运行时间划 ...
- 进程管理—进程描述符(task_struct)
http://blog.csdn.net/qq_26768741/article/details/54348586 当把一个程序加载到内存当中,此时,这个时候就有了进程,关于进程,有一个相关的叫做进程 ...
- 【Linux 应用编程】进程管理 - 进程、线程和程序
基本概念 程序和进程的区别 程序是平台相关的二进制文件,只占用磁盘空间.编写完程序代码后,编译为可执行的二进制文件即可. 进程是运行中的程序,占用 CPU.内存等系统资源. 通过 Shell 命令,可 ...
- 【转载】linux进程及进程控制
Linux进程控制 程序是一组可执行的静态指令集,而进程(process)是一个执行中的程序实例.利用分时技术,在Linux操作系统上同时可以运行多个进程.分时技术的基本原理是把CPU的运行时间划 ...
- Yuchuan_Linux_C 编程之十 进程及进程控制
一.整体大纲 二.基础知识 1. 进程相关概念 1)程序和进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu.内存.打开的文件.设备.锁....) 进程,是一个抽象的概念,与 ...
- linux进程解析--进程切换
为了控制进程的执行,linux内核必须有能力挂起正在cpu上运行的进程,换入想要切换的进程,也就是恢复以前某个挂起的进程,这就是linux的进程切换. 1进程切换的时机 一般来说,进程切换都是发生在 ...
- linux进程解析--进程的创建
通常我们在代码中调用fork()来创建一个进程或者调用pthread_create()来创建一个线程,创建一个进程需要为其分配内存资源,文件资源,时间片资源等,在这里来描述一下linux进程的创建过程 ...
- linux进程解析--进程的退出及销毁
一进程的退出: 当一个进程运行完毕或者因为触发系统异常而退出时,最终会调用到内核中的函数do_exit(),在do_exit()函数中会清理一些进程使用的文件描述符,会释放掉进程用户态使用的相关的物理 ...
随机推荐
- MeteoInfoLab脚本示例:Streamline流线图
绘制Stramline流线图的函数是streamline,需要两个变量(U/V分量或者风向/风速).脚本程序: f = addfile('D:/Temp/GrADS/model.ctl') u = f ...
- win32获取进程树,以及命令行参数
1.先上代码 package main import ( "bytes" "errors" "flag" "fmt" & ...
- 安装ipython
安装ipython,首先系统上已安装python 在这里,我们已安装python3 在windows下: pip intsall ipython 在linux下: sudo apt install p ...
- LeCun自曝使用C语言23年之久,2年前才上手Python,还曾短暂尝试Lua!
程序员圈子的流行风潮,过几年就怀旧风走一波. 这不,最近Twitter上刮起了一阵编程语言使用历史的风潮. 连图灵奖得主.CNN之父-- Yann LeCun 也参与进来了. 他自曝使用C语言时间最长 ...
- Jetson AGX Xavier部署ORB_SLAM2(ROS)
1. 修改CMakeLists.txt Examples/ROS/ORB_SLAM2下的CMakeLists.txt 原 set(LIBS ${OpenCV_LIBS} ${EIGEN3_LIBS} ...
- swoole一键协程
swoole4.x后支持一键协程 加上后,开启一键协程化后,MySQL.Redis.Curl 等操作会变成异步 IO //此行代码后,文件操作,sleep,Mysqli,PDO,streams等都变成 ...
- python爬虫 -掘金
import json from time import sleep import requests url = "https://web-api.juejin.im/query" ...
- 优化Mysql数据库的8个方法
通过8个方法优化Mysql数据库:创建索引.复核索引.索引不会包含含有NULL值的列.使用短索引.排序的索引问题.like语句操作.不要在列上进行运算.不使用NOT IN 和<>操作 1 ...
- CDH+Kylin三部曲之一:准备工作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 在PostgreSQL中CREATE STATISTICS
如果你用Postgres做了一些性能调优,你可能用过EXPLAIN.EXPLAIN向你展示了PostgreSQL计划器为所提供的语句生成的执行计划,它显示了语句所引用的表如何被扫描(使用顺序扫描.索引 ...