操作系统是为了管理硬件设备(cpu进程,存储,i/o)和软件设备(文件)的。
内存划分有几种方法,连续的分区,不连续的分段分页。有简单的分区,分段,分页,也有虚拟的分段,分页。
内存有系统区和用户区的,毕竟操作系统也是个软件嘛
管理存储的话,有内存和外存。尽可能的容纳多的进程,尽快的找到资源的位置,如何找资源的位置,相对地址和绝对地址之分
管理内存的话,第一种方法直接直接将内存划分多个大小相同的区域。将整个进程装进去就可以了,然后运行,将会产生大量的内零头。但是进程过大就会
产生问题,原来采用的是覆盖技术,在此我们不做讨论。
提高一点内存利用率可以采用大小不相同的划分区域,显然这会好一点。

固定分区会产生内零头,动态分配内存的话,会产生外零头。

因为一开始确实可以很紧凑的分配内存,但是不同的进程执行的时间不一样,有些进程执行完了,就会导致内存无法经凑的分配资源。

因此会导致外零头,那么我们可以解决外零头吗?那就要移动内存的位置,就要改变地址了。(看看磁盘碎片整理吧,就知道速度很慢)。

 

动态分配算法也有很多算法,其中有最佳适应算法,但是会产生大量的外零头,导致没法分配,利用经凑技术的话,就会移动大量的进程

 

   我们保存了进程在内存中,那我们该如何知道他在什么位置呢,我们只要知道,每个进程的起始位置,就可以了,因为代码中有偏移量啊。

   所以只要知道起始位置,就能知道,这个进程中的每一条指令的位置。cpu在执行的时候,把下一条要执行的指令的地址保存在基址寄存器中。

   对于单cpu来说,只有一个基址寄存器,辣么多进程,我们该如何把其他的进程,要下一条指令的地址放在哪里呢。放在pcb进程控制块中。

   不晓得我们的java线程也是不是类似的操作。java中程序计数器和这个差不多,也是记录下一条指令的执行地址。

   不过,不晓得,java多线程是每个线程都有个程序计数器内存,还是只有一个程序计数器,然后,其他的也保存在线程控制块中嘞。

   由于进程不能访问别的进程的数据,因此要有一个界限寄存器。保存进程最后的地址。

   我们的java多线程多简单啊,固定分配多线程工作内存的大小。