模块化是软件开发的基本原则之一,一般了解一个软件是从整体功能到各个子模块,子模块如何实现整体功能是人们关注的重点,比如Hadoop整体上实现大批量计算,有数据整合模块、索引模块、机器间信息传递模块、备份模块。。
很多软件开发的原理是与操作系统原理关系密切,但我发现有一个基本问题至今看了很多资料还没有遇到合理解答的:
运行时间是怎么分配的?
线程的概念是从60年代单处理器上的分时系统演变来的,后来人们区分线程和进程,有了复杂的线程/进程调度机制,我不清楚是否有以线程/进程为基础给子模块进行归类的做法,如果有对小型软件而言很多是单线程的,模块可以对应线程;大型软件则可以对应进程本身。
优先级啊,轮叫啊,这些都是操作系统+CPU层面谈的,都没有谈内存、网络传输,要知道现在更多是I/O问题比CPU问题要大。
按照目前所知,所有的描述都是优先级之类的东西,然后就丢给操作系统了。但操作系统常常是不可靠的,结合我的小项目,现在我倾向于实现一个单线程(自然也是单进程)软件,内部子模块要以分配运行时间为主要方式进行调控。这个运行时间体现为CPU的操作数,但computation-bound和I/O-bound的情况要结合考虑。
Oberon里所有程序都整合到一个体系中,可以视作一个超大软件,但它的子模块调度是非常原始简陋的,while(true)然后等待输入或中断,所有程序都是轮流、几乎平均地使用系统资源。在当年效率大大超过设计理念的复杂情况下,输给Unix是自然的事情。Unix超级复杂,繁琐,但解决了Oberon不能解决的问题。