标签:连续 数据 函数 初始化 很多 hive 释放 简化 目标
本周学习第9章:
1.它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,高效的使用了主存
2.它为每个进程提供了一致的地址空间,从而简化了存储器管理
3.它保护了每个进程的地址空间不被其他进程破坏
1.物理寻址
计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址PA。根据物理地址寻址的是物理寻址。
2.虚拟寻址
使用虚拟寻址时,CPU通过生成一个虚拟地址VA来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址,相关硬件为存储器管理单元MMU。
3.地址翻译
把一个虚拟地址转换为物理地址的任务。需要CPU硬件和操作系统之间的紧密合作。
Linux为每个进程维持一个单独的虚拟地址空间:内核虚拟存储器和进程虚拟存储器。内核虚拟存储器包含内核中的代码和数据。
允许虚拟地址空间有间隙;内核不用记录那些不存在的页,这样的页也不用占用存储器
物理存储器——物理页PP,也叫页帧,大小也为P字节。
DRAM缓存的组织结构
1.不命中处罚很大
2.是全相联的——任何虚拟页都可以放在任何的物理页中。
3.替换算法精密
4.总是使用写回而不是直写。
页表:是一个数据结构,存放在物理存储器中,将虚拟页映射到物理页,就是一个页表条目的数组。
Linux缺页异常处理
MMU在试图翻译虚拟地址A时,触发缺页。这个异常导致控制转移到缺页处理程序,执行如下步骤:
缺页处理程序搜索区域结构链表。把A和每个区域的vm_start和vm_end做比较。如果不合法,触发段错误。
当fork函数被当前进程调用时:
内核为新进程创建内核数据结构,并分配给它唯一一个PID。
为新进程创建虚拟存储器。
具体的步骤如下:
删除已存在的用户区域。
映射私有区域。
映射共享区域。
设置程序计数器。
munmap函数删除虚拟存储器的区域 munmap()。
隐式分配器/垃圾收集器
Mark&Sweep垃圾收集器
C程序中常见的与存储器有关的错误
间接引用坏指针:scanf错误
读未初始化的存储器:假设堆存储器被初始化为0
允许栈缓冲区溢出:缓冲区溢出错误
假设指针和它们指向的对象是相同大小的
造成错位错误
引用指针,而不是它所指向的对象
误解指针运算
引用不存在的变量
引用空堆块中的数据
引起存储器泄露
段错误的几种典型有什么?如何解决?
解决:
在编程中以下几类做法容易导致段错误,基本上是错误地使用指针引起的。
1)访问系统数据区,尤其是往系统保护的内存地址写数据最常见就是给一个指针以0地址。
2)内存越界(数组越界,变量类型不一致等): 访问到不属于你的内存区域。
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.栈溢出
#include<stdio.h>
#include<stdlib.h>
void main()
{
main();
}
1.使用printf输出信息
这个是看似最简单但往往很多情况下十分有效的调试方式,也许可以说是程序员用的最多的调试方式。简单来说,就是在程序的重要代码附近加上像printf这类输出信息,这样可以跟踪并打印出段错误在代码中可能出现的位置。
为了方便使用这种方法,可以使用条件编译指令#ifdef DEBUG和#endif把printf函数包起来。这样在程序编译时,如果加上-DDEBUG参数就能查看调试信息;否则不加该参数就不会显示调试信息。
2.使用gcc和gdb
3.使用core文件和gdb
4.使用objdump
本周暂无代码调试问题
无
暂无
本次的内容是学习第九章,这周内容有点难理解,看完最后一节C程序中常见的与存储器有关的错误,看完之后觉得似曾相识,之前编程过程中就遇到很多类似的问题,每次都不知道是社么原因导致的,直接复制错误信息,搜索然后解决,现在大致能弄懂是什么原因引起的错误了。下次编代码遇到类似的错误时就能够更好的解决这些问题。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第四周 | 12/12 | 1/1 | 20/20 | |
第五周 | 271/283 | 1/2 | 15/15 | |
第6周 | 276/283 | 2/3 | 18/18 | |
第7周 | 150/283 | 4/4 | 21/23 | |
第8周 | 294/283 | 4/4 | 24/27 | |
第9周 | 289/283 | 4/4 | 29/23 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:23小时
实际学习时间:29小时
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
# 2017-2018-1 20155232 《信息安全系统设计基础》第十一周学习总结
标签:连续 数据 函数 初始化 很多 hive 释放 简化 目标
原文地址:http://www.cnblogs.com/lsqsjsj/p/7966523.html