Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1849824
  • 博文数量: 211
  • 博客积分: 464
  • 博客等级: 下士
  • 技术积分: 3794
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-24 18:25
个人简介

阿弥陀佛

文章分类

全部博文(211)

文章存档

2020年(2)

2019年(3)

2018年(5)

2017年(6)

2016年(10)

2015年(9)

2014年(73)

2013年(90)

2012年(13)

分类: 架构设计与优化

2015-01-19 14:46:41

      1.一些重要的数据结构应该是Cache-Line对齐的,这样保证在一个cache line当中能够保存,如果不是Cache line对齐的,那么可能会产生重要的数据结构跨Cache-line,那么CPU需要访问两个Cache-Line才能拿到数据。
内存分配时可以使用更加高效的内存申请方法:TCMalloc,可以安装编译,并自动替代glibc里面的malloc,而不用为了适应TCMalloc,重新写一套系统。TCMalloc的原理是为了避免多线程申请内存的争用,使用Thread-Cache Malloc ,即每个线程都维护一个线程的私有数据,通过这种方法实现每个线程调用malloc的时候,都是从自己的线程的私有数据中读取数据,从维护的freelist里面申请内存。

TCMalloc的实现非常的精细,因为TCMalloc的研发者发现,系统lock/unlock的时间要消耗100ns,所以采用这种方式可以非常巧妙的避免多线程同时调用malloc的开销。
如下是获得线程的私有数据的方法:

点击(此处)折叠或打开

  1. inline ThreadCache* ThreadCache::GetThreadHeap() {
  2. #ifdef HAVE_TLS
  3.   // __thread is faster, but only when the kernel supports it
  4.   if (KernelSupportsTLS())
  5.     return threadlocal_data_.heap;
  6. #endif
  7.   return reinterpret_cast<ThreadCache *>(
  8.       perftools_pthread_getspecific(heap_key_));
  9. }

      2.正常的生产者-消费者模型采用队列的方式组织资源,当生产者将元素放入到请求队列中后,消费者从队列中删除元素,并处理该元素。如果生产者与消费者均采用pthread线程来实现,那么读写锁适用于多个消费者,且他们都是需要搜索这个队列。此时只是遍历整个队列,而非插入或删除操作时,这个时候使用读写锁最为合适。
      3.读memcached的代码发现,这里面有关thread的实现都放在thread.c当中,里面的函数均采用static声明,对外只留有一个接口,setup_thread
这样做实现了类似于c++中的封装的思想。
      4.好的程序,比如memcached,想要利用里面的代码,可以直接拿过来用。因为比如线程的部分与其他的业务逻辑并无太大的关联。
      5.Copy on write 只能够解决写时断电的问题,还是无法解决硬盘出现故障的问题。
      6. 为什么cache能够起作用,提高系统的性能,关键因素在于两点:时间局部性和空间局部性。
      7. 采用硬件加速,设计出更好的指令,使用SIMD ,单一指令多数据流的方式,避免了多次访存,当需要取数据的时候,不是去完一个操作数,再取另一个操作数,而是直接将所需的操作数都取回来,目前已经广泛的应用于视频的编解码处理中。
阅读(3134) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

shenyanxxxy2015-01-25 13:24:58

个人总结的一些设计方法和方案,希望能帮助到大家。