- 浏览: 1499089 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (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 7922019年9月24日更新: 注意,需要开启firewall ... -
sdl笔记
2019-01-31 17:19 768sdl教程教程 https://github.com/Twin ... -
tinyemu
2019-01-24 17:59 1483参考https://bellard.org/jslinux/t ... -
aws搭建xl2tp给iphone使用
2018-12-26 21:37 19392019年12月26日 可以参考原来的配置 https:// ... -
consul的基本使用
2017-06-27 11:13 1448### 安装 [centos7上consul的安装](ht ... -
lvs的helloworld
2017-06-13 20:36 629###################lvs######### ... -
系统调用的helloworld
2017-05-04 16:14 690《2.6内核标准教程》 p293 #include < ... -
bitcoin和cgminer的安装
2017-04-05 22:45 1989参考 http://blog.csdn.net/rion_ch ... -
ceph安装和常用命令
2017-03-21 21:55 984/etc/hosts ssh-keygen ssh-copy- ... -
mobile terminal 笔记
2016-12-02 15:35 692找出旧的iphone4 越狱之后可以变个小操作系统 mobi ... -
socket基础和select(python)
2016-06-14 17:21 1844上接 c语言的socket基础ht ... -
socket基础(c语言)
2016-06-14 16:45 1041不使用select 普通的基础socket连接,对多个客户端的 ... -
ffmpeg+nginx 的直播(2,直播摄像头和麦克风)
2016-05-28 20:21 4419假设我的服务器是centos7 192.168.139.117 ... -
ffmpeg+nginx 的直播(1,直播播放的视频文件)
2016-05-26 17:11 665964位操作系统centos7 ############ 1.一 ... -
socat和netcat(nc)
2016-04-29 22:36 1788转 原文链接: http://www.wenquan.name ... -
neutron基础九(qemu nat网络)
2016-02-06 17:21 1676接上基础八,kvm透传nested忽略 1.在主机ce ... -
neutron基础八(qemu 桥接网络)
2016-02-06 13:13 1572qemu的桥接和nat的qemu启动命令是一样的,但是后续的脚 ... -
neutron基础七(qemu tap)
2016-02-02 17:02 1061使用qemu 建立个虚拟机 然后用tap设备, 根据基础六,t ... -
neutron基础六(bridge fdb)
2016-01-28 18:30 2321转发表 在三台机器上建立三个namespace 192.16 ... -
南北流量
2016-01-23 23:26 1867一、三层网络架构: 接入层:负责服务器的接入和隔离 汇聚层:汇 ...
相关推荐
Throughout, you’ll find cutting-edge tips for optimizing performance, maximizing efficiency with both the API and hardware, and fully leveraging OpenGL ES 3.0 in a wide spectrum of applications. ...
12. **《Effective TCP/IP Programming: 44 Tips to Improve Your Network Programs》 by Jon C. Snader** - 提供了44个具体的技巧,帮助开发者提高他们的网络程序质量。 - 内容涉及错误处理、性能优化等方面,是...
A Brief History of Qt Part I: Basic Qt Chapter 1. Getting Started Hello Qt Making Connections Laying Out Widgets Using the Reference Documentation Chapter 2. Creating Dialogs Subclassing ...
Unix was one of the first operating systems written in C, a high-level programming language, and its natural portability and low price made it a popular choice among universities. Initially, two main...
2. "C programming tips.pdf": 该文档提供了C编程的一些实用技巧和最佳实践,可能包括内存管理、指针操作、错误处理、函数使用等方面。通过学习这些技巧,程序员能够写出更优化、更安全的代码,同时避免常见的陷阱...
Database\Pragmatic SQL Antipatterns Avoiding the Pitfalls of Database Programming.mobi Flash\FriendsofED AdvancED ActionScript 3.0 Design Patterns.mobi Flash\OReilly Automating ActionScript Projects ...