技术笔记
工程实践、系统设计、编程语言和技术原理的长期笔记。
-
访问 NULL 指针错误背后的原理
前言 说到 NULL 指针大家都是谈之色变,第一印象就是 NullPointerException, Segmentation fault 之类的错误。NULL 指针大部分情况下会导致程序被终止。但是其实严格来说,访问空指针会产生不可预料的结果。只不过大部分情况是程序被终止。为什么呢?接下来让我们来...
-
对抽象类与接口的一点思考
前言 之前写了一篇文章 [简洁代码之道(1):用多态替代条件语句][1],有人问实现多态的时候为什么用抽象类而不是接口。当时写文章的时候并没有想到这个问题。后来仔细想想,这的确是个值得探讨的问题。多态可以用抽象类或者接口实现,重点是应该用哪个?更大问题是,接口和抽象类有什么本质的区别?下面我们将讨论...
-
简洁代码之道(2):避免全局可变状态
前言 本文是我看了 [谷歌简洁代码演讲系列][1] 中的 [全局状态与单例模式][2] 之后的总结。本文的主题是:避免全局可变状态。下面我们将围绕几个问题开展讨论:什么是全局状态 如何设计好的单例模式 如何设计好的 API 全局状态 什么是全局状态 Talk is cheap, show me t...
-
简洁代码之道(1):用多态替代条件语句
前言 本文是我看了 [谷歌简洁代码演讲系列][1] 中的 [多态和条件语句][2] 的总结。大部分的条件语句是可以用多态代替的,本文将围绕以下问题开展: 为什么要用多态替代条件语句 多态和条件语句的使用场景 如何用多态代替条件语句 在哪里决定要创建什么子类 什么情况下使用多态 为什么要用多态替代条件...
-
控制反转(IoC)与依赖注入(DI)
前言 最近在学习 Spring 框架,它的核心就是 IoC 容器。要掌握 Spring 框架,就必须要理解控制反转的思想以及依赖注入的实现方式。下面,我们将围绕下面几个问题来探讨控制反转与依赖注入的关系以及在 Spring 中如何应用。 什么是控制反转?什么是依赖注入?它们之间有什么关系?如何在 Spring 框...
-
Linux 内存寻址之分页机制
在上一篇文章[Linux 内存寻址之分段机制][1]中,我们了解逻辑地址通过分段机制转换为线性地址的过程。下面,我们就来看看更加重要和复杂的分页机制。 分页机制在段机制之后进行,以完成线性—物理地址的转换过程。段机制把逻辑地址转换为线性地址,分页机制进一步把该线性地址再转换为物理地址。硬件中的分页 ...
-
Linux 内存寻址之分段机制
前言 最近在学习 Linux 内核,读到《深入理解 Linux 内核》的内存寻址一章。原本以为自己对分段分页机制已经理解了,结果发现其实是一知半解。于是,查找了很多资料,最终理顺了内存寻址的知识。现在把我的理解记录下来,希望对内核学习者有一定帮助,也希望大家指出错误之处。 分段到底是怎么回事 相信学过操作系...
-
ucore 实验之操作系统启动流程
前言 本文基于 ucore 操作系统实验,简要分析操作系统的启动流程。ucore 操作系统是清华大学用于操作系统教学实验的 OS,参考了 MIT 的 JOS,哈佛的 OS161 以及 Linux 系统。我们可以通过这个迷你操作系统在代码层面上理解操作系统的思想。 [ucore labs][1] wa...
-
Linux 平台下阅读源码的工具
前言 看源代码是一个程序员必须经历的事情,也是可以提升能力的一个捷径。个人认为:要完全掌握一个软件的方法只有阅读源码 在 Windows 下有 sourceinsight 这个源码阅读软件 (虽然我没用过,但是网上评价还不错),由于我是个 Linuxer,并不喜欢用 Windows,所以自然是选择在 Linux 下...
-
spice 源码分析之 server(1)
前言:本文是结合我自己阅读代码的心得总结而来,同时会忽略很多细节,只能作为阅读源码时的参考。如有错误,欢迎指正。Spice 简介 Spice 是一个开源的云计算解决方案,使客户端能显示远程虚拟主机的操作界面并且使用其设备,如键盘,鼠标,声音等。Spice 给用户提供了一种如同操作本地机器一样的体验,同时...