Long Time No Update

Chinglish title makes me relaxed. To make it short, I have a paper accepted by ANCS 2015, which proposes an application layer parser for SDN (named COPY), OK, not just for SDN. The major...

More

man-catching

原来一直对“反射”这个概念不清楚,听别人提起过很多次,也有vczh这样的大牛号称在C++里实现了反射,我也不知道具体指的是什么。今天在SOLID里遇到一个具体问题,跟HJK讨论了一下,发现原来这就是反射机制。 简单的说,反射就是让对象获取关于自身的信息(如对象类型),而不需要在编写代码的时候提前知道这些信息。比如说,我们有一个对象a,其类型是A。一般来说,我要对a进行操作,需要先声明一个A& a_pointer,然后再来做事情。但是假设我们这时候不知道A这个类型,或者这个类型的头文件并未被引用,就无法对a进行操作了。如果我们可以获得a的类型信息,比如TYPEOF(a)& a_pointer, 那么我们就无需知道a的具体类型,或者引用A类型的头文件了。 C++并不直接支持反射特性,但是上述的场景在OO语言中会经常出现。考虑一个常见的场景。假设有如下的两个派生类,都由Base类派生而来 / a_class.h class A : public Base { public: A() {} virtual ~A() {} virtual void Produce(Base** x) {*x = new A;} }; / b_class.h class B :...

More

MSRA Fellowship 2014 面试游记

从北京回来终于可以歇口气。结果我这口气还是先改了一早上SOLID框架,然后看了2篇paper后才歇出来。简单记录一下这次去MSRA参加“微软学者”奖学金面试的情况。 老板一开始把申请情况转发给我的时候,我还对这个奖学金一无所知,搜了搜发现是个牛逼的奖啊,不少现在的牛人都曾经得过这个奖(戳这里)。而且这个10000美刀的奖金也确实够微软的范。大喘气特别适合这种奖学金:“你这个奖学金有多少啊?”,“一万”,“哦···”,“美刀”,“嗷嗷哦嗷嗷嗷嗷嗷嗷嗷”。就是这种效果。 申请过程就不提了,吐槽一下XJTU真的是找不出其他人了,别的学校都各种校内评选才选出两个,我们这连报名的人都没凑齐。算一算自从微软学者奖学金降到每年只评选10个之后,XJTU还没人能进入final round,这是有多惨。 8月底收到了final round的邮件,说有27个finalist,需要准备presentation和Q&A,可是正好赶上Maipu测试和SOLID重构,快忙不过来了。不过MSRA的UR(University Relation)的同事很有意思,第一封邮件显然是群发的,但是都选了暗送,这样大家都不知道对方的背景。第二封邮件发了个reminder,结果搞成明送了,直接激起了我人肉狂魔的兴趣。于是用邮件名大概人肉了几个。人生立刻跌入了低谷。比如这位,这位,和这位。具体就不展开说了,总之就是在低谷里徘徊了一阵。 该去还是要去,大概准备了一下presentation,想了几个可能会被问到的问题,穿上wedding wear,高铁,走吧。 第一天过去帮老板跑了跑各种私人手续,晚上遇到了室友。本来我大概研究了一下估计是要和棒子一起住了,结果看了看是来自Singapore的,见到一问,哦,福建人。我天朝子民果然牛逼。聊了聊,做CV方向的,CV方向是真火,真的。 第二天参加面试,MW小朋友来接我们,中间才知道这是师妹,果然我们XJTU还是有人才的。吃了早饭,拍了几张照。话说很多人说MSRA的伙食很好,但是估计是因为我不是吃货,所以就感觉不错吧。食堂大概是这个样子。 往外面看的话,是这个样子。 接下来是分组,悲愤的被分到了下午倒数第几个,这就意味着一天好等。等待的人没啥事就聊呗,发挥social能力,展现西交风采。希望别被别人认为我是个喷货就行。难得见到一堆博士聚在一个屋子,大家从deadline开始谈起,谈到做实验,招学生,毕业,然后纷纷倒在发多少钱这个问题上。嗯,天下PhD是一家。 老板帮忙联系了XYQ老师,找过来聊了聊。Xiong老师提到之前申申请的时候毙掉了一个清华的学生,INFOCOM和ICNP长文各一篇。因为觉得他做的太理论了。我突然觉得代码没白写,或者说还是老板大腿粗。聊了几个idea,发现MSRA还是非常注重industry transferring的。记几个关键字,netmap,TCP estat等等吧。回头有空再仔细看看。另外Xiong老师还提到了之前面试一个学生,英文不太好,交流到一半只好换中文,这个埋下了深深的伏笔······· 中午回来吃晚饭,跟ZPF@NUS和一个韩国友人聊得很开心。韩国友人的口语让我信心倍增。 差不多就到我了,进去一通狂讲,反正Xiong老师说底下没有领域内专家,结果还是有点紧张,比平常讲的还是快了点。提问环节真是无与伦比,上来问project detail和privacy issue这个都想到了,回答的也没问题。后面问你这个代码都是你写的吗,你这个东西能跑40Gbps真的假的。这个就有点没话找话了。直到有一位女老师问,请问你在简历里写的Doujin是什么意思,然后又有一位男老师问,请问你以后是想做Research还是想做Industry····我觉得这个世界已经彻底跑偏了。总之都回答的不错吧。唯一的瑕疵是理论上是全英文的,结果我还是说了一点中文: We have built the system into two platforms, x八六 and Tilera·······我真的觉得x八六比x eight six要顺口好多!我第二天才反应过来··· 出来之后就轻松咯,继续闲聊。等饭。中间联系到了vczh大大和斯瑞大大,带着我参观了一圈development...

More

一个轻量级高性能日志类库的原型

Muduo网络库包含了一个轻量级的日志库,可达到超过100MB/s的本地文件写入速度。这个基本上已经达到SATA磁盘线速,满足实际应用中的需求。最近在SOLID系统的开发中,想借用Muduo的日志库来进行元数据(metadata)的输出,但是发现Muduo日志库并不支持同时向多文件进行写入:输出函数是全局的,所以输出行为(包括位置)是共享的;在异步日志类中也是共享了一个mutex。这些都导致Muduo日志库原生不支持多文件的输出。而在SOLID系统中,每种协议或者应用的输出格式是不一样的,放在一个文件显得杂乱而且数据库端也不好处理。 我首先尝试了修改Muduo本身:将输出函数变成Muduo::Logger类的成员而非全局,这样每次在使用LOG宏的时候就可以指定输出函数。然后将异步类中的mutex也搞成私有。后来发现核心问题在域LOG_INFO/LOG_ERROR这些宏实际上是生成了一个匿名的临时对象,这些对象的生命周期就在这条语句之后结束。通过析构函数的调用顺便可以进行文件flush等操作。这就要求修改后每次LOG_INFO时都要对输出函数进行重新赋值,这个开销还是有点大。同时在异步日志类中对mutex的依赖相当多,需要大量修改,还是决定重新造个轮子吧。 正好与Muduo网络库搭配的书到了,仔细研读了一下日志库的代码和相应章节,总结了Muduo可以做到磁盘线速写入的主要原因。 1. double-buffer结构,其实就是ping-pong结构。即前端(接收新日志)将日志写入BufferA中,后端(将日志输出到文件)不断的将BufferB中的日志写入文件,同时前端对BufferA做个判断,超过阈值大小就swap两个buffer,这样的好处是锁粒度相当小,前端只在swap的时候加锁,后端每次把BufferB转移到另一个临时变量后也可以释放锁。两个临界区的操作都是常数时间。这是Muduo高效的最主要原因。 2. 小细节。如时间格式化函数首先比较struct tm.tv_sec,相等的话就只修改tv_usec部分就好了,减少了很多格式化工作。时间部分的长度也是固定的,可以预先格式化等等。 按照以上设计概要,我简单实现了一个提供异步写入的日志类。这个类的对象生命周期可认为是永久,通过类型内部的线程进行持续的写入。简单结构如下。 class Log { private: FILE* file_; vstring name_; uint64_t now_size_; thread* thread_; void FormatTime(char t_time[]); void RollFile(); public: Log(vstring name) : name_(name), now_size_(0), now_buf_(), running_(false)...

(402) 692-7111