首先在说进程是如何运行之前,得先明白进程是个什么东西,它和可执行文件(程序),虚拟地址空间,内存,磁盘都是什么关系。
官话:进程就是在执行的可执行文件(程序)。
白话:菜谱是程序,人是CPU,炒菜的过程就是进程。
说到这,可能就有点疑问了,那这进程和这虚拟地址空间,内存,磁盘又有什么联系?别急听我慢慢道来,首先你炒菜光菜谱够吗?显然没菜在炒个锤子菜,你肯定得有菜,调料,锅对吧。那么同样的,程序只是指令的集合,没数据它又怎么跑。
紧接着就可以回答刚才的问题了,这些指令,数据可定得放个地吧?这不就是磁盘了么。有人肯定会有疑问为啥不放内存上,只要你家有钱当然也可以。开个玩笑明显是没法存放在内存上的,首先内存上的数据是非永久性的,不可能你废老半天劲写了几十行代码完事跑一遍没了,那还怎么玩对吧。再者你家内存多大,撑死8个G,讲道理要是放内存上LOL都玩不了了吧。
好了言归正传,说了这么多这虚拟地址空间是啥呢?这就得好好说道说道了。
首先呢,在很久以前程序在运行的时候,是直接从磁盘里读出来放内存上的。开始程序少还没啥感觉,不过这用着用着吧就有问题了。
- 程序与程序之间不安全。因为都是直接放内存上的,一个程序不小心跑另一个程序里面改个东西又跑回来,是没啥感觉的。完事一看bug了还找不出是哪的问题,压根就不管自己事铁定找不到呀,这不崴泥了么。
- 程序内存使用率太低,进进出出太耗时间。以前的时候内存小,放两程序就不够了,再来个的时候就得先把其他程序的数据先放回磁盘里,因为程序需要的内存还是连续的这家伙换出去一个也许还不够,你还得把另一个也换出去才行。大量的I/O,难顶。
- 程序运行地址不确定。这个可要命了,应为程序每次加载地址都是不确定的,因为程序的很多指令跳转和目标地