初识进程~

哈喽,好久不见,今天要给大家简单的分享一下进程相关知识,如进程如何管理,什么是PCB,进程调度,虚拟空间以及进程间通信等等,内容不难看懂,主要是带大家简单了解一下进程,更深层次的内容这几天也会慢慢分享出来的,那我们就直接开始吧.

 

目录

1.什么是进程

2.程序控制块(PCB  Process Control Black )

3.文件描述符表

4.进程调度

5.进程的优先级

6.进程的状态

7.进程的记账信息

8.进程的上下文

9.进程的虚拟地址空间

10.进程间的通信


1.什么是进程

进程(Process)又称任务(Task).是操作系统对正在运行的程序的一种抽象,简单来说,就是一次程序运行的状态.同时,进程又是操作系统进行资源分配的基本单位.

(举个例子,大家打开任务管理器,可以发现:)

红色框框中的就是我们程序运行的样子,这就是进程.我们再随便打开一个软件的文件夹,找到以下这个可执行文件(.exe),在这里安安静静躺着不动的就是程序了. 

 所以,我们也可以发现程序是静态的,进程是动态的.


2.程序控制块(PCB  Process Control Black )

操作系统的作用之一就是对进程进行管理,而计算机中的进程很多,在管理不同的进程时操作系统如何区别不同进程,如何对其进行资源分配又如何进行调度等呢?

在java中,我们可以将一个进程的相关信息及所需资源等抽象成一个类来描述它,方便操作系统来管理,这样的类就叫做程序控制块(PCB),它是操作系统内设的,并不需要我们手动去创建.以下是PCB在java中的一个粗略表现形式:

class PCB{

        //pid 唯一的身份标识,用来区分不同的进程

        //进程关联的程序信息,依靠内存指针,操作系统要把一些必要的数据加载到内存中,有些是

          要运行的指令(代码),有些是运行时依赖的数据(全局变量)

        //分配给该进程使用的各个所需资源

        //进程的调度信息

}

这样每一个PCB对象,都代表着一个正在运行着的程序(进程).

操作系统再利用某种数据结构比如线性表,搜索树等将这些PCB组织起来,完成一些对一些进程的增删改查等操作.


3.文件描述符表

文件描述符表表示了当前进程都打开了哪些文件,可以将其简单的理解为一个顺序表,每一个元素就表示一个打开的文件,对应的数组下标就是文件描述符.


4.进程调度

在这里只简单的讲解一下进程调度是什么,至于具体的进程调度方式我之后会更新的~

要知道,当前的计算机,CPU是有限的,但是进程数量比较多.比如有些计算机核心数是6核,但是进程数很多,几十个甚至上百个,而每个进程都需要CPU,这就出现了一种狼多肉少的现象, 但是又不可能说6核我就只管6个进程,其他进程不要了,很显然这是荒唐的,所以操作系统就要做到尽可能的公平,让灭个进程都能得到CPU,这个时候就需要进行调度了.

怎么调度呢?简单来说就是轮流来使用CPU,也叫时间片轮转.这里的轮转速度是非常快的,CPU地主频是1.9GHz,1s有19亿个时钟周期,因此人是感知不到这样的轮转的,在宏观的角度来讲,这些进程就好像在同时执行一样,但是微观上来讲,各个进程是在轮流执行的,称为并发式的执行.CPU上有多个核心,每个核心上都可以跑一个 进程,某一时刻两个进程就是在CPU核心上同时执行的,称为并行式的执行.在实际开发中,并不会对并行和并发这两概念做明确的区分,因为从人的宏观角度来看,是看不出来区别的,往往使用"并发"来概括表示"并发"和"并行".因此我们也经常听到"并发编程"这四个字.


5.进程的优先级

上面简单粗暴的讲了进程调度就是操作系统"安排"进程来轮流来吃CPU,但是谁先使用CPU谁后使用,又使用多久呢?会不会因为安排不当而使进程与进程"打架"呢?于是就有了进程的优先级,来规定什么情况下给哪个进程吃CPU,吃多久,用这种方式使进程调度有条不紊.


6.进程的状态

进程有很多种状态,从创建到撤销,依次是创建状态,就绪状态,执行状态,阻塞状态,终止状态.其中进程的3种基本状态就是就绪,运行和阻塞(等待)状态.

就绪状态:进程是准备好了的,只要给了CPU,就可以运行了.

阻塞状态:进程在等待某个任务完成(比如读写磁盘),完成之后才能上CPU执行,完成之前,就算有CPU也不能执行.

运行状态:顾名思义,就是进程占有CPU正在运行.

而这三种状态很显然是可以转换的.

7.进程的记账信息

操作系统在进行进程调度的时候,需要考虑到一些历史记录,这些历史记录上往往记录着每个进程在CPU上执行的时间(也可能是执行的指令数),根据这些历史记录就可以适当的调整进程调度,保证一些进程是按照自己设计的来轮流吃CPU的.这些历史记录就叫做进程的记账信息.


8.进程的上下文

首先举一个很简单的例子,比如今天我有两场会议要参加,在A会议结束时,A老板让我下次开会时必须要把文件A带来;B会议结束时,B老板让我下次开会必须要把文件B带来.到了下次A开会,A老板对我说:文件A带来了吗?下次B开会时,问我:文件B带来了吗?为了避免不被炒鱿鱼,我必须得记录下次开什么会时我得带什么文件,可不能在下次开A会议的时候把B文件带过去.还有就是这次开会还没处理完的一些事情,要在下次开会在处理,就需要明确的记录好这次开会的进度(中间结果),这样下次开会时就可以从上次的结果中继续往下进行了.

进程在调度时也是一样,进程很可能在执行某个操作,还没执行完,就被调走了,过一段时间后,进程再次上了CPU,就需要从上次被调走的地方继续往下开始执行.上次被调走之后的那个状态,就是"上下文".再比如,我们玩游戏时的存档和读档,存档保存的信息,这个就是"上下文".

对于进程来说,上下文,具体指的是CPU里面的一堆寄存器里面的值.在进程被切出CPU时,会把寄存器里面的一些值(上下文)保存到PCB里(内存).当下次进程回到CPU上,PCB里面的上下文就会被读取出来,恢复到CPU寄存器中,从上次被切换的地方再次往下执行.

进程的优先级,状态,记账信息以及上下文都是为了操作系统能有条不紊的进行进程调度的.


9.进程的虚拟地址空间

进程,需要使用一些系统的资源,其中内存就是一个很关键的资源.

每一个进程都需要被分配内存,并且我们都希望每个进程都能用自己的内存,不要被相互干扰,比如这样:

 

但是,我们都知道,c里面的指针是指向一块地址空间的,有一个指针解引用操作就是希望拿到我们自己设置的合法的内存地址,这个是由我们程序员来操作的.试想,只要是人来保证的,就很难得百分百保证不会出错,比如万一这个指针经过人的一些马虎操作,指歪了,指到别的进程的内存地址上了,当你解引用时,很有可能把别的进程给搞挂了,搞不好导致整个程序崩溃,更严重还会带来一定的经济损失.

那怎样才能防止这样尴尬的事情发生呢?为了保证各个进程之间不互相干扰,操作系统就有了"虚拟地址空间"这样的概念.这样每个进程都能防问到自己的地址空间,相互之间不会有影响了,哪怕你指针指错了,操作系统也能及时发现,能将问题限制到进程内部,不会影响到其他进程,更别说把其他进程搞挂了.

每个进程都对应着自己的虚拟地址空间,这个虚拟地址空间经过MMU(专门的硬件设备,集成在CPU里面的)映射,指向真实的内存地址上

例如:

为什么说这种方法就可以避免进程之间的内存互不干扰呢?很简单,举个例子,比如上图中的进程3在指针解引用时,让*p=xxx,使p成为了野指针,指到错误的地址上了.当进程操作p指向的内存时需要经过MMU映射,此时MMU就知道当前访问的是一个 有问题的地址,于是就会通知操作系统说:有进程访问内存错了.这时操作系统就会向该进程发出一个"信号",说:你的内存访问错误了.这个"信号"的默认处理行为就是让进程终止运行.这种形式就不会干扰到其他进程的地址.

因为虚拟地址空间,进程就有了一个重要的特性:隔离性.就是一个进程的运行一般不会干扰到另一个进程.尤其是一个进程崩溃不会影响到另一个进程.

但是又有人问了,每一个进程都有虚拟地址空间,那么多进程加起来,会不会最后比总的物理地址空间还要大呢?

这个顾虑很正常,但是实际上,我们要知道:


1).同一时刻执行的进程没几个,微观上来说,它们大多是并发执行的;

2).即使是同一时刻,有好几个进程在跑,这些进程也不是把所有的虚拟地址空间都给用上了,虽然每个虚拟地址空间很大,但是实际上只使用了内存的一小部分.物理内存只需要把真实使用的这部分内存数据表示出来即可.

3).极端情况下,如果确实有很多进程同时吃了很多真实内存,确实会导致物理内存不够,往往出现这种情况,程序员就需要想办法优化一下内存占用,或者扩容换一个内存更大的机器.

10.进程间的通信

上面讲到,进程之间具有隔离性,确实是保证系统更加稳定了,但是隔离性也有一定的"副作用",比如多个进程之间想要配合,怎么办呢?为了解决这个问题,操作系统又引进了"进程间通信"这一做法.操作系统提供的进程间方式有很多种,但本质都是一样的.简单来说就是在保证隔离性的情况下,设置一个多个进程之间都能访问的公共资源,借助公共资源来进行通信.


好了,今天的共享知识就到这里了,本人知识水平有限,写的不妥的地方还请各位多多指正,评论私信都行,咱们下次再见~~看完的铁子们就给个赞吧~

 

 

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哆啦A梦的110

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值