上一页 1 ··· 3 4 5 6 7 8 下一页
摘要: 概述Skip list是平衡树的一种替代的数据结构,但是和红黑树不相同的是,跳表对于树的平衡的实现是基于一种随机化的算法的,这样也就是说跳表的插入和删除的工作是比较简单的。并且是Redis、LevelDB、nessDB、SkipDB等的底层结构,学习skip list为后面学习levelDB打下基础。核心思想如果是一个简单的链表,如图1,那么我们知道在链表中查找一个元素I的话,需要将整个链表遍历一次。图 1如果是说链表是排序的,并且节点中还存储了指向前面第二个节点的指针的话,如图2,那么在查找一个节点时,仅仅需要遍历N/2个节点即可。图 2这基本上就是跳表的核心思想,其实也是一种通过“空间来换 阅读全文
posted @ 2013-10-26 16:29 TheBug 阅读(1289) 评论(0) 推荐(0) 编辑
摘要: 阅读全文
posted @ 2013-10-26 11:15 TheBug 阅读(303) 评论(0) 推荐(0) 编辑
摘要: 提到文件,操作系统必须解决两个重要的问题。首先是硬盘驱动器的存取速度缓慢得令人头疼(相对于内存而言),尤其是磁盘的寻道性能。第二个是要满足‘一次性加载文件内容到物理内存并在程序间共享’的需求。如果你使用进程浏览器翻看Windows进程,就会发现大约15MB的共享DLL被加载进了每一个进程。我目前的Windows系统就运行了100个进程,如果没有共享机制,那将消耗大约1.5GB的物理内存仅仅用于存放公用DLL。这可不怎么好。同样的,几乎所有的Linux程序都需要ld.so和libc,以及其它的公用函数库。令人愉快的是,这两个问题可以被一石二鸟的解决:页面缓存(page cache),内核用它保存 阅读全文
posted @ 2013-10-20 22:41 TheBug 阅读(1458) 评论(1) 推荐(1) 编辑
摘要: 内存不全是RAM,让我们看看当今的Intel计算机是如何连接各个组件的吧。下图展示了主板上的主要组件:现代主板的示意图,北桥和南桥构成了芯片组。当你看图时,请牢记一个至关重要的事实:CPU一点也不知道它连接了什么东西。CPU仅仅通过一组针脚与外界交互,它并不关心外界到底有什么。可能是一个电脑主板,但也可能是烤面包机,网络路由器,植入脑内的设备,或CPU测试工作台。CPU主要通过3种方式与外界交互:内存地址空间,I/O地址空间,还有中断。眼下,我们只关心主板和内存。安装在主板上的CPU与外界沟通的门户是前端总线(front-side bus),前端总线把CPU与北桥连接起来。每当CPU需要读写内 阅读全文
posted @ 2013-10-19 22:50 TheBug 阅读(3402) 评论(8) 推荐(3) 编辑
摘要: 本文以一个现代的、实际的个人电脑为对象,分析其中CPU(Intel Core 2 Duo 3.0GHz)以及各类子系统的运行速度——延迟和数据吞吐量。通过粗略的估算PC各个组件的相对运行速度,希望能给大家留下一个比较直观的印象。本文中的数据来自实际应用,而非理论最大值。时间的单位是纳秒(ns,十亿分之一秒),毫秒(ms,千分之一秒),和秒(s)。吞吐量的单位是兆字节(MB)和千兆字节(GB)。让我们先从CPU和内存开始,下图是北桥部分:第一个令人惊叹的事实是:CPU快得离谱。在Core 2 3.0GHz上,大部分简单指令的执行只需要一个时钟周期,也就是1/3纳秒。即使是真空中传播的光,在这段时 阅读全文
posted @ 2013-10-19 15:29 TheBug 阅读(4323) 评论(14) 推荐(10) 编辑
摘要: 在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中。这个沙盘就是虚拟地址空间(virtual address space)。1 32位虚拟内存布局在32位模式下虚拟地址空间总是一个4GB的内存地址块。这些虚拟地址通过页表(page table)映射到物理内存,页表由操作系统维护并被处理... 阅读全文
posted @ 2013-10-19 08:34 TheBug 阅读(4022) 评论(2) 推荐(2) 编辑
摘要: 条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法。举个简单的例子,应用程序A中包含两个线程t1和t2。t1需要在bool变量test_cond为true时才能继续执行,而test_cond的值是由t2来改变的,这种情况下,如何来写程序呢?可供选择的方案有两种:第一种是t1定时的去轮询变量test_cond,如果test_cond为false,则继续休眠;如果test_cond为true,则开始执行。第二种就是上面提到的条件变量,t1在test_cond为false时调用cond_wait进行等待,t2在改变test_cond的值后,调用 阅读全文
posted @ 2013-10-12 23:44 TheBug 阅读(1872) 评论(0) 推荐(0) 编辑
摘要: 1互斥锁关于pthread_mutex_t的相关知识,可参考:互斥锁pthread_mutex_t的使用。用户通过调用pthread_mutex_lock来给互斥量上锁,互斥量一旦被锁上以后,其他线程如果想给它上锁,就会阻塞在这个操作上,直到获得锁为止。得到互斥量以后就可以进入关键代码区了,操作完成之后,必须调用pthread_mutex_unlock,这样其他等待该锁的线程才有机会获得锁,否则其他线程将会永远阻塞。POSIX线程锁机制的Linux实现都不是取消点,因此,延迟取消类型的线程不会因收到取消信号而离开加锁等待。值得注意的是,如果线程在加锁后解锁前被取消,锁将永远保持锁定状态,因此如 阅读全文
posted @ 2013-10-11 22:51 TheBug 阅读(1295) 评论(0) 推荐(1) 编辑
摘要: 1 超线程技术每个单位时间内,CPU只能处理一个线程(Thread)。除非有两个核心处理单元,否则要想在单位时间内处理超过一个的线程是不可能的。超线程HT(Hyper-Threading)技术是在单个核心处理单元中集成两个逻辑处理单元,也就是一个实体内核(共享的运算单元),两个逻辑内核(有各自独立的处理器状态),在一颗CPU同时执行多个程序而共同分享一颗CPU内的资源,理论上要像两颗CPU一样在同一时间执行两个线程,P4处理器需要多加入一个Logical CPU Pointer(逻辑处理单元)。因此新一代的P4 的面积比以往的P4增大了5%。而其余部分如ALU(整数运算单元)、FPU(浮点运算 阅读全文
posted @ 2013-10-10 23:43 TheBug 阅读(6177) 评论(9) 推荐(1) 编辑
摘要: 处理器的亲和性软亲和性(affinity) 意味着进程并不会在处理器之间频繁迁移,而 硬亲和性(affinity) 则意味着进程需要在您指定的处理器上运行。通常 Linux 内核都可以很好地对进程进行调度,在应该运行的地方运行进程(这就是说,在可用的处理器上运行并获得很好的整体性能)。内核包含了一些用来检测 CPU 之间任务负载迁移的算法,可以启用进程迁移来降低繁忙的处理器的压力。一般情况下,在应用程序中只需使用缺省的调度器行为。然而,您可能会希望修改这些缺省行为以实现性能的优化。在 Linux 内核中,所有的进程都有一个相关的数据结构,称为 task_struct。这个结构非常重要,原因有很 阅读全文
posted @ 2013-10-09 21:32 TheBug 阅读(957) 评论(0) 推荐(0) 编辑
上一页 1 ··· 3 4 5 6 7 8 下一页