一. 约定
1.作业完成
2.50-200 lines codes
二.课程体系
语言
C
C++
算法
算法
数据结构
基础(系统核心(Kernel)编程)
---------------------------------
linux/unix windows MacOSX
PC机 服务器 ARM
设备驱动/进程管理/内存管理/文件目录系统管理/IO/
内存管理
文件目录
IO
进程管理
进程创建
进程控制
进程通信
进程同步
线程管理
线程创建
线程同步
线程通信
应用
网络
数据库
UI
shell
XML处理
分布式与中间件(Tuxedo/Corba/MQ)
web service
OpenGL
定位:提供编程的能力,为设备驱动与Windows应用奠定基础
三.内存管理
硬件层次
内核层次
语言层次
C: malloc/free
C++:new/delete
数据结构
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分配的空间不要越界访问,因为容易造成内存泄露
4.C++的new与malloc的关系
malloc new new[]
realloc ??
calloc ??
free delete delete??
结论:
new的实现使用的是malloc来实现的.
区别:
new使用malloc后,还要初始化空间.
基本类型直接初始化为默认值.
UDT类型,调用指定的构造器
delete调用free实现
delete负责调用析构器
new与new[]区别
new只调用一个构造器初始化
new[]循环对每个区域调用构造器
delete与delete[]
没有区别 delete[] 只调用一次析构器 循环次数由系统决定
5.函数调用栈空间的分配和释放
` 5.1 总结:
1.函数执行的时候有自己的临时栈.
2.函数的参数就在临时栈中.如果函数传递实参,直接覆盖形参的"垃圾值"
3.通过寄存去返回值(使用返回值返回数据)
4.通过参数返回值(参数必须是指针)
指针指向的区域必须实现分配
5.如果参数返回指针.参数就是双指针.
5.2. _stdcal _cdecl _fastcall
1.决定函数栈压栈的参数顺序.
2.决定函数栈的清空方式
3.决定了函数的名字转换方式.
6. far near huge指针
near 16位
far 32位
huge 综合
四.虚拟内存
问题:
一个程序不能访问另外一个程序的地址指向的空间;
理解:
1.每个程序的开始地址0x80084000
2.程序中使用的地址不是物理地址,而是逻辑地址。(虚拟地址)
逻辑地址仅仅是个编号,编号使用int4 季节整数表示。
每个程序提供了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)
如果是第一次运行,则返回没有映射的空闲空间首地址,
同时产生一个数据:指向地址.
sbrk与brk后台系统维护一个指针.
指针默认是null.
调用sbrk,判定指针是否是0,是:得到大块空闲空间的初始化首地址
否:返回指针,并且把指针位+size
int *p1=sbrk(4);//返回空闲地址,并修改指针为+size
brk(p1+3) 以sbrk的返回的指针为基准,将指针向前移动3个单位
brk(0) 返回sbrk指向的指针.
应用案例:
写一个程序查找1-10000之间所有的素数.
并且存放到缓冲,然后打印.
缓冲的实现使用sbrk/brk
流程:
循环
判定是否素数(isPrimer)
是:分配空间存放
否:继续下步
总结:
share_ptr
stl
new/delete
malloc/free
brk/sbrk
异常处理
int brk(void*)
void* sbrk(int)
如果成功 :brk返回0 sbrk返回一个指针
如果失败:brk返回-1 sbrk返回(void*)-1
unix函数错误,修改内部变量
errno
字符串函数
内存管理函数 malloc memset mamcmp memcpy ...
bzero
错误处理函数
标准IO函数
时间函数
类型转换函数
----------------------------------------------------------------------
----------------------------------------------------------------------
1.作业完成
2.50-200 lines codes
二.课程体系
语言
C
C++
算法
算法
数据结构
基础(系统核心(Kernel)编程)
---------------------------------
linux/unix windows MacOSX
PC机 服务器 ARM
设备驱动/进程管理/内存管理/文件目录系统管理/IO/
内存管理
文件目录
IO
进程管理
进程创建
进程控制
进程通信
进程同步
线程管理
线程创建
线程同步
线程通信
应用
网络
数据库
UI
shell
XML处理
分布式与中间件(Tuxedo/Corba/MQ)
web service
OpenGL
定位:提供编程的能力,为设备驱动与Windows应用奠定基础
三.内存管理
硬件层次
内核层次
语言层次
C: malloc/free
C++:new/delete
数据结构
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分配的空间不要越界访问,因为容易造成内存泄露
4.C++的new与malloc的关系
malloc new new[]
realloc ??
calloc ??
free delete delete??
结论:
new的实现使用的是malloc来实现的.
区别:
new使用malloc后,还要初始化空间.
基本类型直接初始化为默认值.
UDT类型,调用指定的构造器
delete调用free实现
delete负责调用析构器
new与new[]区别
new只调用一个构造器初始化
new[]循环对每个区域调用构造器
delete与delete[]
没有区别 delete[] 只调用一次析构器 循环次数由系统决定
5.函数调用栈空间的分配和释放
` 5.1 总结:
1.函数执行的时候有自己的临时栈.
2.函数的参数就在临时栈中.如果函数传递实参,直接覆盖形参的"垃圾值"
3.通过寄存去返回值(使用返回值返回数据)
4.通过参数返回值(参数必须是指针)
指针指向的区域必须实现分配
5.如果参数返回指针.参数就是双指针.
5.2. _stdcal _cdecl _fastcall
1.决定函数栈压栈的参数顺序.
2.决定函数栈的清空方式
3.决定了函数的名字转换方式.
6. far near huge指针
near 16位
far 32位
huge 综合
四.虚拟内存
问题:
一个程序不能访问另外一个程序的地址指向的空间;
理解:
1.每个程序的开始地址0x80084000
2.程序中使用的地址不是物理地址,而是逻辑地址。(虚拟地址)
逻辑地址仅仅是个编号,编号使用int4 季节整数表示。
每个程序提供了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)
如果是第一次运行,则返回没有映射的空闲空间首地址,
同时产生一个数据:指向地址.
sbrk与brk后台系统维护一个指针.
指针默认是null.
调用sbrk,判定指针是否是0,是:得到大块空闲空间的初始化首地址
否:返回指针,并且把指针位+size
int *p1=sbrk(4);//返回空闲地址,并修改指针为+size
brk(p1+3) 以sbrk的返回的指针为基准,将指针向前移动3个单位
brk(0) 返回sbrk指向的指针.
应用案例:
写一个程序查找1-10000之间所有的素数.
并且存放到缓冲,然后打印.
缓冲的实现使用sbrk/brk
流程:
循环
判定是否素数(isPrimer)
是:分配空间存放
否:继续下步
总结:
share_ptr
stl
new/delete
malloc/free
brk/sbrk
异常处理
int brk(void*)
void* sbrk(int)
如果成功 :brk返回0 sbrk返回一个指针
如果失败:brk返回-1 sbrk返回(void*)-1
unix函数错误,修改内部变量
errno
字符串函数
内存管理函数 malloc memset mamcmp memcpy ...
bzero
错误处理函数
标准IO函数
时间函数
类型转换函数
----------------------------------------------------------------------
----------------------------------------------------------------------