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. JS调用C#中的变量

    今天早上做项目,需要使用JS来得到数据库里面表的行数.经过查找资料,知道可以使用在C#中定义一个全局变量.在JS中调用即可,自己总结一下:供日后参考; public string Str() { st ...

  2. [SCOI2010]序列操作 线段树

    ---题面--- 题解: 在考场上打的这道题,出人意料的很快就打完了?! 直接用线段树,维护几个东西: 1,lazy标记 : 表示区间赋值 2,mark标记:表示区间翻转 3,l1:前缀最长连续的1的 ...

  3. [NOIP2012] 文化之旅 dfs

    这道题就体现了聪明的搜索策略的重要性,如果我们正着搜,判断效率会明显下滑,所以我们就采用倒着搜索.(其实很玄学.....) #include <cstdio> #include <b ...

  4. 压缩跟踪Compressive Tracking

    好了,学习了解了稀疏感知的理论知识后,终于可以来学习<Real-Time Compressive Tracking>这个paper介绍的感知跟踪算法了.自己英文水平有限,理解难免出错,还望 ...

  5. [hdu 6069]素数筛+区间质因数分解

    给[L,R]区间的每一个数都质因数分解的复杂度可以达到(R-L)logR,真的涨姿势…… 另外,质因数分解有很重要的一点,就是只需要打sqrt(R)以内的素数表就够了……因为超过sqrt(R)的至多只 ...

  6. 线段树模板 CDOJ1057

    UESTCOJ不知道为什么进不去了哇 跟着叉姐的算法讲堂写的板子 叉姐的思路真的好清晰啊,一定是练习的多并且理解的够深了 希望自己也可以每天进步一点点吧 代码: #include <map> ...

  7. 使用T4模板生成MySql数据库实体类

    注:本文系作者原创,但可随意转载. 现在呆的公司使用的数据库几乎都是MySQL.编程方式DatabaseFirst.即先写数据库设计,表设计按照规范好的文档写进EXCEL里,然后用公司的宏,生成建表脚 ...

  8. 函数实现多个按钮控制一个div

    <!DOCTYPE HTML><html><head> <meta http-equiv="txttent-Type" txttent=& ...

  9. JavaScript学习笔记——浅拷贝、深拷贝

    参考自:http://www.cnblogs.com/yichengbo/archive/2014/07/10/3835882.html 一.数组的深浅拷贝 在使用JavaScript对数组进行操作的 ...

  10. EL遍历集合

    jstl EL表达式遍历集合 博客分类: JSTL/EL JSTLEL遍历集合  在EL中,方括号运算符用来检索数组和集合的元素.对于实现 java.util.Map 接口的集合,方括号运算符使用关联 ...