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()的实现:

 void * memcopy ( void * dest, const void * src, size_t num )
{
char* pdes = (char*)dest;
char* psrc = (char*)src;
assert(dest !=NULL && src !=NULL && num>);
while(num--)
*pdes++ = *psrc++;
return dest;
}

6.memmove()的实现:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void * memmove ( void * dest, const void * src, size_t num )
{
char* pdes = (char*)dest;
char* psrc = (char*)src;
assert(dest !=NULL && src !=NULL && num>);
//判断dest和src是否存在重叠
if(pdes+num <psrc || psrc+num < pdes) //不存在重叠,正常从前向后复制
while(num--)
*pdes++ = *psrc++;
else //存在重叠,从后向前复制
{
pdes = pdes+num-;
psrc = psrc+num-;
while(num--)
*pdes-- = *psrc--;
}
return dest;
}
int main()
{
int const N=;
char dest[N];
char* src="hello world.";
printf("%s\n",src);
memset(dest,,N*sizeof(char));
char *result=(char*)memmove(dest,src,strlen(src));
printf("%s\n",result);
return ;
}

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

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

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

  1. linux查看某个进程内存占用情况以及/proc/pid/status解释

    以nginx 为例1.toptop -b -n 1 |grep nginx|awk '{print "VIRT:"$5,"RES:"$6,"cpu:& ...

  2. [转]linux下查看进程内存使用情况

    动态查看一个进程的内存使用 1.top命令 top -d 1 -p pid [,pid ...] //设置为delay 1s,默认是delay 3s 如果想根据内存使用量进行排序,可以shift + ...

  3. linux下查看进程内存使用情况

    1. top命令--动态查看一个进程的内存使用top -d 1 -p pid [,pid ...]  //设置为delay 1s,默认是delay 3s  如果想根据内存使用量进行排序,可以shift ...

  4. Linux 程序和进程的关系

    查看进程命令 ps  ps -elf|grep init|grep -v grep 查看init进程ID号:ps aux |grep init |grep -v grep; ps aux 会把系统所有 ...

  5. linux 查看某个进程内存占用情况命令

    1.先用ps查询进程号 ps -aux|grep 进程名字 2.查看更详细的内存占比 cat /proc/3664/status 返回结果:(其中VmRSS为进程所占用的内存)

  6. C语言基础 (10) 变量作用域,生命周期 内存结构

    01 课程回顾 1.指针数组 注意: 对于数组来说,在使用sizeof的时候a和&a[0]是不一样的, 虽然以%x打印出来他们都是地址 2.值传递 int a; fun(a); int *** ...

  7. 【Linux】进程的结构,创建,结束,以及程序转化为的进程的过程

    本文内容: 1.进程的结构 2.程序转化为进程的过程 3.进程的创建 4.进程的结束 背景知识: 1.进程是计算机中处于运行的程序的实体 2.进程是线程的容器 3.程序本身只是指令,数据以及组织形式的 ...

  8. Linux系统下输出某进程内存占用信息的c程序实现

    在实际工作中有时需要程序打印出某个进程的内存占用情况以作参考, 下面介绍一种通过Linux下的伪文件系统/proc 计算某进程内存占用的程序实现方法. 首先, 为什么会有所谓的 伪文件 呢. Linu ...

  9. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

随机推荐

  1. Python 装饰器和抽象类

    #装饰器:对类或者函数进行功能的扩展 ''' #第一步:基本函数 def la(): print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天') #调用函数 la() la() #第二步 ...

  2. [洛谷P3376]【模板】网络最大流(ISAP)

    C++ Code:(ISAP) #include <cstdio> #include <cstring> #define maxn 1210 #define maxm 1200 ...

  3. [Leetcode] scramble string 乱串

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...

  4. 一些奇怪的JavaScript试题

    JavaScript有很多地方和我们熟知的C.Java等的编程习惯不同,这些不同会产生很多让人意想不到的事情.前段时间在知乎有人发了写Javascrtip试题,觉得挺好玩的,这里跟大家分享一下. 01 ...

  5. POJ1637:Sightseeing tour(混合图的欧拉回路)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10581   Accepted: 4466 ...

  6. Ecplise下设置jQuery和ExtJs自动提示

    Spket 1.6.23下载: http://yunpan.cn/cjJYmEcMFIuuN  访问密码 5642 ext jsb下载:http://yunpan.cn/cjJYR7ZTzibQn  ...

  7. 理解SetCapture、ReleaseCapture、GetCapture(控制了消息发往哪个窗口,是理解消息的关键)

    理解SetCapture.ReleaseCapture.GetCapture 正常情况下,鼠标指针位于哪个窗口区域内,鼠标消息就自动发给哪个窗口.如果调用了SetCapture,之后无论鼠标的位置在哪 ...

  8. 51nod加农炮

    这道题维护一下前缀最大值然后二分答案就好了哇 233 #include<cstdio> #include<cstring> #include<algorithm> ...

  9. MySql binlog(理论篇)

    1.什么是binlog? binlog日志用于记录所有更新了数据的sql语句或保存被修改的记录Row: 有了binlog,可以用于实时备份,master/slave主从同步: 在5.0版本前支持文本格 ...

  10. Invalidate()(转)

    原文转自 http://m.blog.csdn.net/blog/piaopiaopiaopiaopiao/41521211 使用Invalidate(TRUE)函数时,它会向消息队列中添加了WM_E ...