Expert C Programming 总结(四)

 

 1. 80386在80286的基础上增加了两种新的地址模式:32位的保护模式和虚拟的8086模式。

 

 2. 今天,计算机系统结构的真正挑战不在于内存的容量,而是内存的速度。


 3. 虚拟内存只是对多层存储进行扩充,使用磁盘而不是主存来保存进行进程的映像,所以说他们是同一种策略。


 4. SunOS中的进程执行于32位地址空间。操作系统负责具体细节,使每个进程都以为自己拥有整个地址空间的独家访问权。这个幻觉是通过“虚拟内存”实现的。所有进程共享机器的物理内存,当内存用完时就用磁盘保存数据。当进程运行时,数据在磁盘和内存之间来回移动。内存管理硬件负责把虚拟地址翻译为物理地址,并让一个进程始终运行于系统的真正的内存中。应用程序员只看到虚拟地址,并不知道哦自己的进程在磁盘和内存之间来回的切换。


 5. 虚拟内存通过“页”的形式组织。页就是操作系统在磁盘和内存之间移来移去或者进行保护的单位,一般为几K字节。

 

 6. 在一台机器中,交换区的大小一般是物理内存的几倍。只有用户进程才会被换进换出。SunOS内核常驻于内存中。


 7. 所有的虚拟内存操作都是出于同样的设计哲学,就是把文件区域映射到内存区域中。这可以提高性能,并允许可观的代码复用。


 8. 对于编写应用程序的程序员而言,Cache和虚拟内存都是透明的。


 9. 堆区域用于动态分配的存储,也就是通过malloc函数获得内存的,并通过指针访问。堆中的所有东西都是匿名的——不能按照名字直接访问,只能通关过指针间接访问。从堆中获取内存的唯一办法就是通过调用malloc等库函数。realloc函数改变一个指针所指向的内存块的大小,既可以将其扩大,也可以把它缩小,它经常把内存拷贝到别的地方然后将指向的新地址的指针返回给你。


  10. 被分配的内存总是经过对齐,以适合机器上最大尺寸的原子访问,一个malloc请求申请的内存大小为方便起见,一般被整为2的乘方。回收的内存可供重新使用。


 11. c程序在使用malloc()和free()时不得不非常的慎重。堆经常会出现两种类型的问题:

      。  释放或改写仍在使用的内存(内存损坏)

      。 未释放不再使用的内存(内存泄漏)


 12. 当离开调用函数alloca的函数时,它所分配的内存就会被自动释放。


 13. 内存泄漏的主要可见症状就是罪魁进程的速度会减慢。

 

  14.  操作系统内核同时动态管理它的内存使用。内核中的许多数据表是动态分配的,所以预先没有固定的限制。如果一个内核程序错误引起内存泄漏,机器的速度就会 慢下来,有时候机器干脆挂起或甚至不知所措。


  15. 总线错误:事实上,总线错误几乎都是由于未对齐的读或者写引起的。它之所以称为总线错误,是因为出现未对齐的内存访问请求时,被堵塞的组件就是地址总线。


 16. 在Sun的硬件中,段错误是由于MMU的异常所所致。而该异常则通常是由于解除引用一个未初始化或者非法值的指针引起的。如果指针引用一个并不位于你的地址空间中的地址,操作系统便会对此进行干涉。


17. 千万不要在一个条件操作符内嵌套另一个条件操作符。如果这样做了,很快就会发现要想明白代码的确切意思可不是件容易ide事情。 


 18. 通常导致段错误的几个直接原因:

   1. 引用一个包含非法值的指针。

   2. 引用一个空指针。

   3. 在未得到正确的权限时进行访问。例如,试图往一个只读文本段中写。

  4. 用完了堆栈或堆空间。


 19. 总线错误意味着CPU对进程引用内存的一些做法不满,而段错误则是MMU对进程引用内存的一些情况发出抱怨。


 20 . 最终可能导致段错误的常见的编程错误是:1. 坏指针值错误。2. 改写(overwrite)错误。3. 指针释放引起的错误。


 21. 注意:系统并不支持在信号处理程序内部调用库函数(除非严格符合标准所限制的条件)。 






 












你可能感兴趣的:(编程,c,cache,存储,sun,磁盘)