ParalleX OS 设计与实现 Parallex 操作系统设计方向讨论
2016-08-04 11:36
295 查看
[b]Parallex 操作系统设计方向讨论[/b] 西安邮电大学 张明瑞
[b] 概要[/b]
ParalleX OS 是一个具有可动态配置的操作系统,与传统宏内核操作系统不同的是,它是基于消息传递的一款分布式操作系统。进一步将低了操作系统多模块之间的耦合。模块分离更加清晰。本文主要描述ParalleX 的设计来讨论怎么设计这款系统。首先,我们讨论两种具有分布式性质操作系统的结构分别是“集中式的一致性内存访问多核系统”与“分布式的非一致性内存访问多节点系统”。
接着,我们主要考察其中关键抽象部分的设计,他们分别是“进线程”,“地址空间”,“文件”,他们是现代操作系统的重要抽象。
最后,我们尝试描述我们的ParalleX 设计趋势,希望能得到清晰设计方向。
1.[b]两个系统方向[/b]
对于具有可动态配置,任务并行,支持任务迁移等性质的系统,我们叫它分布式系统,分布式系统是一个宏观而广泛的概念,现在分布式原理已经应用到了很多方面,例如分布式数据库,分布式文件系统,分布式计算,深度学习等很多领域,当然在操作系统领域上也由应用,本节我们来考察两个基本的分布式操作结构。[b]1.1 集中式的一致性内存访问的多核系统[/b]
集中式的一致性内存访问的多核操作,这种系统的分布式性质体现在进程模块,调度模块,存储模块,内存管理模块之间的消息传递上,它很适合运行在大型服务器上,这些大型机核心众多,却可以共享内存,就是一致性的内存访问,那么我们就可以发现地址空间事实上在这里是一致性的,对于所有处理器是可见的,那么进程原理可以在做到在多个核上迁移,暂时不考虑迁移的消耗,对于一个任务,我们也可以做出相关调度算法,使得进程动态合理的在多核上迁移。在实现这样的系统时,我们的设计重点应该在消息的传递,进程资源的动态配置。这个结构仅仅是基于消息传递的微内核系统,没有体现出分布式的性质。整个系统还是运行在一台大型机器上,对于任务而言,我们或许可以做到分布式性质,使运行时透明化。但是无法使系统级故障透明。结构如下图所示:
图1.1多核处理器拥有各自的缓存,并且可以访问一致性内存
对于这种系统,我们可以将各个模块分离,将一个原子性操作例如划分到每一次函数处理,例如一个进程创建,我们可以将获取内存,拷贝镜像,申请调度做成一个个的模块方法调用,所有的关键部分操作都会变成一条消息发送到消息队列。等待调度模块以我们规定的策略调度消息。
我们现在来考察一个fork()创建一个进程的过程。
Fork(){
Send_want_mem(); /*产生一条请求内存消息*/
Send_exec_img(); /*产生一条请求复制镜像到内存消息*/
Send_req_sche(); /*产生一条请求调度的消息*/
}
此时,在消息队列中就会出现三条消息,暂时不讨论如何调度。当这三条消息都被处理后,这个进程就以就绪态出现在PCB 中。
[b]1.2 分布式的非一致性内存访问多节点系统[/b]
分布式的非一致性内存访问多节点系统,这个系统算是一个典型的分布式系统,它的复杂型也非常的大。首先,这个系统是通过高速覆盖网络互连的一个系统,它形成了一个类似服务器的行为。所有用户并不直接和它交互而是通过客户端来和这个系统交互。在讨论一些细节问题前,我们先来宏观的看看这个系统的概况。它是以客户-服务器模型来运作,完全屏蔽了用户的“视线”,对于用户来说这个系统完全透明,资源透明,位置透明,故障透明,多用户之间透明。用户只需要请求自己的应用,服务器便在整个分布式系统中选择节点来执行这个应用,这个系统的重点在于“代码迁移”当一个进程崩溃时,整个系统需要能迁移整个应用的能力,这自然包括进程上下文,运行时资源,甚至是运行库。以一种异构恢复的方式迁移进程到另一个节点上。已达到完全透明的实现。一旦到了这一步其实这个服务器就变成了P2P结构,并且是非集中识。如下图是其基本结构。
图1.2 分布式的一致性内存访问的多节点系统
我们现在来考察在这样的一个进程。
这里每个节点相对独立,不论fork具体实现,对于这个系统而言,进程应该是其最小控制单元,因为这里的分布式性质体现在应用上,而不是底层上,在2.2节还会具体讨论进程的细节。
[b]1.3两个系统的对比[/b]
集中式的一致性内存访问多核系统 | 分布式的非一致性内存访问多节点系统 | |
任务概念 | 一个进程等与消息的集合,函数级别 | 传统进程定义,应用级别 |
消息传递 | 系统内的模块传递 | 节点之间的高速覆盖网络 |
内存访问 | 一致性共享内存访问 | 节点私有内存访问 |
持久化资源 | 系统内的文件系统 | 专有的文件系统节点 |
不难看出,似乎两个系统组合是一个不错的选择。
2.[b]设计关键问题[/b]
这个部分我们主要阐述在设计一个系统,尤其是计算机操作系统的一些设计上关键问题。包括子系统设计抽象方法讨论,计算机关键的几个抽象信息,进程,地址空间,文件资源。[b] 2.1 什么样的子系统才能被分离[/b]
在设计思考的过程中,我一直有一个问题,什么样的子系统才值等被抽象,被分离出来。在最早的计算机上,内存其实和磁盘是一体的,就是存在与纸带这个载体上,后来计算机发展到了冯,诺伊曼结构后,因为需要程序可存储,所以将内存和磁盘分离开来。也就是后来的经典计算机模型。事实上,后来并不是经典结构不可超越,这个结构其实是在当下科技水平的前提下符和人类思维的产物。所以,它对于现阶段的我们来说结构很合理,似乎无懈可击。但是我们还能在将经典计算机优化?答案我相信是可以的,经典计算机的模块化程度很高,因为它榨干了模块之间所有的内聚性。经典计算机的模块划分大体是基于数据传递代价划分的。当我们不能接受数据在某一个传递阶段的慢速时,我们就会将这个“传递区间”截断,从而将系统分成两个模块,有点像一句谚语“一座桥的程度取决于最薄弱的环节”。现在,我们不能忍受磁盘的速度,所以就有了分布式的文件系统,数据库。因为不能忍受内存的速度,所以有了南北桥芯片。但是现阶段还不能将 处理单元和运行时存储单元分离。
所以,我个人觉得一个系统是否可以分离成为一个单独的模块,取决与在这个系统关键指标上的贡献值。例如,对于计算机来说,速度,稳定,智能等都是关键指标,所以凡是拉低指标的部分都必须被分离成模块,硬件或者软件上的分离与抽象。
[b]2.2 进/线程[/b]
设计一款操作系统,进程是我们第一个需要考虑的核心概念,进程物理上是对CPU的抽象,概念上对于任务的泛化。进程静态上对一簇资源的描述,动态上是对一个具体任务的刻画。在面向过程上,进程是一簇资源。面向对象上是资源与方法的集合。面向函数上,是资源集合和调用过程。对于基于消息传递的系统来说,进程是消息与消息所指向的资源集合,粒度非常小,对于多节点系统来说,进程就是代码,资源每个节点都有的,只需要复制迁移代码就可以了。
[b]2.3 地址空间/命名空间[/b]
如果说进程是对CPU 的抽象,那么地址空间/命名空间就是对进程载体-内存的抽象。对于现代操作系统都是支持多任务的设计来说,地址空间和命名空间就是分离任务的必须条件。是隔离各个任务的必要机制。对于内存访问上,现代操作的设计没有太大区别。
[b]2.4 文件[/b]
文件,文件是对系统可调用持久化资源的一种描述。也是变种应用最多的一种子系统。数据库其实是对文件系统进一步抽象,更加细致化的管理,由于磁盘的物理特性,文件系统已经和计算机系统分离,而且分布式文件系统已经被广泛应用,由其是Linux的虚拟文件系统,更是文件系设计的高端之作。3.[b]ParalleX 的选择[/b]
综上,我们讨论了两种系统结构,几个抽象概念和抽象的方法。我个人觉得先设计实现集中式一致性内存访问系统,这个系统其实还有很多值的讨论的点的,时间有限,这点字写了一早上。查看原文: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/
相关文章推荐
- 用 C# 做组件设计时的事件实现方法讨论
- 用 C# 做组件设计时的事件实现方法讨论
- 操作系统设计与实现:深入解析 1
- 操作系统设计之锁的实现
- 操作系统课程设计报告--虚拟文件系统的实现后附源代码
- 权限设计问题,即C#实现上的设想[供讨论]
- 操作系统设计与实现 读笔(4)
- RayCommand操作系统的实现笔记0--设计想法与编写目的
- 操作系统课程设计 基于DOS的多任务系统的实现
- 操作系统设计与实现 读笔(2)
- 讨论:Qomolangma实现篇(三):兼容层设计
- 操作系统课程设计--简单文件系统的实现
- 用 C# 做组件设计时的事件实现方法讨论
- Android 操作系统的设计与实现--框架
- 操作系统设计与实现--系统调用
- 系统原型结构描述(概述)最近要设计一个框架,大家一起讨论下如何实现?
- 按"利用C++语言设计可扩展线程池"文章实现代码,但是有问题,希望大家来讨论,指出问题,谢谢
- 操作系统设计与实现(读书笔记3)
- VMware 实现自己设计的最小操作系统
- 操作系统设计与实现 读笔(3)