进程之间是如何独立运行的

        我们都知道计算机的主要资源是 cpu与存储器还有I/O设备,他们都是有限的,比如cpu一秒钟只能处理多少条指令,内存只能存储多少GB数据,无论我们如何使用,资源总是这么多。而我们肯定希望我们的计算机资源能充分的发挥他自己的作用,所以我们要去挖掘我们的计算机的潜力。

         目前我们常用的一些pc机,智能手机 一般采用的的多核处理器来实现提高计算机的运行效率,多核处理器这种模式的诞生 是由于人们在制造cpu的工艺方面已经达到了物理极限,目前我们的cpu最高频率只能达到4GHZ。所以cpu的资源是非常宝贵的,如果一个cpu只能运行一个程序,那么当程序在读写磁盘时,cpu就会空闲下来,这对于我们宝贵的cpu资源没有充分利用,对于我们来说是一种奢侈的浪费。所以就出现了一种多道程序的方法来解决这个问题 ,它就是通过一个监控程序,当某个程序无需使用的cpu的时候,监控程序就把正在等待cpu资源的其他程序启动。这样就可以让我们cpu不断的工作,充分的挖掘了cpu的资源供我们使用。那么问题来了 假如我们某一个程序运行完需要10分钟,那岂不是我们其他程序 需要等待10分钟,假如这段时间我鼠标点击了一下,我那就得十分钟之后才能看到我鼠标点击后的效果?

         所以人们通过改进,称之为一种叫协作模式的方法来解决这个问题,协作模式是 每一个程序运行一段时间后,主动的把cpu让给塔器程序。使得每一个程序在一段时间内都能用到cpu,这种模式叫做分时系统,后来演变成我们现在的操作系统,但是这种模式也有很大的缺陷啊,假如我的某一个程序出现了死循环,那其他程序根本没有获得cpu的机会啊。那就只能关机重启,以后再也不去碰这个程序?

        为了解决这一问题,我们通过操作系统,来管理我们的计算机的硬件资源,所有的应用程序都以进程的方式运行,它的权限比操作系统低,每一个进程获得的cpu资源均是由操作系统统一分配的,操作系统是可以强制剥夺cpu资源并且分配给他认为最需要的进程,操作系统在短时间内让cpu在多个进程间进行切换,就可以造成多个进程同时运行的假象。操作系统通过对进程间的地址进行隔离,使得每个进程都有自己独立的地址空间,那么如果我们的内存空间不够,而cpu的资源有剩余的,我们是不是还得想办法让,cpu的资源进一步得到利用呢?

         进程的总体目标是希望每一个进程从逻辑上来看都可以独占计算机资源,上面我们也解决了进程间的cpu资源如何共享的问题,那么我们何不也让进程之间 内存也共享?但是好像又有点矛盾,前面明明说了 每一个进程他们享有独立的内存空间,从而来实现进程间的独立,那么我们该如何不影响进程间的独立运行 并且又能实现共享内存呢?将我们有限的内存空间分配给更多的进程呢?

         解决这个问题的方法就是增加中间层,就是使用一种间接的的地址访问方式,我们将程序给出的地址看作是一种虚拟地址,然后通过某种映射的方法,将虚拟地址转换为实际的物理地址,这样就可以保证任意一个程序所有能够访问的物理内存区域跟另外的程序不出现交集,来达到隔离的效果。那么虚拟地址与物理地址之间是怎么映射的呢,又是以多大的内存空间为一个粒度呢?

          我们可能会想我们通过计算得出我们每一个进程需要的最大内存,把每一个进程需要的最大内存作为一个单位进行映射,这样来提高我们对内存的利用率,而程序运行的时候,在某一个时间段内,它只是在频繁的使用一小部分内存,所以采用这样那个的方式和我们在物理内存上直接访问没有什么区别,并没有提高我们对内存的利用率,所以人们很自然的想到了更小的粒度的内存分割和映射方法,这种方法叫分页。

          我们目前用的处理器一般采用的粒度是4kb大小为一页,那么当我们把进程的虚拟地址空间按页分割,把常用的数据和代码页放在内存中,把不常用的放在磁盘中,当我们需要的时候再从磁盘中提取出来即可,我们以下图为例:我们假设有两个进程分别是process1和process2 ,他们进程的虚拟页面被映射到了物理页面,比如process1进程的VP2与VP3和process2进程的VP0和VP1,另外的还有些页面可能尚未到使用到,它们暂时处于未使用状态比如process2 VP3,而process1 的VP0与VP1不在内存中但是在需要这两个页的时候,操作系统会将其 读出来 放在内存中。虚拟内存是不是和我们使用的内存池很相似?

进程之间是如何独立运行的_第1张图片

     虚拟存储的实现需要依靠硬件的支持,对于不同的cpu来说是不同的。但是几乎所有的硬件都是采用MMU这个部件来映射的。总结一下进程与进程之间独立运行 还是因为他们使用内存时没有出现交集。

你可能感兴趣的:(c++基础,内存,线程池,多进程,c语言,linux)