实现一个LRU Cache

1.什么是Cache和LRU Cache

狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。 广义上的Cache指的是位于速度相差较大的两种硬件之间, 用于协调两者数据传输速度差异的结构。除了CPU与主存之间有Cache, 内存与硬盘之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache── 称为Internet临时文件夹或网络内容缓存等。

CPU中Cache能极大提高存取数据和指令的时间,让整个存储器(Cache和内存)既有Cache的高速度,又能有内存的大容量;操作系统中的内存Page中使用的Cache能使得频繁读取的内存磁盘文件较少的被置换出内存,从而提高访问速度;数据库中数据查询也用到Cache来提高效率;即便是Powerbuilder的DataWindow数据处理也用到了Cache的类似设计。

Cache的算法设计常见的有FIFO(first in first out)和LRU(least recently used)。LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选并舍弃原有的部分内容,从而腾出空间来放新内容。LRU Cache 的替换原则就是将最近最少使用的内容替换掉。其实,LRU译成最久未使用会更形象, 因为该算法每次替换掉的就是一段时间内最久没有使用过的内容。

Read More

linux内存空间分配和内存管理

前段时间把《程序员的自我修养–链接、装载与库》这本书看完了,期间有些地方不是太明白,当时网络搜索了下,今天把当时看到的东西摘抄下,基本文中大部分内容都是拷贝下面提到的参考链接里的东西,自己在组织下,以备以后需要时查看。

地址分为三类,逻辑地址,线性地址和物理地址。

在《深入理解linux内核》中其把地址分为三类:逻辑地址(汇编语言中操作数地址或指令的地址,对于80x86的CPU,逻辑地址是段+段内偏移地址)、线性地址(也叫虚拟地址)和物理地址。但在Stott Maxwell的《Linux Core Kernel Commentrary》中确是这样分的:逻辑地址(也叫虚拟地址)、线性地址和物理地址。按照386CPU总设计师John Crowford的解释,虚拟地址是保护模式下段和段内偏移量组成的地址,而逻辑地址就是代码段内偏移量,或称进程的逻辑地址。其实对于linux来说,这三种说法都没错,由于linux下并不主张将程序分段,而是主张分页,所以即使是在80x86的体系结构下,段的基地址也是0。因此逻辑地址、线性地址、虚拟地址在linux中其实是相同的。所以对于linux下的ELF可执行文件来说,代码段的起始地址0x08048000既是逻辑地址,也是线性地址也是虚拟地址。

1.X86的物理地址空间布局


以x86_32,4G RAM为例:

Read More

准备看下Redis的源代码

Redis是一个开源,BSD授权,高性能的key-value数据库,使用ANSI C编写。Redis的出现很大程度补偿了memcached这类key-value存储的不足,因为:

Memcached基本只支持简单的key-value存储,不支持枚举,不支持持久化和复制能功能。

Redis除key-value之外,还支持list,set,sorted set,hash等众多数据结构,提供了KEYS进行枚举操作,但不能在线上使用,如果需要枚举线上数据,Redis提供了工具可以直接扫描其dump文件,枚举出所有数据,Redis还同时提供了持久化和复制等功能。

如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:

  • Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。
  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
    Redis和memcached不同之处还在以下方面:1.网络IO模型 2.内存管理方面 3.数据一致性问题 4.存储方式及其它方面(上文提到了)等等,这里不在细说。

Read More

编译和调试C/C++程序常用到的一些知识点

做个笔记,记录下编译和调试C/C++程序常用的一些知识点,主要就是gcc、gdb的一些常用使用方法。

gcc

如图所示,先看下C/C++代码生成可执行文件的过程,共4步:预处理、编译、汇编、链接。

一步到位的编译命令为:

1
2
gcc -Wall -g test.c -o test

Read More

工欲善其事必先利其器

Emacs开发环境配置

Vim开发环境配置

首先,我们先看下自己的VIM都安装了什么插件,命令::scriptnames

我们先配置下vimrc文件,vim ~/.vimrc ,我们先设置让其显示行号和高亮代码,添加如下代码:

set nu!  “显示行号
syntax enable   “语法高亮
syntax on

TagList

功能:有点像VC里面的工作区,里面列出了当前文件的所有的宏,全局变量,函数名等。CTRL+W 连续2下可以左右切换。

下载taglist压缩包, 下载地址:http://www.vim.org/scripts/script.php?script_id=273,然后把解压的两个文件taglist.vim 和 taglist.txt 分别放到$HOME/.vim/plugin 和 $HOME/.vim/doc 目录中。

之后在~/.vimrc中添加如下几条命令:

let Tlist_Auto_Open = 1
let Tlist_Ctags_Cmd = ‘/usr/bin/ctags’
let Tlist_Show_One_File = 1
let Tlist_Exit_OnlyWindow = 1

此时,我们打开一个.c文件查看,发现左边多出一个workspace,当不想出现此工作区时,使用:Tlist可以关闭和打开。

Read More

人生大病,只是一“傲”字

先生曰:“人生大病,只是一傲字。为子而傲必不孝,为臣而傲必不忠,为父而傲必不慈,为友而傲必不信。故象与丹朱俱不肖,亦只一傲字,便结果了此生。诸君常要体此人心本是天然之理,精精明明,无致介染着,只是一无我而已:胸中切不可有,有即傲也。古先圣人许多好处,也只是无我而已,无我自能谦。谦者众善之基,傲者众恶之魁。”

引用王阳明先生的这段话来表示下我今后的学习和生活态度,与君共勉。