操作系统的内存分配机制(分层的逐层外包分配模式)

来源:互联网 发布:拳皇98键盘优化版 编辑:程序博客网 时间:2024/05/17 06:33

操作系统中有专门负责分配内存的进程,它会为那些在操作系统级别上使用内存的软件系统分配一块内存。

所谓的编译时内存分配(静态内存分配),即是为程序本身能在下一个阶段(运行阶段)的运行而在内存上的程序区分配内存空间,还有程序里的非指针变量(如原子变量、数组、结构体、类等)分配内存空间:stack

例如,oracle软件系统启动的时候,oracle软件系统本身要运转的话自然需要一些内存上的程序区的内存空间用于oracle软件系统本身的运行。

所谓的运行时内存分配(动态内存分配),即是为程序里的指针变量分配内存空间:heap

例如,而oracle软件系统运行时,(oracle软件系统中具体一个进程)要处理的那些数据,oracle软件系统要为存放这些数据向操作系统申请分配一块内存空间(这种内存空间在内存的什么区上,忘了,暂且叫用户可分配的内存区吧,非操作系统的进程都叫用户(?))。然后,通过类似指针变量这样的工具指向这块区域。


再例如,oracle软件系统中的数据库实例启动时,oracle软件系统也会要操作系统分配一块内存空间给oracle软件系统,至于这块内存空间怎么用,操作系统就管不了,这是由oracle软件系统来决定了,即oracle软件系统中也有专门负责分配内存的进程,当oracle软件系统的其他进程要分配内存空间时,就不用找操作系统中有专门负责分配内存的进程,而是找oracle软件系统中专门负责分配内存的进程。

oracle软件系统中的一个服务器进程启动时,oracle软件系统也会要操作系统分配一块内存空间,即PGA给该服务器进程。之后属于服务器进程的会话们(执行SQL语句时)启动时,就oracle软件系统中专门负责分配内存的进程申请分配内存。

又如,



摘自《

[深入解析Oracle.DBA入门进阶与诊断案例].盖国强.扫描版.pdf



由此,看出一个模式,类似于:

一个全国的总代理(操作系统),手上有全国所有货物(整个内存空间)。

全国的总代理(操作系统)向他的下一级的经销商们(即应用程序系统,如oracle软件系统)按照一定规则分配给他们每人不一样多数量的货物(部分内存空间)。

之后,每个经销商又向他管辖范围内的零售商(即应用程序系统中的具体一个进程)分配货物。

两个层级(总代理向经销商分配,经销商经销经销商向零售商分配)各自内部如何分配货物,不受另一层级的影响。

注释:操作系统是大系统,应用程序系统是该大系统中的一个小系统,一个进程又是小系统中的一个组成。

附加:

划线部分说明,程序源码编译时的一些细节。

摘自《

[深入解析Oracle.DBA入门进阶与诊断案例].盖国强.扫描版.pdf

疑问:

变量在源码中定义,在编译时分配

“在编译时分配”,这是什么意思?一个源码在编译成可执行文件时就在内存上为变量分配了内存空间了吗?

不是吧,一个进程不在运行状态,不会分配内存空间的吧?“在编译时分配”是指在编译源码文件时操作系统从源码文件上可知当该源码对应的一个进程(一个源码编译成可执行文件,当我们鼠标双击一个(在磁盘上的)可执行文件时,就是启动了该可执行文件,具体说,就是将该可执行文件复制到内存上运行,此时这个在内存上的该可执行文件的副本就叫可执行文件(也就是平时说的程序)的一个实例,即进程)要运行前,操作系统要给该进程在内存上的系统分配变量区(区别于内存上的用户(程序)动态分配区)分配哪些变量的内存空间,如进程对应的源码文件里的主函数里的局部变量;运行中,如进程对应的源码文件里的主函数里,要调用其他函数,则在这些函数(里的代码)要运行前,操作系统也要给这些函数在内存上的系统分配变量区(区别于内存上的用户(程序)动态分配区)分配这些函数里定义的那些变量的内存空间。

其实,变量在程序对应的源码被编译时分配空间,是相对于用户程序运行时在内存上的用户(程序)动态分配区上为自己需要处理的数据分配内存空间做对比而言的:

两种分配内存方式的相同点:

两种方式分配的内存空间(前者分配的内存空间,是一块取了名字的区域,即变量名。变量的实质就是一块内存空间。后者分配的内存空间,是一块没有取名字的区域,即无变量名。)的使用者都是用户程序。

两种分配内存方式的不同点:

以前者方式分配内存空间,用户程序进程只要在其对应的源码文件上写上一句变量声明语句即可,操作系统便会在该用户程序进程运行前由操作系统里专门负责内存分配的进程该用户程序进程在内存上的系统分配变量区(区别于内存上的用户(程序)动态分配区)分配该用户程序进程对应的源码文件里定义的那些变量的内存空间。

以后者方式分配内存空间,用户程序进程运行时,要由该用户程序进程自己给自己在内存上的用户(程序)动态分配区分配一些内存空间,为了达到这个目的,所以需要在该用户程序进程对应的源码文件里加上一段代码,即类似C语言中malloc()函数,C++中的new、delete等,这样,该用户程序进程就有了类似操作系统里专门负责内存分配的进程一样的分配内存空间的功能了。

总之,有两点不同。第一,由谁来分配内存空间,前者是操作系统里专门负责内存分配的进程,后者是用户程序进程自己;第二,分配的内存空间放在哪里,前者是在内存上的系统分配变量区(区别于内存上的用户(程序)动态分配区),后者是内存上的用户(程序)动态分配区


注释:一般,一个完整的源码文件编译后生成一个进程,该进程从源码文件里的主函数上的代码开始运行。源码文件里的一个函数不对应一个进程,只是进程要运行的一段代码而已。如果代码里有创建新进程的函数,则会由此方式生成一个新的进程。



Hmm...some of this answer is a little bit outside the bounds of Oracle, but, it's important to remember that Oracle, while really large and complex, is really just another executable program, written in C. To the compiler, linker and O/S, Oracle is just another executable.

So, first, the PGA (Program Global Area) is the private memory of the process. This is non-sharable, only visible to the local process. Now, this private memory is divided into two types of memory: stack and heap.

"Automatic" variables are allocated from the stack, and are named as such because they areautomatically deallocated when the variable goes out of scope.

Heap memory, on the other hand, is not dependent on scope. You must explicitly allocate heap memory, (malloc()/calloc() function calls) and explicitly free it when you are done. (free() function call)

As an example, you have an automatic variable (on the stack), that's of some pointer type. Now, you can call malloc() to allocate some memory and return a pointer to that memory you allocated. When you're done, you should call free(), to free the memory you previously allocated. If you're careless, and your pointer variable goes out of scope before you free the memory it's pointing to, you've lost track of that memory, and it can no logner be accessed or freed. This is called a memory leak, and it's a common programming error found in lots of C programs, including Oracle.

Hope that gives you some idea of what "stack space" is, and difference between stack and heap.

-Mark

PS If you didn't really understand some or all of what I said before, it's not really that important. It's nice to understand the difference between stack and heap, and how memory leaks happen, but, in practice, it's probably not an area a DBA has to be too concerned with. I'm pretty familiar with the concepts, cause I was a C programmer for over a decade before becoming a DBA.







0 0
原创粉丝点击