
C/C++
曦轩
Im a Software Designer
展开
-
内存使用技巧及内存池实现(一)
本文只是展示了一些基本的内存管理技巧,处于篇幅没有更深入的讲解,有兴趣可回复一起探讨^_^ 在当前的软件开发环境下,主要分为两大类:客户端和服务端。软件部署在客户端的情况逐渐被Web应用和服务端的网络应用所替代(游戏客户端例外),并且随着硬件的不断升级和成本的降低,各种计算资源和存储资源被程序随意使用,基本不用考虑一个进程多占了几个Byte,多消耗了CPU几个毫秒。不过,某些场合原创 2012-05-07 22:10:07 · 5131 阅读 · 1 评论 -
Linux -- Pagecache 文件缓存特性
今天看@褚霸的博客,看到了几篇关于pagecache、slab的几篇好文章,转一下!原创文章,转载请注明: 转载自系统技术非业余研究本文链接地址: Linux下谁在消耗我们的cacheLinux下对文件的访问和设备的访问通常会被cache起来加快访问速度,这个是系统的默认行为。 而cache需要耗费我们的内存,虽然这个内存最后可以通过echo 3>/proc转载 2013-09-30 13:05:54 · 10368 阅读 · 0 评论 -
Java -- ExecutorService线程池触发的Full GC问题排查
今天在线上Java代码里,处理了一个由ExecutorServicec线程池引发的问题,将处理过程和一些调试沉淀下来。分布式任务处理模块中,有一个Java daemon进程,通过队列接受Java代码描述的任务(jar),产生子进程(单独的JVM)class loader,处理定义的Java代码,并收集日志、处理结果等,子进程数量在百级。原创 2014-04-02 19:55:10 · 9139 阅读 · 0 评论 -
C/C++ -- 代码技巧及优化
本人总结了一些平时编程的小技巧和非算法类的优化,希望各位一起讨论,也分享自己的技巧 1、inline/define适量的代码冗余 : "代码冗余"是一件很令人讨厌的事情,如果你在两个地方看到了同样的代码,第一反应就应该是"重构"他们,不过类似define这种代码"本地替换"的适当冗余,可以加速代码执行,省去了函数调用的事件,让CPU顺序执行。所以适当的define和i原创 2012-05-03 00:14:09 · 6841 阅读 · 3 评论 -
C/C++ -- 编程中的内存屏障(Memory Barriers) (1)
明天就要transfor去做检索引擎了,今天闲下来了,更新一下博客哈。之前 @高V 同学对本人之前《代码技巧及优化(c/c++)》的文章第六条,有关cache命中和cpu流水优化比较感兴趣,也提出了一些他的看法,今天,我就细化的说一下某些编程的点 -- 内存屏障,以及内存屏障对代码的影响。 OK,首先来说一下什么是"内存屏障",可以先看一下官方式的说法 http://www.ker原创 2012-11-21 14:45:19 · 14683 阅读 · 1 评论 -
C/C++ -- Lib库文件nm调试之符号表
本文主要介绍了一下在Linux下开发c/c++时候,不可避免的会开发或者生成.o .a .so这种中间库状态的文件(可能是自己写了一个lib让别人调用,或者提供.c/.cpp文件嵌入别人的Makefile工程)。如何查看这些库文件的一些基本信息。有时候大家编译程序时候(确切的说是链接器链接的时候)很多错误例如"undefine reference",之类的常见错误,原因就是因为没有找到.o .a原创 2012-11-23 13:02:33 · 9837 阅读 · 0 评论 -
C/C++ -- 编程中的内存屏障(Memory Barriers) (2)
在前面的文章里,主要介绍了一下内存屏障的基本认识,和基本原理。本文针对之前的思路继续聊一聊该如何处理相应的问题,以及一些多线程程序编程的技巧。 1. Volatile关键字 2. Linux pthread线程锁 3. Linux gcc 4.2之后的__sync_fetch_and_add 4. 双Buffer实现Lock fr原创 2012-11-29 12:47:53 · 7675 阅读 · 3 评论 -
UtilBox(ub)基础组件 -- 并发任务队列Taskqueue/TaskDispatcher (一)
Task dispatcher, 任务分发队列,也可以叫做Taskqueue。之前好多同学看到这篇文章内容是“.....”,我是想做一个标记,想写这篇文章,但是没填内容,看的同学还挺多的,以为我是标题党,这里首先表示一下歉意。下次不会了哈。 1. Taskqueue模型简介 2. Taskqueue的用处和优势 3. Taskqueue原创 2012-09-04 17:46:57 · 2945 阅读 · 0 评论 -
UtilBox(ub)基础组件 -- ConfigureLoader文件配置读取模块
好久没更新博客了哈,今天抽空把之前写了一部分的东西拿出来继续分享。 linux的getopt()和getopt_long()大家都用过,读取命令行参数,比如./test -h 127.0.0.1 -c 100 --port 8080类似这样的。好多脚本语言python,shell这样获取比较简单直接sh就可以了(比如echo "./server --start --port 8080原创 2012-11-13 17:45:53 · 2208 阅读 · 0 评论 -
大数据过滤及判断算法 -- Bitmap / Bloomfilter
今天,有个同学向我咨询大数据的一些面试题,其中一类比较有代表性比如判断是否在集合内,比如10个url,判断一个url是否在集合内,还比如有个1~100万个连续无序数字,随机取出里面的N个,求这N个数字等等。这类问题都需要一个大的数据集合,而且每个数据单元都很小,比如一个int 。很大程度上,这类问题可以用Bitmap或者Bloomfilter来做,基本思想就是开辟一块大内存,然后利用一个byte里原创 2012-09-24 15:48:01 · 17945 阅读 · 0 评论 -
UtilBox(ub)基础组件 -- EasyCurl 发送http请求(2)
EasyCurl简单封装了一下libcurl调用,对外的提供抽象化的接口,下面就把源码分享出来,此源码和接口还带进一步完善优化,尤其是一些curl_set_opt()的上层封装。大家可以自己写哈,最后写一个满足自己需求的Curl。 ubplus_curl.h : EasyCurl的类定义和接口,还有一些宏/** ================================原创 2012-08-19 15:40:27 · 2161 阅读 · 0 评论 -
UtilBox(ub)基础组件 -- EasyCurl 发送http请求(1)
昨天晚上锻炼身体,好久没激烈与动了,爽快!回到家,赶紧把之前写好的curl组件分享出来,EasyCurl其实就是对libcurl的一个封装,libcurl如果没用过的可以百度之。 curl其实很简单理解,socket大家都用过,其实http请求也是个socket短链接,只是通信的字段会按着HTTP字段来组包,而且都是明文的。比如在浏览器里输入www.baidu.com,就能开原创 2012-08-17 14:22:50 · 2398 阅读 · 0 评论 -
UtilBox(ub)基础组件 -- Log日志(2)
文章内容和代码为作者原创,转载请说明 ^_^ 之前的文章把Log的大体设计和框架展示出来了,还有根据时间和大小进行分割,目前实现还不支持direct_io模式。但是接口以留出,之后还会对Log进行一次升级,因为有的业务可能存在日志量很大的问题,所以提供一个ub_log_set_buffer(char* buf,size_t size)的函数,来使用用户的buffer,这样可以类似原创 2012-08-17 13:34:53 · 2055 阅读 · 0 评论 -
UtilBox(ub)基础组件 -- Log日志(1)
文章内容和代码为作者原创,转载请说明 ^_^ 这篇文章主要介绍一下log组件,平时大家调试程序和记录程序异常,这是最常用的。比如调试小程序的正确性,有些同学就在代码里放一堆的printf,可是这样带来的后果就是想去掉这写debug用的printf很麻烦(这个可以用宏来代替,比如类似ASSERT,通过开关来控制)。还有,如果程序写成了daemon,放到后台,printf的作用就没了。所原创 2012-08-04 13:32:03 · 2243 阅读 · 2 评论 -
UtilBox(ub)基础组件 -- epoll_server网络事件模型
今天事情比较少,突然在在网上看到了一篇关于网络同步异步IO的帖子,正好想起了前几天分析过的Redis的代码。Redis的代码很精练也很轻巧,基本没有第三方以来的库(最新版本中加入了jemalloc,但已集成在了redis的src里,所以依旧可以直接make),并实现一套轻量型的非阻塞半异步框架-aeEvent(很少有大型互联网后台应用采用全异步框架,一是逻辑和IO都是异步的这样即时性较低,二是编程原创 2012-04-25 21:45:04 · 2294 阅读 · 0 评论 -
UtilBox基础组件
最近写了一些构建c、c++用的基础组件库,比如基础的log日志、通用数据结构、内部缓存等应用或者工具,拿出来分享(之后还会有java和php的),随想了一个UtilBox的名字(简称ub)。这些基础组件都是平时写程序都会用到的,为了可以复用,就剥离出来成lib了,方便以后统一使用。如果大家有什么觉得基础组件平时用的很多,在互联网公司也有应用,也可以写出来分享哈。原创 2012-08-04 13:34:04 · 1468 阅读 · 0 评论 -
内存使用技巧及内存池实现(二)
本文所有内容包括源码均是作者原创,出于尊重,如果转载请表明出处 ^_^ 上一章节,提到了内存池的使用。其实内存池的作用看名字也能猜到,"池"意味着资源是同一管理和创建释放的,就像数据库的连接池、系统的线程池。主要就是为了避免创建、销毁资源的代价。c标准的malloc/free会造成大量的内存碎片以至于影响效率,所以“内存池”的技术某种程度上避免了这种消耗和影响。原创 2012-05-08 18:04:35 · 3511 阅读 · 4 评论 -
Linux -- 内存控制之oom killer机制及代码分析
线上一些内存占用比较敏感的应用,在访问峰值的时候,偶尔会被kill掉,导致服务重启。发现是Linux的out-of-memory kiiler的机制触发的。原创 2014-04-18 15:04:29 · 40595 阅读 · 4 评论