操作系统的一些小常识

进程和线程

一个操作系统可能会有几十到几百个进程在运行,一个进程可能有小到几十个,大到几百个线程在运行。

进程

操作系统里面的内存指的是逻辑内存,例如操作系统有32位和64位,这个指的是操作系统里面的寻址空间,例如32次方,差不多是4G,在进程里面表示这个4G内存的空间你是可以用的,不是说这个4G属于一个进程。每个进程和每个进程之间都是独立的,举一个例子,不然我的指针改一改,我就可以读取到你所有的信息,这是一个非常可怕的事情。网络资源和内存不一样,它是所有的进程所共有的,那么这个进程和别的其它进程都可以打开同一个文件或者都去抢同一个网络的端口。

线程

线程里面包含一个栈,通常习惯于叫做调用堆栈,这个里面的堆是没有含义的,调用堆栈就是调用栈的意思。这个栈里面有什么呢?我们从这个主线程的入口函数这里不断的进行函数调用,每次调用都会把这个参数和返回地址压到栈里面去,然后一层层的放进去,包括一些函数的局部变量也会放到这个栈里面。线程里面还有一个重要的东西——PC,PC指向了当前的一个指令,这个指令它是放在内存里面。这里注意,线程不能够独立的执行,必须依存在应用当中,由应用提供多个线程执行控制。

存储

硬盘:数据能够永久存放,一般都非常大。

内存:关机数据就会没有,不过可以进行快速的随机访问。

缓存:在CPU中,除了运算模块还有缓存,缓存又分好几个级别,有些缓存是和CPU核共有的,有些缓存是它自己独有的。

寄存器:这个是距离CPU运算单元最近的部分,运行速度是非常快的。

寻址空间

寻址空间就是我们每一个进程里面的指针可以取到地址的范围。寻址空间和我们机器上装了多少物理内存是没有关系的,和此时到底有多少个进程也没有关系。每个进程都有自己独立的寻址空间,例如我32位的操作系统,我们的寻址空间就是2的32次方也就是4G。如果我们在一个机器上运行一个32位的操作系统的话,那么即使我们用一个8G的内存,我们用到的也只能是4G.因为它的指针大小,因为它指针的大小只有32位,只能返回到一个4G内存的大小。

32 ——> 2 ^ 32 bytes
64 ——> 10 ^ 19 bytes

指针

指针指向的是逻辑内存,不是物理内存,它的大小跟操作系统的位数有关系,跟物理内存的大小没关系。操作系统要做的是你给定一个逻辑内存的地址,怎样找到实际的数据在哪里呢?通常我们把实际内存的地址和逻辑内存的地址建立一个关系就能够找到,通常是把它对应到物理内存里面去。但是逻辑内存那么大,我对应到物理内存是不一定对应的出来的,有可能它在物理内存,有可能在虚拟内存里面。操作系统都会在硬盘上开辟一个空间,作为一个虚拟内存,我们都知道硬盘是比较大的,只要放的下,我们就可以不断的把它放到我们硬盘上面去。接下来我们要做的就是必须要把数据读取出来,我们不能说这个寻址寻到一半,它不在物理内存里面它就不找了,那么我们就要把虚拟内存里面这个数据放到物理内存里面去,但是不够直接把所有的都放进去,这样系统的开销实在太大了,所以在虚拟内存中有分页的概念,这里面并不是把指针指向的东西放进去,而是把这个虚拟内存的分页放进去。这个分页有可能有几k,也有可能有多少兆,这是根据操作系统的配置来的。它会把一大片内存,从虚拟内存拿出来,放进我们的物理内存,其中就包括指针所指向的这个数据。那么这里就会有一个问题,物理内存放的下吗?放的下就放进去就完事了,如果放不下它就会通过算法去找,那一块是不常用的,找到了就会把它放进虚拟内存,这个过程就叫做分页或者叫做交换,这样就确保了指针指向的数据进入了物理内存里面。在物理内存里面已经指针指向的数据,我们要做的就是把它取出来放到寄存器里面去就好了。但是如果物理内存使用过多的话,它就会发送频繁的分页,我们知道硬盘的速度是很慢的,那么这样的话系统就会变的很慢。

扩展知识

64位的JVM(Java Virtual Machine) ——>可使用更大的内存,需要重新编译。

在Java里面并没有指针这个概念的,我们不会具体去操作地址。但是在这个虚拟机内本身有自己寻址的逻辑,那么我们使用64位的操作系统就可以寻址到64位的寻址空间,它可以使用更高的内存。那么我们怎样把一个32位的Java程序运行到64位的JVM上面呢?在绝大多数的情况我们不需要做太多的考虑,也不需要修改任何的代码,只要重新编译一下即可。

猜你喜欢

转载自blog.csdn.net/qq_40513729/article/details/87969195