Lua 语言学习
Lua 是一个动态弱类型脚本语言,核心由 C 语言实现,执行效率高,可直接做 C / C++ 扩展。另外 Lua 另一个主流实现 Lua JIT 主要研究针对 Lua 的即时编译系统。
而 Lua 由于其高性能、小巧、简单、与 C 结合性好等特点,大量运用于游戏领域,而饥荒的实现以及扩展也基本使用 Lua 完成。
Lua 是一个动态弱类型脚本语言,核心由 C 语言实现,执行效率高,可直接做 C / C++ 扩展。另外 Lua 另一个主流实现 Lua JIT 主要研究针对 Lua 的即时编译系统。
而 Lua 由于其高性能、小巧、简单、与 C 结合性好等特点,大量运用于游戏领域,而饥荒的实现以及扩展也基本使用 Lua 完成。
在传输层中,主要学习三种协议
图中最左边的应用 tcpdump 直接使用数据链路层接口 BPF (BSD packet filter, BSD 分组过滤器) 或 Datalink provider interface (DLPI, 数据链路提供者接口) 进行通信。而其他应用都是用 API 所提供的 socket 或 XTI。当然在 Linux 上提供了 SOCK_PACKET
这种 socket 来访问数据链路。
接下来,将从一个使用 TCP 连接的获取时间的客户端开始。
Sorting something that you will never search is a complete waste; searching something you never sorted is merely inefficient.
— Brian Christian
我们假设对数组进行排序,数组的所有位置都有元素,且长度为 N。对于排序,假设元素存在 \(<\) 和 \(>\) 用以将输入按一致的次序放置,比较运算是除赋值运算外仅有的能对输入数据进行的操作。这种条件下的排序称之为 比较排序 (comparison-based sorting)。另外对于已经排序完成的数组,如果可以保持原本的数据次序我们称之为 稳定排序 (stable sorting)。
She made a hash of the proper names, to be sure.
— Grant Allen
如果可以将存储的数据,其中某一项用于查找,则这个项被称为 键 (key),而通过一定规则将键映射到表中的一个合适的单元,这个规则被称为 散列函数 (hash function)。我们希望 hash 足够简单且保证两个不同的 key 映射到不同的单元,但是单元是有限的,因此我们需要寻找一个 hash function 尽量均匀的产生 hash value。当映射不是单射而是多射时,即发生了 冲突 (collision),有两个不同的 key 经过 hash function 得到了相同的 hash value,我们应该处理这个 collision。
如果给定一个序列,你将如何在这个序列中查找一个给定元素 target,当找到时返回该元素的迭代器,否则返回末尾迭代器。首先排除时间复杂度 \(\mathcal{O}(N)\) 的朴素算法,这不是本文的重点。
I will, in fact, claim that the difference between a bad programmer and a good one is whether he considers his code or his data structures more important. Bad programmers worry about the code. Good programmers worry about data structures and their relationships.
— Linus Torvalds
首先我们需要复习一些在初高中可能学过的基础数学知识。
集合 (Set) 是基本的数学概念,指具体的某种性质的事物的总体,集合中的事物称之为 元素 (element)。
计算机中有很多独占 resource,在任一时刻它们只能被一个进程使用,因此 OS 需要授权一个进程临时地、排他地访问某一 resource 的能力。一般进程会排他性地访问若干资源,假设进程 A 在先使用扫描仪的情况请求蓝光光盘刻录机,而进程 B 在先使用蓝光光盘刻录机的情况下请求扫描仪,由于两个进程都占有一定 resouce 且不会释放,并且互相请求了对方的 Resource,而造成这两个进程无限阻塞下去,这样的状态被称为 死锁 (deadlock)。请不要单纯理解只有一台机器才会产生 deadlock,在多台机器同时访问局域网下的多个独占 resource 时也可能发生。
除了提供抽象外,操作系统还要控制计算机的所有 IO (输入/输出) 设备,必须向设备发送命令、捕获中断并处理设备的各种错误。它还应该在设备和其他部分之间提供简单且易于使用的接口,且这些接口应该尽可能的对所有设备都相同,即设备无关。