ParalleX OS 设计与实现 Parallex 操作系统设计方向讨论

来源:互联网 发布:socket长连接发送数据 编辑:程序博客网 时间:2024/06/05 18:29
Parallex 操作系统设计方向讨论西安邮电大学  张明瑞

                                                 概要

ParalleX OS 是一个具有可动态配置的操作系统,与传统宏内核操作系统不同的是,它是基于消息传递的一款分布式操作系统。进一步将低了操作系统多模块之间的耦合。模块分离更加清晰。本文主要描述ParalleX 的设计来讨论怎么设计这款系统。首先,我们讨论两种具有分布式性质操作系统的结构分别是“集中式的一致性内存访问多核系统”与“分布式的非一致性内存访问多节点系统”。接着,我们主要考察其中关键抽象部分的设计,他们分别是“进线程”,“地址空间”,“文件”,他们是现代操作系统的重要抽象。最后,我们尝试描述我们的ParalleX 设计趋势,希望能得到清晰设计方向。 

1.两个系统方向

对于具有可动态配置,任务并行,支持任务迁移等性质的系统,我们叫它分布式系统,分布式系统是一个宏观而广泛的概念,现在分布式原理已经应用到了很多方面,例如分布式数据库,分布式文件系统,分布式计算,深度学习等很多领域,当然在操作系统领域上也由应用,本节我们来考察两个基本的分布式操作结构。

1.1  集中式的一致性内存访问的多核系统

集中式的一致性内存访问的多核操作,这种系统的分布式性质体现在进程模块,调度模块,存储模块,内存管理模块之间的消息传递上,它很适合运行在大型服务器上,这些大型机核心众多,却可以共享内存,就是一致性的内存访问,那么我们就可以发现地址空间事实上在这里是一致性的,对于所有处理器是可见的,那么进程原理可以在做到在多个核上迁移,暂时不考虑迁移的消耗,对于一个任务,我们也可以做出相关调度算法,使得进程动态合理的在多核上迁移。在实现这样的系统时,我们的设计重点应该在消息的传递,进程资源的动态配置。这个结构仅仅是基于消息传递的微内核系统,没有体现出分布式的性质。整个系统还是运行在一台大型机器上,对于任务而言,我们或许可以做到分布式性质,使运行时透明化。但是无法使系统级故障透明。结构如下图所示: 图1.1多核处理器拥有各自的缓存,并且可以访问一致性内存对于这种系统,我们可以将各个模块分离,将一个原子性操作例如划分到每一次函数处理,例如一个进程创建,我们可以将获取内存,拷贝镜像,申请调度做成一个个的模块方法调用,所有的关键部分操作都会变成一条消息发送到消息队列。等待调度模块以我们规定的策略调度消息。我们现在来考察一个fork()创建一个进程的过程。Fork(){Send_want_mem();   /*产生一条请求内存消息*/Send_exec_img();    /*产生一条请求复制镜像到内存消息*/Send_req_sche();    /*产生一条请求调度的消息*/} 此时,在消息队列中就会出现三条消息,暂时不讨论如何调度。当这三条消息都被处理后,这个进程就以就绪态出现在PCB 中。

1.2  分布式的非一致性内存访问多节点系统

分布式的非一致性内存访问多节点系统,这个系统算是一个典型的分布式系统,它的复杂型也非常的大。首先,这个系统是通过高速覆盖网络互连的一个系统,它形成了一个类似服务器的行为。所有用户并不直接和它交互而是通过客户端来和这个系统交互。在讨论一些细节问题前,我们先来宏观的看看这个系统的概况。它是以客户-服务器模型来运作,完全屏蔽了用户的“视线”,对于用户来说这个系统完全透明,资源透明,位置透明,故障透明,多用户之间透明。用户只需要请求自己的应用,服务器便在整个分布式系统中选择节点来执行这个应用,这个系统的重点在于“代码迁移”当一个进程崩溃时,整个系统需要能迁移整个应用的能力,这自然包括进程上下文,运行时资源,甚至是运行库。以一种异构恢复的方式迁移进程到另一个节点上。已达到完全透明的实现。一旦到了这一步其实这个服务器就变成了P2P结构,并且是非集中识。如下图是其基本结构。 图1.2 分布式的一致性内存访问的多节点系统我们现在来考察在这样的一个进程。这里每个节点相对独立,不论fork具体实现,对于这个系统而言,进程应该是其最小控制单元,因为这里的分布式性质体现在应用上,而不是底层上,在2.2节还会具体讨论进程的细节。

1.3两个系统的对比

  集中式的一致性内存访问多核系统分布式的非一致性内存访问多节点系统任务概念 一个进程等与消息的集合,函数级别传统进程定义,应用级别消息传递 系统内的模块传递节点之间的高速覆盖网络内存访问 一致性共享内存访问节点私有内存访问持久化资源 系统内的文件系统专有的文件系统节点 不难看出,似乎两个系统组合是一个不错的选择。

2.设计关键问题

这个部分我们主要阐述在设计一个系统,尤其是计算机操作系统的一些设计上关键问题。包括子系统设计抽象方法讨论,计算机关键的几个抽象信息,进程,地址空间,文件资源。

     2.1    什么样的子系统才能被分离

在设计思考的过程中,我一直有一个问题,什么样的子系统才值等被抽象,被分离出来。在最早的计算机上,内存其实和磁盘是一体的,就是存在与纸带这个载体上,后来计算机发展到了冯,诺伊曼结构后,因为需要程序可存储,所以将内存和磁盘分离开来。也就是后来的经典计算机模型。事实上,后来并不是经典结构不可超越,这个结构其实是在当下科技水平的前提下符和人类思维的产物。所以,它对于现阶段的我们来说结构很合理,似乎无懈可击。但是我们还能在将经典计算机优化?答案我相信是可以的,经典计算机的模块化程度很高,因为它榨干了模块之间所有的内聚性。经典计算机的模块划分大体是基于数据传递代价划分的。当我们不能接受数据在某一个传递阶段的慢速时,我们就会将这个“传递区间”截断,从而将系统分成两个模块,有点像一句谚语“一座桥的程度取决于最薄弱的环节”。现在,我们不能忍受磁盘的速度,所以就有了分布式的文件系统,数据库。因为不能忍受内存的速度,所以有了南北桥芯片。但是现阶段还不能将 处理单元和运行时存储单元分离。所以,我个人觉得一个系统是否可以分离成为一个单独的模块,取决与在这个系统关键指标上的贡献值。例如,对于计算机来说,速度,稳定,智能等都是关键指标,所以凡是拉低指标的部分都必须被分离成模块,硬件或者软件上的分离与抽象。 

2.2    进/线程

设计一款操作系统,进程是我们第一个需要考虑的核心概念,进程物理上是对CPU的抽象,概念上对于任务的泛化。进程静态上对一簇资源的描述,动态上是对一个具体任务的刻画。在面向过程上,进程是一簇资源。面向对象上是资源与方法的集合。面向函数上,是资源集合和调用过程。对于基于消息传递的系统来说,进程是消息与消息所指向的资源集合,粒度非常小,对于多节点系统来说,进程就是代码,资源每个节点都有的,只需要复制迁移代码就可以了。

2.3    地址空间/命名空间

如果说进程是对CPU 的抽象,那么地址空间/命名空间就是对进程载体-内存的抽象。对于现代操作系统都是支持多任务的设计来说,地址空间和命名空间就是分离任务的必须条件。是隔离各个任务的必要机制。对于内存访问上,现代操作的设计没有太大区别。

2.4    文件

文件,文件是对系统可调用持久化资源的一种描述。也是变种应用最多的一种子系统。数据库其实是对文件系统进一步抽象,更加细致化的管理,由于磁盘的物理特性,文件系统已经和计算机系统分离,而且分布式文件系统已经被广泛应用,由其是Linux的虚拟文件系统,更是文件系设计的高端之作。

3.ParalleX  的选择

综上,我们讨论了两种系统结构,几个抽象概念和抽象的方法。我个人觉得先设计实现集中式一致性内存访问系统,这个系统其实还有很多值的讨论的点的,时间有限,这点字写了一早上。

查看原文:http://zmrlinux.com/2016/08/04/parallex-os-%e8%ae%be%e8%ae%a1%e4%b8%8e%e5%ae%9e%e7%8e%b0-parallex-%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e8%ae%be%e8%ae%a1%e6%96%b9%e5%90%91%e8%ae%a8%e8%ae%ba/
0 0