`
kmplayer
  • 浏览: 509003 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

第七章 对内存的思考

阅读更多
1,8086内存地址的形成经过:取得段寄存器的值,左移4位,加上16位的偏移地址(段内地址)。
在Microsoft C中,fan关键字表示指针存储了段寄存器的内容和偏移地址。
near关键字表示指针只存储16位的偏移地址,它的段地址使用当前数据或堆栈段寄存器中的值。

2,虚拟内存只是对多层存储进行扩充,使用磁盘而不是主存来保存运行进程的映像。

3,虚拟内存通过“页”的形式组织。页是操作系统在磁盘和内存之间转移或进行保护的基本单位。

4,换出:如果一个进程不会马上运行,操作系统可以暂时取回所有分配给它的物理内存资源,将相关信息备份到磁盘上。
在磁盘中有一个特殊的“交换区”,用于保存从内存中换出的进程。大小一般是物理内存的几倍。

5,进程只能操作位于物理内存中的页面。
当进程引用一个不在物理内存中的页面时,MMU就会产生一个页错误。内核对此事件做出响应,并判断该引用是否有效。
如果无效,内核向进程发出一个“segmentation violation”信号。
如果有效,内核从磁盘中取回该页换入到内存中。一旦页面进入内存,进程便被解锁,可以重新运行。

所有对内存的读取和写入操作都要经过Cache。当处理器需要从一个特定的地址提取数据时,这个请求首先递交给Cache。
如果数据已经存在于Cache中,它就立即被提取。
否则,Cache向内存传递这个请求,就要进行缓慢的访问内存操作。读取也是以行为单位,读取的同时也装入到Cache中。

6,堆经常会出现两种类型的问题:
(1)释放或改写仍在使用的内存。(“内存损坏”)
(2)未释放不再使用的内存。(“内存泄露”)

7,总线错误:
几乎都是由于未对齐的读或写引起的。
(1)之所以称为总线错误,是因为出现未对齐的内存访问请求时,被堵塞的组件就是地址总线。
(2)对齐的意思是数据项只能存储在地址是数据项大小的整数倍的内存位置上。
这样做可以极大的简化如Cache控制器和内存管理单元这样的硬件。
即:“数据项不能跨越页面或Cache边界”

8,段错误
引发:指针引用一个并不位于自己地址空间中的地址。

导致段错误的常见编程错误:
(1)坏指针值错误:
在指针赋值之前就用来引用内存。
对指针进行释放后,又访问它。
(2)改写错误:
越过数组边界写入数据或在动态分配的内存两端写入数据等。
(3)指针释放:
释放同一个内存块两次
释放一个未曾使用malloc分配的内存(无效指针)
释放仍在使用的内存

9,使用setjmp/longjmp从信号中恢复
#include <stdio.h>
#include <setjmp.h>
#include <signal.h>

jmp_buf buf;
void handler(int s)
{
	if(s==SIGINT) printf("now get a SIGINT signal\n");
	longjmp(buf,1);
}
int main()
{
	signal(SIGINT, handler);
	if(setjmp(buf))
	{
		printf("back in main\n");
		return 0;
	}
	else
		printf("first time through\n");
	loop:
		goto loop;
}

注:setjmp和longjmp使得程序难以调试和理解,如果不是出于特殊需要,最好避免使用它们。

10,捕获段错误信号的处理程序
#include <stdio.h>
#include <signal.h>
void handler(int s)
{
	if(s==SIGBUS) printf("now get a bus error signal\n");
	if(s==SIGSEGV) printf("now get a segmentation violation signal\n");
	if(s==SIGILL) printf("now get an illegal instruction signal\n");
	exit(1);
}
int main()
{
	int *p=NULL;	
	signal(SIGBUS, handler);
	signal(SIGSEGV,handler);
	signal(SIGILL,handler);
	*p=0;
	return 0;
}
分享到:
评论

相关推荐

    密码编码学第五章课后思考题答案

    ### 密码编码学第五章课后思考题答案解析 #### 题目背景与概述 本章节讨论了密码学中的重要概念和技术,包括但不限于密码算法的安全性评估、硬件与软件实现考虑因素以及AES(高级加密标准)算法的核心组件之一——...

    像程序员一样思考.pdf

    第3到7章是书中的主体部分,分别探讨了用数组、指针和动态内存、类、递归和代码复用来解决问题的途径和实际应用。最后,第8章从培养程序员思维的角度,进行了总结和概括,告诉读者如何才能像程序员一样思考。

    像程序员一样思考

    第3到7章是本书的主体部分,分别探讨了用数组、指针和动态内存、类、递归和代码复用来解决问题的途径和实际应用。最后,第8章从培养程序员思维的角度,进行了总结和概括,告诉读者如何才能像程序员一样思考。 《像...

    Java语言程序设计与数据结构(基础篇)第7章课后习题代码chapter7.rar

    本压缩包"Java语言程序设计与数据结构(基础篇)第7章课后习题代码chapter7.rar"聚焦于Java的基础知识,特别是与数据结构相关的编程实践。数据结构是计算机科学中的核心概念,它关乎如何有效地存储和组织数据,以便...

    微型计算机原理作业第六章习题与思考题.doc

    《微型计算机原理作业第六章习题与思考题》主要涵盖了微机系统中断系统、可编程控制器8259A的功能、中断向量表的作用及构建,以及8259A中断系统的初始化编程等内容。以下是对这些知识点的详细阐述: 1. **中断系统...

    微机原理与接口技术第三章答案

    第三章可能会详细阐述这些概念及其对性能的影响。 5. **中断系统**:中断是微处理器处理外部事件的一种机制,它可以暂停当前任务,响应紧急事件,然后返回原来的任务。这一章可能涉及中断的分类、中断处理过程以及...

    通信原理基础

    第七章至第十一章是专题论述,技术难度比较高,看书时要积极思考。特别是第七章“内存管理”,读了并不表示懂了,懂了并不表示就能正确使用。有一位同事看了第七章后觉得“野指针”写得不错,与我切磋了一把。可是过...

    C语言第五章习题参考答案

    以下是对第五章习题参考答案的详细解析。 1. **循环**:在C语言中,循环是程序重复执行特定任务的关键结构。第五章可能包含for、while和do-while循环的练习。for循环常用于已知循环次数的情况,while和do-while则...

    C++大学教程第二版12-24章答案

    3. **动态内存管理**:第16章可能讲解了指针、动态内存分配与释放,这是C++中必不可少的一部分。理解new和delete运算符以及如何避免内存泄漏至关重要。 4. **模板和泛型编程**:第17章会介绍模板,包括函数模板和类...

    Java程序设计与数据结构第九章习题答案

    在Java程序设计与数据结构的学习过程中,第九章通常会涵盖数据结构的重要概念和应用,包括数组、链表、栈、队列、树等基础数据结构,以及如何利用这些数据结构来解决问题。本资源提供了第九章的习题答案,旨在帮助...

    像程序员一样思考,完整扫描版

    第3到7章是书中的主体部分,分别探讨了用数组、指针和动态内存、类、递归和代码复用来解决问题的途径和实际应用。最后,第8章从培养程序员思维的角度,进行了总结和概括,告诉读者如何才能像程序员一样思考。

    《像程序员一样思考》(Think Like a Programmer )扫描版[PDF]

    第3到7章是本书的主体部分,分别探讨了用数组、指针和动态内存、类、递归和代码复用来解决问题的途径和实际应用。最后第8章从培养程序员思维的角度,进行了总结和概括,告诉读者如何才能像程序员一样思考。

    互联网金融基础第7章习题-课后思考(答案与解析).docx

    ### 互联网金融基础第7章知识点详解 #### 一、云计算的五大特征 1. **按需自助服务**:用户可以随时根据需求自行配置资源,如服务器和存储空间,无需与供应商进行人工交互即可实现资源的自动分配。 2. **通过...

    c语言程序设计现代方法第5章习题

    第五章习题是学习者巩固和深化C语言基础知识的重要环节。本章主要涵盖的内容可能包括函数、指针、数组、结构体以及内存管理等核心概念。 1. **函数**:在C语言中,函数是代码组织的基本单元,可以重复使用并执行...

    华清远见嵌入式linux应用程序开发技术详解下载(内部资料).rar

    第7章 进程控制开发   7.1 Linux下进程概述  7.2 Linux进程控制编程   7.3 Linux守护进程   7.4 实验内容   本章小结   思考与练习  第8章 进程间通信   8.1 Linux下进程间通信概述   8.2 ...

    操作系统(内存管理)

    文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半...

    深入.NET第二章的上机

    在"第二章上机"这个文件中,你将找到与这些知识点相关的实例代码,通过实际操作和修改代码,你将加深对.NET基础知识的理解,并提高编程技能。记得在实践中不断思考和探索,这是成为一名熟练的.NET开发者的重要步骤。

Global site tag (gtag.js) - Google Analytics