linux(一)
来源:互联网 发布:中国海洋大学 知乎 编辑:程序博客网 时间:2024/06/07 05:49
inux/Unix Window MacOSX PC机 服务器 ARM 设备驱动/进程管理/内存管理/文件目录系统管理/IO 内存管理 文件目录 IO 进程管理 进程创建 进程控制 进程通信 进程同步 线程管理 线程创建 线程同步 线程通信 应用 网络 数据库(pro*c/c++) UI shell 定位:提供编程的能力,为设备驱动与Window应用奠定基础.三.内存管理 硬件层次 内存结构管理 内核层次 内存映射 堆扩展 语言层次 c:malloc c++:new 数据结构 STL 智能指针 1.问题: malloc怎么分配空间? malloc与new的关系? 2.Linux对内存的结构描述 1./proc/${pid}/ 存放进程运行时候所有的信息(包括内存结构) 结论: 任何程序的内存空间分成4个基本部分 1.代码区 2.全局栈区 3.堆 4.局部栈 进程查看 ps aue 2.理解程序的变量与内存空间的关系 结论: 1.内存分四个区. 2.各种变量对应存放区 3.堆栈是一种管理内存的数据结构. 4.查看程序的内存地址. 3.理解malloc的工作的原理 malloc使用一个数据结构(链表)维护分配空间 链表的构成:分配的空间/上一个空间数据/下一个空间/空间大小等信息. 对malloc分配的空间不要越界访问.因为容易破坏后台维护结构.导致malloc/free/calloc/realloc不正常工作. 4.C++的new与malloc的关系 malloc new new[] realloc new() calloc new[] free delete delete[]? 结论:new的实现使用的是malloc来实现的. 区别:new使用malloc后,还要初始化空间. 基本类型,直接初始化成默认值. UDT类型,调用指定的构造器 delete调用free实现. delete负责调用析构器.然后在调用free new与new[]区别 new只调用一个构造器初始化. new[]循环对每个区域调用构造器. delete 与delete[] 5.函数调用栈空间的分配与释放 5.1.总结: 1.函数执行的时候有自己的临时栈. 2.函数的参数就在临时栈中.如果函数传递实参.则用来初始化临时参数变量. 3.通过积存器返回值.(使用返回值返回数据) 4.通过参数返回值.(参数必须是指针) 指针指向的区域必须事先分配. 5.如果参数返回指针.参数就是双指针. 5.2.__stdcall __cdecl __fastcall 1.决定函数栈压栈的参数顺序. 2.决定函数栈的清空方式 3.决定了函数的名字转换方式. 6.far near huge指针 near 16 far 32 huge 综合四.虚拟内存 问题: 一个程序不能访问另外一个程序的地址指向的空间. 理解: 1.每个程序的开始地址0x80084000 2.程序中使用的地址不是物理,而是逻辑地址(虚拟内存). 逻辑地址仅仅是编号.编号使用int 4字节整数表示. 4294967296 每个程序提供了4G的访问能力 问题: 逻辑地址与物理地址关联才有意义:过程称为内存映射. 背景: 虚拟内存的提出:禁止用户直接访问物理存储设备. 有助于系统的稳定. 结论: 虚拟地址与物理地址映射的时候有一个基本单位: 4k 1000 内存页. 段错误:无效访问. 合法访问:比如malloc分配的空间之外的空间可以访问,但访问非法.五.虚拟内存的分配. 栈:编译器自动生成代码维护 堆:地址是否映射,映射的空间是否被管理. 1.brk/sbrk 内存映射函数 补充:帮助手册 man 节 关键字 1-8 1:Linux系统(shell)指令 2:系统函数 3:标准C函数 7:系统编程帮助 分配释放内存: int brk(void *end);//分配空间,释放空间 void *sbrk(int size);//返回空间地址 应用: 1.使用sbrk分配空间 2.使用sbrk得到没有映射的虚拟地址. 3.使用brk分配空间 4.使用brk释放空间 理解: sbrk(int size) sbrk与brk后台系统维护一个指针. 指针默认是null.调用sbrk,判定指针是否是0,是:得到大块空闲空间的首地址初始化指针.同时把指针+size 否:返回指针,并且把指针位置+size 应用案例: 写一个程序查找1-10000之间所有的素数. 并且存放到缓冲,然后打印. 缓冲的实现使用sbrk/brk 流程: 循环 判定是否素数(isPrimer) 是,分配空间存放 不是,继续下步. 总结: 智能指针 stl new malloc brk/sbrk 异常处理 int brk(void*) void *sbrk(int); 如果成功.brk返回0 sbrk返回指针 失败 brk返回-1 sbrk返回(void*)-1 Unix函数错误,修改内部变量: errno 字符串函数string.h cstring 内存管理函数malloc memset mamcmp memcpy ... bzero 错误处理函数 标准IO函数 时间函数 类型转换函数
0 0
- Linux常用命令(一)
- linux入门(一)
- linux学习(一)
- linux学习(一)
- linux手记(一)
- linux命令行(一)
- 学习Linux(一)
- Linux学习(一)
- Linux 杂记(一)
- linux常用命令(一)
- Linux常用命令(一)
- Linux常用命令(一)
- Linux系统启动(一)
- LINUX系统管理(一)
- linux 定时器( 一)
- Linux学习(一)
- Linux命令(一)
- linux 命令行 (一)
- Introduction to Face Detection and Face Recognition
- bootstrap的datepicker控件使用心得
- HDU 1596:find the safest road【Dijkstra & SPFA】
- 浅析JavaScript DOM编程以及重排
- 零基础学python-5.2 数字表达式操作符
- linux(一)
- Delphi New,Getmem,ReallocMem联系与区别
- http://www.cnblogs.com/dudu/archive/2011/03/05/asp_net_webform_mvc.html
- 关于通过异或交换两个元素的值的一个陷阱
- 工作会议的方法
- Linux进程间通信——使用命名管道
- 关于Android popupWindow的位置显示 showAtLocation理解
- [Leetcode]Binary Tree Paths
- Linux启动新进程的几种方法及比较