reactor & proactor

标准定义

两种I/O多路复用模式:Reactor 和 Proactor

一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的 read/write 事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。

两个与事件分离器有关的模式是Reactor和Proactor。Reactor 模式采用同步 IO,而 Proactor 采用异步 IO。

在 Reactor 中,事件分离器负责等待文件描述符或 socket 为读写操作准备就绪,然后将就绪事件传递给对应的处理器,最后由处理器负责完成实际的读写工作。

而在 Proactor 模式中,处理器–或者兼任处理器的事件分离器,只负责发起异步读写操作。IO 操作本身由操作系统来完成。传递给操作系统的参数需要包括用户定义的数据缓冲区地址和数据大小,操作系统才能从中得到写出操作所需数据,或写入从 socket 读到的数据。事件分离器捕获 IO 操作完成事件,然后将事件传递给对应处理器。比如,在 windows 上,处理器发起一个异步 IO 操作,再由事件分离器等待 IOCompletion 事件。典型的异步模式实现,都建立在操作系统支持异步 API 的基础之上,我们将这种实现称为“系统级”异步或“真”异步,因为应用程序完全依赖操作系统执行真正的IO工作。

查看更多

cppcon2020 Back to basics: The Abstract Machine

什么是 C++ Abstract Machine

“The C++ Abstract machine is a portable abstraction of your operating system, kernel and hardware. The abstract machine is the intermediary between your c++ program and the system that it is run on.”

C++ defines how programs work in terms of an abstract machine deliberately defined to be “close to the hardware”.

When we write c++ code, we are writing to the c++ abstract machine.

Structure

Memory

查看更多

在知乎上删掉的保研经历

本科是帝都211,数字媒体技术专业(偏通信专业)。
从大一下开始对编程产生了浓郁的兴趣,最开始的时候是自学c语言,当时快速学完了语法,以致于学校的c语言课都没怎么听过,考试轻松过。
大一暑假接触前端,当时对于编程了解尚浅,所以更喜欢可视化的东西。跟着慕课网的课程看,也算是对前端有了初步的了解。
大二课业繁重,加上大一成绩也不算特别好,就开始专心学习专业课(包括数电模电信号等课),最终得到了一个还不错的绩点,但是这段时间内对于编程的学习也就断断续续了。寒假期间陪女朋友学车的时候在驾校的咖啡厅看完了整套的邓俊辉数据结构,算是入了门,但是具体的代码也没有实践过。大二下学期由于要和做大创,又对unity浅尝辄止,算是了解了点面向对象的思想。
之后参加了学校ACM集训,暑假在学校呆了一个月,每天刷题(虽然都是些简单题),倒也算是把基本的数据结构熟悉了,也锻炼了编程思维。同时又学了一些机器学习,看了《机器学习基石》系列教程,还有CS231n(当然仍然浅尝辄止)。大二下本想转专业去计科,后权衡再三,没有转。
大三上。
身边的大佬师哥拿到了很好的offer,交谈中其实很是振奋,觉得一直自学下去其实也是可行的,故决心放弃绩点专心刷计算机基础课,期间简略看完CSAPP,看了大半部SICP,刷了算法橙书,计算机网络(自顶向下),并且坚持ACM训练,6级考了577。有幸参加了两次ACM区域赛,均打铁(不过还是不甘)。
寒假决定找工作,匆忙间看了李航的《统计学习方法》,一刷了《王道数据结构》和《剑指offer》。又知道自己基础薄弱,开始看操作系统,这门课起初学起来十分吃力,前后换了很多教程和课本,最终靠孙志岗老师的教程初步了解了操作系统。期间还看了点java和javaweb,跟着教程完成了小的项目。可以说那段时间是慌乱和迷茫的,知道自己很差却只能拼了命地弥补。

大三下继续ACM训练和计算机专业课的学习,先是看了东南徐立臻老师的《数据库》教程。又在一阵慌乱中继续着算法的训练。参加过春招(内推),打击过大,遂放弃(电话面试一问三不知,一点b-树都没有),还得感谢师哥模拟面试,虽然我最后砸的不行。决意考研,和女票一起考南大软件。在正式复习考研前,参加acm邀请赛,意外拿了银牌,算是一个很大的惊喜,可能是“杨超越附体”了。
考研专业课有四门(数据结构,操作系统,计算机网络和软件工程)。从5月底到9月中旬,就是充实的考研复习阶段了。期间专业课至少过了2遍,数据结构的算法题应该都刷了不止一遍,基本的题目应该是很熟悉了。南软的软件工程专业课让我收获颇丰,一是面向对象的思想,二是一个中型系统项目对自己的启发。软件工程这门课包括了uml和一些设计模式和面向对象的知识,课程设置独树一帜。

考研复习期间还做过php和java的项目。php项目算是学了设计模式之后的一次练兵,算是自己第一次不跟着教程写项目,对于代码不断进行重构,成就感max。

然后转机来了,机缘巧合,本不该进入保研圈的我因为之前得到的奖和相对较高的绩点幸运保研,真实的幸运,感激地一塌糊涂!!

查看更多

词法分析

1556345446610

标识符是一个大的集合。

记号的数据结构定义

1
2
3
4
5
6
7
8
9
10
11
12
enum kind {IF,LPAREN,ID,INTLIT,...}
struct token{
enum kind k;
char *lexeme;// 单词
};
/*eg if(x>5)
===>>
token{k=IF,lexeme=0};
token{k=LPAREN,lexeme=0};
token{k=ID,lexeme="x"};
.....
*/

词法分析器的任务,字符流到记号流。

记号流是编译器内部定义的数据结构,编码所识别出的词法单元。

查看更多