windows虚拟内存(win32)

时间:2022-03-10 02:02:39

windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,windows内存管理器经常在内存中来回移动对象,依此来
满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找对象呢?

为了解决这个问题,Windows操作系统为各应用程序腾出一些内存存储地址,用来专门登记个应用在内存中的地址变化,(
所以句柄是指向地址的地址。)句柄所记录的就是内存管理器中对象不断改编后的地址。 这样我们只需记住这个句柄地址
就可以简介地知道对象具体在内存中的哪个位置。这个地址是在对象装在(Load)时系统分配给的,当系统卸载时有释放给
系统。

句柄地址(稳定) ---> 记载着对象在内存中的地址 ---> 对象在内存中的地址(不稳定)---> 实际对象

本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目
分配确定的句柄,并将据并返回给应用程序,然后通过句柄来进行操作。

但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确
不一样,,这和每次电影院售给我们的门票是不同的座位是一样的道理。

进程常常被定义为程序的执行。可以把一个进程看成是一个独立的程序,在内存中有其完备的数据空间和代码空间。一个进程
所拥有的数据和变量只属于它自己。

线程则是某一进程中一路单独运行的程序。也就是说,线程存在于进程之中。一个进程由一个或多个线程构成,各线程共享
相同的代码和全局数据,但各有其自己的堆栈。由于堆栈式每个线程一个,所以局部变量对每一县城来说是私有的。由于所
有线程共享同样的系统区域,操作系统分配给一个进程的资源对该进程的所有线程都是可用的,正如全局数据可供所有线程
使用一样。

简而言之,一个程序至少有一个进程,一个进程至少有一个线程。线程的划分度小于进程,使得多线程程序的并发性高。另
外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。线程在执行过程中
与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。

但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。从逻辑角度看来,多线程的意义在
于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看作多个独立的应用,来实现进程的调度
和管理以及资源分配,这就是进程和线程的重要区别。

一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

进程和线程的主要差别在于他们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下
不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。

线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要
比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且有要共享某些变量的
并发操作,只能用线程,不能用进程。


在mac、windows nt等采用微内核结构的操作系统中,进程的功能发生了变化:他只是资源分配的单位,而不再是调度运行
的单位。在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发功能的单位是线程。

线程是进程中执行运算的最小单位,亦即执行处理调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那
么线程表示完成该任务的许多可能的子任务之一。

windows虚拟内存(win32)