Not enough space和HP-UX内存管理

最近开发环境(HP-UX)上经常碰到的一个问题,类似于:

/usr/lib/dld.sl: Call to mmap() failed -TEXT /apps/mmcprodora/8.0.6/lib/librw60.sl
/usr/lib/dld.sl: Not enough space

主要原因在HP-UX上,对于32位的应用程序运行,Shared memory有1.75GB的限制。

1. 普通程序的存储空间分布

text 正文段,CPU执行的机器指令部分。通常可共享,只读。
data 初始化数据段,包含程序需赋初值的变量。

如C程序中任何函数之外的声明。int maxCount = 999;
bss 非初始化数据段(block started by symbol). 在程序开始执行前,内核将此段初始化为0。

如long sum[1000];
stack 栈。自动变量给每次函数调用需保存的信息。
heap 堆。动态存储分配。

2. HP-UX 32位应用的内存管理

HP-UX缺省的内存管理是基于象限,分成四个象限,每个象限空间为1GB。HP-UX提供三种可执行方式:

SHARE_MAGIC,EXEC_MAGIC和SHMEM_MAGIC。

缺省情况下为SHARE_MAGIC。

每个进程在象限上有各自的空间,text(执行代码)映射到第一象限,进程的私有数据映射到第二象限。所有的可共享的对象都被映射到第三、四象限,以单份空间的形式可以为所有进程共享。其中第四象限只能提供0.75GB,最后的1/4象限保留做architected I/O。

这也就是说无论系统有多大的物理空间,也只能提供1.75GB作为共享对象的存储空间。

EXEC_MAGIC方式下会要求linker使用-N选项,这样data将紧随着text之后,就可以提供更的的数据空间(将近1.9GB)

SHMEM_MAGIC把进程的所有内容合并到第一象限(包括text、data和stack),这样就可以腾出第二象限,空间可以达到2.75GB。不过SHMEM_MAGIC只在32位kernel的时候支持。

shared library(.sl)包括指令和数据,是在运行时动态加载的,同一个动态库可以被不同的进程共享。按理在我们的开发环境上也不该超过1.75GB,主要的问题目前的开发中许多都复制了多份相同的shared library,这样导致无法达到共享的目的。

如果想使应用超出1.75GB的共享空间的限制,两种方法:

1) 编译成64位应用程序

2) 使用memory window

而在我们的应用中最好的解决方法是第三种:大家使用同一份shared library。

参考:

《UNIX环境高级编程》

想唱就唱



从开始的超女白痴,到看了最后两场的5进3和决赛,觉得“想唱就唱”还是表现了很好的草根娱乐,我喜欢想唱就唱。

想唱就唱

要唱的响亮

就算没人有为我鼓掌

至少我还能够勇敢的自我欣赏

想唱就唱

要唱的漂亮

就算这舞台多空旷

总有一天能看到挥舞的荧光棒

移-动3G采用159号段

中移动正式获3G用159号段 3G号段争夺战开打
前两天还在讨论3G号段的问题,据说是15打头,现在看到了下文。可怜我们都已经把15给内部使用了:-(。看来大家的想法都是一样的,14实在是太难听。

不过这种想法实在也是不好,人为地浪费了很多资源,好好的一座大楼就没有了第四、十三、十四层,何必呢?


P.S. MSN SPACE的标题不允许使用“移动”两个字,不知哪里犯禁了?

乐乐近日语录



1. “你撒谎,你不对,今晚不再跟你睡”和“你这个笨丫头,水开了都不知道”

近来使用频率最高的句子了,一般是对你表示不满的时候,边伸出食指戳你,边咬牙切齿的,有时也是嬉皮笑脸的。

第一句取自儿歌,第二句取自童话《糖果屋历险记》老巫婆对小女孩说的话。

一般这时候得到的回音是“晚上不和我睡最好了,晚上不要再来找我”,呵呵,不过说了也是白说,晚上她还要粘牢你。

2. 周六带小家伙出去玩,下了雨,地有点湿。刚好碰上小语,小语在一个水汪凼上使劲踩水,不小心摔了一跤,乐乐脱口而出,“小语摔了一跤,在水里给淹死了。”

来自《小马过河》,小松鼠对要下河的小马说,“小马哥哥,小马哥哥,千万别下水。前几天我的一个朋友在河里给淹死了。”

3. “别提有多舒服啦”

得意的时候说的话,尤其躺在沙发上,享受的很。来自《三个小猪》,老大喜欢晒太阳,别提有多舒服啦。

4. “一二三四五六七,多劳多得”

现在让她数数,都不肯数了,每次数到七,接下来的话就是“多劳多得”。我晕!

来自电影《麦兜的故事》,已经记不清看过多少遍了,每次电脑带回家被她看见了,就直嚷“麦脱,麦脱”(她说的是麦太,主要看的是粤语版),“我要看小猪。”百看不厌啊!我可苦了,想想每周至少看5遍,周周都看,连续看了几个月了,你说她也不烦,再说粤语她怎么就明白了小猪妈妈喊的是“一二三四五六七,多劳多得”。

5. “风吹杨柳飘啊飘”

下午又带乐乐去了紫金港,学校里已经有新生来报到了。比上次去热闹了不少。看到悬挂着的大气球,乐乐开心的很,蹦蹦跳跳。路边的彩旗,风吹着,摇摇摆摆的,乐乐一把抓住小旗,来了一句,“风吹杨柳飘啊飘。”不知她怎么想的。

Call Super

在OO框架中有时会使用Call Super,味道比较怪。有时想在框架里加点什么,会继承一个基类。常规说法:“要做自己的事情,只需在子类中实例化过程方法,但重要的要记住在自己方法开始时调用父类。”

看这个例子:

public class EventHandler …
public void handle (BankingEvent e) {
housekeeping(e);
}
public class TransferEventHandler extends EventHandler…
public void handle(BankingEvent e) {
super.handle(e);
initiateTransfer(e);
}
TransferEventHandler从EventHandler继承,并做了自己的初始化工作。不过在这里比较苦恼的事情就是你要记住super.handle()。感觉极差。象这种苦力活最好还是交给API本身来完成。

(以前写前台程序,尤其是控件事件的触发这样的代码时,往往会调用父类的事件)


通常可以采用Template Method来解决:

public class EventHandler …
public void handle (BankingEvent e) {
housekeeping(e);
doHandle(e);
}
protected void doHandle(BankingEvent e) {
}
public class TransferEventHandler extends EventHandler …
protected void doHandle(BankingEvent e) {
initiateTransfer(e);
}
这里handle是公共接口对外不变,父类中又提供了doHandle的hook方法,子类可以随意改写。这样写子类的轻松不少,父类的作者也可以随心所欲做他的housekeeping了。


handle/doHandle是一种不错的命名方法,比较清晰。

(template method我很喜欢,写MulProcBase就用了)


软件开发有两种态度DirectingAttitude or an EnablingAttitude

有些语言中可以对方法进行冻结,阻止被子类改写。从EnablingAttitide的角度出发,并不倾向于这样做,尤其对于继承的公开的接口。赞同冻结的意见往往是这样不会对父类造成破坏。我不觉得改写一个错误的方法也是一种“破坏”。子类、父类本就息息相关,要么都干活要么都不行。

不过在非冻结时,子类有可能会有特殊的操作,其行为无法预期。这时往往应该提供给子类前进的自由,但都让它走到你所需的终点,而不是简单地说“NO”。

(很难说哪一种态度更好,终极目标也许该是EnablingAttitude,但在我们目前的工程情况中,似乎怎能放手。

google和microsoft在软件的开发和使用是否也是两种态度,呵呵。

在用人的角度上来说,同样也会有两种态度,EnablingAttitude也是一种不错的尝试。给人以信心,给人以空间。)


Multi-Level Hooks

看一个JUnit的例子(Junit使用模板方法来控制全部的测试案例):
public abstract class TestCase
public void runBare() throws Throwable {
setUp();
try {
runTest();
}
finally {
tearDown();
}
}
protected void setUp() throws Exception {
}
protected void tearDown() throws Exception {
}
这是常见的模板方法,有两个空的hook method需要被改写。到目前为止一切都很好,你可以很方便地根据需要增加自己的setUp和tearDown代码。

不过当用户想从来自JUnit的另一个框架继承来使用时,有点麻烦了:
public class AlphaTestCase extends TestCase
protected void setUp() throws Exception {
alphaProjectSetup();
}
这里我们碰到了前面所说的call super问题,采用前面的建议重新定义:
public class AlphaTestCase extends TestCase…
final protected void setUp() throws Exception {
alphaProjectSetup();
doSetUp();
}
protected void doSetUp() throws Exception {
}

(Good! hehe)

不过当采用这个框架时,对于一个熟悉JUnit的用户来说就遇到了问题。每一个项目,每一本书籍,都告诉他需要改写setUp,而不是新发明的doSetUp。可能使用 final会比较好,但即使用了final,一个不同的setUp方法带来的混乱还是很痛苦的。

另一种选择。在第二层的框架改写调用setUp的地方。
public class AlphaTestCase extends TestCase…
public void runBare() throws Throwable {
alphaProjectSetup();
setUp();
try {
runTest();
}
finally {
tearDown();
}
}
protected void setUp() throws Exception {
}
现在大家还是可以象以前一样使用setUp。如果框架的作者想加入其他的一些行为,也没问题。

值得考虑的方法,如果一个模板方法不能合适的工作, 考虑往上移一层。(提供了一点思路,别一脑子闷死)


不是所有的模板都能让你那样自由。有些情况可能没有源代码,也无法确定做什么。框架的作者是一种DirectingAttitude,冻结了调用方法,阻止你改写。而且即使你能做,也要注意很多事。框架的作者有可能修改你已经改写的方法,方便的同时也带来了一种责任,你必须自己密切注释父类发生 的变化。

(双刃剑,使用的时候我希望框架是对的,不要我去操心,而想扩展功能时,又希望能让我看看源代码,做点改动什么的)


另一种方法目前可以采用的是使用Annotation。Junit和其他基于Java的框架在近几个月已经可以在annotations工作,紧跟NUnit。Annotations允许你使用更多的元数据,而不仅仅是名字,允许你更多的选择。但那已经是另一篇文章的事了。

(这个我看不懂,下次再学习)


中文是我胡乱翻译的,括弧里是当时的胡思乱想,还是看原文的好。

幻灯片演讲的小技巧

使用PPT做演讲时,经常遇到的问题是:
1. 边讲能边看点提示,尤其是内容不很熟悉的时候
2. 边讲能边做一下反馈记录
频繁地做切换不是很爽,或者有时也不想让台下的听众看到了,呵呵。
上次听同事Allen说过,不过没有实践,还是没弄明白,这次在宁波倒做了下实验。
在桌面上“显示 属性”-“设置”,选择第二个监视器,允许“将Windows桌面扩展到
”该监视器上。
菜单“幻灯片放映”-“设置放映方式”,在多监视器中选择幻灯片放映显示于第二个
监视器。
启动幻灯片放映,投影中出现了演讲内容,而你的桌面上却什么也没变。
不错吧!可以随心所欲了,没人会发现你在干什么:-)

P.S.测试一下邮件的发布。

宁波出差

好久没出过差了,尤其是比起2、3年前BOSS建设的时候,一出去就是个把月的。最近一次的出去好像还是和Morphis, Herfool和小帅哥去嘉兴,那时也挺累的。

这次还好了,系统上线,去作个培训,还不用我讲,挺幸福的,哈哈。从杭州去宁波挺快,走高速2小时都不到,跟着省公司领导,狐假虎威,也顺便大吃一顿,有口福。不过喝酒还是苦事,没办法。

晚上睡的不错,没有小乐乐在凌晨6点叫我起床,一觉到8点,也是久违的感觉了。看到LP发来的短信,“女儿一睁开眼就叫爸爸”。心里觉得一热,有人念的感觉真好。

四年前的辞职信

四年前离开曾一起创办的公司,我写的辞职报告。早忘了,没想到kingworld又用上了。听到消息公司情况不是很好,或许应该庆幸,但又觉得好伤感。毕竟是当年一起成长起来的公司,还有纪老师和那帮弟兄。

附当年的辞职报告

尊敬的公司领导:
本人在公司担任技术部经理一职,与公司共同成长至今,非常感谢公司以及公司领导对我的关心和帮助。但由于在工作过程中,不能和公司领导意见一致,存在较大分歧,对公司的日常工作造成不好的影响,不利于公司的发展;个人也不能很好地发挥作用。特请辞去公司职务,望予批复。
此致。

辞职人:
2001-08-01

把google的桌面搜索卸了



把google的桌面搜索卸了,虽然蛮喜欢,也偶尔会使用,尤其是凭一点印像找两年前的邮件的时候,呵呵。卸完后,google让我提意见,写了一句“索引文件只能安装在C:盘”。我的机器C:盘只有10G,都快满了,而桌面搜索的索引就占了1G,在不想重装系统的情况下,只有割爱了。

目前google还没有提供手动调整桌面搜索安装位置的方法,不知何时才能支持。