1. 背了一首诗

    题破山此后禅院 
            常建
清晨入古寺,初日照高林。
曲径通幽处,禅房花木深。
山光悦鸟性,潭影空人心。
万籁此俱寂,惟闻钟磬音。

2. 让无力者有力,让悲观者前行

1999南方周末主编寄语

3. java String.format vs MessageFormat.format

MeesageFormat由于是一个在提前分析的指定位置插入相应的值,性能要好于采用正则表达式查找占位符的String.format方法.

String.format("name=%s, age=%d", "hello", 25);
MessageFormat.format("name={1}, age={0}, {1}", 25, "hello");

4. css(flex -> grid)

  1. flex 布局系统,阮一峰
  2. grid 布局系统,阮一峰

flex 水平垂直居中, element-UI就是用 flex实现的布局。

.box {
    display: flex;
    flex-flow: row wrap;
    justify-content: center;
    align-content: center;
    height: 100%;
}

5. sudo vs su

  1. sudo = Super user do //超级用户do
  2. su = Shift user //切换用户

su命令是当前用户用来切换到另一个用户的命令,参数为用户名。 执行时会要求输入密码,这个密码是你要切换到的用户的密码。

注意,当你是root用户是,切换到本机的其他任何用户都是不需要输入密码的

6. mysql - pageCache

MySQL · 性能优化 · PageCache优化管理

  1. OS默认情况下, memory未超过上限时, 不会主动清理page cache,以求达到最高的文件读写效率
  2. 当需要较大的内存时,memory不足,OS会立即释放 page cache 来满足请求的内存。 但由于 page cache 释放比较耗时, 可能会引起性能抖动。
pageCache 诊断工具

1. vmtouch -v /file
2. vmtouch -e /file   # evict 释放
3. vmtouch -t /file   # touch 每个page读取一个字节, 迫使load到 page cache

7. CPU 时钟中断

实现队列的多种方式:

  1. 链表, 增删 O(n)
  2. 小根堆、红黑树, 增删 O(log n)
  3. 时间轮, 增删 O(1) // 整体上算O(1)

每个CPU核心都有一个定时器队列,linux采用的时间轮实现队列

8. java.io & java.nio

  1. java.io, 核心是 stream。 stream 就是长度不定的字节序列
    • inputStream, outputStream
    • 标准输入输出 System.in, System.out, System.error
    • BufferedOutputStream
    • ObjectOutputStream
    • PrintStream
  2. java.nio, 核心是 channel,buffer
    • nio (New IO or Non_Blocking IO)
    • nio更多用在网络编程上,普通的文件读写, 大家还是大多用java.io
    • Channel和Buffer独立开发,组合起来使用,这种设计思路应用的就是面向对象中“组合优于继承”的设计思想,通过组合来替代继承,避免了继承带来的组合爆炸问题
    • ServerSocketChannel用于服务器编程,可以使用accept()函数监听客户端(SocketChannel)的连接请求
    • java.nio中的Channel既可以读,也可以写,而java.io中的Stream要么只能读,要么只能写,这也是java.nio比java.io类少的另一个重要原因

Channel: Channel有两种运行模式:阻塞模式和非阻塞模式。

其中,FileChannel只支持阻塞模式。

DatagramChannel、SocketChannel、ServerSocketChannel支持阻塞和非阻塞两种模式,默认为阻塞模式。

我们可以调用configureBlocking(false)方法将其设置为非阻塞模式。 非阻塞Channel一般会配合Selector,用于实现多路复用I/O模型。

OS: 在操作系统层面,主要的I/O有:文件、网络、标准输入输出、管道。

文件是没有非阻塞模式的。毕竟文件不存在不可读和不可写的情况

网络、标准输入输出、管道都存在阻塞和非阻塞两种模式。

一般来讲,应用程序调用read()或write()函数读取或写入数据,数据会在应用程序缓冲区内核缓冲区I/O设备这三者之间拷贝传递。

Selector

在网络编程中,使用非阻塞模式,线程需要通过while循环,不停轮询调用read()、write()、accept()函数,查看是否有数据可读、是否可写、是否有客户端连接到来

多路复用I/O模型是网络编程中非常经典的一种I/O模型。 为了实现多路复用I/O模型,Unix提供了epoll库,Windows提供了iocp库,BSD提供了kequeue库

Java作为一种跨平台语言,对不同操作系统的实现方式进行了封装,提供了统一的Selector

我们可以将需要监听的Channel,调用register()函数,注册到Selector中Selector底层会通过轮询的方式,查看哪些Channel可读、可写、可连接等,并将其返回处理

在异步模式下,Channel不再注册到Selector,而是注册到操作系统内核中,由内核来通知某个Channel可读、可写或可连接java.nio收到通知之后,为了不阻塞主线程,会使用线程池去执行事先注册的回调函数