单片机全局变量 局部变量 堆与栈 的区别

单片机全局变量 局部变量 堆与栈 的区别,第1张

1、栈区(stack)—

由编译器自动分配释放

,存放函数的参数值,局部变量的值等。其 *** 作方式类似于数据结构中的栈。

2、堆区(heap)

一般由程序员分配释放,

若程序员不释放,程序结束时可能由OS回收

。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,

未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

-

程序结束后有系统释放

4、文字常量区—常量字符串就是放在这里的。

程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。

1、 全局变量的作用用这个程序块,而局部变量作用于当前函数;

2、前者在内存中分配在全局数据区,后者分配在栈区;

3、 生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁,局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在;

4、 使用方式不同:通过声明后全局变量程序的各个部分都可以用到,局部变量只能在局部使用

*** 作系统和编译器通过内存分配的位置来知道的全局变量分配在全局数据段,并且在程序被运行的时候就被加载。;

编译器通过语法词法的分析,判断出是全局变量还是局部变量。如果是全局变量的话,编译器在将源代码翻译成二进制代码时就为全局变量分配好一个虚拟地址 (windows下0x00400000以上的地址,也就是所说的全局区),所以程序在对全局变量的 *** 作时是对一个硬编码的地址 *** 做。

局部变量的话,编译时不分配空间,而是以相对于ebp或esp的偏移来表示局部变量的地址,所以局部变量内存是在局部变量所在的函数被调用时才真正分配。 以汇编的角度来看:函数执行时,局部变量在栈中分配,函数调用完毕释放局部变量对应的内存,另外局部变量可以直接分配在寄存器中。

*** 作系统通过变量的分配地址就可以判断出是局部变量和全局变量。

通常情况下,Oracle数据库会先将这些临时数据存放到内存的PGA(程序全局区)内。在这个程序全局区中有一个叫做排序区的地方,专门用来存放这些因为排序 *** 作而产生的临时数据。但是这个分区的容量是有限的。当这个分区的大小不足以容纳排序后所产生的记录时,数据库系统就会将临时数据存放到临时表空间中。这就是临时表空间的来历。看起来好像这个临时表空间是个临时工,对于数据库的影响不会有多大。其实大家这是误解这个临时表空间了。在用户进行数据库 *** 作时,排序、分组汇总、索引这些作业是少不了,其会产生大量的临时数据。为此基本上每个数据库都需要用到临时表空间。而如果这个临时表空间设置不当的话,则会给数据库性能带来很大的负面影响。为此管理员在维护这个临时表空间的时候,不能够掉以轻心。要避免因为临时表空间设置不当影响数据库的性能。

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

1栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

2堆,就是那些由new分配的内存块,他们的释放编译器不去管,由用户的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后, *** 作系统会自动回收。

3自由存储区,就是那些由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来结束自己的生命的。

4全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

5常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。

这是固定的,根据变量类型判断就行:

全局变量和静态变量放在全局区

局部变量放在栈区

动态申请的内存在堆区

register变量在寄存器

字符串常量在文字常量区

1、栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源;

2、堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收;

3、全局变量区(datasegment)—存放全局变量,静态变量和字符串常量,不释放;

4、代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域。

1、数据高速缓冲区(Data Buffer Cache)

在数据高速缓冲区中存放着Oracle系统使用过的数据块(即用户的高速缓冲区),当把数据写入数据库时,它以数据块为单位进行读写,当数据高速缓冲区填满时,则系统自动去掉一些不常被用户访问的数据。

如果用户要查的数据不在数据高速缓冲区时,Oracle自动从磁盘中去读取。数据高速缓冲区包括三个类型的区:

(1)脏数据区(Dirty Buffers):包含有已经改变过并需要写回数据文件的数据块。

(2)自由区(Free Buffers):没有包含任何数据并可以再写入的区,Oracle可以从数据文件读数据块该区。

(3)保留区(Pinned Buffers):此区包含有正在处理的或者明确保留用作将来用的区。

2、Redo Log Buffer Cache缓存对于数据块的所有修改。

主要用于恢复其中的每一项修改记录都被称为redo 条目。利用Redo条目的信息可以重做修改。

3、Shared Pool用于缓存被执行的SQL语句和被使用的数据定义。

它主要由两个内存结构构成:Library cache和Data dictionary cache

修改共享池的大小:ALTER SYSTEM SET SHARED_POOL_SIZE = 64M;

Library Cache缓存被执行的SQL和PL/SQL的相关信息,即存放SQL语句的文本,分析后的代码及执行计划。

 Oracle的数据库:

一系列物理文件的集合

包括控制文件、数据文件、联机日志文件、参数文件、密码文件等

即:Oracle Database = Controlfile + datafile + logfiel + spfile +

1控制文件(controlfile)

数据库的名字,检查点信息,数据库创建的时间戳

所有的数据文件,联机日志文件,归档日志文件信息

备份信息等

2数据文件(datafile)

包含了用户和应用程序的所有数据

--查看数据文件信息

3联机日志文件

记录了用户对数据库的所有 *** 作,一个数据库中至少要有两个日志组文件,每个日志组中至少有一个日志成员

日志组中的多个日志成员是互为镜相关系

4归档日志文件

Oracle可以运行在两种模式之中,归档模式和非归档模式。在归档模式中,为了保存用户的所有修改,

在联机日志文件切换后和被覆盖之间系统将他们另外保存成一组连续的文件系列,该文件系列就是归档日志文件。

用户恢复意外情况出现的数据丢失、异常等。

5参数文件(pfile和spfile)

initSIDora或initora文件,通常位于:$ORACLE_BASE/admin/<SID>/pfile

初始化文件记载了许多数据库的启动参数,如内存,控制文件,进程数等,在数据库启动的时候加载(Nomount时加载)

6其他文件

密码文件:用于Oracle 的具有sysdba权限用户的认证

告警日志文件:报警日志文件(alertlog或alrtora),记录数据库启动,关闭和一些重要的出错信息

查看路径:select value from v$PARAMETER where name =‘background_dump_dest’;

7数据库逻辑组织结构

表空间、段、区、块

一个数据库由一个或多个表空间组成,一个表空间只能属于一个数据库

一个表空间由一个或多个多个数据文件组成,一个数据文件只能属于一个表空间

一个数据文件由一个或多个 *** 作系统块组成,每一个 *** 作系统块只能数以一个数据文件

一个表空间可以包含一个或多个段,一个段只能属于一个表空间

一个段由一个或多个区组成,每一个区只能属于一个段

一个区由一个或多个Oracle 块组成,每一个Oracle块只能属于一个区

一个区只能属于一个数据文件,数据文件的空间可以分配到一个或多个区

一个Oracle 块由一个或多个 *** 作系统块组成,一个 *** 作系统块是一个Oracle块的一部分

oracle实例:

一个Oracle Server由一个Oracle实例和一个Oracle数据库组成。

即:Oracle Server = Oracle Instance + Oracle Database

Oracle实例

包括了内存结构(SGA)和一系列后台进程(Background Process),两者合起来称为一个Oracle实例

即:Oracle Instance = SGA + Background Process

Oracle内存结构

包含系统全局区(SGA)和程序全局区(PGA)

即Oracle Memory Structures = SGA + PGA

SGA由服务器和后台进程共享

PGA包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反,PGA是

只被一个进程使用的区域,PGA 在创建进程时分配在终止进程时回收。即由服务器进程产生。

1SGA

系统全局区SGA,SGA = 数据缓冲区+ 重做日志缓冲区+ 共享池+ 大池+ Java 池+ 流池

系统全局区是动态的,由参数SGA_MAX_SIZE决定。

查看当前系统的SGA大小:show parameter sga_max_size;

要修改:alter system set sga_max_size=1200m scope=spfile;

因为实例内存的分配是在数据库启动时进行的,所以要让修改生效,要重启数据库。

ORACLE 10G 引入了ASMM(自动共享内存管理),DBA只需设置SGA_TARGET,ORACLE就会

自动的对共享池、JAVA池、大池、数据缓冲区、流池进行自动调配。取消自动调配就是

sga_target设为。

数据缓冲区(Database buffer cache):存储从数据文件中获得的数据块的镜像

大小由db_cache_size 决定

查看:show parameter db_cache_size;

设置:alter system set db_cache_size=800M;

重做日志缓冲区(Redo log buffer):对数据库的任何修改都按顺序被记录在该缓冲,然后由LGWR进程将

它写入磁盘,大小由LOG_BUFFER决定

共享池(Shared pool):是SGA中最关键的内存片段,共享池主要由库缓存(共享SQL区和PL/SQL区)和数据

字典缓存组成,它的作用是存放频繁使用的sql,在有限的容量下,数据库系统根据一定的算法决

定何时释放共享池中的sql。

库缓存大小由shared_pool_size 决定

查看:show parameter shared_pool_size

修改:alter system set shared_pool_size=120m;

数据字典缓存:

存储数据库中数据文件、表、索引、列、用户和其它数据对象的定义和权限信息

大小由shared_pool_size 决定,不能单独指定

大池(Large pool):是一个可选的区域,用于一些大型的进程如Oracle的备份恢复 *** 作、IO服务器进程等

Java 池:该程序缓冲区就是为Java 程序保留的。如果不用Java程序没有必要改变该缓冲区的默认大小

流池(Stream pool):被Oracle流所使用

2PGA

是为每个用户进程连接ORACLE数据库保留的内存

进程创建时分配,进程结束时释放,只能被一个进程使用

PGA包括了以下几个结构:

()排序区

()游标状态区

()会话信息区

()堆栈区

由参数:pga_aggregate_target 决定

3几类进程:用户进程,服务器进程,后台进程,其它可选进程

用户进程

在用户连接数据库产生,请求oracle服务器连接,必须要先建立一个连接,不会直接和oracle服务器连接

服务器进程

当连接实例并建立用户会话时产生,独立服务器或者提供共享服务器都能产生

后台进程

维持物理和内存之间的联系,用来管理数据库的读写,恢复和监视等工作。

Server Process主要是通过他和user process进行联系和沟通,并由他和user process进行数据的交换。

在Unix机器上,Oracle后台进程相对于 *** 作系统进程,也就是说,一个Oracle后台进程将启动一个 *** 作

系统进程。

在Windows机器上,Oracle后台进程相对于 *** 作系统线程,打开任务管理器,我们只能看到一个

ORACLEEXE的进程,但是通过另外的工具,就可以看到包含在这里进程中的线程。

必须要有的后台进程

DBWn -->数据库写进程

PMON -->程序监控进程

SMON -->系统监控进程

LGWr -->日志写进程

CKPT -->检查点进程

可选进程:

ARCN 归档进程

RECO

Snnn

pnnn

DBWn(数据库写进程)

负责将修改过的数据块从数据库缓冲区高速缓存写入磁盘上的数据文件中

写入条件:

发生检查点

脏缓存达到限制

没有自由的缓存

超时发生

表空间离线

表空间只读

表被删除或者截断

开始备份表空间

可以修改数据写进程的数量

alter system set db_writer_processes=3 scope=spfile;

PMON(程序监控进程)

清除失效的用户进程,释放用户进程所用的资源。

如PMON将回滚未提交的工作,释放锁,释放分配给失败进程的SGA资源。

清除失败的进程

回滚事务

释放锁

释放其他资源

SMON(系统监控进程)

检查数据库的一致性,当启动失败时完成灾难恢复等

实列恢复时,前滚所有重做日志中的文件,打开数据库为了用户能访问,回滚未提交的事务,释放临时表空间

清除临时空间,聚结空闲空间,从不可用的文件中恢复事务的活动,OPS中失败节点的实例恢复

清除OBJ$表

缩减回滚段

使回滚段脱机

LGWr(日志写进程)

将重做日志缓冲区中的更改写入在线重做日志文件

条件:

提交的时候(commit)

redo log buffer达到1/3满

每隔3秒

有大于1MB 重做日志缓冲区未被写入磁盘

DBWR需要写入的数据的SCN号大于LGWR 记录的SCN号,DBWR 触发LGWR写入

超时

在dbwr进程些之前写日志

CKPT(检查点进程)

DBWR/LGWR的工作原理,造成了数据文件,日志文件,控制文件的不一致,CKPT进程负责同步数据文件,

日志文件和控制文件

CKPT会更新数据文件/控制文件的头信息

条件:

在日志切换的时候

数据库用immediate ,transaction ,normal选项shutdown数据库的时候

根据初始话文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的设置的数值来确定

用户触发

ARCN(归档进程)

在每次日志切换时把已满的日志组进行备份或归档

条件:

数据库以归档方式运行的时候

RECO

负责解决分布事物中的故障。Oracle可以连接远程的多个数据库,当由于网络问题,有些事物处于悬而未决的状态。

RECO进程试图建立与远程服务器的通信,当故障消除后,RECO进程自动解决所有悬而未决的会话。

Server Process(服务进程)

分为专用服务进程(Dedicated Server Process)和共享服务进程(MultiTreaded Server Process)

专用服务进程:一个服务进程对应多个用户进程,轮流为用户进程服务。

用户进程(User Process)、服务进程(Server Process)、后台进程(Background Processes)的启动

用户进程: 数据库用户请求Oralce server会话时被启动

服务进程:当用户会话启动后,连接到Oracle实例时该进程被启动

后台进程:当Oracle实例被启动时,启动相关的后台进程

以上就是关于单片机全局变量 局部变量 堆与栈 的区别全部的内容,包括:单片机全局变量 局部变量 堆与栈 的区别、全局变量和局部变量有什么区别是怎么实现的、oracle切换默认临时表空间会影响当前运行吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9684786.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存