操作系统中有专门负责分配内存的进程,它会为那些在操作系统级别上使用内存的软件系统分配一块内存。
所谓的编译时内存分配(静态内存分配),即是为程序本身能在下一个阶段(运行阶段)的运行而在内存上的程序区分配内存空间,还有程序里的非指针变量(如原子变量、数组、结构体、类等)分配内存空间:stack
例如,oracle软件系统启动的时候,oracle软件系统本身要运转的话自然需要一些内存上的程序区的内存空间用于oracle软件系统本身的运行。
所谓的运行时内存分配(动态内存分配),即是为程序里的指针变量分配内存空间:heap
例如,而oracle软件系统运行时,(oracle软件系统中具体一个进程)要处理的那些数据,oracle软件系统要为存放这些数据向操作系统申请分配一块内存空间(这种内存空间在内存的什么区上,忘了,暂且叫用户可分配的内存区吧,非操作系统的进程都叫用户(?))。然后,通过类似指针变量这样的工具指向这块区域。
oracle软件系统中的一个服务器进程启动时,oracle软件系统也会要操作系统分配一块内存空间,即PGA给该服务器进程。之后,属于该服务器进程的会话们(执行SQL语句时)启动时,就找oracle软件系统中专门负责分配内存的进程申请分配内存。
又如,
摘自《
[深入解析Oracle.DBA入门进阶与诊断案例].盖国强.扫描版.pdf
》
由此,看出一个模式,类似于:
一个全国的总代理(操作系统),手上有全国所有货物(整个内存空间)。
该全国的总代理(操作系统)向他的下一级的经销商们(即应用程序系统,如oracle软件系统)按照一定规则分配给他们每人不一样多数量的货物(部分内存空间)。