随笔分类 -  编程技能

c/c++/python等语言基本用法、语言内存模型、编译链接、调试
摘要:这几天写的程序应用到多继承。以前对多继承的概念非常清晰,可是很久没用就有点模糊了。重新研究一下,“刷新”下记忆。假设我们有下面的代码:#include classA{private:chardata;public:A(){data ='A';}virtualvoidShow(){printf("A/... 阅读全文
posted @ 2015-04-27 14:58 cgj 阅读(417) 评论(0) 推荐(0)
摘要:cannot load shared object file undefined symbol场景:共享库里引用了主程序一个符号,结构编译的时候没问题,运行时用 dlopen 打开共享库报上述错误原因:共享库使用的这个符号在主程序里没有任何调用,所以编译主程序时改符号没有被导出。需要在编译主程序时添... 阅读全文
posted @ 2014-09-25 14:43 cgj 阅读(458) 评论(0) 推荐(0)
摘要:背景:不同产品组将其功能编译为.so,这些.so 可以加载到统一的基础平台上运行,如果产品组代码有改动,只需要更新对应的.so问题:如何动态加载.so文件,并使用里边的函数/类 ?解决方法1: 使用类的多态特性,将各种产品功能抽象为“工作类”,这些“工作类”都继承一个“动态加载基类”,然后定义纯C的类创建和销毁函数,产品功能.so加载进来后,基础平台寻找创建和销毁函数,就可以创建一个“工作类”实例,并通过基类指针使用。下面是示例代码class worker_base { protected: int wtype; public: worker_base(... 阅读全文
posted @ 2013-12-03 19:41 cgj 阅读(1810) 评论(0) 推荐(0)
摘要:这里http://hedengcheng.com/?p=725有对volatile 非常详细的解释,看完之后,心里一惊,因为我刚好在一个项目里用了文中错误示范那种方式来做线程同步,场景如下:Thread1 对性能要求非常高,它有一些中间数据需要定时同步给数据库,我就增加了一个线程Thread2 来帮它做(Thread2还干了很多其他事情),基本做法是:thread1 干完do_something后,给一个全局的 volatile flag 置1;Thread2在一个大循环里,当检测到flag值是1,则会去读thread1产生的中间数据并入库。按照帖子的说法,flag=true 对应的汇编指令可 阅读全文
posted @ 2013-12-02 19:36 cgj 阅读(823) 评论(0) 推荐(0)
摘要:看到知乎上有个关于linux多进程、多线程的讨论:http://www.zhihu.com/question/19903801/answer/14842584自己项目里也对这个问题有过很多探讨和测试,所以正好开贴整理一下,题目有点长,其实就2点:1. 多进程模型和多线程模型,这两种模型在linux上有什么区别,各有何优缺点? 这里仅限于linux平台,因为linux平台跟win平台关于线程的实现差异很大。2. 采用intel dpdk做包处理程序,是采用多进程模型好,还是多线程模型好? 这里仅限于包处理程序(ips,waf,其他网络设备引擎),因为不同应用场景区别也很大。首先知乎里边的评论,. 阅读全文
posted @ 2013-11-19 10:56 cgj 阅读(6408) 评论(1) 推荐(1)
摘要:第一届淘宝并发编程比赛-多线程排序性能优化http://ifeve.com/tao-code-match-1/在这里看到一道题目,从一个文件里读取字符串,排序,然后写入另一个文件。用C实现了一下,逻辑比较简单:1 将文件读取进来放到一个结构数组里2 根据线程数目N切割这个数组为N个子数组(如果无法整切,多出来的部分由主线程负责排序),每个线程使用qsort算法排序子数组3 主线程等待所有子线程排好序,然后归并子线程的结果4 将结果写入文件在我的机器上,Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz,用4个线程,结果如下:read fp : ./sowpods.t 阅读全文
posted @ 2013-11-12 17:09 cgj 阅读(4357) 评论(0) 推荐(0)
摘要:http://hi.baidu.com/pope123/item/f2eb0b2fb6a2110e73863e71遇到在头文件里定义 static inline 函数的情况 阅读全文
posted @ 2013-11-11 16:36 cgj 阅读(288) 评论(0) 推荐(0)
摘要:简单的std接口使用http://www.cnblogs.com/CnZyy/p/3317999.html根据上述连接实际操作一下,会发现不同的std容器提供很多类似的操作接口,因此初接触者必然有疑惑:数组的情况,要用vector,list 还是 deque, 哈希表的情况,要用 map还是hash_map,什么时候又应该用 set/hash_set.1. vector , list, deque 的区别http://blog.csdn.net/jiangxinyu/article/details/3109982简单来说,需要知道不同容器底层是怎么实现的,vector 是连续内存,因而[]操作 阅读全文
posted @ 2013-11-07 13:22 cgj 阅读(358) 评论(0) 推荐(0)
摘要:刚下班没事干,实现了一个简单的优先级队列#include #include typedef void (*pqueue_setindex) (void *obj, int pq_index);typedef int (*pqueue_cmp) (void* obj1, void* obj2);typedef struct pqueue_struct{ void **heap; int numelem; pqueue_setindex setindex; pqueue_cmp cmp;}pqueue;pqueue* pqueue_new(int pq_size, pqueue_setinde.. 阅读全文
posted @ 2013-08-26 18:47 cgj 阅读(941) 评论(0) 推荐(0)
摘要:1 工程上已经使用并行技术的例子1.1 网络设备 :Intel DPDKIntel 推出的基于x86平台的数据包处理方案,目前已经开源:http://dpdk.org/,网上最新版本是 1.3.1,主要内容包括:多核框架,基于大内存页的内存管理方案,无锁队列,用户态网卡驱动,这几个核心模块的底层实现用到了本文档前面提到的诸多概念,在前面概念的描述过程中,也引用了一些dpdk的代码。1.2 网络游戏虽然文章一开头已经提到,目前家用PC和手机核数最高已经超过10颗,但很多网络游戏的主引擎还是单进程的,比较确定的使用了多核系统的,有云风主导开发的一款游戏(据说采用多进程模型),另外,剑侠奇缘现在有选 阅读全文
posted @ 2013-08-08 17:19 cgj 阅读(548) 评论(0) 推荐(0)
摘要:1 一些资源http://openmp.org/wp/ openmp 开放标准的并行程序指导性注释,没用过http://software.intel.com/zh-cn/articles/parallelization-using-intel-threading-building-blocks-intel-tbb intel tbb ,Intel的C++多线程库,没有用过,有人说性能很不好https://code.google.com/p/nbds/ 无锁数据结构库,关键是针对缓存做了优化,需要注意的是里边的哈希表是没有删除的,说多了都是泪http://mcg.cs.tau.ac.il/pro 阅读全文
posted @ 2013-08-08 17:17 cgj 阅读(3181) 评论(0) 推荐(0)
摘要:简单介绍了锁,这章简单介绍一下无锁编程。有一个观念需要先了解:虽然无锁编程对于多核编程作用有限,但是它对于理解多线程编程的许多深层次问题还是有很好的借鉴作用。前半句的意思是说无锁编程的难度导致只能有极少一部分人能真正利用这种技术做出东西,其他人只能等待这部分人的成果,后半句的意思是即便你成为不了前面这些人,但稍微了解一下他们做的东西,可以大大帮助你理解多核编程的很多概念。1 什么是无锁编程基本的概念与第四章,并发级别是一致的,就是多线程程序里,不需要依赖于锁这样的阻塞机制就可以保证同步的编程技术。2. 无锁编程相关技术从上图可以看到,如果要自己编写无锁程序,基本上要掌握前面几章涉及的所有概念。 阅读全文
posted @ 2013-08-08 17:13 cgj 阅读(907) 评论(0) 推荐(0)
摘要:锁的概念是承接原子操作的,根本目的都是为了并发保护,只不过抽象的层次更高,多核环境下的锁的实现要依赖于第三章的理论基础。下面是几种常见的锁机制的简介,这里不谈具体实现,具体实现可以参考linux内核代码1.1 信号量Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时, 阅读全文
posted @ 2013-08-08 17:10 cgj 阅读(1085) 评论(0) 推荐(0)
摘要:在看多核编程相关论文时,往往一个并发算法会说自己是wait-free的或者lock-free的,或者是 non-blocking 的,这些专有词汇其实表示的是并发的程度,或者说并发的级别。并发级别的理解是阅读各种并发算法设计论文以及并发数据结构实现的必备基础。1.1 Wait-freedom 无等待并发Wait-freedom 指的是每一个线程都一直运行下去而无须等待外部条件,整个流程中任何操作都能在一个有限的步骤内完成,这是最高的并发级别,没有任何阻塞。结合之前原子操作部分的知识,可以简单认为能够直接调用一个原子操作实现的算法或程序就属于Wait-free,比如下面的 increment_r 阅读全文
posted @ 2013-08-08 16:50 cgj 阅读(3633) 评论(0) 推荐(0)
摘要:1 定义Sequential consistency , 简称 SC,定义如下… the result of any execution is the same as if the operations of all the processors were executed in some sequential order, and the operations of each individual processor appear in this sequence in the order specified by its program [lamport]下面用一个小例子说明这个定义的意思 阅读全文
posted @ 2013-08-08 16:47 cgj 阅读(5328) 评论(0) 推荐(2)
摘要:1 定义缓存一致性 Cache coherence 简称 CC, 缓存一致性协议是在共享缓存多处理器架构确保最终一致性最突出、最重要的机制。这些协议在缓存线(cache-line)级别实现了对一致性的保证。缓存线是从主内存中读取数据和向内存中写入数据的缓存单位(至少从一致性机制的角度看是这样的)。商用处理器上三个最突出最重要的缓存一致性协议—MOESI, MESI, and MESIF—的缩写都来自它们为缓存线定义的各种状态:Modified(已修改), Owned(被占用),Exclusive(独占的), Shared(共享的), Invalid(无效的), and Forward(转发的) 阅读全文
posted @ 2013-08-08 16:39 cgj 阅读(4783) 评论(0) 推荐(0)
摘要:问题1:内存模型是什么?答案:CPU硬件有它自己的内存模型,不同的编程语言也有它自己的内存模型。如果用一句话来介绍什么是内存模型,我会说它就是程序员,编程语言和硬件之间的一个契约,它保证了共享的内存地址里的值在需要的时候是可见的,它保证了机器执行代码的结果与程序员脑子里的预期是一致的。。它最大的作用是取得可编程性与性能优化之间的一个平衡。[parallellabs.com]问题2:多核并行编程为什么需要关注内存模型?答案:目前缺少一个并发的内存模型,使得开发多核程序的程序员不得不面对内存操作的一些细节。从语言来说,.net , java 基于虚拟机的语言其内存模型相对完整,c,c++的内存模型 阅读全文
posted @ 2013-08-07 18:53 cgj 阅读(1740) 评论(0) 推荐(0)
摘要:1.1 多核处理器定义多内核处理器架构是指:芯片设计工程师在单个处理器中集成两个或多个 “执行内核(即计算引擎)”。多内核处理器可直接插入到单一处理器基座中。但是,操作系统会把它的每个执行内核作为独立的逻辑处理器,为其分配相应的执行资源。要利用多核处理器的运算能力,需要改写操作系统和编译器,广泛使用的vista, vin7 等都能支持多核体系架构。1.2 多核发展趋势首先思考一个问题: 为什么微处理器要从单核转向多核?答案是: 功耗问题限制了单核不断提高性能的发展途径.有几个简单的公式可以说明这个问题:1)处理器性能 = 主频 * IPC , 主频是指每秒时钟周期数,比如1Ghz,是每秒10亿 阅读全文
posted @ 2013-08-07 18:37 cgj 阅读(2958) 评论(0) 推荐(0)
摘要:首先了解几个概念1. 串行最基本的程序执行方式,串行程序的整个运行时,只有一个调用栈和一个运行时上下文。2. 并发多线程出现后比较常见的程序执行方式,多线程程序运行时,会有多个运行时上下文和对应的多个调用栈。逻辑上多个线程同时发生,物理上是由操作系统调度,CPU某一时刻依然只执行一个线程的任务。3. 并行多核处理器出现后会越来越常见的程序执行方式,物理上多个任务可以同时运行,这个概念介于操作系统和体系架构之间,从操作系统而言,依然是调度多个线程去CPU执行,只不过有了多个CPU/核心,不同线程可以绑定从而完全占用一颗核心,所以从体系架构的角度,同一时刻是有多个任务同时运行,另外一些说法,如‘多 阅读全文
posted @ 2013-08-06 18:12 cgj 阅读(2732) 评论(0) 推荐(0)