// MuSkipList.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include <random> #include <iostream> #include <set> #include <assert.h> using namespace std; typedef unsigned _int64 Key; struct Comparator { int operator()(const…
多进程编程多用在并发服务器的编写上,当收到一个请求时,服务器新建一个进程处理请求,同时继续监听.为了提高响应速度,服务器采用进程池的方法,在初始化阶段创建一个进程池,池中有许多预创建的进程,当请求到达时,只需从池中分配出来一个进程即可:当进程不够用时,进程池将再次创建一批进程.类似的方法可以用在内存分配上. C++中,创建一个复杂的对象需要几十条指令,包括函数调用的代价(寄存器值得保存和恢复),以及构造或复制构造函数体的执行代价,甚至动态分配内存的代价.尤其是,在不重载new和delete运算符…
内核中有些地方的内存分配是不允许失败的,为了确保这种情况下的成功分配,内核开发者建立了一种称为内存池的抽象:内存池其实就是某种形式的后备高速缓存,它试图始终保存空闲的内存,以便在紧急状态下使用: mempool会分配一些内存块,空闲且不会真的得到使用:因此,使用mempool很容易浪费大量内存:几乎在索欧情况下,最好不使用mempool而是处理可能的分配失败:而如果系统分配内存失败会导致对系统的一致性破坏,为了应对这种情况,则应该使用mempool: 内存池对象的类型为mempool_t,在<l…
在内核中有不少地方内存分配不允许失败. 作为一个在这些情况下确保分配的方式, 内核 开发者创建了一个已知为内存池(或者是 "mempool" )的抽象. 一个内存池真实地只是一 类后备缓存, 它尽力一直保持一个空闲内存列表给紧急时使用. 一个内存池有一个类型 mempool_t ( 在 <linux/mempool.h> 中定义); 你可以使用 mempool_create 创建一个: mempool_t *mempool_create(int min_nr, mempoo…
内核中经常进行内存的分配和释放.为了便于数据的频繁分配和回收,通常建立一个空闲链表——内存池.当不使用的已分配的内存时,将其放入内存池中,而不是直接释放掉. Linux内核提供了slab层来管理内存的分配和释放.频繁分配和回收必然导致内存碎片,slab 缓存分配器通过对类似大小的对象进行缓存而提供这种功能, 从而避免了常见的碎片问题. 1.缓存 Linux 内核的缓存管理者有时称为" slab 分配器". 因此, 它的功能和类型在<linux/slab.h> 中声明. sl…
LevelDB学习笔记 (3): 长文解析memtable.跳表和内存池Arena 1. MemTable的基本信息 我们前面说过leveldb的所有数据都会先写入memtable中,在leveldb中每个 LevelDB 实例最多会维护两个 MemTable: mem_ 和 imm_.mem_ 可以读写,imm_ 只读.分别对应了memtable和immutable table. 1.1 首先去看一下db/memtable.h 下面是基本的构造信息 class MemTable { publi…
Import Advanced Go Programming 1.5 面向并发的内存模型 在早期,CPU都是以单核的形式顺序执行机器指令.Go语言的祖先C语言正是这种顺序编程语言的代表.顺序编程语言中的顺序是指:所有的指令都是以串行的方式执行,在相同的时刻有且仅有一个CPU在顺序执行程序的指令. 随着处理器技术的发展,单核时代以提升处理器频率来提高运行效率的方式遇到了瓶颈,目前各种主流的CPU频率基本被锁定在了3GHZ附近.单核CPU的发展的停滞,给多核CPU的发展带来了机遇.相应地,编程语言也…
http://blog.csdn.net/a2331046/article/details/52294006 在ios4以前,只有非并发的情况下,队列会为operation开启一个线程来执行.如果是并发的情况,operation需要自己创建一个线程来执行.所以说,NSoperation的并发和非并发不是传统意义上的串行和并行. 但是在ios4以后,不管是并发还是非并发,队列都会为operation提供一个线程来执行.所以isConcurrent这个变量也就没有用处了. 但是,这里还设涉及到了两个…
一.原理 arena是LevelDB内部实现的内存池. 我们知道,对于一个高性能的服务器端程序来说,内存的使用非常重要.C++提供了new/delete来管理内存的申请和释放,但是对于小对象来说,直接使用new/delete代价比较大,要付出额外的空间和时间,性价比不高.另外,我们也要避免多次的申请和释放引起的内存碎片.一旦碎片到达一定程度,即使剩余内存总量够用,但由于缺乏足够的连续空闲空间,导致内存不够用的假象.        C++ STL为了避免内存碎片,实现一个复杂的内存池,LevelD…
NSoperation也是多线程的一种,NSopertaion有2种形式  (1) 并发执行       并发执行你需要重载如下4个方法     //执行任务主函数,线程运行的入口函数    - (void)start        //是否允许并发,返回YES,允许并发,返回NO不允许.默认返回NO    -(BOOL)isConcurrent     - (BOOL)isExecuting     //是否已经完成,这个必须要重载,不然放在放在NSOperationQueue里的NSOper…