3/29/2008
把新买的蚊帐也挂起来了,呵呵,占据了客厅里好大一块地方啊,不过还是蛮漂亮的,LP还把几个毛绒玩具放进去了
迎接宝宝进行曲严重进行中啊……
3/25/2008
He eats no fish and plays the game.
他忠诚而守规矩。
----------------------------------------------------------------------
一个有历史渊源的用法。英国历史上宗教斗争激烈,旧教规定在斋日教徒可以吃鱼。新教推翻旧教后,新教教徒拒绝吃鱼表示忠于新教。所以“eat no fish”就转译为“忠诚”。当然就要遵守规则,“play the game”就转译为“守规矩”。
例句:
John can be relied on. He eats no fish and plays the game.
约翰值得信赖。他忠诚而守规矩。
Frank is a man eating no fish, so we can believe in and depend on him.
弗兰克是个诚实的人,我们可以信任并依赖他。
Don't tip belongings of the bag onto the table!
别把袋里东西倒在桌子上!
----------------------------------------------------------------------
通过这个句子记住一个动词和一个名词。
第一,动词tip,倾斜,翻倒(to topple over, overturn; slant)(以前的句子里学过tip的3个名词含义“顶端”“建议”和“小费”),既可以作及物动词,也可以作不及物动词使用。第二,经常用作复数的名词belongings,所有物。
例句:
I hope you've let none of your belongings in the hotel.
我希望你什么东西也没忘在旅馆里。
Who bumped the table and tipped the vase?
谁撞了桌子打翻了花瓶?
3/12/2008
I don't want to be at odds with my neighbors.
我不想与邻居们有什么争执。
----------------------------------------------------------------------
名词odds很难找到直接对应的中文含义,大概相当于“可能的机会”“成败的可能性”之类的含义。这个句子里“be at odds with sb.”是个固定的表达,意思是,与某人意见不一致、有争执。英文对这个表达的解释就是,be in disagreement,be in conflict。
例句:
The artist and the self-critic . . . are, with a few felicitous exceptions, forever at odds.
艺术家和自我批判(的品质)……除了少数令人欣喜的例外,总是冲突的。
He's always at odds with his father over politics.
在政治上他总和父亲意见不一。
Bush is at odds with Davis over California energy crisis.
布什与戴维斯在加州能源危机的问题上意见相左。
#!/bin/bash
for ((i=1;i<15;i++)) ; do #for和((以及))和;之间可以有空格也可以没有空格
if [ $i -le 10 ] ; then #第一个(中括号)[和if及$i之间都必须有空格,10和第二个(中括号)]之间必须有空格,但是(中括号)]和;之间的空格可有可无
echo 0$i
else
echo $i
fi
case $i in
1|3|5|7|9|11|13|15) echo 00000;; #后面必须是两个分号;;
2|4|6|8|10|12|14) echo 11111;; #后面必须是两个分号;;
esac
done
3/8/2008
Don't forget to clock out before you go.
走之前别忘记打卡。
----------------------------------------------------------------------
上下班为了记录考勤,在大多数公司都有打卡的制度。这个动词“打卡”,就要用“clock”来表示。实际上,仍然来自于clock作为名词“钟表”的最初含义,这里的clock是动词,英文的解释是,To record working hours with a time clock,即,以钟表记录工作时间。在酒店入住登记和结账,分别使用的是“check in”和“check out”,与此类似,上班打卡就是“clock in”,下班打卡就是“clock out”。
例句:
We clocks in at 9 a.m. and out at 6 p.m.
我们早上9点上班,下午6点下班。
3/4/2008
“标准linux系统数据段、代码段、堆和栈在虚存层面是连续的。堆向上增长,栈向下增长,在堆底和栈顶之间有256MB的内存可供分配”,这句话应该有问题吧?一个程序只能动态分配256M内存?附上几段我原来在其它论坛上就相关问题回帖的片断,供参考。
原话题是讨论FreeBSD系统上的内存分配的,讨论过程中跟NetBSD和Linux系统进行了比较。
第一片断:
在32位机器的4GB的地址空间中,高端的1GB是缺省留给内核使用的,低端的大致3GB的空间则留给进程自己使用。我们知道,对于一个传统的unix进程的内存布局而言,低端是text段,然后是data段,然后是向上生长的heap,位于高端的则是向下生长的stack。由于data和heap的大小在FreeBSD里是统一规划的,所以在此不做严格区分。
但对于现在的系统而言,heap和stack之间并非一马平川,这里面还有一部分是给mmap预留的空间。如下图所示,左边表示
的是FreeBSD进程的内存布局,右边则是Linux进程的内存布局。
我们可以看到,FreeBSD进程的heap向上生长的极限并不是stack的顶部,而是mmap区域的底部。图中用红线表示。这个界限就是前面所说的MAXDSIZ参数的意义,也就是说,data段最大只能到达此处。和stack碰头的任务就交给mmap了,事实上,mmap区域向上生长的极限就是stack向下生长的极限,也就是由MAXSSIZ参数对应的stack下限地址。因此,一个系统中有多少空间用于mmap就由MAXDSIZ和MAXSSIZ两个参数限定了。
在前面的试验中,我们逐步增大MAXDSIZ,实际上就是在逐步压缩mmap的生存空间,直至系统中那些依赖于mmap的程序出现问题为止。
再来看看Linux进程的内存布局。它的mmap区域改成了从顶端向下生长, 于是,原来stack和heap碰头的事情就交给了mmap来做了。这样的效果就是如果mmap没干过什么的话,heap就可以一直生长到stack那儿!我认为,这也就是为什么同样的程序,在Linux上不做任何修改的情况下就能让heap长到3056MB的原因。
第二片断:
我在前面曾经怀疑过NetBSD的进程地址空间布局和Linux是一样的,即mmap空间从高向低长。今天查了一下NetBSD的文档,证实了我的想法:【NetBSD Documentation: UVM, the new Virtual Memory system】
What is ``top down'' memory allocation?
This rearranges mmap(2)'ed memory allocations that don't request a specific address such that
they start directly below the stack and work from the top down, instead of from the middle
upwards. By doing this, the area of space reserved for heap growth and the area of space reserved
for mmap(2)'ed allocations are merged, meaning that the heap can grow larger, or a process can
mmap more or larger objects. The kernel still uses the traditional ``bottom up'' scheme for its
internal memory management.
第三片断:
Linux和NetBSD把mmap的生长方向从自底向上改为自顶向下之后,heap和mmap都有机会(是各自而不是同时)占用更大的地址空间。和原来的(FreeBSD的)地址空间布局比较起来,FreeBSD的mmap挡在了heap的前面,而Linux和NetBSD的mmap却挡在了stack的前面。关于这一点,在前面所引的Linux的http://lwn.net/Articles/91829/一文中已有说明:
There are a couple of disadvantages to this approach. One is that the stack area is rather more
confined than it used to be. The actual size of the stack area is determined by the process's
stack size resource limit, with a sizable cushion added, so problems should be rare.
也就是说,把mmap挪到stack前面之后,虽然解放了heap,但stack的日子可就没原来那么滋润了。
第四片断:
看了新出的【Understanding the Linux Kernel】第三版,书中第二十章专门讲到了Linux的新的内存布局(819页):
Linux是在2.6.9版本中引入所谓的“flexible memory region layout”的,从本质上说,就是一个进程的内存布局取决于它的
用户模式栈预期能长多大。不过仍然可以使用传统的布局方式,主要用于内核无法限制用户模式栈的大小的时候。
一般来说,如果内核能够通过RLIMIT_STACK得到一个用户模式栈的尺寸上限,那它就使用灵活布局。这个限制定义了保留给栈的线性地址空间,但是,这个大小不能小于128 MB,也不能大于2.5 GB。
如果RLIMIT_STACK被设为“无穷大”,或者系统管理员把sysctl_legacy_va_layout变量设为1,内核就无法确定用户模式栈的上限,于是就选择传统的内存区域布局。