- 博客(57)
- 资源 (1)
- 收藏
- 关注
原创 QT下使用boost::threadpool编译问题
threadpool不属于BOOST,以下是安装链接http://www.cnblogs.com/kingcat/archive/2012/05/07/2487192.html作者使用的是BOOST1.58.0版本由于安装BOOST库的缘故导致系统下的动态库如以下形式:libboost_thread.so.1.58.0有一个1.58.0的后缀,虽然boost库可以正常调
2016-10-22 14:30:14
653
原创 QT链接muduo库
muduo编译安装链接http://blog.youkuaiyun.com/liuweihui521/article/details/52556375使用muduo库中自带的例子DiscardServer,路径examples/simple/DiscardServer;代码直接拷贝即可。在PRO文件中添加以下数据:LIBS += /usr/lib/muduo/libmudu
2016-10-20 19:36:07
1100
原创 地下通道之MVC模式
地下通道如下图: A路(B路,C路)只知地下通道,不知B路,C路(A路,C路;A路,B路)。通过地下通道做中转,A路到B路,C路。MVC模式如下图: MVC模式,只让视图知道控制器,只让模式知道控制器,达到可维护强,可扩展强。
2012-05-27 09:46:53
884
原创 Reassociation Transformation
void combine7(vec_ptr v, data_t* dest){ long int i; long int length = vec_length(v); long int limit = length - 1; data_t* data = get_vec_start(v); data_t acc = IDENT;
2012-03-09 22:33:42
760
原创 Enhancing Parallelism
void combine6(vec_ptr v, data_t* dest){ long int i; long int length = vec_length(v); long int limit = length - 1; data_t* data = get_vec_start(v); data_t acc0 = IDENT;
2012-03-09 22:29:41
471
原创 Loop Unrolling
void combine5(vec_ptr v, data_t* dest) { long int i; long int length = vec_length(v); long int limit = length - 1; data_t* data = get_vec_start(v); data_t acc = IDENT;
2012-03-09 22:24:30
744
原创 Eliminating Unneeded Memory References
void combine4(vec_ptr v, data_t* dest) { long int i; long int length = vec_length(v); data_t* data = get_vec_start(v); data_t acc = IDENT; for (i = 0; i { acc
2012-03-08 20:24:44
499
原创 Reducing Procedure Calls
data_t* get_vec_start(vec_ptr v) { return v->data; } void combine3(vec_ptr v, data_t* dest) { long int i; long int length = vec_length(v); data_t* data = get_vec_start(v);
2012-03-08 20:14:56
536
原创 Eliminating Loop Inefficiencies
void combine2(vec_ptr v, data_t* dest) { long int i; long int length = vec_lenght(v); *dest = IDENT; for (i = 0; i length; ++i) { data_t val; get_vec_elem
2012-03-08 20:06:01
566
原创 ProgramExample
typedef int data_t; typedef struct { long int len; data_t* data; }vec_rec, *vec_ptr; #define IDENT 0 #define OP + //#define IDENT 1 //#define OP * vec_ptr new_vec(long int len
2012-03-08 19:43:07
476
原创 Optimizing Program Performance
1:Eliminating Loop Inefficiencies2:Reduce Procedure Calls3:Eliminating Unneeded Memory References4:Loop Unrolling5:Multiple Accumulators6:Reassociation Transformation看了下优化程序性能,感触良多,接下来
2012-03-07 22:37:32
558
原创 读书笔记 Effective STL
STL是建立在泛化之上的。数组泛化为容器,参数化了所包含的对象的类型。函数泛化为算法,参数化了所用的迭代器的类型。指针泛化为迭代器,参数化了所指向的对象的类型。
2012-03-03 18:53:22
435
原创 读书笔记 Effective C++
声明一个pure virtual函数的目的是为了让derived classes只继承函数接口。声明简朴的(非纯)impure virtual函数的目的,是让derived classes继承该函数的接口和缺省实现。声明non-virtual函数的目的是为了令derived classes继承函数的接口及一份强制性实现。由于non-virtual函数代表的意义是不变性(invarian
2012-02-23 20:36:13
372
原创 读书笔记 Effective C++
尽量以pass-by-reference-to-const替换pass-by-value。前者通常比较高效,并可避免切割问题(slicing problem) 以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass-by-value往往比较适当。
2012-02-22 18:55:16
410
原创 读书笔记 Effective C++
polymorphic(带多态性质的)base classes应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。 Classes的设计目的如果不是作为base classes使用,或不是为了具备多态性(polymorphically),就不该声明virtual析构函数。
2012-02-19 12:34:46
441
原创 C语言一行一行读文件
char RevData[100]; FILE* pfile = fopen("20111216-1633-1634.TXT", "r"); CDev dev; while (!feof(pfile)) { fgets(RevData, sizeof(RevData), pfile); dev.OnReceive((const void*)RevData, sizeof(RevD
2011-12-20 10:38:20
2466
原创 心境
最近心绪纷飞,看书没有心思,没有前段时间的激情与渴望,多了一些迷茫与茫然。一部分是强迫自己看英文书籍,毕竟英语不提高,对于以后的发展总是有影响的;另一部分是最近在看算法,不像前段时间看操作系统概念,一点就透,算法需要心思去思考,更令我惰懒的是还是看的英文,进度就更缓慢;最重要的原因可能最近工作上的事需要思考的太多了,花费了太多心神,以至于晚上只想放松,或者说脑袋刚想想问题就想到工作上的难题。等最近
2011-11-30 20:50:51
777
原创 链接 读深入理解计算机系统
链接(linking)就是将不同部分的代码和数据收集和组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储器并执行。链接可以执行于编译时(compile time),也就是在源代码被翻译成及其代码时;也可以执行于加载时(load time),也就是在程序被加载器(loader)加载到存储器并执行时;甚至执行于运行时(run time),由应用程序来执行。链接器在软件开发中扮演着一个关
2011-11-19 17:26:14
616
原创 数组分配和访问 读深入理解计算机系统
T A[N];它在存储器中分配了L×N字节的连续区域,这里L是数据类型T的大小(单位为字节)。我们用XA来表示起始位置。其次,它引入了标识符A,A可以用来作为指向数组开头的指针。这个指针的值就是XA。可以用0~N-1之间的整数索引来访问数组元素。数组元素i的存放地址XA+L*i.指针运算如果p是一个指向类型T的数据的指针,p的值为Xp,表达式p+i的值为Xp+L*i,这里L是数
2011-11-18 10:45:09
770
原创 寄存器使用惯例 读深入理解计算机系统
程序寄存器是唯一一个被所有过程共享的资源。虽然在给定时刻只能有一个过程是活动的,我们必须保证当一个过程(调用者)调用另一个(被调用者)时,被调用者不会覆盖某个调用者稍后会使用的寄存器的值。为此,IA32采用了一组统一的寄存器使用惯例,所有的过程都必须遵守,包括程序库中的过程。根据惯例,寄存器eax,edx,ecx被划分为调用者保存(caller save)寄存器。当过程P调用Q时,Q可以覆盖这
2011-11-17 14:44:04
3600
原创 程序的机器级表示 读深入理解计算机系统
1:程序计数器(称为%eip)表示将要执行的下一条指令在存储器中的地址。2:整数寄存器文件包含8个被命名的位置,分别存储32位的值。这些寄存器可以存储地址(对应于C的指针)或整数数据。有的寄存器用来记录某些重要的程序状态,而其他的寄存器用来保存临时数据,例如过程的局部变量。3:条件码寄存器保存着最近执行的算术指令的状态信息。它们用来实现控制流中的条件变化,比如说用来实现if或while语句
2011-11-17 14:23:17
1237
原创 处理器读并解释储存在存储器中的指令 读深入理解计算机系统
hello.c源程序已经被编译系统转换成了可执行目标文件hello,并被存放在磁盘上。为了在Unix系统上运行该可执行文件,我们将它的文件名输入到称为shell的应用程序中:unix> ./hellohello,worldunix>shell是一种命令行解释器,它输出一个提示符,等待你输入一行命令,然后执行这个命令。如果该命令行的第一个单词不是一个内置的shell命令,那么shel
2011-11-13 13:00:06
904
原创 程序被其他程序翻译成不同的格式
在hello程序生命周期的一开始时是一个高级C程序,因为当处于这种形式时,它是能够被人读懂的。然而,为了在系统上运行hello.c程序,每条C语句都必须被其他程序转化为一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序(executable object program)的格式打好包,并以二进制磁盘文件的形式存放起来。目标程序也称为可执行目标文件(executable object
2011-11-10 20:04:58
659
原创 信息就是位+上下文 读深入理解计算机系统
我们的hello程序的生命是从一个源程序(或者说源文件)开始的,该源程序由程序员通过编辑器创建并保存为文本文件,文件名就是helloc.c。源程序实际上就是一个由0和1组成的位(又称为比特)序列,这些位被组织8个一组,称为字节。每个字节都表示程序中某个文本字符。大部分的现代系统都使用ASC码标准来表示文本字符,这种方式实际上就是用一个唯一的字节大小的整数值来表示每个字符。下图给出hello.c
2011-11-09 20:42:29
1674
1
原创 页面置换 读操作系统概念第六版
页面置换:如果没有空闲帧,那么就找当前不在使用的帧,并使之空闲。可以这样来释放一个帧:将其内容写到交换空间,并改变页表(和所有其他表)以表示该页不在内存中。1:查找所需页在磁盘上的位置。2:查找一空闲帧:a:如果有空闲帧,那么就是用它。b:如果没有空闲帧,那么就是用也置换算法以选择一个“牺牲”帧。c:将“牺牲”帧的内容写到磁盘上;改变页表和帧表。3:将所需页读入(新)空闲帧
2011-11-08 19:49:28
821
原创 请求页面调度 读操作系统概念第六版
请求页面调度系统类似于分页系统加上交换。进程驻留在次级存储器上(通常为磁盘)。当需要执行进程时,将它换入内存。不过,不是将整个进程换入内存,而是使用lazy swapper。lazy swapper只有在需要页时,才将它调入内存。由于将进程看做一系列的页,而不是一个大的连续空间,因此使用“交换”从技术上来讲并不正确。交换程序对整个进程进行操作,而调页程序只是对进程的单个页进行操作。因此,在讨论有关
2011-11-07 20:55:19
3318
原创 虚拟内存 读操作系统概念第六版
虚拟内存技术允许进程的执行不必完全在内存中。这种方案的一个很大的优点就是程序可以比物理内存大。而且,虚拟内存将内存抽象成一个巨大的、统一的存储数组,进而将用户看到的逻辑内存与物理内存分开。这种技术允许程序员不受内存存储的限制。虚拟内存也允许进程很容易地共享文件和地址空间。 程序通常有处理异常错误条件的代码。由于这些错误即使有也是很少发生,所以这种代码几乎不执行。数组、链表和表通常分配了
2011-11-06 18:53:58
1287
原创 解读城市
没有机遇,没有惊才,难以留在城市;没有技能,难以谋生,即使积累再丰富,坐吃山空,几代甚至几十代,也会离开城市。 别给自己太多的压力,前路一片荆棘,走到最后的人寥寥无几,都抱着雄伟壮志,挫伤的心远比自豪的多。
2011-11-05 17:18:45
506
原创 分段 读操作系统概念第六版
采用分页内存管理有一个不可避免的问题:用户观点的内存和实际内存的分离。用户观点的内存和实际内存不一样。用户观点的内存需要映射到实际内存。该映射允许逻辑内存和物理内存的不同。 想一下你在写程序时是如何考虑程序的。你会认为程序是由主程序加上一些子程序、过程、函数或模块所构成的。还有各种数据结构:表、数组、堆栈、变量等。每个模块或其他数据元素都可以通过名称引用。你会说“符号表”、“函数sqrt”
2011-11-04 19:22:11
784
原创 分页 读操作系统概念第六版
每个操作系统都有自己的方法来保存页表。绝大多数都为每个进程分配一个页表。页表的指针与其他信息(如指令计数器)一起存入进程控制块中。当分派程序需要启动一进程时,它必须首先装入用户寄存器,并根据所保存的用户页来定义正确的硬件页表值。 标准解决是采用小但专用且快速的硬件缓冲,这种缓冲称为翻译后备缓冲器(translation look aside buffer, TLB)。TLB是关联内存根据给
2011-11-03 19:21:25
743
原创 分页一 读操作系统概念第六版
分页(paging)内存管理方案允许进程的物理地址空间可以是非连续的。分页避免了将不同大小的内存块备份到交换空间上的麻烦问题。 物理内存分为固定大小的块,称为帧(frame)。逻辑内存也分为同样大小的块,称为页。当进程需要执行时,其页从备份存储中调入到可用的内存帧中。备份存储也分为固定大小的块,其大小与内存的帧一样。由CPU所生成的每个地址分为两个部分:页码(p)和页偏移(d)。页号作
2011-11-02 20:07:50
756
原创 连续内存分配 读操作系统概念第六版
内存通常分为两个区域:一个用于驻留操作系统,另一个用于用户进程。保护操作系统不受用户进程所影响,保护用户进程不受其他用户进程所影响。通过采用重定位寄存器和界限寄存器,可以实现这种保护。重定位寄存器含有最小的物理地址值;界限寄存器含有逻辑地址的值。有了重定位寄存器和界限寄存器,每个逻辑地址必须小于界限寄存器;MMU动态地将逻辑地址加上重定位寄存器的值后映射为物理地址。映射后的物理地址在送交内存单
2011-11-01 20:10:01
868
转载 [转]50个c/c++源代码网站
C/C++是最主要的编程语言。这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码 。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C++源代码的网站。这不是一个完整的清单,您有建议可以联系我,我将欢迎您的建 议,以进一步加强这方面的清单。 添加:http://www.boost.org/1、http://snippets.dzone.com/tag
2011-11-01 10:10:10
456
原创 地址捆绑 读操作系统概念第六版
通常,程序以二进制可执行文件形式存储在磁盘上。为了执行,程序应被调入内存并放在进程内。根据所使用的内存管理方案,进程在执行时可以在磁盘和内存之间移动。在磁盘上等待调入内存以便执行的进程形成了输入队列。通常的步骤是从输入队列中选一个进程并装入内存。进程在执行时,会访问内存中的执行中的指令和数据。最后,进程终止,其地址空间将被释放。CPU所生成的地址通常称为逻辑地址,而内存单元所看到的地址(即
2011-10-30 21:41:07
775
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人