DongHao: 12 2011存档

2011年读书

| | Comments (0) | TrackBacks (0)
一年一度的读书回顾时间又到了,今年读书数量创新低,因为我愈发觉得生活中有很多东西比读书重要得多,比如陪家人聊聊天,比如出去走走呼吸呼吸pm2.5的空气,比如看看kernel代码,比如加班查查bug....呵呵,开个玩笑

个人觉得:

最回肠荡气的 —— 《静静的顿河》

整整四本,我三个月才细细看完
草原的哥萨克们,经历了世界大战,经历了内战,终于厌倦了同胞相残的可怕日子,于是扔掉枪扔掉子弹,回到家,认命似的接受了统治。原文”反正谁统治都一样”,“谁统治都比打仗好“。
做为一部前苏联三十年代的热门小说,我真的很奇怪这么一部反战名著,这么一部相对写实(当然,写实性不能跟《古拉格群岛》相比,但比《钢铁是怎样炼成的》要真实多了),这么一部连当时苏联红军抢哥萨克农民粮食都敢写的小说,是怎么在那个高压的年代出版并风行的?还获得了“斯大林文学奖”?
奇迹,只能说是奇迹


最精彩最吸引我的 —— 《三体》系列

第一部很有悬念,但人物塑造偏单薄;第二部人物饱满多了,主角不再是作者以前爱写的那种“高大全”的英雄形象,变得更加真实更加细腻;第三部,以我这点水平,无法再多说,一句话——绝了!


最盛名难符的 —— 《卢比孔河》

梁文道先生推荐汤姆.霍兰的历史小说,于是我就借了这本书看,看完才发觉简直是流水帐,没有任何人物描写和历史分析,只有走马观花和泛泛而谈,既不深入也不精彩,它是怎么在豆瓣上获得8.6分的?与此相比,我在kindle上看的电子书《罗马英雄传--西庇阿》《汉尼拔的军事生涯》要比它精彩得多



几个月前朱照远同学向我提过一个epoll的疑似bug:

1. 创建一个socket(sfd)并connect到某个server
2. 创建 epoll_create(efd)
3. 将socket的描述符sfd加入efd,  采用ET模式
4. 调用epoll_wait将返回一个EPOLLOUT事件(因为连接成功了)

以上是正常的,但是,此时如果从server来了一个消息, epoll_wait将会返回一个event,这个event包含了EPOLLIN和EPOLLOUT
“照理说”,既然采用了ET模式,EPOLLOUT上次已经出现了,不应该再出现,但是它被EPOLLIN事件给“带出来”了

这看上去似乎像个问题,但似乎也可以理解为epoll的一个特性,所以,保险起见,我发了个邮件给 linux-api 和 linux-netdev 说明了一下这个事儿,希望能得到权威回答。
不久就有两位回邮件了,其中一位是 Eric Dumazet(从git log里看,他提交了很多kernel network方面的patch,应该是很有发言权的),说得很明白:

"Its not true. Same "status" can be delivered several time.

Think about Edge and Level trigger. An event (change of status) is the
trigger.

As soon as on trigger is done, epoll delivers a status.

And your file status is indeed EPOLLOUT | EPOLLIN, since you can read or
write on it.
....
Not a bug, but a misinterpretation of what is an event and what is a
status.​"


看来正确的理解是:ET模式只保证在边缘条件出现时(上面的例子是从不可读变为可读)从epoll_wait里返回,但不保证fd的event里只有“从不可读变为可读”带来的EPOLLIN。毕竟epoll_wait返回的event是指fd的“状态”,既然这个fd可写可读,那么包含EPOLLIN和EPOLLOUT就不能被认为是有错。