2010年4月11日星期日

设计多线程安全库

1. 为什么要多线程?
    多线程可以提高系统的性能。更方便实现某些程序模型。

2. posix中的一些线程安全函数如下
        asctime_r, ctime_r, getgrgid_r,getgrnam_r, getpwnam_r,
getpwuid_r, gmtime_r, localtime_r, rand_r, readdir_r, strtok_r

3. 线程安全和可重入例程的特点
线程安全例程是指这个例程即使被多个线程同时调用也不会产生错误的结果。
通常,可以通过一下三种方法来保证线程安全:

3.1 设计成可重入例程
只使用参数和堆栈的例程。   
void test(int *buf) {
           int in_buf[20];
           buf[0] = in_buf[0];
          ....
}
3.2 使用线程局部的数据
使用thread specific data或者Thread local Storage技术的函数
3.3 利用锁技术
spinlock, mutex_lock , ...

4. 非线程安全函数的例子
4.1  libc 中的ctime
返回了全局的静态分配的_tmbuf
struct tm _tmbuf;

/* Return the `struct tm' representation of *T in local time.  */
struct tm *
localtime (t)
     const time_t *t;
{
  return __tz_convert (t, 1, &_tmbuf);
}


2010年4月10日星期六

使用qemu建立简单的ceph分布式文件系统测试环境

1. 下载代码并编译
git clone git://ceph.newdream.net/git/ceph.git
git clone git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git

2. 配置服务端环境并启动服务
2.1 添加use_xattr
在/etc/fstab中,找到服务端所在文件系统的位置,添加use_xattr选项。比如
UUID=c0fb46f4-6b8d-41a3-b026-5850b9f51865 / ext3
relatime,user_xattr,errors=remount-ro 0 1
重启系统

2.2 建立文件夹
mkdir -p dev/osd0
mkdir out
mkdir log

2.3 启动ceph服务, ip地址可以根据自己的环境选择
./vstart.sh -n -d -m 192.168.0.100

3. 测试服务端配置
./csyn --syn makedirs 2 2 2
./csyn --syn walk
执行后,应该可以看到很多文件夹和文件

4. 编译linux客户端
4.1 配置
make menuconfig , 在文件系统中选择ceph

5. 启动qemu 加载ceph文件系统
mount -t ceph 192.168.0.100:/ /mnt/ceph
touch abc

6. 验证
./csyn --syn walk
应该可以看到刚刚建立的文件abc