Aiur – ZelluX 的技术博客

Security, Kernel, Virtualization, Programming Languages

Archive for April, 2009

终端下如何在Emacs中使用鼠标

without comments

http://linux.about.com/od/emacs_doc/a/emacsdoc567.htm

M-x xterm-mouse-mode 开启鼠标支持,操作的时候按住shift能恢复到之前的xterm鼠标模式

M-x mouse-wheel-mode 开启滚轮支持

一些相关的参数:
mouse-drag-copy-region 选中后自动复制
mouse-wheel-scroll-amount 每次滚动的行数
mouse-wheel-follow-mouse 滚动位置
mouse-wheel-progressive-speed  滚动速度

Written by zellux

April 29th, 2009 at 10:50 am

Posted in Tools

Tagged with ,

Notes on Xen vcpu

without comments

1. 绑定vcpu和cpu
xm vcpu-pin <domain-id> <vcpu-id> <cpu-id>

2. 为domainU设置vcpu数
xm vcpu-set <domain-id> <vcpu-id>
注意这里的vcpu-id不能超过domainU配置中的vcpu数

3. xen中的不同domain的vcpu是独立的,或者说domain0的vcpu0和domainU的vcpu0不是同一个。在这个问题上犯过错,以至于设计接口语义的时候出问题了。

Written by zellux

April 27th, 2009 at 9:13 pm

Posted in Computer System

Tagged with

IPv6 动态域名

without comments

http://dns6.org/

水木上看到的,提供免费的ipv6动态域名申请

List of available domains :

boulay.be : A, AAAA, CNAME, NS
dns6.org : A6, AAAA
at.home.be : A, AAAA, CNAME, NS
iax.be : A, AAAA, CNAME, NS
ipv4.be : A, CNAME
odns.be : A, AAAA, CNAME, NS
oo.lv : A, AAAA, CNAME, NS
pouet.be : A, AAAA, CNAME, NS
xdns.eu : A, AAAA, CNAME, NS

You get a hostname like : login.boulay.be
This allows you to use your computer as an http, ftp, .. server, because even if your ip changes, you’re always reachable through your static hostname (you’ve just to keep it updated with your latest ip).

Additionnal available services :
NS : allows you to delegate it to your own dns server
MX : allows you to receive email at *@login.boulay.be
Wildcard : allows you to specify also *.login.boulay.be
ex: www.login.boulay.be
Cloaked : allows you to cloak your url

Written by zellux

April 20th, 2009 at 12:26 pm

Posted in Tools

Tagged with ,

PPoPP 08 – FastForward

without comments

FastForward for Efficient Pipeline Parallelism
http://systems.cs.colorado.edu/~moseleyt/publications/giacomoni-2008-ppopp-ff.pdf

这篇paper介绍了一种针对多核访问优化的队列, 主要的特点:
1. Lock-free
2. Single-producer/single-consumer
3. Cache-optimized

经典的Lamport的lock-free的队列实现可以用下面的伪代码来表述(同样只适用于单一生产者/单一消费者的情形):

enqueue_nonblock(data) {
    if (NEXT(head) == tail) {
        return EWOULDBLOCK;
    }
    buffer[head] = data;
    head = NEXT(head);
    return 0;
}
dequeue_nonblock(data) {
    (head == tail) {
        return EWOULDBLOCK;
    }
    data = buffer[tail];
    tail = NEXT(tail);
    return 0;
}

这种实现尽管做到了lock-free,但是存在几个问题,首先是它只适用于sequential consistency内存模型,在relaxed consistency的内存模型里可能会出现类似于Double-Checked Lock(http://techblog.zellux.czm.cn/?p=30)的问题,当然这个问题可以通过插fence指令来解决;第二个问题是这篇paper着重解决的,就是enqueue和dequeue这两个操作都用到了tail和head这两个全局变量,导致多核在读取/修改这两个变量时的为了保证cache coherency会频繁的进行cache的更新,从而导致cache line threading,降低了效率。

接下来看FastForward的实现:

enqueue_nonblock(data) {
    if (NULL != buffer[head]) {
        return EWOULDBLOCK;
    }
    buffer[head] = data;
    head = NEXT(head);
    return 0;
}

dequeue_nonblock(data) {
    data = buffer[tail];
    if (NULL == data) {
        return EWOULDBLOCK;
    }
    buffer[tail] = NULL;
    tail = NEXT(tail);
    return 0;
}

这个版本的队列实现粗看和Lamport的那个区别很小,而实际上这里解决了一个重要的问题:解除了head和tail的共享问题。dequeue操作只需要关心tail,enqueue操作只关心head,这样两个变量就变成CPU本地的资源了,不需要做任何同步。当然这个实现同样局限于sequential consistency,不过加fence保证顺序的overhead不大。最后测试中这个版本的单次操作比Lamport的快3.7倍左右,可见这样一个小小的改动对性能的提升起了举足轻重的作用。

paper后面还严格的证明了这种队列实现的正确性,即保证了消费者读出的数据的顺序和它们在生产者写入时的顺序一致,此处略去。

Written by zellux

April 20th, 2009 at 12:15 pm

ELPA: Emacs Lisp Package Archive

without comments

今天试用了下果然很方便,强烈推荐~

以下转载自http://blog.pluskid.org/?p=206

TeX 有 CTAN,Perl 有 CPAN,Python 有 PyPI 和 easy_install (虽然好像至今还不支持自动 uninstall),Ruby 有 RubyForge 和 gem ,诸如 Eclipse 、NetBeans、Firefox 这样的大型软件都有方便的插件/扩展查找和自动安装的功能,更别说各大流行的 Linux 发行版所带的那些包管理器了。然而号称具有无穷可扩展性的超强编辑器:GNU Emacs ,虽然确实具有无数的扩展,但是这些扩展往往各式各样、散落各地,并且正是由于这无穷的扩展性,让各个扩展的安装定制方式千奇百怪,很难统一在一起。我想 这也是 Emacs 长久以来一直没有统一的扩展管理的原因之一吧。

不过一直被人们说成不“Modern”的 Emacs 近年来也确实有发愤图强,添加了 GTK 界面的支持,新的编码系统,对 XFT 的支持等等。而 EmacsWiki 的兴起也终于让大部分的 Emacs 相关的信息有了一个统一的汇集地,大部分的扩展都可以在上面找到相关的下载和安装指南。不过这离自动管理还有一定的距离。不过,再后来,我们终于有了 ELPA (Emacs Lisp Package Archive)

ELPA 是一个集中存放 Emacs Lisp Package 的地方,它同时还提供了一个工具可以自动查找、安装和卸载在 ELPA 中注册的 Package 。实际上,正像前面说的那样,Emacs 的扩展 Package 可以说是各式各样,仅仅要把它们搜集到一起就已经很不容易了,更别说提供全自动的安装和卸载功能了。但是最难的还是要有人去做这个事情吧。一旦有人发起 了,建立了一个平台,后面的工作主要由各个扩展的作者将自己的代码按照 ELPA 的规范定制一下并添加到 ELPA 中去。这也是我在这里宣传 ELPA 的原因,让更多人知道这个平台,让它逐渐丰富完善起来。

实际上,现在的 ELPA 中已经包含了诸如 emmsMuse 以及 nxml 等 80 多个扩展。当然,这个数目实在是不多,不过也正是如此,才需要大家去加以完善。现在 ELPA 提供的功能也比较简单。打开 Emacs ,到它的主页上,把那段代码复制到 Emacs 中 eval 一下就算 ELPA 安装好了。

…………

Written by zellux

April 14th, 2009 at 2:04 pm

Posted in Tools

Tagged with ,

关于tuple的读音

without comments

水木上有个帖子讨论tuple这个词该怎么读,于是有人翻出来这个三年前的新闻组邮件

http://coding.derkeiler.com/Archive/Python/comp.lang.python/2006-02/msg01915.html

I used to pronounce it toople. But the people that taught me Python
found it both comical and confusing. At first they thought I meant a 2
element tuple. So they wondered if a 3 element tuple was a threeple,
etc. After much harrassing, I changed my wayward ways and pronounced
it tuhple to fit in with the cool Python guys. ;-)

Then we went to hear Guido speak about Python 2.2 at a ZPUG meeting in
Washington, DC. When he said toople I almost fell out of my chair
laughing, particularly because the people who taught me to say it the
“right” way were with me. When I looked over, they just hung their
head in shame.

I work with Guido now and I’m conflicted. I’m still conditioned to say
tuhple. Whenever he says toople, I just get a smile on my face. I
think most of the PythonLabs guys pronounce it toople.

有意思,嘿嘿

我一直习惯把这个词读成/tʌpəl/,估计是受tunnel这个词的影响,然后查了下http://en.wiktionary.org/wiki/tuple#Pronunciation_2 发现/tuːpəl/和/tʌpəl/都可以

Written by zellux

April 10th, 2009 at 4:17 pm

Posted in Programming

Tagged with ,

CGO 09 一篇关于DCL检测的论文

without comments

Double-Checked Lock是一个常见的由于程序员把内存模型默认为sequential momery consistency导致的问题,具体见我去年写的一篇博文http://techblog.iamzellux.com/2008/07/singleton-pattern-and-double-checked-lock/

虽然Java 5解决了这个问题,但是C++等语言中这个问题依然存在,依然有很多因为程序员假设sequential consistency而编译器做了错误的指令调度后导致的bug,见http://www.newsmth.net/bbscon.php?bid=335&id=250203

CGO 09的这篇paper Detecting and Eliminating Potential Violations of Sequential Consistency for Concurrent C/C++ Programs针对这个问题进行了深入研究,通过加fence指令的方法解决了因编译器的指令调度造成的违背程序员原义的问题,可以在http://ppi.fudan.edu.cn/yuelu_duan下载到。没有认真读过,俺在这里就不误人子弟了 O.O

Written by zellux

April 9th, 2009 at 10:33 pm

Posted in Programming

Tagged with ,

彩色版svn diff

without comments

首先要装colordiff这个彩色版的diff脚本,arch和debian的源上都有,然后用svn diff的–diff-cmd=colordiff选项把diff工具设置成colordiff即可

可以设个alias方便使用

alias svndiff=’svn diff –diff-cmd=colordiff’

另外如果要把colordiff的结果分页,可以使用less -R,不清楚most的对应选项是啥/或者说most有么有这么个选项。

Written by zellux

April 8th, 2009 at 11:18 pm

Posted in Tools

Tagged with ,

SOSP 99 – Cellular Disco

without comments

同样是今年寒假读的


两年前的paper的升级版,这次是利用Disco在一个多核电脑上跑多个操作系统并虚拟成一个cluster。主要解决了两个问题,一是容错性,当硬件错误发生时如何把影响缩小到一个单元里;二是资源的管理,如何高效地在虚拟机间动态的分配物理CPU和内存。

容错和动态资源管理在某种程度上相互矛盾的。因此在分配资源的时候,要尽可能的减少一个虚拟机使用的cell数。这里的cell是指相对独立的容错 单元,后面还提到一个node的概念,Origin 2000上每个node含两个CPU。CD还提供了两种快速的进程间通讯的primitive,RPC和message。

关于容错,有这么个问题,Disco在操作系统和硬件之间多弄了这么一层虚拟层,某个虚拟的操作系统出问题时可以不影响到其他操作系统,可是操作系 统不也是保证了进程间的互相独立,当一个进程异常时不影响另一个进程吗?多设立一层Disco对容错有什么帮助吗?这个问题的答案在于,VMM的代码量很 小,可以看作是一个可信的系统软件层(trusted system software layer),因为当VMM的代码行数少于五万行时,它的复杂度就和其他可信的层(如cache coherence protocol)差不多了,这个复杂度比现代操作系统的复杂度差不多要低两个等级。

传统操作系统通常使用一个全局的run queue来管理和分配进程在多个CPU上的运行,这种实现不适合CD的容错要求,也带来了更多的contention。所以CD为每个VCPU维护了一 个run queue,同时引入了VCPU migration的机制来平衡VCPU的负载,按颗粒度分三级,intra-node intra-cell inter-cell。内存管理方面,CD实现了memory borrowing机制,使得一个cell可以暂时的从其他cell里获得内存,如果这种借用受限于容错性,就只能使用原来的paging机制了。

CPU管理

CD有两个CPU平衡策略,一个在处理器空闲时发生,另一个定期平衡VCPU的负载。空闲调度时要同时考虑gang scheduling的限制以及因转移破坏的cache/node affinity。而定期的调度则是通过一棵全局的load tree的辅助来实现的。此外还需要一个scalable gang scheduler来保证效率,CD的调度器总是选择优先度最高的gang-runnable VCPU(等待时间最多),然后通过低开销的RPC通知那些拥有(和这个VCPU同属于一个虚拟机的VCPU)的处理器,这些处理器在收到消息后,立即停 止当前正在运行的VCPU,服从同一调度策略。通过这种方式实现的调度就不需要一个全局的管理器了。

内存管理

每个cell都维护了自己的freelist,每次接收请求时都优先分配本地node上的资源。内存借用也很直接,需要借用内存的cell向有空闲内存的cell发个RPC即可,RPC的返回结果是一个machine page的list。

测试结果

测试中CD是作为kernel process跑在IRIX 6.4上的,也就是说VMM的下面还有一层操作系统,主要是为了利用IRIX提供的设备驱动。CD在每个CPU上跑一个线程,完全占有整个CPU,IRIX只在需要设备驱动时才被激活。

测试比较了两个测试环境,跑在真机上的IRIX 6.4(增加了多核支持),和跑在CD上的IRIX 6.2。最后的结果显示大部分情况下(单核、8核、32核)后者和前者的差距在10%以内,最差情况下也只有20%的overhead。接下来的容错机制 的overhead同样很小,不高于2%。

Written by zellux

April 8th, 2009 at 4:38 pm

Posted in Computer System

Tagged with , ,

SOSP 97 – Disco

without comments

趁还在编译内核的时候把以前写过的东西都转过来,今年寒假读的 (SOSP ’97)

Disco: running commodity operating systems on scalable multiprocessors


很早的一篇paper,发表的第二年Rosenblum就创办了VMWare。这篇paper介绍了一个跑在 FLASH机器上的虚拟机Disco,FLASH的架构是实验性质的cache coherent non-uniform memory architechure(ccNUMA)。

传统的VMM在实现上主要有三个问题

  • overhead,例如特权指令需要由VMM模拟
  • 资源管理,缺乏对资源配置的细粒度的了解,导致资源分布不均(如调度一个没有价值的计算任务)
  • 通讯和共享,不同虚拟机是不是应该简单的看成是享有相同硬件资源的完全独立的操作系统?

实现细节

1. 虚拟CPU

Disco虚拟CPU时是把指令放到物理CPU上直接执行的。当调度到某个虚拟CPU时,Disco就把物理机的寄存器设置为虚拟机的寄存器并跳转到相应的PC。

直接执行的好处在于大多数操作能获得和在真机上跑一样的效率,而难点在于处理不能直接放到真机上运行的指令,如修改tlb,访问物理内存等。

Disco为每个虚拟CPU记录了一个类似于传统操作系统中process table entry的数据结构。为了模拟特权指令,Disco还在这个数据结构中维持了虚拟CPU的特权寄存器和tlb的内容。

在MIPS处理器上,Disco运行在kernel mode掌握着对硬件的完全控制;控制器交给虚拟机的操作系统时,Disco把CPU置为supervisor mode;当进入user mode时取消。Supervisor模式允许操作系统访问受保护的内存区域(supervisor segment),但仍不能执行特权指令,也不能访问物理内存。诸如page fault的trap发生时,vmm会捕获到这个异常,修改相应的特权寄存器并跳转到虚拟机的trap vector。

2.虚拟内存

Disco增加了一层物理地址到机器地址的转换。虚拟机使用从0开始的物理地址,大小和为虚拟机的内存相等,Disco把这些物理地址映射到了 FLASH的40位机器地址上。这种映射的实现借助于MIPS处理器的software-reloaded TLB,当操作系统尝试在TLB中插入一个virtual-to-physical的映射时,Disco会把这里的physical address改成对应的machine address,这样之后通过这条TLB记录的地址访问就不需要再经过VMM的处理了,没有额外的overhead。

为了方便计算TLB地址,Disco为每个虚拟机记录了一个pmap数据结构,每个pmap结构对应着虚拟机的一个物理页。pmap包含了一个指向 机器内存的引用,以及指向虚拟地址的映射(虚拟地址可能有多个,原文中用了复数形式),这主要用于页面被VMM回收时TLB的重置。另外MIPS处理器为 每个TLB记录标记了一个地址空间标识符(ASID, address space identifier),用来防止context switch时不必要的TLB刷新。Disco为了简单化处理,就在物理CPU被调度为另一个虚拟CPU时刷新TLB,这样ASID就能直接使用虚拟机提 供的了。

这样的处理带来了性能问题,由于TLB在虚拟CPU切换时会被刷新,带来了额外的TLB miss,而TLB miss由于需要被模拟,它的代价很大。为了减少这种性能影响,Disco维持了一个virtual-to-machine的二级软TLB,TLB miss发生的时候首先查看软TLB有没有相关的记录,如果找不到再交给虚拟机上的操作系统去处理。这种处理的影响就是虚拟机所看到的TLB会比实际 CPU的TLB大很多。

3. NUMA 内存管理

不怎么熟悉NUMA,这部分先粗读了,大致思想是通过动态的页面转移和复制维持locality,从而避免remote cache miss。

4. 虚拟IO设备

增加特殊的设备驱动是最清晰的实现方法,每个Disco设备都定义了一个monitor call,供设备驱动传参调用。对于支持DMA操作的设备,Disco也需要截获这些DMA请求并转换为相应的machine address。对于仅有一个虚拟机访问的设备,Disco只要保证访问的排外性并翻译DMA请求即可,而不需要虚拟IO资源。截获所有DMA操作的一个 好处是Disco可以在虚拟机间共享磁盘和内存资源。

5. Copy-on-write disks

DMA请求被截获时,如果请求的磁盘块已经在内存里了,就不需要再访问磁盘。如果请求的大小正好是虚拟机页面大小的整数倍,直接把对应的物理页映射 到虚拟机里就行,另外考虑到以后可能会修改这部分内存,需要将那些页面设为read-only,从而实现copy-on-write,同时这些处理对虚拟 机完全透明的。

磁盘被写入时,分两种情况处理:对于持久性的磁盘,如包含用户文件的,同一时间Disco只允许一个虚拟机挂载这个磁盘,其他虚拟机可以通过NFS 等分布式文件系统协议访问它;而对于非持久的磁盘,如根磁盘,使用copy-on-write的策略,即在写操作发生时记录下被修改的扇区,而copy- on-write的磁盘自身不会被修改。

6. 虚拟网络接口

虚拟机间通过NFS共享文件时,不做特殊处理的话,客户端和服务器端会各有一份buffer cache保存共享的数据。因此copy-on-write的策略同样被用在了网络实现上,虚拟机间的信息传送是通过在发送方和接收方上映射同一个只读页来完成的。

SPLASHOS: A Specialized Operating System

SPLASHOS是一个特制的跑在Disco上的library os,包括了线程创建、同步操作、libc函数和一个用于文件IO的NFS客户端栈,应用程序和这个library os链接后就能直接跑在Disco上,配合跑多个这样的操作系统的话就能利用起整个机器的资源。另外这种操作系统也不需要自己处理page fault等异常了,直接交给虚拟机就行。

测试结果

整个测试是跑在SimOS这个模拟器上的,模拟的配置是一个特点类似于FLASH的large-scale multiprocessor。测试的workload是四个比较具有代表性的,并行编译(pmake),verilog模拟,raytrace和 sybase关系数据库。

测试的结果,跑单个workload的时间比不用Disco慢3%到16%

Written by zellux

April 8th, 2009 at 4:33 pm

Posted in Computer System

Tagged with , ,

FireStats icon Powered by FireStatsBetter Tag Cloud