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