- 浏览: 1477205 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (691)
- linux (207)
- shell (33)
- java (42)
- 其他 (22)
- javascript (33)
- cloud (16)
- python (33)
- c (48)
- sql (12)
- 工具 (6)
- 缓存 (16)
- ubuntu (7)
- perl (3)
- lua (2)
- 超级有用 (2)
- 服务器 (2)
- mac (22)
- nginx (34)
- php (2)
- 内核 (2)
- gdb (13)
- ICTCLAS (2)
- mac android (0)
- unix (1)
- android (1)
- vim (1)
- epoll (1)
- ios (21)
- mysql (3)
- systemtap (1)
- 算法 (2)
- 汇编 (2)
- arm (3)
- 我的数据结构 (8)
- websocket (12)
- hadoop (5)
- thrift (2)
- hbase (1)
- graphviz (1)
- redis (1)
- raspberry (2)
- qemu (31)
- opencv (4)
- socket (1)
- opengl (1)
- ibeacons (1)
- emacs (6)
- openstack (24)
- docker (1)
- webrtc (11)
- angularjs (2)
- neutron (23)
- jslinux (18)
- 网络 (13)
- tap (9)
- tensorflow (8)
- nlu (4)
- asm.js (5)
- sip (3)
- xl2tp (5)
- conda (1)
- emscripten (6)
- ffmpeg (10)
- srt (1)
- wasm (5)
- bert (3)
- kaldi (4)
- 知识图谱 (1)
最新评论
-
wahahachuang8:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
websocket的helloworld -
q114687576:
http://www.blue-zero.com/WebSoc ...
websocket的helloworld -
zhaoyanzimm:
感谢您的分享,给我提供了很大的帮助,在使用过程中发现了一个问题 ...
nginx的helloworld模块的helloworld -
haoningabc:
leebyte 写道太NB了,期待早日用上Killinux!么 ...
qemu+emacs+gdb调试内核 -
leebyte:
太NB了,期待早日用上Killinux!
qemu+emacs+gdb调试内核
转自http://rdc.taobao.com/blog/cs/?p=1675
1. 优雅地使用链表
链表是编程中经常要用到的数据结构,结构体描述时分为数据域和指针域,本没有什么好讲。但有没有想过教科书上的这种方式有什么问题?通过这种方式定义和使用链表,对于不同的链表类型,都要定义各自的链表结构,繁琐的很。linux kernel中链表的用法才应该是教科书中出现的。
基本思想:在Linux内核链表中,不是在链表结构中包含数据,而是在数据结构中包含链表节点。
1) 链表定义:
2) 链表使用者定义:
3) 通过node定位user_t:
这里用到了container_of,container_of又用到了offsetof。offsetof是通过将结构体起始地址强制对齐到0来计算出node和起始地址的偏移offset;而container_of在node地址基础上减去offset得到user_t结构体的地址并返回user_t。
2. 高效地分支判断
写程序不可避免的需要使用if/else,如何高效地进行分支判断呢?使用
__builtin_expect是一个GCC内置的函数,语义是表示EXP == C,返回值是表达式的值。这两个宏定义是为了提示编译器正确地进行分支判断的优化。
优化的原理是:通过调整生成汇编代码的顺序,将经常发生的分支代码放在cmp指令之后顺序执行,将不经常发生的分支代码通过jump指令跳过去,从而降低jump指令清空处理器流水线的影响。
3. 汇编实现的原子操作
这条汇编表示给my_var原子加my_int,lock前缀就是用来保证原子性的。
Intel CPU有3种保证原子性的方式,lock前缀是其中之一,原理是通过锁总线来阻止其它处理器操作相应的地址。
4. 0长度数组
定义数组时,长度必须是一个编译时确定的值,如果想使用运行时的值来确定数组的长度,可以使用0长度数组。
只有GNU C才支持的特性,对于定义不确定长度的数组非常有用。
5. 三目运算的另类表达
GNU 允许C 语言省略条件表达式中的表达式2省略, 此时表示表达式2与表达式1相同.例如
a = x ? : y;
等价于
a = x ? x : y;
但是如果 x 是一个表达式, 仅求值一次.
也来分享一下你正在使用的tips吧!
参考文章:
1. 优雅地使用链表
链表是编程中经常要用到的数据结构,结构体描述时分为数据域和指针域,本没有什么好讲。但有没有想过教科书上的这种方式有什么问题?通过这种方式定义和使用链表,对于不同的链表类型,都要定义各自的链表结构,繁琐的很。linux kernel中链表的用法才应该是教科书中出现的。
基本思想:在Linux内核链表中,不是在链表结构中包含数据,而是在数据结构中包含链表节点。
1) 链表定义:
struct list_head { struct list_head *next, *prev; }; #define LIST_HEAD_INIT(name) { &(name), &(name) }
2) 链表使用者定义:
struct user_t { data domain; list_head * node; }; struct user_t g_user_list; LIST_HEAD_INIT(&g_user_list);
3) 通过node定位user_t:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #define container_of(ptr, type, member) ({ const typeof(((type *)0)->member) * __mptr = (ptr); (type *)((char *)__mptr - offsetof(type, member)); }) struct user_t* next = container_of(g_user_list->next->node, struct user_t, node);
这里用到了container_of,container_of又用到了offsetof。offsetof是通过将结构体起始地址强制对齐到0来计算出node和起始地址的偏移offset;而container_of在node地址基础上减去offset得到user_t结构体的地址并返回user_t。
2. 高效地分支判断
写程序不可避免的需要使用if/else,如何高效地进行分支判断呢?使用
likely/unlikely。 #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) long __builtin_expect (long EXP, long C)
__builtin_expect是一个GCC内置的函数,语义是表示EXP == C,返回值是表达式的值。这两个宏定义是为了提示编译器正确地进行分支判断的优化。
优化的原理是:通过调整生成汇编代码的顺序,将经常发生的分支代码放在cmp指令之后顺序执行,将不经常发生的分支代码通过jump指令跳过去,从而降低jump指令清空处理器流水线的影响。
3. 汇编实现的原子操作
__asm__ __volatile__( " lock ;n" " addl %1,%0 ;n" : "=m" (my_var) //output : "ir" (my_int), "m" (my_var) //input : //modify /* no clobber-list */ );
这条汇编表示给my_var原子加my_int,lock前缀就是用来保证原子性的。
Intel CPU有3种保证原子性的方式,lock前缀是其中之一,原理是通过锁总线来阻止其它处理器操作相应的地址。
4. 0长度数组
定义数组时,长度必须是一个编译时确定的值,如果想使用运行时的值来确定数组的长度,可以使用0长度数组。
struct line { int length; char contents[0]; }; struct line *thisline = (struct line *)malloc (sizeof (struct line) + this_length); thisline->length = this_length;
只有GNU C才支持的特性,对于定义不确定长度的数组非常有用。
5. 三目运算的另类表达
GNU 允许C 语言省略条件表达式中的表达式2省略, 此时表示表达式2与表达式1相同.例如
a = x ? : y;
等价于
a = x ? x : y;
但是如果 x 是一个表达式, 仅求值一次.
也来分享一下你正在使用的tips吧!
参考文章:
http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html http://kernelnewbies.org/FAQ/LikelyUnlikely http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html http://zh.wikipedia.org/wiki/%E6%9D%A1%E4%BB%B6%E8%BF%90%E7%AE%97%E7%AC%A6
发表评论
-
xl2tp 备份
2019-09-24 16:25 6922019年9月24日更新: 注意,需要开启firewall ... -
sdl笔记
2019-01-31 17:19 732sdl教程教程 https://github.com/Twin ... -
tinyemu
2019-01-24 17:59 1432参考https://bellard.org/jslinux/t ... -
aws搭建xl2tp给iphone使用
2018-12-26 21:37 18922019年12月26日 可以参考原来的配置 https:// ... -
consul的基本使用
2017-06-27 11:13 1399### 安装 [centos7上consul的安装](ht ... -
lvs的helloworld
2017-06-13 20:36 596###################lvs######### ... -
系统调用的helloworld
2017-05-04 16:14 632《2.6内核标准教程》 p293 #include < ... -
bitcoin和cgminer的安装
2017-04-05 22:45 1958参考 http://blog.csdn.net/rion_ch ... -
ceph安装和常用命令
2017-03-21 21:55 953/etc/hosts ssh-keygen ssh-copy- ... -
mobile terminal 笔记
2016-12-02 15:35 624找出旧的iphone4 越狱之后可以变个小操作系统 mobi ... -
socket基础和select(python)
2016-06-14 17:21 1801上接 c语言的socket基础ht ... -
socket基础(c语言)
2016-06-14 16:45 994不使用select 普通的基础socket连接,对多个客户端的 ... -
ffmpeg+nginx 的直播(2,直播摄像头和麦克风)
2016-05-28 20:21 4358假设我的服务器是centos7 192.168.139.117 ... -
ffmpeg+nginx 的直播(1,直播播放的视频文件)
2016-05-26 17:11 659264位操作系统centos7 ############ 1.一 ... -
socat和netcat(nc)
2016-04-29 22:36 1744转 原文链接: http://www.wenquan.name ... -
neutron基础九(qemu nat网络)
2016-02-06 17:21 1621接上基础八,kvm透传nested忽略 1.在主机ce ... -
neutron基础八(qemu 桥接网络)
2016-02-06 13:13 1542qemu的桥接和nat的qemu启动命令是一样的,但是后续的脚 ... -
neutron基础七(qemu tap)
2016-02-02 17:02 1030使用qemu 建立个虚拟机 然后用tap设备, 根据基础六,t ... -
neutron基础六(bridge fdb)
2016-01-28 18:30 2263转发表 在三台机器上建立三个namespace 192.16 ... -
南北流量
2016-01-23 23:26 1824一、三层网络架构: 接入层:负责服务器的接入和隔离 汇聚层:汇 ...
相关推荐
as well as a host of tips, tricks and code one-liners, that will save you time on a day-to-day basis. The book is organized into self-contained chapters on individual topics for ease of reference. ...
1001 Microsoft Visual C++ Programming Tips
Are you aware that C Programming is one of the most popular and most commonly used programming languages today? Did you know many expert developers have started with learning C in order to become ...
Are you aware that C Programming is one of the most popular and most commonly used programming languages today? Did you know many expert developers have started with learning C in order to become ...
以下是一些关键知识点,这些内容基于“Tips and Tricks for Programming in Matlab”这篇文档: 1. **MATLAB简介**: MATLAB是由MathWorks公司开发的一款强大的数学计算软件。自1984年首次发布以来,它已经从一个...
This document provides a comprehensive ...programming tips on C++. This document also provides a C++ library which imitates Java−language, and which has various methods to avoid memory problems in C++.
c standard library practical tips programming.chm
这份"Linux Tips Linux 小技巧合集 DOC"包含了多个实用的Linux使用技巧,旨在帮助用户更加高效地操作和管理Linux系统。以下是这些文档中可能包含的一些关键知识点: 1. **命令行基础**: - `ls`:列出目录内容。 ...
This idea led to two books: ShaderX2: Introductions & Tutorials with DirectX 9 ShaderX2: Shader Programming Tips & Tricks with DirectX 9 The first book helps the reader get started with ...
In only 21 days, you'll have all the skills you need to get up and running ... Get expert tips from a leading authority for programming your databases with Visual C++ 6 in the corporate environment.
Are you aware that C Programming is one of the most popular and most commonly used programming languages today? Did you know many expert developers have started with learning C in order to become ...
《高级LabVIEW编程技巧与技术》是一份专为LabVIEW开发者设计的重要参考资料,它深入探讨了如何提升LabVIEW编程的效率和质量。LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是由美国国家仪器公司...
本书《ShaderX2: Shader Programming Tips and Tricks with DirectX 9.0》由Wolfgang F. Engel编辑,Wordware Publishing, Inc.出版,首次发行于2003年10月25日。这本书的主旨在于分享在微软的DirectX 9.0环境下进行...
Linux调试技术和性能调优手段,chm格式
"Linux Debugging and Performance Tuning Tips and Techniques"这个压缩包文件显然是为了帮助用户掌握这些技能而设计的。这里,我们将深入探讨其中可能包含的一些关键知识点。 **Linux Debugging** 1. **日志分析*...
These fun and easy tips transform the dreaded chore of learning a new programming language into a fun process. You'll be proud to show off your new skills to your friends and family! What are the ...
of-Line Puzzle Binary I/O Buffering Problems Unbuffered I/O Designing File Formats C-Style I/O Routines C-Style Conversion Routines C-Style Binary I/O C- Versus C++- Style I/O Programming Exercises ...