陈硕的 Blog

吾尝终日而思矣,不如须臾之所学也。吾尝跂而望矣,不如登高之博见也。……君子生非异也,善假于物也。

[置顶] 《Linux 多线程服务端编程:使用 muduo C++ 网络库》网上书店预订

摘要: 内容简介本书主要讲述采用现代 C++ 在 x86-64 Linux 上编写多线程 TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即 one loop per thread。这是在 Linux 下以 native 语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序。本书以 muduo 网络库为例,讲解这种编程模型的使用方法及注意事项。本书的宗旨是贵精不贵多。掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施。掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于 阅读全文

posted @ 2013-01-11 12:35 陈硕 阅读(7411) 评论(8) 推荐(4) 编辑

2024年8月25日

汉字激光照排小史

摘要: 本文大致按年代顺序回顾一下中文印刷,特别是现代汉字激光照排的历史。 阅读全文

posted @ 2024-08-25 08:08 陈硕 阅读(124) 评论(0) 推荐(0) 编辑

2024年7月13日

复刻王选教授 45 年前第一张汉字激光照排的报纸样张

摘要: 复刻王选教授 45 年前第一张汉字激光照排的报纸样张 45 年前的 1979 年 7 月,汉字激光照排之父,北大王选教授主持研制的华光 I 型原理性样机排出了第一张 8 开报纸样张(下图)。 我用 LaTeX 复刻了这个样张(图二): PDF 见 https://github.com/chenshuo/typeset/blob/master/wangx 阅读全文

posted @ 2024-07-13 10:32 陈硕 阅读(124) 评论(1) 推荐(2) 编辑

2023年5月18日

纪念陈皓(左耳朵耗子)

摘要: # 纪念陈皓(左耳朵耗子) 上周日晚上(2023-05-14,美国旧金山时间,下同)我从推特上看到[陈皓因突发心梗辞世](https://twitter.com/ghosTM55/status/1657946836643241985),第一反映是[不敢相信](https://twitter.com/ 阅读全文

posted @ 2023-05-18 12:10 陈硕 阅读(11126) 评论(16) 推荐(130) 编辑

2022年7月16日

Brendan Gregg《性能之巅》第 2 版推荐语

摘要: Brendan Gregg《性能之巅》第 2 版推荐语 应电子工业出版社编辑的邀请,我怀着忐忑的心情,斗胆写下这篇推荐语,以下是带链接的原稿。 阅读全文

posted @ 2022-07-16 02:34 陈硕 阅读(31579) 评论(2) 推荐(3) 编辑

2021年5月5日

Kernighan《UNIX 传奇:历史与回忆》杂感

摘要: 《Unix 传奇:历史与回忆》是 Brian W. Kernighan 2019 年的新作,我 2020 年 1 月购得,先通读了英文版,9 月份机缘巧合做了中译本的审校,逐字阅读了韩磊的译本,乘着记忆尚未褪去,写一篇书评兼读后感。 阅读全文

posted @ 2021-05-05 12:31 陈硕 阅读(6418) 评论(9) 推荐(13) 编辑

2014年12月3日

在 Boolan 网开讲《网络编程实战》课程

摘要: 《网络编程实战》是一门以讲解实例为主的课程,每一节都讲一两个网络编程的例子程序,课程偏重 Linux 服务端 TCP 网络编程。 本课程要求听课人员已经读过《Unix 网络编程》,能写简单的 TCP echo 服务。 课程地址:http://boolan.com/course/4 配套页面:http://chenshuo.com/pnp 阅读全文

posted @ 2014-12-03 01:47 陈硕 阅读(3784) 评论(0) 推荐(0) 编辑

2014年5月20日

C1000k 新思路:用户态 TCP/IP 协议栈

摘要: 现在的服务器支撑上百万个并发 TCP 连接已经不是新闻。实现 C1000k 的常规做法是调整内核参数,提高文件数,降低每个连接的内存消耗。 在今年的 BSDCan2014 会议上, Patrick Kelsey 介绍了把 FreeBSD 9.x 的 TCP/IP 协议栈移植到了用户态,并用于 WANProxy 项目。在用户态运行 TCP/IP 协议栈意味着并发 TCP 连接不再占用系统文件数,只占内存,解决了 C1000k 的一大瓶颈, 阅读全文

posted @ 2014-05-20 14:12 陈硕 阅读(9327) 评论(3) 推荐(4) 编辑

2013年11月1日

《Linux 多线程服务端编程:使用 muduo C++ 网络库》电子版上市

摘要: 《Linux 多线程服务端编程:使用 muduo C++ 网络库》 电子版已在京东和亚马逊上市销售。京东购买地址:http://e.jd.com/30149978.html亚马逊Kindle版:http://www.amazon.cn/dp/B00FF1XYJI京东阅读效果:PCiPad目前京东的阅读器没有切白边功能,值得改进。 阅读全文

posted @ 2013-11-01 10:36 陈硕 阅读(10148) 评论(1) 推荐(1) 编辑

2013年10月11日

C++面试中string类的一种正确简明的写法

摘要: 本文首发于酷壳网 http://coolshell.cn/articles/10478.html先说说程序员(应届生)面试的一般过程,一轮面试(面对一到两个面试官)一般是四、五十分钟,面试官会问两三个编程问题(通常是两大一小),因此留给每个编程题的时间只有 20 分钟。这 20 分钟不光是写代码,还要跟面试官讨论你的答案并解答提问,比如面试官拿过你的答案纸,问某一行代码如果修改会有什么后果。因此真正留给在纸上或白板上写代码的时间也就 10 分钟上下。本文给出了一个能用 10 分钟时间在纸上写出来且不会有错的 String class,强调正确性及易实现(白板上写也不会错),不强调效率与功能完备 阅读全文

posted @ 2013-10-11 10:57 陈硕 阅读(6358) 评论(1) 推荐(2) 编辑

2013年10月10日

读者来信与解答 1

摘要: 读者来信用黑色,我的回答用蓝色。经过整理,接近对话体。 > 陈硕,你好,>> 阅读了你的书,很有收获。> 但是没有在moduo的源代码里面找到实现线程模型11的例子。即one thread per loop + thread pool。> 谢谢。 书第 173 页图 6-14 下面的第一段话,具体改动方法参考前一页的 diff。 > 谢谢。>> 另外TcpConnection和Channe... 阅读全文

posted @ 2013-10-10 12:18 陈硕 阅读(2167) 评论(0) 推荐(0) 编辑

2013年9月9日

用条件变量实现事件等待器的正确与错误做法

摘要: TL;DR 如果你能一眼看出 https://gist.github.com/chenshuo/6430925 中的那 8 个 Waiter classes 哪些是对的哪些是错的,本文就不必看了。前几天,我发了一条微博 http://weibo.com/1701018393/A7FrW7ZVd ,质疑某本书对 Pthreads 条件变量的封装是错的,因为它没有把 mutex 的 lock()/unlock() 函数暴露出来,导致无法实用。后来大家讨论的分歧是这个 cond class 是不是通用的条件变量封装,还是只是一个特殊的“事件等待器”。作为事件等待器,其实现也是错的,因为存在丢失事件的 阅读全文

posted @ 2013-09-09 03:01 陈硕 阅读(3945) 评论(3) 推荐(1) 编辑

2013年8月28日

[转载]赖勇浩:推荐《Linux 多线程服务器端编程》

摘要: 推荐《Linux 多线程服务器端编程》赖勇浩(http://laiyonghao.com)最近,有一位朋友因为工作需要,需要从网游的客户端编程转向服务器端编程,找我推荐一本书。我推荐了《Linux 多线程服务器端编程——使用 muduo C++ 网络库》给他,他在网上书店看了以后问我为什么推荐这么厚一本书给他,正好这本书我已经早就看完了,一直也想写篇“书评”,就在这里多扯几句。其实实在算不上书评,原因有二:一是读书的时候囫囵吞枣,理解不够深刻,不深刻自然不能评;二是这几年虽然在 Linux 下写服务器端的网络程序,但很少用多线程,也很少用 C++,书里谈的东西,算是不熟悉的领域,自然也不能乱评 阅读全文

posted @ 2013-08-28 09:48 陈硕 阅读(2729) 评论(0) 推荐(1) 编辑

2013年8月18日

用muduo实现memcached协议的例子

摘要: 最近花了两天时间用 muduo 部分实现了 memcached 服务器协议,代码位于 examples/memcached/server,能通过 memcached 的大部分测试用例(incr/decr 还没有实现)。这不是 memcached 的替代品(它没有实现LRU和超时功能,也没有实现二进制协议,更没有自己管理内存),而是一个网络编程的示例(代码只有 1000 行,比 memcached 小很多),展示 muduo 风格的事件驱动编程,以及将来性能优化的试验品(换句话说,现在这个版本完全没有在性能上做出任何努力)。读过 memcached 代码的人可以对比这两种编程风格的区别,memc 阅读全文

posted @ 2013-08-18 12:59 陈硕 阅读(2314) 评论(0) 推荐(0) 编辑

2013年8月12日

近期微博吐槽言论存档,涉及“性能优化”、C++陋习等

摘要: 写C++程序的几个陋习:class 名以大写 C 开头,例如 CDate;成员变量以 m_ 开头;变量采用匈牙利命名法;不知道何时禁用 copy-ctor/assign operator。前三个可能是从MFC那里传下来的,当时C++、class、OO是新玩意儿,要与 C struct 区分,现在还这么做就土了。C++的成员变量可用特殊命名格式,加下划线后缀即可(加下划线前缀是错的)。但在 Java 里不必模仿 C++ 的这种成员变量命名方式,IDE 可以让成员变量以不同的颜色显示,与局部变量区分,根本无需特殊命名。写程序就怕把以前的编程经验不加区分地应用到新语言中,写成四不像,不地道。知道禁用 阅读全文

posted @ 2013-08-12 13:54 陈硕 阅读(5558) 评论(4) 推荐(4) 编辑

2013年7月17日

《Linux多线程服务端编程:使用muduo C++网络库》上市半年重印两次,总印数达到了9000册

摘要: 《Linux多线程服务端编程:使用muduo C++网络库》这本书自今年一月上市以来,半年之内已经重印两次(加上首印,一共是三次印刷),总印数达到了9000册,这在技术书里已经算是相当不错的成绩。以下谈一谈这本书的写作背景与内容取舍的原因。 阅读全文

posted @ 2013-07-17 11:18 陈硕 阅读(7433) 评论(12) 推荐(7) 编辑

2013年2月4日

用 LaTeX 排版编程技术书籍的一些个人经验

摘要: 陈硕多年之前我写过一篇书评《〈Word 排版艺术〉读后感——兼谈与 LATEX 的比较》,其中写道“如果将来有时间,我把自己用 LATEX 排书的经验总结一下,让读者在阅读《Word排版艺术》的基础上,更容易地把知识应用到 LATEX 排版中去。” 我自己排版了 《Linux 线程服务端编程:使用 muduo C++ 网络库》,现在终于可以把账还上了。本文假定读者已经读过 LATEX 的入门文档和书籍,具备基本的使用技能,这不是一篇入门教程。排版是一门大学问,我只是一名技术图书的作者,有一些初步的 LATEX 使用经验。我不是专家,出版印刷的行话也不怎么会说。本文的目的是让有志于用 LATEX 阅读全文

posted @ 2013-02-04 03:59 陈硕 阅读(2764) 评论(0) 推荐(1) 编辑

2013年1月28日

为什么多线程读写 shared_ptr 要加锁?

摘要: 陈硕(giantchen_AT_gmail_DOT_com)2012-01-28我在《Linux 多线程服务端编程:使用 muduo C++ 网络库》第 1.9 节“再论 shared_ptr 的线程安全”中写道:(shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr 的线程安全级别和内建类型、标准库容器、std::s 阅读全文

posted @ 2013-01-28 05:17 陈硕 阅读(12899) 评论(7) 推荐(9) 编辑

2013年1月20日

关于 std::set/std::map 的几个为什么

摘要: 尽管 C++ 标准没有强求 std::map 底层的数据结构,但是根据其规定的时间复杂度,现在所有的 STL 实现都采用平衡二叉树来实现 std::map,而且用的都是红黑树。本文对 STL 中红黑树(rb_tree)的实现问了几个稍微深入一点的问题,并给出了我的理解。 阅读全文

posted @ 2013-01-20 13:22 陈硕 阅读(7735) 评论(2) 推荐(9) 编辑

2013年1月13日

muduo多机协作网络编程示例一:单词计数及排序

摘要: 去年我写了《Muduo 网络编程示例》系列文章,这些文章已经收入《Linux 多线程服务端编程:使用 muduo C++ 网络库》一书。这些文章讲的基本都是运行在单机上的网络程序,每个例子都只有一个程序(第7.13节例外)。我接下来打算继续写几篇文章,谈一谈分布在多台机器上、协作发挥作用的网络编程例子。今天先讲第一个,单词计数及排序。单词计数(word count),顾名思义就是统计一个文本文件里边每个词出现了多少次。排序指的是按出现次数从多到少排序,也可以把问题改为“找出出现次数最多的1000个单词”。这个问题有三个层次,第一是输入文件比较小,能完全放入内存;第二是输入文件比较大,不能一次性 阅读全文

posted @ 2013-01-13 04:02 陈硕 阅读(2984) 评论(2) 推荐(1) 编辑

2012年12月17日

发布几个PDF小工具

摘要: 《Linux多线程服务端编程——使用muduo C++网络库》这本书是我自己用LaTeX排版的,在排版过程中也积累了一些小工具,今天把其中几个发布出来。这几个工具都直接基于开源的 iText 库,可从 http://itextpdf.com/ 下载。下载Groovy 版本位于 https://github.com/chenshuo/typeset/tree/master/toolsJava 版本位于 https://github.com/chenshuo/recipes/tree/master/java/pdf各个工具的输出示例位于 http://vdisk.weibo.com/s/kT4fL 阅读全文

posted @ 2012-12-17 12:59 陈硕 阅读(5067) 评论(2) 推荐(6) 编辑

2012年9月21日

新书预告:《Linux 多线程服务端编程——使用 muduo C++ 网络库》

摘要: 看完了 W. Richard Stevens 的传世经典《UNIX 网络编程》, 能照着例子用 Sockets API 编写 echo 服务, 却仍然对稍微复杂一点的网络编程任务感到无从下手? 书中示例代码把业务逻辑和 Sockets 调用混在一起,似乎不利于将来扩展?程序在本机测试正常,放到网络运行上就经常出现数据收不全的情况?TCP 协议真的有所谓的“粘包问题”吗?该如何设计打包拆包的协议?又该如何编码实现才不会掉到陷阱里?带外数据(OOB)、信号驱动IO这些高级特性到底有没有用?网络协议格式该怎么设计?发送 C struct 会有对齐方面的问题吗?对方不用 C/C++ 怎么通信? 将来服 阅读全文

posted @ 2012-09-21 07:17 陈硕 阅读(4312) 评论(8) 推荐(3) 编辑

2012年7月6日

从《C++ Primer 第四版》入手学习 C++

摘要: 学习C++只需要读一本大部头。 C++不是特性(features)最丰富的语言,却是最复杂的语言,诸多语言特性相互干扰,使其复杂度成倍增加。鉴于其学习难度和知识点之间的关联性,恐怕不能用“粗粗看看语法,就撸起袖子开干,边查Google边学习”这种方式来学习C++,那样很容易掉到陷阱里或养成坏的编程习惯。如果想成为专业C++开发者,全面而深入地了解这门复杂语言及其标准库,你需要一本系统而权威的书,这样的书必定会是一本八九百页的大部头。 阅读全文

posted @ 2012-07-06 09:02 陈硕 阅读(29023) 评论(21) 推荐(17) 编辑

2012年7月1日

《Muduo 网络库:现代非阻塞C++网络编程》演讲

摘要: 2012年6月30日下午将在深圳做《Muduo 网络库:现代非阻塞C++网络编程》演讲,这是PPT:http://www.slideshare.net/chenshuo/muduo-network-library演讲视频:http://v.youku.com/v_show/id_XNDIyNDc5MDMy.htmlhttp://youtu.be/YDnCAs894Bg活动介绍:http://ouropensource.51qiangzuo.com/ 阅读全文

posted @ 2012-07-01 23:54 陈硕 阅读(2494) 评论(1) 推荐(0) 编辑

2012年6月6日

发布一个适合服务端C++程序的高效日志库

摘要: PPT 见http://www.slideshare.net/chenshuo/efficient-logging-in-multithreaded-c-server/2012年6月30日在深圳的简短演讲:http://v.youku.com/v_show/id_XNDIyMjUwMDYw.htmlhttp://www.youtube.com/watch?v=KM_eQ6uRYdU代码位于 muduo 网络库中的 muduo/basehttps://github.com/chenshuo/muduomuduo 0.5.0 也包含了这个日志库http://code.google.com/p/mu 阅读全文

posted @ 2012-06-06 21:26 陈硕 阅读(3634) 评论(2) 推荐(0) 编辑

导航