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()的实现:
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程序与进程内存结构的更多相关文章
- linux查看某个进程内存占用情况以及/proc/pid/status解释
以nginx 为例1.toptop -b -n 1 |grep nginx|awk '{print "VIRT:"$5,"RES:"$6,"cpu:& ...
- [转]linux下查看进程内存使用情况
动态查看一个进程的内存使用 1.top命令 top -d 1 -p pid [,pid ...] //设置为delay 1s,默认是delay 3s 如果想根据内存使用量进行排序,可以shift + ...
- linux下查看进程内存使用情况
1. top命令--动态查看一个进程的内存使用top -d 1 -p pid [,pid ...] //设置为delay 1s,默认是delay 3s 如果想根据内存使用量进行排序,可以shift ...
- Linux 程序和进程的关系
查看进程命令 ps ps -elf|grep init|grep -v grep 查看init进程ID号:ps aux |grep init |grep -v grep; ps aux 会把系统所有 ...
- linux 查看某个进程内存占用情况命令
1.先用ps查询进程号 ps -aux|grep 进程名字 2.查看更详细的内存占比 cat /proc/3664/status 返回结果:(其中VmRSS为进程所占用的内存)
- C语言基础 (10) 变量作用域,生命周期 内存结构
01 课程回顾 1.指针数组 注意: 对于数组来说,在使用sizeof的时候a和&a[0]是不一样的, 虽然以%x打印出来他们都是地址 2.值传递 int a; fun(a); int *** ...
- 【Linux】进程的结构,创建,结束,以及程序转化为的进程的过程
本文内容: 1.进程的结构 2.程序转化为进程的过程 3.进程的创建 4.进程的结束 背景知识: 1.进程是计算机中处于运行的程序的实体 2.进程是线程的容器 3.程序本身只是指令,数据以及组织形式的 ...
- Linux系统下输出某进程内存占用信息的c程序实现
在实际工作中有时需要程序打印出某个进程的内存占用情况以作参考, 下面介绍一种通过Linux下的伪文件系统/proc 计算某进程内存占用的程序实现方法. 首先, 为什么会有所谓的 伪文件 呢. Linu ...
- Linux内核笔记--内存管理之用户态进程内存分配
内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...
随机推荐
- Hibernate高级应用
数据模型与领域模型的关系 领域模型是一个分析模型,它帮助需求分析人员.用户认识现实业务的工具,描述的是业务中设计的试题及其相互之间的关系,它是需求分析的产物.领域模型是需求分析人员与用户交流的有力工具 ...
- 斜率dp+cdq分治
写在前面 这个东西应该是一个非常重要的套路......所以我觉得必须写点什么记录一下,免得自己忘掉了 一直以来我的斜率dp都掌握的不算很好......也很少主动地在比赛里想到 写这个的契机是noi.a ...
- redux的基本概念
1. State 应用的数据,即状态 2. Action 一个纯对象,携带这个操作的类型和数据信息,主要是用来进行传递信息,如下所示: const action = { type: 'ADD_TODO ...
- 东北育才冲刺noip(day9)
这十天来呢,感觉自己进步很大,(虽然被碾压的很惨),看到了自己以前完全没见过,也没想过的算法,打开新世界的大门. 同时呢,也感觉自己太弱了,于是就注册了这个博客. 为了促进进步,在这里立下flag,我 ...
- 插头dp题表
bzoj1814: Ural 1519 Formula 1 bzoj3125: CITY bzoj1210: [HNOI2004]邮递员 bzoj2331: [SCOI2011]地板 bzoj1187 ...
- 在Eclipse上使用egit插件通过ssh协议方式上传项目代码的具体步骤
在Eclipse上使用egit插件通过ssh协议方式上传项目代码 前戏: 使用ssh方式可以不通过https协议,避免直接提供账号密码的方式上传项目到git在线服务器,如Bitbucket.GitHu ...
- org.json与json-lib的区别(补充 FastJson)
org.json 是JSON国际组织官方推出的标准json解析方案,已经被 android sdk 纳入到标准内置类库,依赖项少,但直至API17版本SDK中,仅支持JSONObject与JSONAr ...
- taotao用户注册前台页面
注册页面效果: 注册jsp: <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- Educational Codeforces Round 55:A. Vasya and Book
A. Vasya and Book 题目链接:https://codeforc.es/contest/1082/problem/A 题意: 给出n,x,y,d,x是起点,y是终点,d是可以跳的格数,注 ...
- Google MapReduce中文版
英文原文链接: Google Map Reduce 译文原文链接: Google MapReduce中文版 Google MapReduce中文版 译者: alex 摘要 MapReduce是一个编程 ...