UNIX编程课堂笔记
UNIX编程课堂笔记
一.课程定位
1/3就业.
奠定程序基础
二.学习方法
效果:先做,后理解.
方法:练习.50-200行代码
三.课程结构
Bash脚本语言(系统管理,安装部署脚本)
内存管理
文件管理
IO操作(Curses字符界面)
进程创建
进程通信
线程
线程的同步与异步
信号
socket编程
QT图形界面
Pro*c/c++
UML与OOA&D
GTK+
XML的处理与解析
Web Service
Corba
Tuxedo
项目:数据采集
网络爬虫
聊天程序
四.内存管理.
Unix/Linux系统的内存管理brk/sbrk/mmap/munmap
C的内存管理方式malloc/calloc/realloc/free
C++的内存管理方式new new[] delete/delete[] new()
STL
智能指针
1.查看Unix/Linux的内存的结构.
a.任何一个程序在系统中被管理的时候使用唯一的ID标示
进程ID. pid_t getpid()
#include <unistd.h>
System V
BSD
Posix(Linux/)
b.man 分8节
2:系统函数调用
3:C函数调用
7:综合函数调用
实验:
目的:查看程序的内存结构
ps aue
pstree
top
在系统有一个目录/proc/${pid}/ 进程管理目录
cat maps 查看进程的内存结构.
代码内存空间
全局内存空间(全局栈)
局部内存空间(局部栈)
自由内存空间(堆)
2.用户变量存放在哪些内存空间?
auto/static
register/valitile
const
restrict 函数的指针参数
mutable/const成员变量
explicit修饰构造器(禁止构造器作为类型转换)
3.查看栈数据的特点.
全局栈从小到大
局部栈从大到小
堆空间不要越界访问.
malloc/calloc/realloc/free 自己在内部维护着一个链表数据结构.
struct
{
用户申请的数据空间 4 1
上次分配的空间地址 4 2
下次分配空间地址 4 3
本空间大小 4 4
}
4.new怎么分配的,与malloc有什么区别
new =malloc (new 分配完毕调用构造器)
delete=free (delete释放之前调用析构器)
delete[] 与delete 都释放一次,但delete[]多次调用析构函数
delete调用一次.
技巧,回避调用构造器来产生对象.
///////////////////////////////////////////////////////////
总结:
1.能否查看某个进程的ID.
a.getpid
b.ps aue
c.top
d.pstree
2.了解/proc目录作用以及maps文件的饿内容.
3.知道程序的4个内存区域的作用.
4.了解常用数据变量存放的区域
5.malloc/new工作的过程:后台维护一个数据结构管理内存
越界访问,因为容易破坏后台结构,导致malloc/free new/delete无法正常工作
6.new/malloc区别free/delete的区别,delete 与delete[]的区别
///////////////////////////////////////////////////////////
5.Linux低层提供内存分配方式
内存地址其实不是物理地址. 是虚拟地址.
计算机使用4字节表示内存地址.4G.4G的地址根本不存在.
虚拟地址:地址本身不具备意义,只有与某个物理内存映射后,地址才有意义.
虚拟地址可以映射到内存/磁盘文件/网卡/键盘/扫描仪.
一个地址要合法使用满足两个条件.
a.地址有物理映射(段错误)(能访问)
b.地址要被分配(数据不安全)(合法访问) new malloc
保护模式:
平面内存:
5.1.得到虚拟空间的空闲地址
sbrk/brk
得到没有映射空闲虚拟地址。
分配与释放空间
sbrk函数说明
void *sbrk(intptr_t size);
参数:分配的空间的大小.
返回:分配空间的首地址.
如果空间大小是0,直接返回空闲地址,不分配空间
5.2.试验:
使用sbrk返回一个空闲地址,察看是否映射?
5.3.使用sbrk分配空间
sbrk参数不能为0;
5.4.空间映射的基本单位4K=4094字节。--页(page)
映射的空间至少是pagesize*X
size_t getpagesize();
5.5.使用brk函数分配空间/释放空间
int brk(void *ptr)
参数:指定内存的结束地址。
ptr>当前空闲(sbrk(0)获取)地址,分配空间
ptr<当前空闲(sbrk(0)获取)地址,释放空间
当一个page被释放,则page被自动解除映射
总结:
1.brk/sbrk是内存分配释放函数
2.使用brk/sbrk得到空闲首地址
3.使用brk/sbrk分配释放内存
4.什么时候需要使用brk/sbrk(大块的连续内存)
6.Linux提供更加底层的内存分配
mmap分配空间/映射内存空间 分配尺寸至少是4K的倍数。
((4字节/4K)+1)*4k
munmap释放空间,并且解除映射
函数说明:
void * mmap(
void *ptr,//指定从什么地址开始映射。必须是页首,而且没有被映射的.可以使用sbrk(0)来获取
//如果是NULL,系统来确定开始位置.
size_t size,//分配空间大小,建议是pagesize的倍数
int prot,//分配空间的访问模式.
//PROT_READ | PROT_WRITE |PROT_NONE |PROT_EXECUTE
int flags,//映射方式:
// 共享还是私有MAP_SHARED MAP_PRIVATE
// 内存映射还是文件映射MAP_ANONMOUS
int fd, //这个参数在没有MAP_ANONMOUS的时候有效,否则无效
offset_t off);
返回值:分配失败,返回0,NULL ,否则空间首地址。
int munmap(void*,size_t);
试验:
使用mmap分配空间 。
1.学习使用mmap分配,munmap释放
2.体会PROT_READ|PROT_WRITE的作用
MAP_SHARED|MAP_PRIVATE
3.映射必须是一个页
4.释放的大小与规律
总结:
1.使用mmap分配空间。
2.RPOT_WRITE PROT_READ PROT_EXECUTE作用
3.释放空间的规律
4.分配的开始位置可以指定.
sbrk/brk与mmap不要混杂使用。
回顾:
1.使用brk/sbrk(大块内存/无权限考虑)
2.使用mmap/munmap (大块内存/有权限考虑)
3.两组内存分配函数的区别,以及new/malloc的区别。
作业:
1.
输入随便多个数或者指定个数的整数,使用brk/mmap申请内存存放输入数。
输入完毕,把素数与合数分开分别打印出来。
2.
找出10000之内所有相邻素数。
思考:
1。声明函数指针变量.
2。函数指针类型转换.
3。函数指针赋值.
*4。函数是怎么传递参数的,尤其是指针参数以及C++的引用?
1.zip 压缩文件名 目录/*
评论暂时关闭