c
Liberal-man
计算机科班出身。毕业后进入腾讯,有4年后台开发经验,从参与到设计内部使用的游戏消息分发平台,支撑200多款业务,日消息量级过亿。目前在北京创业中,负责带领技术团队。
展开
-
epoll边沿触发漏报消息包问题
开发一个即时通讯后台,底层的网络收发使用 epoll + main loop实现网络事件(conn、read、send)的异步触发读写,以达到能最大限度减少线程的IO等待,提高cup利用率的目的。实际使用中,会发现有少量并没有 因为访问后端阻塞 但是依然反馈慢到超时的情况,我们定义从客户端发消息到收到反馈,3s超时,而我们发现延迟可能好几分钟,这让我觉得肯定不是后端一些复杂逻辑导致的,逻辑层再复杂,原创 2016-08-05 11:47:33 · 2709 阅读 · 2 评论 -
从零开发MQTT服务(二)
二、配置文件 也不是核心模块,不用太多篇幅写了,看我github代码吧static int load_conf_from_file(libertymqtt_config *config, bool reset, const char *filename, int level, int *line){ int ret = 0; const int MAX_LINE = 1024;原创 2016-06-22 22:53:51 · 415 阅读 · 0 评论 -
环形队列
环形队列,也可以叫环形缓冲区。我们用数组来举例,通常对于一个放到数组中的队列,生产者将数据写入队尾,消费者从队头取走,两个指针朝着同一个方向运动,消费者追生产者。而“环”在这里的体现,就是不管生产者还是消费者,当指针跑到队尾的时候,掉头到该数组头去,形成一个没有终点的环。 这要做的好处是,当生产者和消费者都是单线程,也就是只有一个生产者和一个消费者的时候,不用加锁。如果生产者或者消费者都是多个,就原创 2016-07-08 12:09:45 · 832 阅读 · 0 评论 -
C调用graphviz绘制堆
之前的博客http://blog.csdn.net/socho/article/details/51565498《对”堆”的理解》中打印堆是在终端中,不是很直观,发现一个可以生成图片的利器graphviz,于是用c语言调用下,程序运行中生成图片,特别直观了。 以上是用终端打印出来的,发现了一个绘图利器graphviz,可以把堆画出来。安装这个软件什么的就不讲了,自己百度,这里默认已经安装好了。所以原创 2016-06-08 20:31:53 · 2225 阅读 · 2 评论 -
从零开发MQTT服务(一)
开发语言:Linux下C语言,gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) 操作系统:Centos 6.5 64bit 源码地址:https://github.com/liberalman/mqtt/tree/master/libertymqtt一.日志模块文件路径:src/log.c 这里贴出核心代码void print(const char原创 2016-06-22 11:25:00 · 515 阅读 · 0 评论 -
修改FILE缓冲区大小,改进写日志性能
由于线上服务端程序,需要大量写入日志,将来入数据库库,以便做数据分析或者对账之用,可是发现日志打开后服务器变慢了,对外并发响应数量也减少了。于是分析了下日志写入函数fprintf。其写日志文件的顺序是:程序写入用户地址空间内核从用户地址空间缓冲区复制到内核文件缓冲区内核文件缓冲区满的情况下再放入内核io队列,等待写入到硬盘上。写文件其实不是直接写到硬盘,那样的话一堆程序都同时并发往硬盘上写,硬盘原创 2016-07-06 22:42:14 · 10021 阅读 · 4 评论 -
从零实现高并发Web服务器-哈希表
哈希表自定义实现哈希表/** 键值对 */typedef struct { lbt_str_t key; /**< 键 */ lbt_uint_t key_hash; /**< 通过哈希运算,将key投影到整型的哈希值 */ void *value; /** 值 */} lbt_hash_key_t;/** 桶元素 */typedef struct原创 2016-07-17 16:37:19 · 832 阅读 · 0 评论 -
二分查找、折半查找
#include <stdio.h>#define N 10void printA(int A[], char n){ int i = 0; for (i = 0; i < n; i++) { printf("%d ", A[i]); } printf("\n");}void printSearch(int A[], char n, i原创 2016-06-15 18:28:31 · 729 阅读 · 0 评论 -
linux下如何让程序无法重复启动
通常情况下一个程序可以被多次执行,也就存在多个相同的进程。有时候我们有些全局资源只允许单进程访问,为了不让进程多起,要实现进程在一台机器上只能有一个实例的方法。 经查找,可以使用flock的方式,建一个lock file,让程序执行前先检查是否有执行中的实例,即对文件加锁。single_program.c#include <stdio.h>#include <stdlib.h>#include原创 2016-06-04 22:24:38 · 2845 阅读 · 0 评论 -
c语言实现回调函数
callback.c/* * @file c语言实现回调函数 * @detial 在java等更高级的语言中往往已经给我们封装好了回调函数的调用方式,直接用就可以了。而C语言中并没有这种直接可以操作的回调方式,我们用函数指针来实现回调原理。 */#include<stdio.h>// 方法指针的格式为:int (*ptr)(char *p) 即:返回值(指针名)(参数列表)typedef原创 2016-06-04 10:13:16 · 7159 阅读 · 2 评论 -
对”堆”的理解
建堆、向下调整、向上调整、堆排序原创 2016-06-02 12:22:02 · 2218 阅读 · 1 评论 -
geohash实现(c语言)
GeoHash算法首先,你要Baidu下,找到该算法核心原理,这里摘自网络文档,简单介绍下。GeoHash算法是通过二分法,经过一定次数的无限逼近,将经纬度的二维坐标浮点值变成一个可排序、可比较的的字符串编码。在编码中的每个字符代表一个区域,并且前面的字符是后面字符的父区域,即父子字符串有相同的前缀。其算法的过程如下:地球纬度区间是[-90,90], 如某纬度是39.92324,可原创 2015-10-27 00:32:30 · 1328 阅读 · 1 评论