linux程序与进程内存结构

1.可执行文件结构:

  1)代码区:包含操作码和操作对象、常量数据(const声明)、立即数,代码区是共享的, 只提供只读。

  2)全局/静态数据区:包含被初始化的全局数据和初始化静态数据。

  3)未初始化数据区(BBS):包含未初始化的全局数据和未初始化静态数据。

2.进程结构:

  1)代码区:加载可执行程序代码段,由加载器完成。

  2)全局数据区:加载可执行文件数据段,数据生存周期为整个程序运行过程。

  3)未初始化数据区:加载未初始化数据,数据生存周期为整个程序运行过程。

  4)栈区:由编译器自动分配,存放函数的参数值,返回值,局部变量,函数完成调用则释放。

  5)堆区:动态分配内存,由程序员自己分配与释放,若程序员没释放,则最后由os释放。

3.堆和栈的区别:

  栈由系统自动管理由allocal()函数完成申请,自动完成释放,是一片连续的区域向下扩展,空间有限制,超过会溢出;

  堆是向高地址扩展的不连续区域,由malloc/free(new/delete)申请/释放,效率低,而且会产生较多的碎片。

4.内存管理常用函数:

  1)malloc()/free()(c++中:new/delete):动态分配/释放内存

  2)realloc():用来更改堆中已经配置的内存空间

  3)calloc():把分配的内存初始化为0,用法与malloc()相似

  4)allocal():为栈分配内存,自动释放

  5)memcopy():从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

  6)memmove():用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中

  7)memset():一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

  8)memcmp() :比较内存区域buf1和buf2的前count个字节

  9)memchr():从buf所指内存区域的前count个字节查找字符ch

5.memcopy()的实现:

1 void * memcopy ( void * dest, const void * src, size_t num )
2 {
3     char* pdes = (char*)dest;
4     char* psrc = (char*)src;
5     assert(dest !=NULL && src !=NULL && num>0);
6     while(num--)
7         *pdes++ = *psrc++;
8     return dest;
9 }

6.memmove()的实现:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<assert.h>
 5 void * memmove ( void * dest, const void * src, size_t num )
 6 {
 7     char* pdes = (char*)dest;
 8     char* psrc = (char*)src;
 9     assert(dest !=NULL && src !=NULL && num>0);
10     //判断dest和src是否存在重叠
11     if(pdes+num <psrc || psrc+num < pdes)  //不存在重叠,正常从前向后复制
12         while(num--)
13             *pdes++ = *psrc++;
14     else //存在重叠,从后向前复制
15     {
16        pdes = pdes+num-1;
17        psrc = psrc+num-1;
18        while(num--)
19            *pdes-- = *psrc--;
20     }
21     return dest;
22 }
23 int main()
24 {
25     int const N=30;
26     char dest[N];
27     char* src="hello world.";
28     printf("%s\n",src);
29     memset(dest,0,N*sizeof(char));
30     char *result=(char*)memmove(dest,src,strlen(src));
31     printf("%s\n",result);
32     return 0;
33 }

7.memmove()与memcopy()区别:

  在内存没有发生折叠时,两者的作用相同,当内存发生折叠时,memmove()可以保证输出结果正确,memcopy()不能保证,memcopy()是memmove()的一个子集。

时间: 2024-11-10 04:35:55

linux程序与进程内存结构的相关文章

Linux 可执行文件与进程内存结构, Linux 进程内存加载

一个可执行程序包含三个部分 代码段:主要存放指令,操作以及只读的(常量)数据(例如字符串常量).数据段:全局或者静态的已经初始化的变量.BSS 段:全局或者静态的未初始化的变量. 栈上面有1G内存时Linux内核区,与栈之间有一个gap随机地址,防止代码攻击.数据区data与堆区之间也有一个随机gap.

linux的获取进程与进程内存结构

原文地址:https://www.cnblogs.com/jest549/p/11365604.html

Linux 程序和进程的关系

查看进程命令 ps  ps -elf|grep init|grep -v grep 查看init进程ID号:ps aux |grep init |grep -v grep; ps aux 会把系统所有的进程列出来. top 动态显示系统命令.按T 只看内存和交换分区,以及恢复.只看M tasks和CPU.显示多个CPU情况 1 htop 安装 yum -y install htop. 没有的话 先安装软件仓库:rpm -ivh http://repository.it4i.cz/mirrors/

linux学习之进程,线程和程序

                                                                                  程序.进程和线程的概念 1:程序和进程的差别 进程的出现最初是在UNIX下,用于表示多用户,多任务的操作系统环境下,应用程序在内存环境中基本执行单元的概念.进程是UNIX操作系统环境最基本的概念.是系统资源分配的最小单位.UNIX操作系统下的用户管理和资源分配等工作几乎都是操作系统通过对应用程序进程的控制实现的! 当使用c c++ j

java中的进程与线程及java对象的内存结构【转】

原文地址:http://rainforc.iteye.com/blog/2039501 1.实现线程的三种方式: 使用内核线程实现 内核线程(Kernel Thread, KLT)就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上.程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口——轻量级进程(Light Weight Process,LWP),轻量级进程就是我们通常意义上所讲的线程,由于每个轻量

Linux从程序到进程

Linux从程序到进程 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机如何执行进程呢?这是计算机运行的核心问题.即使已经编写好程序,但程序是死的.只有活的进程才能产出.我们已经从Linux进程基础中了解了进程.现在我们看一下从程序到进程的漫漫征程. 一段程序 下面是一个简单的C程序,假设该程序已经编译好,生成可执行文件vamei.exe. #include <stdio.h> int glob=0; /*global

oracle整体结构-内存结构、物理结构、逻辑结构、进程

Oracle的体系结构大体上分为两部分:Instance(实例)和Database(数据库). Instance(实例) :在Oracle Instance中主要包含了SGA以及一些进程(例如:PMON.SMON.DBWn.LGWR.CKPT等).如果一个用户的进程连接到Oracle Server时,其实就是连接到Oracle Instance.在SGA中又包含了5大部件:Share Pool.Database Buffer Cache.Redo Log Buffer.Java Pool.Lar

Linux内存点滴:用户进程内存空间

原文出处:PerfGeeks 经常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的.VIRT , Virtual Image (kb)RES, Resident size (kb)SHR, Shared Mem size (kb)%MEM, Memory usage(kb)SWAP, Swapped size (kb)CODE, Code size (kb)DATA, Data+Stack size (kb)nFLT, Page Fault countn

应用 Valgrind 发现 Linux 程序的内存问题

如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在.有一款非常优秀的 linux 下开源的内存问题检测工具:valgrind,能够极大的帮助你解决上述问题.掌握 valgrind 的使用以及工作原理,能够有效地定位进而避免应用开发中的内存问题. 5 评论: 杨 经 ([email protected]), 软件工程师, IBM 2008 年 11 月 27 日 内容 应用 Valgrind 发现 Linux 程序的内存问题 回页首 Valgrind 概述 体系结构 Va