用Bollger记录技术之路的点滴...

关注高性能linux网络编程,NoSQL, c/c++/java ~~~ weibo @语_行 http://weibo.com/201281062~~~ twitter @JerryVector https://twitter.com/JerryVector
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  Linux/C

摘要:什么是内存对齐对齐是跟数据在内存中位置相关的话题。如果一个变量的内存地址正好是它长度的整数倍,它就称作 是自然对齐的。举例来说,对于一个32为的类型的数据(通常会是4个字节),如果它在内存中的地 址刚好可以被4整除,那它就是自然对齐的。一些体系结构对对齐的要求非常严格。通常像RISC的系统,载入未对齐的数据会导致处理器陷入(一 种可处理的错误);还有一些系统可以访问没有对齐的数据,只不过性能会下降。编写可移植的代码 要避免对齐问题,保证所有的类型都能够自然对齐。更多内容请移步: 内存对齐 阅读全文

posted @ 2013-11-18 18:56 语行 阅读(334) 评论(0) 推荐(0)

摘要:可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语 法如下所示:x/ n、f、u是可选的参数。n是一个正整数,表示需要显示的内存单元的个数,也就是说从当前地址向后显示几个 内存单元的内容,一个内存单元的大小由后面的u定义。f 表示显示的格式,参见下面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当 阅读全文

posted @ 2013-08-26 15:02 语行 阅读(994) 评论(0) 推荐(0)

摘要:非阻塞型同步 (Non-blocking Synchronization) 简介如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步。同步可分为阻塞型同步(Blocking Synchronization)和非阻塞型同步( Non-blocking Synchronization)。阻塞型同步是指当一个线程到达临界区时,因另外一个线程已经持有访问该共享数据的锁,从而不能获取锁资源而阻塞,直到另外一个线程释放锁。常见的同步原语有 mutex、semaphore 等。如果同步方案采用不当,就会造成死锁(deadlock),活锁(livelock)和优先级反转(priori 阅读全文

posted @ 2013-06-05 13:22 语行 阅读(4326) 评论(0) 推荐(1)

摘要:1:大小写转换: 大写->小写: tr A-Z a-z 小写->大写: tr a-z A-Z2:进制转换: 十进制->16进制: echo "ibash=10;obase=16;num"|bc 16进制->10进制: echo "ibash=16;obase=10;num"|bc 注意16进制数要用大写。否则会出错。 阅读全文

posted @ 2013-05-03 13:41 语行 阅读(720) 评论(0) 推荐(0)

摘要:写C++程序的都知道,标准库STL给我们提供了大量容器供我们使用,如list,set, list能提供高效的插入删除操作,而set能提供高效的查询操作,但是当我们需要一个既能保证搞笑查询又能高效插入删除的时候该如何选择呢,显然,单纯的使用list或set是无法满足我们的需求的。基于近期一个项目的业务特点,选用了list.h这个数据结构,这里对list.h做一点介绍,也是自己的一个总结。基于linux内核版本2.6.9的list.h。(网上看到有说2.6和2.4内核存在一些差异, 我自己还看到2.6.9的list.h跟2.6.18的list.h的实现也有一些差异,2.6.18里边提供了hlist 阅读全文

posted @ 2013-04-18 16:19 语行 阅读(621) 评论(0) 推荐(0)

摘要:1:整体初始化过程第二节中我们谈到了在twemproxy启动过程中,需要在core_start这个函数中创建context,这个core_start函数里就完成了配置文件的解析以及相应组件的初始化。下边定位到core.c: core_start这个函数,我们来看看它的具体实现。1):struct context *ctx;首先,在这个函数的开始,创建了一个context对象。context,顾名思义:上下文,我们看它的定义:一个context含有id, cf(配置),stats,pool:server_pool, 因为一个配置文件中会有很多个节点,每一个节点其实就是一个server_ pool 阅读全文

posted @ 2013-03-23 13:39 语行 阅读(1063) 评论(0) 推荐(0)

摘要:三、Twemproxy关键数据结构分析1: array. 位于:nc_array.hTwemproxy自己实现了一个数组结构以及一系列对这个结构进行操作的函数,array结构定义如下:struct array { uint32_t nelem; /* # element 当前数组的位置索引*/ void *elem; /* element 元素指针,指向array的首地址*/ size_t size; /* element size 每一个元素的大小 */ uint32_t nalloc; /* # allocated element ... 阅读全文

posted @ 2013-03-16 22:25 语行 阅读(2622) 评论(0) 推荐(0)

摘要:一、Twemproxy概述及其特性Twemproxy是一个由twitter开源的memcache与redis的代理,全部由C语言实现。作为一个代理,它的主要特性包括:1:可以减少到后端cache服务器的连接。2:在多个cache服务之间自动共享数据。3:能够使用不同的策略和散列函数支持一致性hash。4:通过配置设置是否禁用失败的节点。5:运行多个实例,客户端可以连接到第一个可用的代理服务。6:支持请求的流式与批处理,降低来回的消耗。二、Twemproxy启动启动流程分析对于一个由C/C++编写的应用程序而言,程序的启动点一般都是main函数,所以对一个程序进行分析的话,也一般都是有main函 阅读全文

posted @ 2013-03-16 20:41 语行 阅读(3984) 评论(0) 推荐(0)

摘要:你可能对于 Linux 的负载均值(load averages)已有了充分的了解。负载均值在 uptime 或者 top 命令中可以看到,它们可能会显示成这个样子:load average: 0.09, 0.05, 0.01很多人会这样理解负载均值:三个数分别代表不同时间段的系统平均负载(一分钟、五 分钟、以及十五分钟),它们的数字当然是越小越好。数字越高,说明服务器的负载越 大,这也可能是服务器出现某种问题的信号。而事实不完全如此,是什么因素构成了负载均值的大小,以及如何区分它们目前的状况是 「好」还是「糟糕」?什么时候应该注意哪些不正常的数值?回答这些问题之前,首先需要了解下这些数值背后的 阅读全文

posted @ 2013-03-13 23:13 语行 阅读(526) 评论(0) 推荐(0)

摘要:我们知道,linux上 , man是一个很有用的命令,使用他可以帮助我们查看一个命令的使用手册。有时候,当我们想查看linux一个系统函数的文档,如何来区分呢,可以这样使用:1 Executable programs or shell commands2 System calls (functions provided by the kernel)3 Library calls (functions within program libraries)4 Special files (usually found in /dev)5 File formats and conventions eg 阅读全文

posted @ 2013-03-06 12:58 语行 阅读(256) 评论(0) 推荐(0)

摘要:twemproxy exploretwemproxy,也叫nutcraker。是一个twtter开源的一个redis和memcache代理服务器。 redis作为一个高效的缓存服务器,非常具有应用价值。但是当使用比较多的时候,就希望可以通过某种方式 统一进行管理。避免每个应用每个客户端管理连接的松散性。同时在一定程度上变得可以控制。 搜索了不少的开源代理项目,知乎实现的python分片客户端。node的代理中间层,还有各种restfull的开源代理。RedBrigeC + epoll实现的一个小的webserverredis自身执行lua脚本的功能来执行redis命令访问时在url中带上lua 阅读全文

posted @ 2013-02-05 14:36 语行 阅读(18409) 评论(0) 推荐(0)

摘要:我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子。比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便利,但是对于程序员来说可能并不太好,原因有两个:虚拟机屏蔽了操作系统的系统调用,以及很多底层机制。大量的封装好的类库也屏蔽了很多实现细节。一段时间后,你会发现你知其然,不知所以然。。我以前在CSDN上写过一篇《Java NIO类库Selector机制解析(上,下,续)》,在那篇文章中我说提到过(有讥讽的语气)Java的程序员不懂底层实现,所以很难把技术学得更扎实。此时,一部分程序员会不自然地想学学底层的技 阅读全文

posted @ 2012-11-22 15:41 语行 阅读(793) 评论(3) 推荐(1)

摘要:线程中特有的线程存储, Thread Specific Data 。线程存储有什么用了?他是什么意思了?大家都知道,在多线程程序中,所有线程共享程序中的变量。现在有一全局变量,所有线程都可以使用它,改变它的值。而如果每个线程希望能单独拥有它,那么就需要使用线程存储了。表面上看起来这是一个全局变量,所有线程都可以使用它,而它的值在每一个线程中又是单独存储的。这就是线程存储的意义。下面说一下线程存储的具体用法。l 创建一个类型为 pthread_key_t 类型的变量。l 调用 pthread_key_create() 来创建该变量。该函数有两个参数,第一个参数就是上面声明的 pthread_ke 阅读全文

posted @ 2012-07-25 16:52 语行 阅读(2149) 评论(0) 推荐(0)