3.Netty from the ground up

Netty 组件:

  • Bootstrap / ServerBootstrap
  • EventLoop
  • EventLoopGroup
  • ChannelPipeline
  • Channel
  • Future / ChannelFuture
  • ChannelInitializer
  • ChannelHandler

接下来将会在本章对上面组件进行介绍,为了避免分散地介绍它们,我们将详细说明它们是如何在一起工作的。

Read more

1.Netty and Java NIO APIs

本章内容主要介绍:

  • Netty 架构
  • 我们为什么需要非阻塞IO
  • 阻塞IO vs 非阻塞IO
  • 了解 JDK 的 NIO实现的问题和 Netty 的解决方法

前面关于 Netty 架构的省略。

异步的设计

整个 Netty 的 API 都是异步的。异步处理并不新鲜,已经出现有一段时间了。在这些年里,IO 经常出现瓶颈,所以异步处理变得越来越重要。

在使用资源时调用异步处理可以变得更有效率,因为当任务进行时,我们可以去干其他事,直到我们收到任务完成的信息。

Read more

Netty's Hello World

Netty 官网

可以到官网下载,也可以直接使用 maven 依赖:

1
2
3
4
5
6
7
8
<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.30.Final</version>
<scope>compile</scope>
</dependency>
</dependencies>
Read more

linux

启动流程

POST -> BIOS(Boot Sequence) -> MBR(bootloader,446) -> Kernel -> initrd -> (ROOTFS)/sbin/init(/etc/inittab)

BIOS自检 -> 从BIOS中读取启动顺序 -> 读取MBR中的bootloader -> 加载内核 -> 读取伪根 -> 读取根文件中的init

文件系统

Linux 中,一切资源皆文件。比如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或是目录都被看作是一个文件。

Read more

《算法导论》笔记3-9

中位数和顺序统计

期望为线性时间的选择算法

这里的随机划分使用了快速排序中的随机版。

1
2
3
4
5
6
7
8
9
10
11
randomized_select(A, low, high, index)
if low == high
return A[low]
mid = randomized_partition(A, low, high)
leftRange = mid - low + 1
if index == leftRange
return A[mid]
elif index < leftRange
return randomized_select(A, low, mid - 1, index)
else
return randomized_select(A, mid + 1, high, index - leftRange)

《算法导论》笔记2-8

线性时间排序

计数排序

计数排序假设 n 个输入元素中的每一个都是在 0 到 max 区间内的一个整数。(max 是数组里最大的数字)

基本思想:对每个输入元素 x,确定小于 x 的元素个数。利用这一信息,就可以直接把 x 放到它的输出数组中的位置了。例如如果有 17 个元素小于 x,则 x 就应该在第 18 个输出位置上。当有几个元素相同时,这一方案就要稍作修改,因为不能把它们放在同一输出位置。

假设输入数组是 A[0 … n],那么我们还需要两个数组:B[0 … n] 输出数组,C[0 … max] 临时数组。

Read more

《Head First 设计模式》笔记10

代理模式(Proxy)

为另一个对象提供一个替身或占位符以控制对这个对象的访问。

栗子

还记得上一个笔记中的糖果机吧,现在产品经理想要一份写着糖果机位置、库存和当前的状态报告。

是不是挺简单的?赶紧写代码。

Read more

《Head First 设计模式》笔记9

状态模式(State)

允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

栗子

现在有一台糖果机,它的状态(挺复杂的):

  • 没有 25 分钱 -> 投入 25 分钱 -> 有 25 分钱
  • 有 25 分钱 -> 转动曲柄 -> 售出糖果(数量不为0) | 糖果售罄(数量为0)
  • 有 25 分钱 -> 退钱按钮 -> 退出 25 分钱
  • 售出糖果 -> 没有 25 分钱

从上面的状态实现代码的步骤:

  1. 找出所有状态 -> 共四种:没有 25 分钱、有 25 分钱、售出糖果、糖果售罄。
  2. 创建一个持有当前状态的实例变量 state。
  3. 写出所有可能发生的动作判断。
Read more