Sunday, March 27, 2011

libc interface v.s. system call

啥是System Call

$man 2 intro
INTRO(2)                                                Linux Programmer's Manual                                               INTRO(2)

NAME
       intro - Introduction to system calls

DESCRIPTION
       Section  2 of the manual describes the Linux system calls.  A system call is an entry point into the Linux kernel.  Usually, sys‐
       tem calls are not invoked directly: instead, most system calls have corresponding C library wrapper functions which  perform  the
       steps  required (e.g., trapping to kernel mode) in order to invoke the system call.  Thus, making a system call looks the same as
       invoking a normal library function.


每个system call都有一个number在<syscall.h>中. system call列表在Linux Kernel Source的arch/i386/kernel/entry.S中.

strace: 跟踪一个程序, 输出程序执行过程中所调用的system call

$strace ls 
execve("/bin/ls", ["ls"], [/* 25 vars */]) = 0
brk(0)                                  = 0x25b3000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7c0f616000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=144586, ...}) = 0
...

System Call Reference

lisp笔记

编程环境

Emacs的用户显然有福. 在Emacs中,可以用M-x ielm进入Emacs自带的lisp解释器

第一段代码:Hello World

ELISP> (print "Hello world")
"hello world"

读入编辑好的lisp文件

ELISP> (load "~/test.lisp")

四则运算

ELISP> (* 7 10)    ;计算7*10
70
ELISP>(* 2 ( cos 0) (+ 4 6))     ;计算2*cos(0)*(4+6)
20.0

循环

ELISP> (loop for i in '(1 2 3) do (print i))
1
2
3
其他loop方式

定义函数

ELISP>(defun multiply-by-seven (number)
         (* 7 number))
multiply-by-seven
ELISP>(multiply-by-seven 10)
70

参考

[1]GNU Emacs Lisp

Thursday, March 24, 2011

aspell

安装aspell
MacOS
$sudo port install aspell
$sudo port install aspell-dict-en

修改~/.emacs
(setq ispell-program-name "aspell")

rsync

参考
Rsync on Ubuntu

同步两个目录的文件src和dst,两个文件可以在同一台机器上:
$rsync -a /home/path/src/ /home/path/dst/
两个文件也可以在不同的机器上, 比如从远端同步到本地:
$rsync -a -e ssh apc999@host:/home/path/src/ /home/path/dst/
或者从本地同步到远端:
$rsync -a -e ssh /home/path/src/ apc999@host:/home/path/dst/

一个稍微复杂些的例子:
将本目录文件(除 .svn文件外)同步到host上,保持所有文件属性
rsync --delete -azvv --exclude '.svn*' -e ssh . apc999@host:~/foo/
选项:
  • -a: 保持文件的时间权限等属性
  • -z: 在传输中压缩
  • -b: 如果覆盖一些文件,备份被覆盖的文件
  • -e: 指定remote shell
  • -r: 递归同步子目录
  • -v: verbose,显示详细的输出
  • --delete: 删除dst中src没有的文件
  • --exclude: 对于某些文件不进行同步

Friday, March 18, 2011

英语,paper, 总结一下

每句在20个单词左右, 避免过长或过短.亲!!!!!!!!!!!!!!!!!!!!!!!!

句式保持变化, 每句都用we开头是非常口语的, 有木有!!!!!!!!!!!!!!!!

单数可数名词记得加冠词.冠词伤不起啊!!!!!!!!!!!!!!!!!!!!!!!!!

不要用following contributions, 直接说three controbutions,有木有!!!!!!!!!!!!

Friday, March 11, 2011

SSD notes

Cell: SLC(Single Level Cell)每一个cell可以存储一个bit,而MLC(Multiple Level Cell)每一个cell可以存储多个bit. MLC有更高的存储密度, 但是读和写一个cell也要花上更多时间.

Page: SSD一般把多个Cell组织成一个page,page的大小通常是4KB. page是SSD上读和写的最小单位.

Block: 而128个page又被组织成一个512KB大小的block. block是擦除数据的最小单位.

TRIM: 当要写的page为空的时候, 可以直接在这个page上写. 然而当这个page不为空的时候, 就需要把这个page所属于的block读入内存,然后在内存中改写相应的page内容,把SSD上的block完全擦除,再写入更改过后的block. 所以哪怕只是做一个bit的改动, 也需要完成上述步骤. 所以在SSD上做in-place或者random的写代价是非常的昂贵. 另外频繁的擦写也会对SSD的寿命造成损害因为一块MLC的SSD通常只能被反复擦写10000次.

这种独特的读写特性也给传统的文件系统带来的"困扰".比如文件系统通常自己维护可用page的信息并进行分配,而不会告知底层存储设备某个page的数据是依然有效还是已经被删除. 一旦有新的数据需要写入一个已有数据的page,就有可能需要等待先要擦除整个block,造成写的性能降低. 为了解决这个问题,很多SSD都支持TRIM这个功能来和操作系统交互. 当操作系统删除一个文件的时候, 除了更新文件系统外还会给SSD设备发送TRIM命令来告知这些文件占据的page已经不需要保存. 这样SSD可以提前用昂贵的block擦除更新把这些page清空. 在下次写的时候就不需要等待整个block的更新了.

Tuesday, March 01, 2011

[Linux]查看/控制登陆

查看最近登陆情况
last

或者查看/var/log/auth.log也可以找到被记录的登陆信息

修改/etc/hosts.allow
sshd:    1.2.3.4,  5.6.
这样可以让ip为1.2.3.4以及处于网段5.6.的client通过ssh登陆本机
修改/etc/hosts.deny
sshd:    all
这样除了hosts.allow中定义的ip外所有链接全部拒绝