标签:buffer 一周 第四周 动态 更新 返回 信息安全系统 数组 博客
虚拟存储器的另一个称呼是虚拟内存。
当电脑内运行的程序占用太多内存时,操作系统会将一部分硬盘存储空间用作内存,以缓解内存的紧张。
因为使用部分硬盘空间做内存,各个进程的地址空间不用被修改或删除,各进程的地址空间由此得到保护。
正因为各进程的地址空间未被破坏,存储器可以给每个进程提供完全一致的地址空间,存储器的管理得到简化。
计算机最自然的寻址方式是物理寻址,即CPU直接通过物理地址访问主存。
虚拟寻址则是CPU生成一个虚拟地址,虚拟地址通过地址翻译转换成对应的物理地址,再通过生成的物理地址访问主存。
地址翻译需要CPU硬件与操作系统之间的密切配合才可实现。
CPU芯片上有一个称作内存管理单元的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表内容由操作系统来管理。
存储器映射是指把芯片中或芯片外的FLASH,RAM,外设,BOOTBLOCK等进行统一编址。即用地址来表示对象。
由于各个硬件是由厂家生产制造的,所有设备的地址在生产结束后就被确定下来,用户只能使用地址而不能修改地址。
一个简单的存储器映射:内存单元A的地址为X,把它映射到地址Y,这样访问Y时,就可以访问到A了。当然,访问原来的地址X,也可以访问到A。
动态存储分配,即指在目标程序或操作系统运行阶段动态地为源程序中的量分配存储空间,动态存储分配包括栈式或堆两种分配方式。
动态存储分配方式是不一次性将整个程序装入到主存中。可根据执行的需要,部分地动态装入。同时,在装入主存的程序不执行时,系统可以收回该程序所占据的主存空间。
动态存储分配方式在存储空间的分配和释放上,表现得十分灵活,现代的操作系统常采用这种存储方式。
首次适应算法
算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。
此算法都是从低地址开始找,空间分配之后剩下很多的小碎片,增加寻找可用空闲分区的开销。
循环首次适应算法
从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。
此算法很难产生较大的可用空闲分区。
最佳适应算法
将空闲分区链中的空闲分区按照空闲分区由小到大的顺序排序,从而形成空闲分区链。每次从链首进行查找合适的空闲分区为作业分配内存,这样每次找到的空闲分区是和作业大小最接近的,所谓“最佳”。
此算法产生大量难以利用的外部碎片。
最坏适应算法
将空闲分区链的分区按照从大到小的顺序排序形成空闲分区链,每次查找时只要看第一个空闲分区是否满足即可。
当一个小作业占用大空间时,大作业就没有可用空间。
快速适应算法
将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表,这样,系统中存在多个空闲分区链表,同时在内存中设立一张管理索引表,该表的每一个表项对应了一种空闲分区类型,并记录了该类型空闲分区链表表头的指针。
五种算法当中最吃硬件处理能力的算法,而且此算法是看进程给分区的,不方便大的多进程程序正常运行。
计算机的垃圾通常是指不用的空间或分区,垃圾收集器是一种动态存储分配器,自动释放程序已经不再需要的已分配空间和资源。
C语言中与存储器有关的错误经常是在据错误源一段距离才表现出来。
假设指针和它们指向的对象是相同大小的
例子来自课本:
int **makeArray1(int n, int m)
{
int i;
int **A = (int **)malloc(n * sizeof(int));
for(i = 0; i < n; i++)
A[i] = (int *)malloc(m * sizeof(int));
return A;
}
这里有个明显的错误,就是在第四行程序中,将sizeof(int*) 写成了sizeof(int)。这段代码只有在int和指向int的指针大小相同的机器上不会出错。但在64位的机器上就会出现隐患。错位(Off-by-one)错误
例子来自课本:
int **makeArray2(int n, int m)
{
int i;
int **A = (int **)malloc(n * sizeof(int *));
for(i = 0; i <= n; i++)
A[i] = (int *)malloc(m * sizeof(int));
return A;
}
第4行代码创建了一个n个元素的指针数组,但在第6,7行试图初始化这个数组的n+1个元素,这就会导致覆盖掉A数组后面的某个存储器。错误理解操作符的优先级和结合性
就像数学四则运算当中不知道先加减还是先乘除一样,对指针p指向的整数减一操作错误编写成:
*p--;
正确写法是:
(*p)--;
引起存储器泄露
如果对一块内存分配之后,忘记了释放这个已分配的内存块,就是产生内存泄露问题。
问题2:来自打开虚拟机过程。昨日经过下午大约两小时的更新,我的电脑终于可以使用了。但是在打开虚拟机的时候,虚拟机提示我不能打开虚拟机。
问题2解决方案:根据查找来的资料提示,我新下载了最新版本的VB虚拟机,删除旧的版本,现在虚拟机能用了。个人猜测,旧的虚拟机不能用是因为Win10在更新过程中,将C盘内存储与虚拟机相关的信息修改了,旧虚拟机没有办法找到执行路径,因此就不能打开安装有的虚拟机。安装新版本的虚拟机之后,新的虚拟机知道原来的虚拟机文件的位置,能执行。
B. N
C. NN
D NN*N
正确答案是C,而我选D,因为我认为步长和循环个数有关。但是这个想法和课本描述相悖。
A. USB
B .PCI
C .网卡
D .图形卡
正确答案: B 我的答案: C
网卡是工作在链路层的网络组件,不和CPU和主存直接相连,不属于I/O设备。
- [20155207](博客链接)
- 结对学习内容
- 实验四合作部分
- 第九章第7、8节
本章课程提到了数据结构堆和链表,还有数据结构图和树没有出现。我现在就很好奇,计算机系统当中哪一部分是会用到图结构,哪一部分会用到树结构。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 31/31 | 1/1 | 20/20 | |
第三周 | 24/55 | 2/3 | 24/44 | 知道浮点数怎么储存的 |
第四周 | 177/328 | 2/5 | 17/61 | 现在我的C语言程序也会在Linux命令行下使用了:*) |
第五周 | 54/382 | 2/7 | 18/79 | 复习一遍汇编语言 |
第七周 | 2360/2722 | 1/8 | 12/91 | |
第八周 | 624/3344 | 2/10 | 19/110 | 了解多线程和多进程 |
第九周 | 1112/4456 | 3/13 | 15/125 | 学习怎么实现pwd命令 |
第十一周 | 157/4613 | 2/15 | 10/135 | 在紧急情况下恢复不可使用的虚拟机 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:12小时
实际学习时间:10小时
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
2017-2018-1 20155223 《信息安全系统设计基础》第11周学习总结
标签:buffer 一周 第四周 动态 更新 返回 信息安全系统 数组 博客
原文地址:http://www.cnblogs.com/battlefieldheros/p/7955455.html