读书笔记----c专家编程(第七章)
2014-02-09 22:18
176 查看
1.CPU寄存器--cache存储器(高速缓冲存储器,位于cpu和主存储器之间)--内存--磁盘--磁带 访问速度降低 容量上升
2.所有的进程都共享一个机器的物理内存,都有一个自己的地址空间(虚拟地址空间),当内存用完时就用磁盘保存,所以,在进程运行时,数据是在磁盘和内存之间来回移动的,
3.虚拟内存:它允许多个进程运行于较小的物理内存中。虚拟内存通过“页”的形式组织。页:操作系统在磁盘和内存之间移来移去或进行保护的单位,一般为几k字节。虚拟内存=(通过映射)物理内存+部分磁盘空间,详见图7-3.
4.如果一个进程处于就绪状态(不会马上运行,优先级较低)或者睡眠状态,操作系统可以暂时取回所分配给它的物理内存资源,将该进程的所有信息都备份到磁盘上,这样,这个进程就被“换出”。而在磁盘中有一个特殊的“交换区”,用于保存从内存中换出的进程。一般交换区的大小为物理内存的几倍。
5.cache存储器:当数据从内存读入时(写数据到内存中),整“行”(一般为16或32个字节)的数据被装入cache,如果程序有良好的地址引用局部性,那么CPU以后对邻近数据的引用就可以从快速的cache读取,而不用从缓慢的内存中读取,cache操作的速度与系统的周期时间相同。CPU对内存的读取与写入操作都要经过cache,如果cpu需要从一个特定地址提取数据时,这个请求首先交给cache,如果数据已经存在于cache中,他就可以立即被提取,否则,cache向内存传递这个请求,进行缓慢的访问内存操作,内存读取的数据以行为单位,在读取的同时也装入cache中。
6.数据的拷贝:mencpy的速度明显快于strcpy或者for循环。(与cache存储器有关)
7.堆:堆中的所有东西都是匿名的----不能按名字直接访问,只能通过指针间接访问,也就是在分配内存后,要定义一个指针指向它才能进行访问。一般申请内存用malloc,或者calloc,后者在返回指针之前先把分配好的内存的内容都清空为零。
堆会出现的问题:释放或者改写仍在使用的内存(内存损坏) 为释放已分配的内存(内存泄漏)
检测内存泄漏的方法:用swap命令查看磁盘的交换区时候在减少。 查看进程ps -ef 的SZ选项,查看是否一直在增大。
8.信号就是一种事件通知或是一个软件中断
9.对齐:就是数据项(如4个字节对其,4个字节就是数据项)只能存储在地址是数据项大小的整数倍的内存位置上。例如:访问一个8字节的double数据时,地址值允许是8的整数倍,所以一个double数据可以存储与地址24、8008或32768,但是不能存储于地址1006(不能被8整除)。
10.段错误:就是MMU异常所导致的。段错误其实本质就是core dump
导致段错误的原因(指针与越界):
(1)访问不存在的内存地址(指针为初始化)
(2)访问系统保护的内存地址
(3)访问只读的内存地址
(4)改写(overwrite)错误:越过数组边界写入数据,在动态分配的内存两端之外写入数据如:p = malloc(256); p[-1] = 0; p [256] = 0; (正确的是p[0]---p[255])
2.所有的进程都共享一个机器的物理内存,都有一个自己的地址空间(虚拟地址空间),当内存用完时就用磁盘保存,所以,在进程运行时,数据是在磁盘和内存之间来回移动的,
3.虚拟内存:它允许多个进程运行于较小的物理内存中。虚拟内存通过“页”的形式组织。页:操作系统在磁盘和内存之间移来移去或进行保护的单位,一般为几k字节。虚拟内存=(通过映射)物理内存+部分磁盘空间,详见图7-3.
4.如果一个进程处于就绪状态(不会马上运行,优先级较低)或者睡眠状态,操作系统可以暂时取回所分配给它的物理内存资源,将该进程的所有信息都备份到磁盘上,这样,这个进程就被“换出”。而在磁盘中有一个特殊的“交换区”,用于保存从内存中换出的进程。一般交换区的大小为物理内存的几倍。
5.cache存储器:当数据从内存读入时(写数据到内存中),整“行”(一般为16或32个字节)的数据被装入cache,如果程序有良好的地址引用局部性,那么CPU以后对邻近数据的引用就可以从快速的cache读取,而不用从缓慢的内存中读取,cache操作的速度与系统的周期时间相同。CPU对内存的读取与写入操作都要经过cache,如果cpu需要从一个特定地址提取数据时,这个请求首先交给cache,如果数据已经存在于cache中,他就可以立即被提取,否则,cache向内存传递这个请求,进行缓慢的访问内存操作,内存读取的数据以行为单位,在读取的同时也装入cache中。
6.数据的拷贝:mencpy的速度明显快于strcpy或者for循环。(与cache存储器有关)
7.堆:堆中的所有东西都是匿名的----不能按名字直接访问,只能通过指针间接访问,也就是在分配内存后,要定义一个指针指向它才能进行访问。一般申请内存用malloc,或者calloc,后者在返回指针之前先把分配好的内存的内容都清空为零。
堆会出现的问题:释放或者改写仍在使用的内存(内存损坏) 为释放已分配的内存(内存泄漏)
检测内存泄漏的方法:用swap命令查看磁盘的交换区时候在减少。 查看进程ps -ef 的SZ选项,查看是否一直在增大。
8.信号就是一种事件通知或是一个软件中断
9.对齐:就是数据项(如4个字节对其,4个字节就是数据项)只能存储在地址是数据项大小的整数倍的内存位置上。例如:访问一个8字节的double数据时,地址值允许是8的整数倍,所以一个double数据可以存储与地址24、8008或32768,但是不能存储于地址1006(不能被8整除)。
10.段错误:就是MMU异常所导致的。段错误其实本质就是core dump
导致段错误的原因(指针与越界):
(1)访问不存在的内存地址(指针为初始化)
#include<stdio.h> #include<stdlib.h> void main() { int *ptr = NULL; *ptr = 0; }
(2)访问系统保护的内存地址
#include<stdio.h> #include<stdlib.h> void main() { int *ptr = (int *)0; *ptr = 100; }
(3)访问只读的内存地址
#include<stdio.h> #include<stdlib.h> #include<string.h> void main() { char *ptr = "test"; strcpy(ptr, "TEST"); }
(4)改写(overwrite)错误:越过数组边界写入数据,在动态分配的内存两端之外写入数据如:p = malloc(256); p[-1] = 0; p [256] = 0; (正确的是p[0]---p[255])
相关文章推荐
- C专家编程 读书笔记
- 读书笔记---c专家编程(第六章)
- C专家编程-读书笔记之第三章
- 【编程珠玑】读书笔记 第七章 粗略估计
- C专家编程读书笔记-类型转换
- 读书笔记之:C专家编程
- 【读书笔记】c专家编程
- [读书笔记]C专家编程
- C专家编程:第七章:对内存的思考
- c专家编程3、4章读书笔记
- c语言专家编程,读书笔记
- Java编程思想 第七章读书笔记
- NO.2开始写读书笔记,第一本C专家编程
- C专家编程——读书笔记
- c语言专家编程,读书笔记
- 数据结构编程笔记二十三:第七章 图 关键路径算法的实现
- 读书笔记之编程之魂(与27位编程语言创始人对话)
- Thing King” 和“页面游戏 (摘录 C专家编程)------MMU的理解
- 编程之美---动态规划:从新手到专家(关于动态规划算法最精彩的中文描述,没有之一)
- SQlite数据库的C编程接口(一) 简介 ——《Using SQlite》读书笔记