您的位置:首页 > 编程语言

读书笔记----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)访问不存在的内存地址(指针为初始化)

#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])
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: