生成可执行文件的过程
要想深刻理解从源代码到可执行文件的过程,那就去实现一个编译系统,实现一个简易版的即可。也许我后面有机会去做这个事情,但不知道会不会有这个空闲了
i++ 和 ++i 的区别
i++ 本身并不立即自增,返回值为 i 本身的原始值。++i 本身立即自增,返回值为 i + 1
类型转换
防止隐式类型转换带来的不确定性,显示转换带来的精度丢失问题
变量和常量
数据类型定义字节大小,变量名是内存地址的别名,存储实际数据。这个内存地址是存储实际数据的起始地址,而数据类型的字节大小就表明从这个起始地址开始读取的字节大小,这样就能够找到对应存储的实际数据,不会多读,也不会少读
宏定义和宏函数
主要就是谈一谈宏定义和宏函数容易出错的地方,由于只是单纯的文本替换,且不支持和调试,导致在写代码期间是无法排查的,这就需要我们能够知道哪些地方容易出错,好在后续使用过程中不容易犯错
策略模式
在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代码
第五章:文件系统
文件系统这一章没有前面几章易读,个人在学习过程中没有感觉到乐趣,也不知道是不是文件系统本身无趣,还是作者的写作内容需要改进呢?
第四章:并发
同一进程下的多线程共享内存地址,对同一块内存地址的读不会引发数据竞争,但是修改会引发数据竞争。常用的办法是加锁保护临界区或保证修改的动作是原子的
第三章:内存虚拟化
当我们描述地址空间时,所描述的是操作系统提供给运行程序的抽象。程序不在物理地址 0~16KB 的内存中,而是加载在任意的物理地址。当操作系统这样做时,我们说操作系统在虚拟化内存,因为运行的程序自认为它被加载到特定地址(例如 0)的内存中,并且具有非常大的地址空间
第二章:CPU虚拟化
作者用分配桃子举例说明虚拟化,为了让这个例子更加合理,我们假定拿到桃子的人并不食用,仅是占有就心满意足了(当我后面谈食用或品尝也只是占有的意思,享用完之后就会归还)。每个小朋友(进程)都希望得到一个完整的桃子,可现实情况是篮筐中只有一个桃子,我需要为这个篮筐遮上一层布,“欺骗”小朋友这里面有很多很多的桃子(虚拟化),好让他们齐聚于此。我对每个伸手要桃子的小朋友说,你手里现在已经被分配一个完整的桃子,等你真正想要占有实体的时候我会具体的分配到你的手里。每个小朋友不可能一口吃掉这颗桃,等他需要品尝的时候,我就用小刀切割一块他所需的桃子交到他手里面(这是实际分配的,至于允诺的其它部分的桃子由于他暂时没有申请,视为我的可调用资源),给他慢慢享用。这样,其它小朋友来请求吃桃子的时候,我依旧能够满足他们的需求,因为我还有可调用资源。只要我不让他们看到这块布之后的桃子数量,他们永远都以为自己占有一个桃子
18910111214