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程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...
随机推荐
- cf 442 D. Olya and Energy Drinks
cf 442 D. Olya and Energy Drinks(bfs) 题意: 给一张\(n \times m(n <= 1000,m <= 1000)\)的地图 给出一个起点和终点, ...
- Visual Studio调试之断点技巧篇
原文链接地址:http://blog.csdn.net/Donjuan/article/details/4618717 函数断点 在前面的文章Visual Studio调试之避免单步跟踪调试模式里面我 ...
- [Leetcode] palindrome partition ii 回文分区
Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...
- Windows Socket 编程_ 简单的服务器/客户端程序
转载自:http://blog.csdn.net/neicole/article/details/7459021 一.程序运行效果图 二.程序源代码 三.程序设计相关基础知识 1.计算机网络 2 ...
- bzoj2424 [HAOI2010]订货 dp+单调性
[HAOI2010]订货 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1311 Solved: 884[Submit][Status][Discu ...
- python异常之with
1.基本语法 with expression [as target]: with_body 参数说明: expression:是一个需要执行的表达式: target:是一个变量或者元组,存储的是exp ...
- 【BZOJ4766】文艺计算姬 [暴力]
文艺计算姬 Time Limit: 1 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description "奋战三星期,造台计算机 ...
- loj6087 毒瘤题
传送门:https://loj.ac/problem/6087 [题解] 这垃圾题目卡空间啊... k=1相信大家都会,把所有数异或起来就是答案了. 考虑k=2,把所有数异或起来得到两个答案数的异或值 ...
- [BZOJ1982][POJ1740][Spoj 2021]Moving Pebbles|解题报告
这道题的题意BZ和POJ上的都不大清楚... 大概就是给出n堆石子,以及初始每堆石子的个数 两个玩家交替操作,每个操作可以任意在一堆中取任意多的石子 然后再从这堆里拿若干个石子放到某个当前还存在的堆里 ...
- Android无埋点数据收集SDK关键技术
前言 鉴于日益强烈的精细化运营需求,网易乐得从去年开始构建大数据平台,<<无埋点数据收集SDK>>因此立项,用于向大数据平台提供全量,完整,准确的客户端数据. << ...