系统目的
支持远程访问网络中计算机上的文件。 通过使用TCP协议交换事务(消息),系统“虚拟地”支持所有基本文件操作(创建,删除,读取,写入等)。
应用领域
该系统的功能在以下情况下有效:
- 在移动和嵌入式设备(智能电话,机载控制系统等)的本机应用程序中,这些应用程序可能在连接可能暂时中断(脱机)的情况下快速访问远程服务器上的文件;
- 在已加载的DBMS中,如果请求在某些服务器上处理,而数据存储在其他服务器上;
- 在分布式公司网络中,用于收集和处理需要高速数据交换,冗余和可靠性的信息;
- 在具有微服务架构的复杂系统中,模块之间交换信息的延迟至关重要。
结构形式
Cage系统(有一个实现-Windows OS中的Python 3.7的beta版)包括两个主要部分:
- Cageserver-文件服务器程序(功能包),在需要远程访问文件的网络计算机上运行;
- 笼式类,带有用于客户端软件的方法库,可简化服务器交互的编码。
在客户端使用系统
Cage类的方法代替了文件系统的常规“常规”操作: 创建,打开,关闭,删除文件,以及以二进制格式 (指示数据的位置和大小) 读取/写入数据 。 从概念上讲,这些方法接近C语言的文件功能,在C语言中,打开/关闭文件是在输入输出的“通道”上执行的。
换句话说,程序员不使用“文件”对象的方法(Python中的_io类),而是使用Cage类的方法。
创建Cage对象的实例时,它将与服务器(或多个服务器)建立初始连接,通过客户端的ID传递授权,并通过所有文件操作的专用端口号接收确认。 删除Cage对象时,它指示服务器结束连接并关闭文件。 通信的终止可以启动服务器本身。
该系统基于将客户端程序的常用文件片段缓存在RAM的缓存(缓冲区)中,从而提高了读取/写入性能。
客户端软件可以使用具有各种设置(缓冲存储器的数量,与服务器交换时块的大小等)的任意数量的Cage对象。
单个Cage对象可以与多个服务器上的多个文件交换数据。 创建对象时,将设置通信参数(IP地址或DNS服务器,用于授权的主端口,路径和文件名)。
由于每个Cage对象可以同时使用多个文件,因此共享内存空间用于缓冲。 缓存大小-页面数及其大小在创建Cage对象时动态设置。 例如,一个1 GB高速缓存是1,000个页面,每个页面1 MB,或10,000个页面,每个100 KB,或100万个页面,每个1 KB。 页面大小和页数的选择是每个应用程序的一项特定任务。
您可以同时使用多个Cage对象来定义不同的缓冲存储器设置,具体取决于访问不同文件中信息的功能。 最基本的算法是使用最简单的缓冲算法:在指定数量的内存用完之后,新页面按照报废的原则以最少的访问次数将旧页面排挤掉。 在不均匀(从统计意义上)共享的情况下,缓冲尤其有效,首先是共享给不同的文件,其次是共享给每个文件的片段。
Cage类不仅支持数据地址(指示阵列的位置和长度,“替换”文件系统操作)的输入/输出,还支持较低的“物理”级别的输入/输出-通过缓冲存储器中的页码。
对于Cage对象,支持原始的“休眠” (“睡眠”)功能-可以将它们“最小化”(例如,在与服务器断开连接或停止应用程序等的情况下),并快速将其存储到客户端的本地转储文件中从此文件还原(恢复通信后,重新启动应用程序时)。 这使得在临时“离线”之后激活客户端程序时可以显着减少流量,因为经常使用的文件片段将已经在缓存中。
笼子大约有3600行代码。
构建服务器的原理
可以使用任意数量的端口启动Cageserver文件服务器,其中一个端口(“主”端口)仅用于授权所有客户端,其余用于数据交换。 Cage服务器程序仅需要Python。 并行地,带有文件服务器的计算机可以执行任何其他工作。
服务器最初是作为两个主要过程的组合启动的:
- “连接” -执行与客户端建立通信并在服务器主动下终止的操作的过程;
- “操作” -用于完成客户端处理文件的任务(操作)以及关闭客户端命令上的通信会话的过程。
两个进程都没有同步,并且没有组织为基于多进程队列,代理对象,锁和套接字的无休止的接收和发送消息的循环。
“连接”过程为每个客户端提供了一个用于接收和传输数据的端口。 服务器启动时设置端口数。 端口和客户端之间的对应关系存储在进程之间共享的代理内存中。
“操作”过程支持文件资源的分离,并且如果“第一个”客户端首次打开文件时允许,则几个不同的客户端可以一起读取一个文件中的数据( 准并行 ,因为访问是由锁控制的)。
严格按顺序使用服务器操作系统的文件子系统在“操作”过程中执行在服务器上创建/删除/打开/关闭文件的命令的处理。
对于一般的读/写加速,这些操作在“操作”过程生成的线程中执行。 线程数通常等于打开的文件数。 来自客户端的读/写任务被提交到常规队列,第一个释放的线程将任务从她的脑海中移开。 特殊逻辑消除了服务器RAM中的数据覆盖。
“操作”过程监视客户的活动,并通过其命令和超过非活动超时时间来停止其服务。
为了确保可靠性,Cageserver记录了所有事务。 一本普通日记中包含来自客户端的消息副本,其中包含创建/打开/重命名/删除文件的任务。 为每个工作文件创建一个单独的日志,在其中写入消息副本,其中包含用于在此工作文件中读写数据的任务,以及记录的(新)数据数组和在覆盖(在“旧”状态下写入新数据”时销毁的数据)数组)
这些日志提供了还原备份中的新更改以及从当前内容“回滚”到过去正确时间的机会。
Cageserver大约有3,100行代码。

启动Cageserver文件服务器程序
在对话框中启动时,需要确定:
-授权的主要端口;
-与授权客户进行交易交换的端口数量(从1个或多个端口开始,在主端口编号之后的下一个开始)。
使用笼子类
类笼。 笼子 ( cage_name =“”,pagesize = 0,numpages = 0,maxstrlen = 0,server_ip = {},wait = 0,awake = False,cache_file =“” )
从此类中,创建与文件服务器交互并包含缓冲存储器的对象。
参量
- cage_name ( str )-用于在服务器端标识客户端的对象的条件名称
- pagesize ( int )-缓冲存储器一页的大小(以字节为单位)
- numpages ( int )-缓冲存储器的页面数
- maxstrlen ( int )-写入和读取操作中的最大字节字符串长度
- server_ip ( dict )-包含使用的服务器地址的字典,其中的键是服务器的条件名称(应用程序内的服务器ID),值是一个字符串,其地址为:“ ip address:port”或“ DNS:port”(名称和实际地址的匹配是临时的,可以更改)
- wait ( int )-接收端口时等待服务器响应的时间(以秒为单位)
- awake ( boolean )-创建对象的方法的标志( False-如果创建了新对象, True-如果对象是从先前的“最小化”对象创建的-使用“休眠”操作,默认情况下为False)
- cache_file ( str )-休眠的文件名
方法
笼子 file_create ( 服务器,路径 )-创建一个新文件
笼子 file_rename ( 服务器,路径,new_name )-重命名文件
笼子 file_remove ( 服务器,路径 )-删除文件
笼子 打开 ( 服务器,路径,mod )-打开文件
返回fchannel通道号。 mod参数是文件打开模式:“ wm”是互斥的(读/写),“ rs”是只读的,并且仅由其他客户端共享,“ ws”是读/写,并且仅由其他客户端共享。
笼子 关闭 ( fchannel )-关闭文件
笼子 write ( fchannel,begin,data )-将字节字符串写入文件
笼子 读取 ( fchannel,begin,len_data )-从文件读取字节字符串
笼子 put_pages ( fchannel )-从缓冲区向服务器“推送”已修改的指定通道的所有页面。 当您需要确保通道上的所有操作都物理存储在服务器上的文件中时,将在算法中的这些点使用它。
笼子 push_all ()-从缓冲区向服务器“推送”已修改的Cage类实例的所有通道的所有页面。 当您需要确保所有通道上的所有操作都存储在服务器上时,可以使用它。