0%

一、默认方法

1.1 总论

这是 CPP 与 Java 的OOP 最不同的地方。对于 Java ,基本上是没有默认的行为的,因为所有的对象其实都是指针,所以只有被定义过的方法会用到,而没有被定义过的方法,我们一点也不担心它会在什么其他地方出现,比如:

Student cnx;					// 我们不担心 cnx 内部是怎样的,因为这个就是一个指针
Student qs = cnx;				// 我们不担心 qs 与 cnx 的关系,因为只不过是对象指针的赋值,而跟实际的两个 Student 没有关系
System.out.println(qs);			// 我们不担心 qs 的字符串化,因为来自 Object 类
classroom.answerQuestion(qs)	// 我们不担心 qs 到底是怎么传入的,因为我们知道传入的就是一个指针
...
end of execution				// 我们不关心 qs 和 cnx 的释放,因为都是 JVM 负责的
```​

但是对于 CPP 来说,这些就都是问题了。


```cpp
Student cnx;					// 真的定义了一个 Student 对象,里面的内存情况是啥样的?
Student qs = cnx;				// 真的将一个对象复制给了另一个对象,那么是怎么复制的?
string s = qs;					// 发生了类型转换,这么多的类型,都是怎么转换的?
answerQuestion(qs)				// 我传进去的到底是个什么,我可以修改它吗?
...
end of execution				// 谁来释放 cnx 和 qs,没有人管一下吗?

可以看到正是因为 CPP 提供了强大的功能,导致在我们没有给我们的类进行任何设计的时候,给人的感觉就是完全不知道会发生什么?当然程序不会有任何二义性的东西存在,它一定会按照一定的规则去执行的。只不过这个规则被 CPP 隐藏起来了,导致我们入门的时候对于各种东西都十分迷茫。

Read more »

一、二义性和无义性

我们都知道程序是接受不了二义性的,当一条语句可以有两个执行结果的时候,那么程序就会接受不了。但是我们常常忽略“无义性”,这是我取得概念,意思是这条语句的执行结果是不确定的,这种不确定不是说结果不确定,比如 C 里面局部变量刚声明的时候值也是不确定的,但是没关系,而是说执行的规则是不确定的,那么就是不可以的。

但是由于 CPP 高度的自由性,所以他希望所有的规则都是使用者来制定,但是这种自定义规则制定前,也必然是存在一定的规则的,但是这个规则需要我们自己去了解。


二、声明、定义、初始化

Read more »

一、Shell 相关知识

1.1 外部命令与内建命令

我认为 shell 其实可以看作由一个字符串处理的前端加一个调用其他文件的后端组成。前端将用户输入的字符串进行解析,然后将解析的结果传给后端,让后端去调用其他文件。这里的文件指的是“外部命令”。之所以叫这个名字,正是因为外部命令的功能实现并不在 shell 之内。正是因为 shell 不需要实现外部命令,所以这次大作业的难度并不高。相对应的内部命令,其功能的实现是在 shell 之内的(也就是需要在 shell 的代码中实现),幸好大作业并不要求实现内部命令。

关于一个命令是内部命令还是外部命令,可以用 type 命令查看,比如输入

type cd
Read more »

一、总论

1.1 直观理解

Unit2 的问题以电梯作为题目背景出题,刚做题的时候很容易就把这个单元的任务当成了处理多线程,当我全部完成这些作业以后,发现仅仅将 U2 概括为多线程,是一个十分片面的直观理解。

我觉得应该这么理解,U2 要完成的东西有(当然可以不完成):

  • 多线程设计:这比原来的处理多线程要难一些,处理多线程类似于能跑就行了,但是多线程设计偏向于跑的好,除了比较基础的生产者消费者模型,如果能再次基础上应用 Furture 、Balk、Work-Thread 等模式,可以做到一个更好的优化,此外,限制线程的种类,优化资源管理,这些东西都要比“抄一个多线程模型”要难很多。
  • 面向对象设计:面向对象是一种管理代码的方式,只有代码量激增的时候,面向对象对代码的管理能力才能超越面向过程。因此这个其实是一个可选项,因为如果采用一些思路的话,代码量很少,只有采用及其牛逼的调度器策略的时候,才有代码量激增的情况。
  • 数据结构设计:这是这次新题目的新难题,因为虽然题还是那个题,但是原来只有一栋楼,现在是 15 栋楼或者是 50 个坐标,总之如何处理这些请求的位置,就成了一个难题。我个人做的就极其繁复,会把每一层每一个方向单独作为一个集合,但是其实把所有请求不加分类的放进一个一维的集合中,似乎可维护性和可拓展性都会强很多。
  • 运筹:这回的题目最大的特点就是优化是永无止境的,而且是没有方向的,我们只知道一件事:我们不知道怎么优化。电梯调度算法其实是一个研究很深的问题,在运筹学上专门有一章去讲这个,似乎叫“电梯群控理论”。我翻了一些论文,感觉不仅我不知道怎么优化,似乎写论文的人也不知道怎么优化。但是估计他们也有ddl,所以估计应付应付就交了。
Read more »

综述

之所以在介绍 C++ 的文章里 C 语言,是因为 C++ 确实脱胎于 C,所以很多语法现象都是和 C 保持一致的。


运算符优先级

虽然盲目的整理过会就忘,但是还是有很多可以记住的东西

Read more »

这是一次对于 MOS 内存管理的钻牛角尖梳理,在梳理过程中诞生了一些奇怪的东西。

kseg0 的第一性映射

操作系统的代码不是 C 就是汇编。所以我们从一开始就在使用虚拟空间了。但是很有意思的是,我们为什么可以?我们在一开始的时候没有内存控制块,也没有页表结构。所以我们到底是怎么完成映射的?

其实就是对于 kseg0,只要我们往里面写东西,那么内容就会直接写到高位抹零后对应的物理地址上。这种映射是第一性的,也就是说,即使我一直不建立内存控制块,一直不建立页表结构,只要我用链接器把代码放到了 kseg0,那么这种关系依然是成立的。我写的每一段代码,操作的每一个数据,都是直接写到物理内存中的,不走 MMU,不查页表。这是一切的本源。

关于 kseg1 的情况,其实应该是书里写错了,采用的映射关系其实不是抹掉高 3 位以后映射到物理地址,而是映射到了设备总线。只有这样,才可以避免 kseg0 和 kseg1 的不同的虚拟页面映射到同一个物理页框。不同的虚拟页面确实可以映射到同一个物理页框,但是这意味着这两个虚拟页面的内容应该是相同的,但是显然这两个段内容显然不是相同的,所以两个段必然不能遵守书中的规则。

Read more »