能力值:
( LV2,RANK:10 )
|
-
-
2 楼
以Windows操作系统为例
“API函数的那些代码是一直在内存中存在的,还是程序执行后被加载到内存?”
答:API函数的那些代码不是一直在内存中存在的。是程序执行后被加载到内存的。
但是如果Windows操作系统启动后,你自己程序运行前,已经有先前的程序用到你所要用到的API,那么此API可能已在内存中(为什么是可能呢?因为Windows操作系统是虚拟内存机制,一些不常用的代码可能会通过分页内存的形式被交换到硬盘的虚拟内存中,以节省内存空间,这些代码只在内存中留下一些类似指针地址之类的信息,已方便再需要用到时,操作系统再通过页交换机制换进内存);若之前无程序用到此API,那么其不在内存中,等你要用时调入内存。若之前有程序用到你所要用到API所在的dll,那么dll的相关信息可能已在内存中(也可能做为分页内存交换出),但整个dll的API代码内容一般不在。
dll加载到入进程虚拟内存空间有两种形式:随程序exe代码加载时加载其地址相关信息(仅是地址相关信息,不是代码内容,代码内容等用到时再调入内存)入进程虚拟内存空间;程序运行中使用Win32 API函数LoadLibrary或LoadLibraryEx动态加载其地址相关信息入进程虚拟内存空间。
“如果是程序加载后被加载到内存的话,是怎么加载的?”
答:通过操作系统的“加载器”实现,此“加载器”并非运行程序,而是操作系统自身的功能模块。如果先前有程序引用到你所要使用的dll,那么在你程序运行后,只在操作系统内增加此dll的使用计数,并不重复加载此dll,你程序和先前程序共享dll代码。
“是整个dll所有API一起加载,还是用到哪个就加载哪个?”
答:操作系统可用内存有限,若所用到的所有dll的所有API都载入,则开销过大。故一般操作系统都是用到哪个载入哪个。
“并且加到哪块内存地址是不是固定的?”
答:硬件物理地址不是固定的,操作系统是虚拟内存机制,会随时整理内存碎片,移动内存中代码位置。但在各运行的进程内部,API代码加载到进程内的虚拟地址一般是固定的(若其dll分配及加载到其要求的首选地址)。
“如果不固定,是怎么个分配原则?”
答:硬件物理地址分配原则:操作系统虚拟内存管理机制。
各进程内虚拟内存地址分配原则:dll二进制文件内附带有dll要求的首选加载地址及dll大小等信息,操作系统加载器首先计算dll能否加载到其要求的进程虚拟内存地址,若能则加载;若不能(一般是被其他dll占用),则由操作系统分配另外合适的地址加载,此时的地址不固定,由操作系统当时的运行情况及其分配算法决定。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
回答的很犀利...
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
3Q,基本明白,能和我说说内存过页不?
|
|
|