分类目录归档:工作

无锁队列

去年在做一个项目时,遇到一个问题:需要处理一些数据,其输入速度是一定的,但输入的数据中只有一部分是实际需要处理,具体比例不一定,但希望能够保证实际处理数据的速度是一定的。所以,在这里用到了队列。首先对数据进行预处理,判断是否需要进行实际处理,如果需要则放入队列。同时还以一定的速率从队列取数据进行处理。这些操作都是在一个进程中,所以用 C 写了一个很简单的队列实现:基于共享内存,保证进程重启队列数据不会丢失;支持当队列满时自动 dump 到文件,使用文件作为存储。

最近又有一个这样的需求:一个进程产生数据放入队列,另一个进程判断队列长度,如果大于某一个值则进行处理,典型的“生产者 – 消费者”模型。这里就要求队列支持多进程,直接把之前写的队列拿来用会有问题,因为读和写队列可能同时进行,当两个进程同时修改某一个计数器时就可能会导致数据不一致。这里简单对队列进行加锁,即读和写是互斥的,就很容易的解决了这个问题。但在高并发时,读写互斥会带来性能上降低。之前公司内部看到有人分享过无锁队列的实现,研究了一下代码发现这个实现并不是真正的无锁队列,读写仍然是互斥的。

在参考了酷壳的文章:无锁队列的实现 之后,根据文章提供的思路,实现了一个无锁队列,它的要求是:

1、支持多进程(线程)同时对队列进行读写。

2、使用共享内存作为存储。

3、能够获取到当前队列的长度。

4 、兼容32位和64位系统

另外前题是:数据单元长度是固定的。

代码在此:https://github.com/haipome/lock_free_queue

大致的思路是:

在初始化时获取一大块内存自己分配,永不释放。将内存划分为控制区和数据区,数据区分成平均的数据块,每个数据块又有一个数据块头。通过数据块头,将队列中的数据组织成为链表。控制区里有两个“指针”分别指向链表的头和尾,这里并不能使用真正的指针,而是数据块的编号,使用 -1 标识链表的结束,为了解决队列在最开始时的初始化问题,所以这里多使用了一个编号为 -1 的数据块。另外,为了解决头尾指针指向同一数据块的问题,当 pop 时,读取的是头指针指向的数据块的下一个数据块,所以这里又多使用了一个数据块。

后记:多进程到处是坑,花了将近两天时间来 DEBUG

参考:

Legacy __sync Built-in Functions for Atomic Memory Access

找工作的经历和想法

签了三方协议,找工作这事算是定了。我不是那种拿很多 offer 的牛人,所以没有什么经验好写。我只想写写自己关于找工作的一些过程和想法。这不是面经,如果你觉得对你有用,那就更好了。

其实这标题有点偏颇,因为我找工作的经历很简单,并且着重点并不再找工作上面。迄今为止,我只参加过很少的招聘会,正式笔试过两次,面试过一家公司,也就是签约的这家公司。不过自己很满意现在的结果。我喜欢编程和互联网,而工作和这两者相关,工作正好是自己喜欢做的事情是很幸运的,不是吗?另外,通过实习对公司多少有点了解,对公司和风格和文化比较认同,很喜欢那种单纯自由的工作环境,并且待遇也很不错。 继续阅读

收到了QQ的Offer

上午在自习室看书,接到了腾讯 HR 的电话,告诉我已经确定可以留用了。虽然之前 Leader 和导师都打过电话说基本上没问题,不过正式收到心里踏实一点,哈哈。待遇还不错,不过 HR 一再嘱咐薪资是公司高压线,就不能公开了。

最近没怎么费心去找工作,毕竟腾讯一直是自己的目标。不过还是投了百度,还参加了人人的笔试。

去参加人人笔试完全是去玩,投了一个产品经理的职位,想看看非技术的笔试题什么样的。已经过去两天没有通知,估计被鄙视了。我觉得笔试题出的有点烂,比如这个:“请设计一款针对儿童使用的手机。”这个需求写的也太模糊点了吧!多大的儿童?是为了易用还是为了限制使用?真的有必要为儿童专门设计一款手机吗?所以我回答:该产品定位不清晰。估计考官会被气到吧。

百度上周末给我发短信让我去参加笔试。但很奇怪,官网上显示简历一直是未处理状态,也没受到通知邮件,就没去。昨天又收到短信,让明天去笔试。这次收到邮件了,简历也是已处理的状态,感觉安排好混乱的说。反正对百度没好感,索性不去了。

接下来趁还在学校,多看几本书吧!

在腾讯实习的日子

从深圳回来已经有两周了,在腾讯实习的一个多月的时间是一份很不错的人生经历。

上学期四月份开始找的实习。参加腾讯实习生招聘是我第一次正式的面试和笔试,很幸运的获得了实习机会,腾讯也是我心仪已久的公司。关于笔试和面试当时写过一篇《我是这样拿到腾讯暑期实习offer的》

7月13号早上到达深圳,做地铁到腾讯大厦报道,开始了实习生活。

继续阅读

我是这样拿到腾讯暑期实习offer的

经过一个星期的忙碌,终于在昨天拿到了腾讯暑期实习的offer. 这也是我第一次参加正式的招聘。现在把我拿到offer的经历写下来,包括之前零星写的一些东西的整理,供大家参考,希望能给不管是找工作还是不找工作的同学一些帮助。其实招工作并没有想象中的那么难。我觉得你在决定是考研还是找工作的时候,首先要确定的是你究竟想要什么?这个问题的答案要问你自己。

我是理学院数学系数学与应用数学专业本科大三学生,完全是抱着打酱油的心态申请的实习,报的是软件开发(后台研发方向),经过了一次的笔试和三次面试,最终拿到腾讯offer. 能走到这一步,我只想说:I’m Feeling Lucky.

笔试:上周六上午参加的笔试。笔试相对来说还是挺难得(之前参加过淘宝的一次笔试,没有下文)特别是选择题,是多项选择。加上迟到了十分钟,时间很紧张的做完了。由于签了保密协议,所以不便透漏笔试题目。晚上就收到了一面通知,看来腾讯的效率还是相当高的。官网显示参加笔试的有两千多人,进入面试的一千多一点。淘汰率40%.

继续阅读