摘要:最近在公司的代码中看到不少likely/unlikely的调用,起初不太明白,上网一查才明白这东西是干吗用的。首先要明确以下代码的含义:if (likely(value))等价于if (value)if (unlikely(value))等价于if (value)也就是说likely()和unlikely()从阅读和理解的角度是一样的。这两个宏在内核中定义如下:1 <linux/compiler>2 3 #define likely(x) __builtin_expect(!!(x), 1)4 #define unlikely(x) __builtin_expect(!!(x), 阅读全文
ln -s 软链接产生Too many levels of symbolic links错误
2011-09-07 21:47 by 后端技术, 18000 阅读, 1 推荐, 收藏, 编辑
摘要:今天在linux下编译了一下boost,其中include文件和lib文件都安装在个人目录,为了编译时不必添加额外的-I参数,所以采用ln -s boost /usr/include/boost。编译一个boost测试源文件发现如下的错误:Too many levels of symbolic links。查找一番发现建立软链接时采用的是相对路径,所以才会产生这样的错误,解决方式是采用绝对路径建立软链接:ln -s /home/XX/include/boost /usr/include/boost即可、 阅读全文
linux直接I/O简单介绍
2011-08-28 11:51 by 后端技术, 473 阅读, 0 推荐, 收藏, 编辑
摘要:1. 缓冲I/O与直接I/O什么是缓存 I/O (Buffered I/O) 缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page cache )中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。缓存 I/O 有以下这些优点:缓存 I/O 使用了操作系统内核缓冲区,在一定程度上分离了应用程序空间和实际的物理设备。 缓存 I/O 可以减少读盘的次数,从而提高性能。当应用程序尝试读取某块数据的时候,如果 阅读全文
Linux内存管理浅谈
2011-08-21 23:04 by 后端技术, 1353 阅读, 4 推荐, 收藏, 编辑
摘要:linux内存管理还是比较复杂的,其中牵扯到很多方面的知识,这篇小博文算是自己对于内存管理的一点点的总结。 阅读全文
gprof的使用说明
2011-08-14 18:01 by 后端技术, 1385 阅读, 0 推荐, 收藏, 编辑
摘要:1. 什么是gprof gprof是GNU profiler工具。可以显示程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。也可以显示“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。还可以显示“注释的源代码”,是程序源代码的一个复本,标记有程序中每行代码的执行次数。2.如何使用gprof在编译或链接源程序的时候在编译器的命令行参数中加入“-pg”选项,编译时编译器会自动在目标代码中插入用于性能测试的代码片断,这些代码在程序在运行时采集并记录函数的调用关系和调用次数,以及采集并记录函数自身执行时间和子函数的调用时间,程序运行结束后,会在程序退出 阅读全文
core dump小总结
2011-08-02 14:10 by 后端技术, 761 阅读, 0 推荐, 收藏, 编辑
摘要:一、 core dump简介当程序因为异常终止(崩溃)时,操作系统会一个程序在特定时间内进程中运行信息的状态dump出来。一般会产生一个core文件,用于记录包括程序计数器,堆栈信息及其他信息,core文件主要用于记录程序crash的现场信息,为程序调试程序提供了物证。core dump时会产生诸如core.pid的文件。二、 core产生的原因 core文件产生的原因非常多,可能因为硬件故障,更有可能因为程序中的错误,比较普遍的有:内存访问越界,无效指针,堆栈溢出等。当然还有其他的原因,这里就不追究全面了。三、 控制core文件 有时候程序down了, 但是core文件却没有生成。core文 阅读全文
函数式宏定义与类型检查
2011-07-27 13:02 by 后端技术, 1128 阅读, 0 推荐, 收藏, 编辑
摘要:函数式宏定义的危害大家是有目共睹的,当函数式宏定义搭配上弱类型检查的函数式,使用起来就是悲剧。例:#define PRINT(x) printf(“I am %s”,x)当使用以上宏定义时,gcc的过程只会报一个warn,而并不会报error。我们可以从gcc的整个过程看一下,首先是预处理阶段:使用PRINT的代码会被文本替换为printf,然后就是编译阶段,编译阶段会进行类型检查,但printf是一个软类型函数,gcc只会提示一个waring,并不会报error,然后产出可执行文件。当传入PRINT的参数是一个string类型时,在运行时就会报一个segment error。从上面问题上得到 阅读全文