进程
1. 进程的相关概念
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
1.1 进程的定义
狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
1.2 进程的概念(1)
进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
1.3 进程的概念(2)
进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行时),它才能成为一个活动的实体,我们称其为 进程(下面讲到为什么进程是活动的实体)。
通俗一点理解,我们可以将 运行中的程序 看做是 进程,比如我们平时经常使用到的QQ,当我们打开qq这个app时就相当于启动了一个进程,操作系统就会为该进程分配内存空间.
我们看下图:
2. 进程和程序的区别
首先我们要明白程序是什么?程序是我们写下来的一段代码,而进程的产生是因为代码开始执行了。
就像下图:
此时我们便可以通过这个图片来理解程序和进程的区别:
一、 进程是动态的,程序是静态的:程序是有序代码的集合,进程是程序的执行。进程有核心态/用户态。
程序是静态的很好理解,那自己写的代码当然是静态的。进程是动态的也好理解,代码开始执行,那肯定会执行完毕,执行完毕了,进程也就消亡了,所以进程是动态的。
二、 进程是暂时的,程序是永久的;进程是一个状态变化的过程,程序可以长久保存
基于一的解释,二这个也是相同的理解。
三、进程和程序的组成不同,进程的组成包括程序、数据和进程控制块(即进程状态信息)
由于进程是动态的,并且需要间断的执行,那么就需要保存进程的状态信息。
3. 进程管理:
操作系统本身是一个大话题,是一个非常发杂的软件.它本身的功能有很多,其中有一个和咱们密切相关的功能模块, 进程管理!
为什么我们需要进程管理呢?
大家看图:
可以看到,由于我们的进程很多,才需要管理,如果进程只有几个的话当然涉及不到进程管理.
如何进行进程管理呢?
- 描述一个进程,使用结构体/类,把一个进程有那些信息表示出来.
- 组织这个进程,使用一定的数据结构,把这些结构体对象放到一起,(通常是使用双链表这个数据结构)
3.1 进程的结构体有哪些属性
关于进程的结构体我们还有一个别称,就是 PCB(进程控制块)
(1) Pid(操作系统里指进程识别号)
PID(Process Identification)操作系统里指进程识别号,也就是进程标识符。操作系统里每打开一个程序都会创建一个进程ID,即PID。
只要运行一程序,系统会自动分配一个标识
是暂时唯一:进程中止后,这个号码就会被回收,并可能被分配给另一个新进程。
只要没有成功运行其他程序,这个PID会继续分配给当前要运行的程序。
如果成功运行一个程序,然后再运行别的程序时,系统会自动分配另一个PID。
(2) 内存指针
当前这个进程使用的内存是哪一部分.(进程运行的时候,使用了哪些内存上的资源)
(3) 文件描述符表
如下图:
上图红色框中的都是文件,
文件: 比如硬盘上存储的数据,往往就是以文件为单位进行整理的.
进程每打开一个文件就会产生一个 ‘文件描述符’(标识这个文件被打开) .由于一个进程可能会打开很多文件,自然对应了一组文件描述符,把这些文件描述符放到了类似于顺序表这样的一个数据结构中,就构成了文件描述符表!
文件描述符表描述了:你这个进程使用了那些文件,或者是使用了哪些硬盘资源.
此时:我们结合内存指针和文件描述符表可以知道,进程的运行需要从操作系统这里申请资源,此时也可以理解为进程是操作系统进行资源分配的基本单位!
下面的属性都是描述个cpu资源相关的属性.这些属性都是辅助进行.
4. 进程调度:
咱们的程序能够运行,全依仗cpu,每个程序相当于一组’二进制指令’的集合,这些指令靠cpu运行.
cpu有一个概念(核心数)
以小鱼这个电脑举例:
我的电脑只有8个核心,其中每个核心相当于一个员工,并且每个员工可以同时进行两个人的工作,也就可以理解为我的这八个核心可以同时运行16个进程,当时大家刚才已经看到了,我们的任务管理器里面有不小于100个进程正在运行,那我这个小小的8个核心就是累屁了也不能同时运行100多个进程啊.
那么下面就涉及到了计算机为什么可以同时运行这么多的进程了.
(1) 并行
并行性是指系统具有同时进行运算或操作的特性,在同一时刻能完成两种或两种以上担任工作,并行性需要相关硬件的支持,例如流水线或多处理硬件环境。
举个例子:
假设我是一个长的好看,有才华的女生,我有一个择偶标准,就是需要(1)有钱(2)长得帅(3)会舔我(会哄我开心,帮我排解压力).
但是呢,放眼望去,并没有找到符合这三种条件的男生(我们称为ABC),有钱的不帅( A ),帅的没钱( B ),会舔的不帅也没钱( C ).但是我呢,是一个追求完美的女生,我就是想要找到符合我择偶标准的男生,此时呢~我就打算,同时和三个男生交往,因为是同时和他们一起交往,此时就是并行.
(2) 并发
并发指两个或多个事件在同一时间间隔内发生。操作系统的并发性是指计算机系统中’同时’存在多个运行的程序,因此具有处理和调度多个程序同时执行的能力。在操作系统中引进程序的目的是使程序能够并发执行。在多道程序环境下,一段时间内,宏观上有多道程序在"同时"执行,而在每一个时刻,单处理机环境下 实际仅能有一道程序执行,因此 微观上这些程序是分时交替执行的。操作系统的并发性是通过分时得以实现的。
依旧是通过上面的例子举例:
因为我是在同时和三个男生交往,那么对于我的名誉来说,我一定是不想让他们碰见的.
所以呢,我就规划了一个时间表:
周一,周三,周五周二,周四周六周日有钱的( A )帅的( B )会舔的( C )给自己放个假
为什么有钱的可以一礼拜陪他三天,当然是因为金钱的力量啦!!!
于是呢,我就按照上述的表来进行每周的时间分配,当我们把时间的长度调整为1周时,会发现我在不同的时间陪着他们不同的人,但是当我把时间的长度调为1年,2年时,我们就可以认为,我是在"同时"和ABC在一起.此时涉及到的性质就是我们所讲到的"并发"
5. 进程调度需要的属性
(1) 进程状态
简单的认为进程的状态主要是这两个:
就绪态: 该进程已经准备好,可以随时上cpu执行
阻塞态:该进程暂时无法上cpu执行
我们依旧通过上述的例子演示:
有一天呢,A说我需要出差一个月,那么在他出差的这一个月期间,我都无法跟他在一起,此时A就是"阻塞态",但是虽然A出差了,但是我还有B,C,此时我可以随时去找这两个男友,陪他们在一起,此时这两位男友就是"就绪态".
(2) 进程优先级
进程之间的调度不一定是公平的,有的需要优先调度~~
例如:
为什么我会给A分配更多的时间来陪我,是因为A有钱,有钱就体现了他的重要性,当然要A优先了,那么为什么只让C一礼拜陪我一次,当然是因为,他除了能把我舔的开心,没有其他用途了,一没钱二不帅,优先级自然就是最后的了.
(3) 进程上下文
上下文就是描述当前的进程执行到了哪里,这样的一个"存档记录".
进程在离开ccpu的时候要把当前运行的中间结果进行"存档",等下次进程回来cpu上,再回复之前的"存档",从上次的结果继续往后执行.
所谓上下文具体指的就是进程运行过程中,cpu内部的一系列寄存器的值.
寄存器:
寄存器有很多种,其中最典型的作用就是保存当前进程执行的中间结果,包括执行到了哪一条指令.
存档: 进程离开cpu就需要将寄存器的值保存在PCB上下文字段中~~
读档: 进程下次回来,cpu再把PCB中的值恢复到寄存器中.
举例:
有一天A跟我说,你准备准备咱们下个月去三亚旅游,那么此时我需要准备的就是性感泳衣啦!之后,在我陪着B的时候,他对我说下个月我妈妈过生日,你记得准备下生日礼物啊!那么我就想,阿姨的生日礼物就买个手机吧.
后来A问我东西准备好了吗,但是由于我一时间记不清,便说了手机已经买好了,B问我准备好了吗?我又回答说性感泳衣已经买好了.此时不就是穿帮了嘛,所以我们需要进程的上下文来记录我们的事情进行到了哪里!
(4) 进程的记账信息
统计了每个进程在cpu上执行了多久~~
可以作为调度的参考依据.
例如: 我一礼拜只陪C一天,导致C舔我舔的不是那么用心了,此时我一看陪伴C的天数,发现是陪伴他的次数太少了,于是我需要一礼拜多抽出几天陪他,这样他就会又很用心的舔我了~当然,这样的情况也只是暂时的,等他又用心舔我之后,我依旧是一礼拜只陪他一天…
6.操作系统的常用数据结构
操作系统往往使用双向链表这样的结构来组织PCB~~
1.创建一个进程就是创建一个链表的结点
2.销毁一个进程就是把链表中的结点给删除了
3.遍历进程就是遍历双向链表
版权归原作者 小鱼不会骑车 所有, 如有侵权,请联系我们删除。