摘要: 通过CAS操作免锁设计:CAS原子 操作(Compare & Set):包含三个操作数,内存值V、旧的预期值 oldval、要修改的新值newval,当且仅当内存V中的值和旧值oldval相同时,将内存V修改为newval。数组队列是一个循环数组,队列少用一个元素,当头等于尾标示队空,尾加1等于头标... 阅读全文
posted @ 2014-01-21 00:47 平凡之路 阅读(7420) 评论(9) 推荐(4) 编辑
摘要: 软件系统中常见的资源有内存、文件句柄、数据库会话、线程、服务等,资源管理是资源使用者对资源进行有效控制的过程。资源管理的设计往往影响软件的非功能性需求:性能:软件系统中操作往往涉及很多资源,如何保证资源可用、避免浪费、高效获取。可扩展:如何设计资源管理架构保证向上、向下兼容。可预测:如何保证资源操作的时间是可以预期的。灵活性:如何设计保证系统易于定制和配置。稳定性:如何设计保证资源的频繁操作不会导致系统的不稳定。一致性:如何设计保证系统处于一致的状态。软件系统的设计往往需要考虑以上多个方面,而某些方面本身是互相矛盾的,比如灵活性和性能本身可能冲突(分层架构设计),针对实际的问题在不同的影响之间 阅读全文
posted @ 2014-01-07 22:11 平凡之路 阅读(1486) 评论(0) 推荐(1) 编辑
摘要: 基于栈空间的优化: 在C语言中函数调用是基于程序堆栈机制,函数调用会进行压栈操作,堆栈被用来保存函数返回地址、寄存器值、入参、局部变量等信息,在函数调用过程中需要在栈上分配空间并对栈空间初始化,一个典型的程序堆栈入下图所示: 函数调用时,首先分配被调用函数的参数空间将其初始化,将其压入调用者的堆栈中,然后将返回地址压入调用者的堆栈。被调函数的堆栈开始依次保存了ebp寄存器、其它一些寄存器的值(用于存放上一个函数的部分局部变量)、对于不能存放在寄存器中的局部变量信息将会保存在栈空间中。了解了函数栈机制,通过对函数进行适当的调整就可以显著的优化性能。 1:通过修改入参的传递方式的优化,一个典... 阅读全文
posted @ 2013-12-28 23:22 平凡之路 阅读(2454) 评论(2) 推荐(0) 编辑
摘要: 基于处理器分支预测优化: 现代处理器由指令控制单元(ICU)和执行单元(EU)组成,ICU负责取指、译码,EU负责指令执行,为了并行处理ICU会预取指令,所以EU执行的指令通常ICU在前期就取出译码,对于含有分支的代码就包含多条取指路径,ICU在分支路径采用了分支预测技术,既预先选择一条分支取指译码,如果后期发现预测失败则需要重新取指,这意味着浪费了几个时钟周期。分支预测算法通常基于以前运行的结果来作为下次预测的依据。 1. 优化分支预测: 由于预测算法通常基于以前的结果,如果我们的代码分支条件的判断是有规律的,则有助于分支预测的准确性,如下例所示:#include #include #i.. 阅读全文
posted @ 2013-11-02 13:10 平凡之路 阅读(1693) 评论(0) 推荐(3) 编辑
摘要: 通过设计合理的数据结构和算法将一些本需要在运行期间计算的信息预先存放在内存中来提升性能,是一种空间换时间的优化,下面一些实际的例子描述了这种优化方法的使用:在一个递增的数组中查询和待查找元素最接近的的索引例如数组[1,2,3,4,5],待查找元素为1.1返回数组索引0,待查找元素为1.6返回数组索引1,通过计算和数组每个元素的差值,循环遍历一遍数组可以即可得到索引值,如下代码所示:const double g_searchTable[] = {1,2,3,4,5};int getIndex(double data){ int index = 0; double temp; d... 阅读全文
posted @ 2013-10-17 22:30 平凡之路 阅读(4045) 评论(3) 推荐(1) 编辑
摘要: 组件:提供特定功能的软件实体,能够独立编译,通过不同的接口表现不同的行为。目标是实现组件开发和产品开发分离,接口和实现分离。通过注册组件可以在产品中快速的定制组件相关的功能。1:组件定义:明确组件的性质、用途、包含的接口实现接口中的方法一个组件通常由一个外部头文件和若干个实现文件组成,通过库和头文件形式发布//组件ID,组件管理机构统一分配#define CID_TRACE 0x00000001//组件实例化接口,由组件提供者实现ICOMP* insTraceComp();2:接口定义:明确接口的用途、范围确定接口中的方法接口由头文件组成,包括接口ID定义和接口定义//接口ID,组件管理机构统 阅读全文
posted @ 2013-09-08 14:00 平凡之路 阅读(2746) 评论(0) 推荐(2) 编辑
摘要: 基本框架MDU(消息分发单元):包含一个消息处理任务,包含自身的消息队列,是一个消息调度的基本单位。PID (功能子模块) :框架中用PID作为模块的划分,每个模块具有自己的PID编号,根据功能和调度需求可以安排多个PID到一个MDU中,PID是消息通信的一个基本单位,每个PID提供一个消息处理入口。MQ (消息队列) :使用消息队列作为任务通信的数据结构。消息处理流程构建一个MDU模块,注册入框架中,初始MDU没有注册PID,未构建消息处理任务。构建PID,注册入对应的MDU中,如果是MDU中第一个PID,构建消息处理任务。消息处理任务从该MDU对应的消息队列中取消息处理。消息处理任务获取消 阅读全文
posted @ 2013-08-18 10:24 平凡之路 阅读(3493) 评论(0) 推荐(5) 编辑
摘要: 问题描述:生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。条件变量解决方案:基于队列构建一个缓冲区,生产者在队尾填充,消费者在队头获取。队列缓冲区作为多个线程的共享资源。由于多个消费者和生产者线程可以并发访问缓冲区,需要互斥锁来控制对缓冲区的互斥访问。队列空时消费者线程需要等到队列中存在资源、队列满时生产者线程 阅读全文
posted @ 2013-07-24 22:06 平凡之路 阅读(2948) 评论(0) 推荐(1) 编辑
摘要: 接收邮件import poplib,pdb,email,re,timefrom email import headerPOP_ADDR = r'pop.126.com'USER = ''PASS = ''CONFIG = ''def getYear(date): rslt = re.search(r'\b2\d{3}\b', date) return int(rslt.group())def getMonth(date): monthMap = {'Jan':1,'Feb':2,&# 阅读全文
posted @ 2013-07-15 23:12 平凡之路 阅读(3018) 评论(0) 推荐(0) 编辑
摘要: 在交互环境中通常使用pdb.run来调试:import pdbdef pdb_test(arg): for i in range(arg): print(i) return argpdb.run("pdb_test(3)")b 函数名、行号: 打断点,b可以查询所有的断点。(Pdb) b pdb_testBreakpoint 1 at c:\users\plpcc\desktop\pdbtest.py:3(Pdb) bNum Type Disp Enb Where1 breakpoint keep yes at c:\users\plp... 阅读全文
posted @ 2013-07-07 14:34 平凡之路 阅读(27152) 评论(1) 推荐(0) 编辑