Archive

Archive for April, 2009

gleery os kernel

April 29th, 2009

关于gleery kernel 的介绍似乎早就应该开始了。 gleery是一个非常tiny的os kernel,其实就它目前的功能来说只是一个bootstrap plus版。虽然功能很简单,但是学到的东西还是非常多的,而且最困难的部分也已经被跨越了。

gleery os kernel主要是大四上完成的,实现一个自己的os kernel总是一件很让人感兴趣的事情。我首先从阅读《自己动手写操作系统》一书开始,作为内核领域内的新手,这样的一本入门级的指导书可以省去很多盲 目的尝试。操作系统内核的编写在一开始的时候其实是面向机器的编程,需要了解很多Intel处理器的相关知识和汇编指令的工作方式。我觉得这是最困难的部 分,一旦克服了这一关,后面的工作就是纯粹的软件设计和实现的工作了。在编写的过程中我参考了很多资料,包括minix源代码,linux早前版本的源代 码,以及Intel处理器的手册和一些其他资料。

我执意要在Windows上开发这个os,所以也遇到了很多障碍。之前就花了很多时间去弄清楚怎么将gcc编译的obj文件和nasmw编译的o文 件链接到一起,并且声称没有PE头或ELF头的二进制程序。这方面的资料很少,因为大多数人都是在linux上做开发。不过在windows上的开发也给 我带来很大的便利,比如我用source insight建立工程极大的方便了代码的编写和阅读。

下面介绍一下我在开发中使用的开发环境和工具:

source insight:编辑器,以及minix代码的阅读器,同时提供了一键编译和一键调试功能。

一键编译主要是设置source insight 调用make.exe实现了,主要的流程在makefile文件里面控制。

一键调试则是调用bochs的程序,设置启动参数实现的。

有了这两个功能,开发过程就变得非常舒适了,代码的修改和调试可以马上看到结果。在此之前我需要在命令行里面编译代码,然后手动运行bochs,如果需要频繁的改动然后查看结果,效率会非常低。

编译器: dev C++ 中自带的mingw, 以及nasmw。

自定义的工具:自己用C写了一些工具用来生成最后的软盘镜像。

这次决定发布的版本只是一个demo版,仅仅演示了时钟和键盘中断的效果,以及一个IDLE进程。以后会发布一个更加完善的版本。

你可以从http://code.google.com/p/gleery/上check out到源代码

Author: gleery Categories: 程序设计 Tags: , ,

正确使用JDBC数据库连接

April 29th, 2009

今天在写程序是时候遇到一个很诡异的内存问题,程序没有缓存任何东西,但是却使用了1G的内存。Java程序出现内存问题一样非常难以调试,由于是 程序自动回收,反而难以从程序本身入手。通常的原因是使用了对象却没有释放,也许我们认为应该释放了,但实际却没有被释放,或者在一些被封装的很深的地方 占用了大量的内存而没有被程序员所察觉。

Java里面有一些能够帮助找到内存泄漏的程序,其中Java Memory Profiler比较好用,免费的工具而且是图形化的界面。跑了一便程序后发现在jdbc哪里累计了很多的内存。回头来检查程序,发现唯一有可能的地方是 Connection,之前不是很确定应该每次使用时创建新的Connection还是是使用一个,Java的文档里面也并没有说使用 Connection应该注意什么。所以 便共享了一个Connection。改了程序后再跑,发现内存果然没有飞涨了。很明显Connection会使得数据库操作中的大量对象无法被释放,从而 导致内存泄漏,每次创建新的Connection,使用完后释放则没有问题。仔细想想Connection更多保存着和数据库操作相关的本地对象,对于数 据库来说维持一个Connection,在不做任何操作的情况下并不是太大的负担。

之后在网上找了一下,看到有一个人遇到和我类似的问题,页面在这里

把他的代码转过来

  1. Connection conn = null;
  2. ResultSet rs = null;
  3. PreparedStatement pss = null;
  4. try
  5. {
  6. conn = dataSource.getConnection(USERID,PASSWORD);
  7. pss = conn.prepareStatement(SELECT SAVESERIALZEDDATA
  8. FROM SESSION.PINGSESSION3DATA WHERE SESSIONKEY = ?);
  9. pss.setString(1,sessionKey);
  10. rs = pss.executeQuery();
  11. pss.close();
  12. conn.close();
  13. }
  14. catch (Throwable t)
  15. {
  16. // Insert Appropriate Error Handling Here
  17. }
  18. finally
  19. {
  20. // The finally clause is always executed - even in error
  21. // conditions PreparedStatements and Connections will always be closed
  22. try
  23. {
  24. if (pss != null)
  25. pss.close();
  26. }
  27. catch(Exception e) {}
  28. try
  29. {
  30. if (conn != null)
  31. conn.close();
  32. }
  33. catch (Exception e){}
  34. }
  35. }
Author: gleery Categories: 程序设计 Tags: , ,

OpenMP的初体验和问题的讨论

April 29th, 2009

今天小试了一下OpenMP,VS2005和08版都支持OpenMP。 在工程选项的语言栏启用OpenMP的支持,还要记得在文件里面添加, 如果忘记添加这个头文件,运行的时候会提示缺少vcompd.dll。
一个简单的使用OpenMP进行并行优化的程序如下:
#include <stdio.h>
#include <omp.h>

int main(int argc, char * argv[])
{
#pragma omp parallel for
for (int i = 0; i < 10; ++ i)
{
printf(”%d”, i);
}

getchar();
return 0;
}

第二个例子看起来是这样的:

#include <stdio.h>
#include <omp.h>
#include <ctime>

int main(int argc, char * argv[])
{
clock_t t1 = clock();
int sum = 0;
#pragma omp parallel for
for (int i = 0; i < 1000000; ++ i)
{
sum += sum;
}
printf(”\ntime:%d\n”, clock() - t1);

printf(”%d\n”, sum);

sum = 0;
for (int i = 0; i < 1000000; ++ i)
{
sum = (sum + i);
}

printf(”%d”, sum);
getchar();
return 0;

}

在跑这个程序的时候我发现启用了多线程for的程序所耗费的时间反而远远多于正常运行的时间。
注意到在循环中 sum是一个共享变量, 如果要在多线程中正确对其累加是要使用同步锁的。
实际运行会发现,累加的结果和实际的并不相符,也就是说OpenMP这里只是做了简单的分割。
而且由于伪共享的问题,会使得Cache失效,从而增加了运行时间。

正确的代码如下:

#include <stdio.h>
#include <omp.h>
#include <ctime>

int main(int argc, char * argv[])
{
clock_t t1 = clock();
int sum = 0;
#pragma omp parallel for reduction(+: sum)
for (int i = 0; i < 1000000; ++ i)
{
sum += sum;
}
printf(”\ntime:%d\n”, clock() - t1);

printf(”%d\n”, sum);

sum = 0;
for (int i = 0; i < 1000000; ++ i)
{
sum = (sum + i);
}

printf(”%d”, sum);
getchar();
return 0;
}

增加的reduction表示每个线程使用本地的sum进行操作,在并行代码块结束后进行reduction操作,reduction的语法是

reduction(operation:var)

这里我们使用+号作为operation, 即进行累加,这样修改过以后,程序达到了并行的效果,而且得到了正确的结果。

从这个问题我们可以看出并行程序设计和传统程序在思维上的不同,对于大多数习惯了串行程序的程序员来说,要写出正确的并行程序并不容易。

Author: gleery Categories: 程序设计 Tags:

开始打理博客

April 28th, 2009

一直懒得写新的东西,pongba在他的博客上推荐大家从现在开始写博客,虽然一直也有这样的想法,却从来没有付诸实践。要想像pongba那样每次都写出一片精彩的长篇更是目前看起来相当困难的一件事,毕竟自己的写作功底还不行哈。所以决定从贴上几篇以前散落在其他地方的文章开始,丰富自己博客的内容。最近打算写的是语言与内存管理,希望能够将各种语言及其内存管 理的策略做一个介绍,目前还在写作中,以后再慢慢贴出来。

另外决定给博客换个主题,新的主题貌似很流行呢,在wordpress的主题下载里排第二,的确是很好看,所以就不管是不是和别人的一样了,先拿来用着。

Author: gleery Categories: 闲话生活 Tags: ,