Archive for 一月, 2009

UC Berkeley 开设《星际争霸》的专门课程

Posted by jcadam - 30/01/09 at 12:01 下午

starcraft-course

中文:
http://mmdays.com/2009/01/30/starcraft-course-opened-for-college-earn-credits/

英文:
http://www.starcraftwire.net/blog/comments/study-starcraft-for-college/

这个消息不算雷人,游戏年龄19岁的俺还是颇为感动。

嘿~,如果您喜欢我的博客,您可以通过RSS.链接将本博客的最新文章传输到您喜欢的阅读器。 Subscribe with Google 
订阅到鲜果 订阅到抓虾

突如其来的冷漠

Posted by jcadam - 29/01/09 at 01:01 下午

这是昨天发生的事情。早晨乘车上班,电车进入新桥站时突然紧急刹车。我当时坐在靠着隔档的座位上,临座的人几乎是突然扑到我身上,站着的乘客有人摔倒,然后广播里说似乎有人从站台上跳下来了,正在确认情况。因为还没有进站,车门未开,车里的人大都在惊讶了若干秒之后开始各忙各的事儿。我在第二节车厢,若真的有人被碾碎,恐怕我是能看到的,只需要稍微将脑袋向后偏一下,但是我没看,不知道是不敢看还是别的。所有人都漠不关心的平静,对面的女人在玩手机游戏,站着我身边的男人打电话到公司说明迟到原因,临座的女人继续看手里的一本小说。车厢里除了有人小声讲电话的声音以外,就是平稳的呼吸的声响,似乎突然被放大到能够听到的音响。17分钟以后,广播再次响了,说是已经将问题排除,并报告电车迟到17分钟向乘客道歉云云。9点50左右到公司,坐在椅子上脑子里还是不断回响着像电视机没有节目时那样所发出的噪声。

一个人住的时候,我曾想,若是我死在公寓里,恐怕也不会有人知道,直到尸体腐烂被蛆虫吞噬,发出恶臭时或者房东会将我像打扫垃圾一样扫出去。那种恐惧和寂寞,恰似电车里一声声平静的呼吸,毫无波澜的沉重。

嘿~,如果您喜欢我的博客,您可以通过RSS.链接将本博客的最新文章传输到您喜欢的阅读器。 Subscribe with Google 
订阅到鲜果 订阅到抓虾

Linux内核源码阅读系列(8)-内核的构成 之 二

Posted by jcadam - 27/01/09 at 05:01 下午

进程管理

进程

进程是正在运行的程序的实体。它们是Linux用以完成各种应用程序的核心。”链接“系列文章中说明了一个应用程序如何从源代码变成可执行文件,以及如何将这个可执行文件加载进入内存从而使程序运行的过程。可执行的目标文件被加载后就行成了进程的基本组成部分。操作系统本身还会为每一个进程添加一些附加的信息用以对进程进行调度管理和创建/消灭等过程。另一方面,为了方便用户的使用,Linux向用户应用程序提供了一些系统调用帮助用户应用程序进行进程的管理。进程有自己的生命周期,它可以被创建,消灭,使其进入活动状态等等,这些状态之间可以通过系统调用或者进程调度的机制进行转换。下面的图展示了从交互式shell中启动’yes’这个应用程序的过程。

从shell运行yes

从shell运行yes

bash在使用fork()系统调用之后,只是在虚拟内存空间上复制一个和自己完全相同的拷贝,那么这时我们就可以得到两个bash,其中早先的那个bash进程通常被称作父进程,而其后被创建的那个进程被称作子进程;因为现在用户需要运行的是yes这个程序,其中原来的bash需要使用wait()进入等待状态以便腾出CPU占用时间来运行’yes’。在接下来的过程中,刚刚被创建的那个新的bash的副本,会使用exec()系统调用将yes这个应用程序的可执行文件映射并拷贝到内存中,通过这个方式,操作系统可以创建一个信的进程。yes这个程序比较特殊,他的作用事实上就是不断的输出’yes’这个字符串,但事实上任何应用程序都可能退出,比如我们这个时候按一下Ctrl-C,其后的动作是通过系统系统调用exit()结束进程。父进程bash在接收到子进程结束的消息后,可能又进入活动状态。

线程

进程管理部分的代码,着重可以看看进程的创建,消灭以及其他状态之间的转换是怎样实现的,此外,还有“线程”需要注意。线程在Linux中的实现和进程非常相似,可以说他是一种特殊的进程。线程的特殊之处在于多个线程之间共享相同的“进程空间”——这一点其实逻辑上很容易想清楚,就是多线程通常用来相应高并发的任务,而这些线程事实上完成的功能是一致的,他们之间不需要有区别。从“调度器”的角度来看,线程和进程是一致的。

信号

进程管理的另外一个重要内容是所谓的“信号”(signal),它是一个简单的向进程传递非同期时间的功能。收到信号的进程可以选择通过指定的signal handler做一个动作,或者忽略这个信号,等等。收到信号的进程的行为于收到中断的内核非常相似。:)说了等于没说……

内存管理

关于内存管理的内容的文章简直可以说在互联网上泛滥成灾。写文章的人从不同的角度对应该怎样管理内存的问题做了很多讨论。内存管理的策略也是多如牛毛,比如C++标准模板库中用free list实现的内存池等等。所以,看内存管理的话,很多大仙可以拍拍胸脯满怀信心的就把书翻过去了。但是,Linux作为一个经过实战考验的开源操作系统——事实上开源创造了更加安全可靠的操作系统,研究发现Linux2.6版本共5.7million行的源代码中,仅仅存在985个Bug;而如果将总代码量于工业界的平均水平相比,Linux中存在114,000~171,000个Bug都可以被评价为“质量不错”——它的内存管理实现可以被认为在很多地方都具有参考和借鉴的意义。就凭这一点,内存管理简直可以说是内核代码中最值得关注的部分。

Linux内存管理可以被分为两大块。第一是实内存管理,另外一个是虚拟内存的管理方法。

实内存管理

实际的内存分配策略往往区分大块内存划分和小块内存划分以提高内存分配算法的效率。Linux的实内存分配测律也不例外,她采用了以Page为单位的Buddy方法来划分大块内存区域的同时,对于小内存区块却采用了一个叫做Slab的小内存划分方法。这两者的实现都非常精巧,值得仔细研究。

虚拟内存管理

虚拟内存(Virtual Memory)技术可以说是现代计算机系统中非常重要的组成部分。它不但关系到硬件的设计,而且还关系到很多重要的软件技术的实现,比如以前文章中提到的共享库和动态链接技术。MMU(Memory Management Unit)是在计算机体系结构发展这中产生的,这个硬件组件是现代虚拟内存技术的硬件基础。Linux中采用了多重虚拟地址的虚拟内存空间,所以,它让操作系统本身获得了更加强大的能力。所以,虚拟内存管理的部分应该硬件结合软件一起来看才能看个通通透透。虚拟内存同时和内核的其他部分,比如,进程管理有很多关联的地方——比如前文提到的程序的内存映像的生成等,所以,在讨论进程的过程中也不能忘记虚拟内存。

这个部分的关键词有:Demand paging,Swapping, Page fault等等。

嘿~,如果您喜欢我的博客,您可以通过RSS.链接将本博客的最新文章传输到您喜欢的阅读器。 Subscribe with Google 
订阅到鲜果 订阅到抓虾