2019-11-05 20:54
⁄ 工业·编程
⁄ 共 1958字
在看linux内核代码的时候,经常会看到likely(x)和unlikely(x)宏的使用。那这两个宏有什么作用呢?
这两个宏在内核中的定义如下:
# define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)
可见这里使用了gcc的内建函数__builtin_expect()。
__builtin_expect (long exp, long c)函数:
该函数用来引导gcc进行条件分支预测。在一条指令执行时,由于流水线的作用,CPU可以同时完成下...
GCC阅读全文
2019-11-04 23:02
⁄ 工业·编程
⁄ 共 805字
今天遇到一下奇怪的段错误,研究发现原来是内存写越界了。
函数片段如下 ht_insert_he --> ht_index --> hashfunction
void ht_insert_he(hash_table *table, hash_entry *entry) { hash_entry *tmp; unsigned int index; entry->timestamp = time(NULL); entry->next = NULL; ...
踩内存阅读全文
2019-11-03 23:01
⁄ 工业·编程
⁄ 共 1512字
众所周知,踩内存是一个非常麻烦的问题,不管是在应用层或是内核层,关于踩内存的检测也有各种各样的工具,比如应用层的优秀开源valgrind,内核内置的kmemcheck等。关于这些工具的具体信息就不在这里做进一步描述了,本文主要简单介绍一下几种踩内存工具的工作原理。
一种最为简单的踩内存工具为通过给分配的内存前后多加上一小块内存,用于存放我们预先设定的值,比如Crc和Magic: 不管是应用程序(App)或是内...
踩内存阅读全文
2019-11-02 22:52
⁄ 工业·编程
⁄ 共 13257字
1. 线程池基本原理
2. 线程池C语言实现 2.1 线程池的数据结构 #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <errno.h> #include <unistd.h>
typedef struct { void *(*function)(void *); /*函数指针,回调函...
线程池阅读全文
2019-11-01 22:40
⁄ 工业·编程
⁄ 共 5617字
在嵌入式应用开发过程中,踩内存的问题常常让人束手无策。使用gdb调试工具,可以大幅加快问题的定位。不过,对于某些踩内存的问题,它的表现是间接的,应用崩溃的位置也是不固定的,这就给问题定位带来了更大的困难。
笔者见过带有虚函数C++的类对象在试图调用虚函数时,因指向虚函数的表指针被踩了,导致获取虚函数的地址是错识的,从而应用崩溃。此问题的表现就是间接的:在踩内存发生时,应...
踩内存阅读全文
2019-10-31 22:37
⁄ 工业·编程
⁄ 共 374字
现象:
程序死的时候出现屏幕打印如下:
Program received signal SIGSEGV, Segmentation fault.
定位:
1、bt,打印当前调用栈。如果不是踩了栈的内存,那么这一个命令可以看出死在哪里。
2、如果bt打印消息如下:0x00000000 in ?? ()
那么基本可以确定是栈被踩了。
栈被踩一般而言是局部变量溢出导致。
3、可以看看黑匣子。黑匣子里...
踩内存阅读全文
2019-10-30 22:31
⁄ 工业·编程
⁄ 共 1005字
背景:做各个模块集成,其中包含了文件管理、录像业务相关的库。在文件管理初始化时,应用层会指定数据根目录。
现象:测试发现在执行特定操作时,目录失效,无法创建文件,日志大概这样 (NULL) /Movie/xxxx.MP4,好像是指定的根目录变空了。
检查一番, 没有进行去初始化, 跟文件管理库负责同事远程沟通了下,他在库里维护了一个指针,指向 应用 层设置的 目录字符串(这个方法当然不好,应该复制进去,后已修改),
...
踩内存阅读全文
2019-10-29 22:26
⁄ 工业·编程
⁄ 共 322字
语言由于可以直接操作内存,给我们的编程带来了便利,同时也带来了内存写越界之类的问题,常常造成我们的系统crash。下面总结了我在工作中碰到的导致内存越界的各种场景,以供分析此类问题时作个参考。
1、直接写越界,包括1)栈空间变量写越界覆盖掉函数返回地址,导致函数返回时crash。2)全局变量写越界,导致覆盖掉符号表中排在这个全局变量后面的全局变量的值。
2、未初始化指针变量的值写操作。
3、指针释放了未置空,后...
踩内存阅读全文
2019-10-28 22:15
⁄ 工业·编程
⁄ 共 1418字
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const void *src, size_t count); void *memmove(void *dst, const void *src, size_t count); 他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。 一、memcpy函数 ...
踩内存阅读全文
2019-10-27 21:13
⁄ 工业·编程
⁄ 共 4245字
1、DPDK特点
DPDK全称为Data plane development kit,是一个用来进行包数据处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点:
1)轮询:在包处理时避免中断上下文切换的开销,
2)用户态驱动:规避不必要的内存拷贝和系统调用,便于快速迭代优化
3)亲和性与独占:特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中
4)降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存...
DPDK阅读全文