Cage Remote File Access System

Stelsel doel

Ondersteuning vir afstandtoegang tot lêers op rekenaars op die netwerk. Die stelsel ondersteun "feitlik" alle basiese lêerbewerkings (skepping, uitvee, lees, skryf, ens.) deur transaksies (boodskappe) uit te ruil deur die TCP-protokol te gebruik.

aansoeke

Die funksionaliteit van die stelsel is effektief in die volgende gevalle:

  • in inheemse toepassings vir mobiele en ingebedde toestelle (slimfone, aanboordbeheerstelsels, ens.) wat vinnige toegang tot lêers op afgeleë bedieners vereis in die lig van moontlike tydelike onderbrekings in kommunikasie (met vanlyn gaan);
  • in gelaaide DBBS'e, as navraagverwerking op sommige bedieners uitgevoer word, en databerging op ander uitgevoer word;
  • in verspreide korporatiewe netwerke vir die insameling en verwerking van inligting, wat hoëspoeddata-uitruiling, oortolligheid en betroubaarheid vereis;
  • in komplekse stelsels met mikrodiensargitektuur, waar vertragings in die uitruil van inligting tussen modules van kritieke belang is.

Struktuur

Die Cage-stelsel (daar is 'n implementering - beta-weergawe in Python 3.7 op Windows) bevat twee hoofdele:

  1. Hokbediener — 'n lêerbedienerprogram ('n pakket funksies) wat op rekenaars op die netwerk loop waarvan die lêers afstandtoegang vereis;
  2. klas Cage met 'n biblioteek van metodes vir kliëntsagteware, wat die kodering van interaksie met bedieners vereenvoudig.

Gebruik die stelsel aan die kliëntkant

Die metodes van die Cage-klas vervang die gewone, "roetine" lêerstelselbewerkings: skep, oopmaak, toemaak, uitvee lêers, sowel as lees/skryf data in binêre formaat (wat die posisie en grootte van die data aandui). Konseptueel is hierdie metodes naby aan die lêerfunksies van die C-taal, waar die oopmaak/toemaak van lêers "op kanale" van invoer/uitvoer uitgevoer word.

Met ander woorde, die programmeerder werk nie met metodes van "lêer" voorwerpe (klas _io in Python), maar met metodes van die Cage-klas.

Wanneer 'n instansie van 'n Cage-objek geskep word, vestig dit 'n aanvanklike verbinding met 'n bediener (of verskeie bedieners), word deur die Kliënt-ID gemagtig, en ontvang bevestiging met 'n toegewyde poortnommer vir alle lêerbewerkings. Wanneer 'n Cage-voorwerp uitgevee word, gee dit die bediener opdrag om op te hou kommunikeer en die lêers toe te maak. Beëindiging van kommunikasie kan ook deur die bedieners self geïnisieer word.

Die stelsel verbeter lees-/skryfwerkverrigting deur gereeld gebruikte lêerfragmente van kliëntprogramme in die RAM-kas (buffer) te buffer.
Kliëntsagteware kan enige aantal Cage-voorwerpe met verskillende instellings gebruik (buffergeheuegrootte, blokgrootte wanneer met die bediener uitgeruil word, ens.).

'n Enkele Cage-objek kan met veelvuldige lêers op verskeie bedieners kommunikeer. Kommunikasieparameters (IP-adres of DNS-bediener, hoofpoort vir magtiging, pad en lêernaam) word gespesifiseer wanneer die voorwerp geskep word.

Aangesien elke Cage-voorwerp met veelvuldige lêers gelyktydig kan werk, word gedeelde geheuespasie vir buffering gebruik. Kasgrootte – die aantal bladsye en hul grootte word dinamies gestel wanneer 'n Cage-objek geskep word. Byvoorbeeld, 'n 1 GB-kas is 1000 bladsye van 1 MB elk, of 10 duisend bladsye van 100 KB elk, of 1 miljoen bladsye van 1 KB elk. Die keuse van die grootte en aantal bladsye is 'n spesifieke taak vir elke toepassingsgeval.

Jy kan verskeie Cage-voorwerpe op dieselfde tyd gebruik om verskillende buffergeheue-instellings te definieer, afhangende van hoe toegang tot inligting in verskillende lêers verkry word. As 'n basiese een word die eenvoudigste bufferalgoritme gebruik: nadat 'n gegewe hoeveelheid geheue uitgeput is, verplaas nuwe bladsye oues volgens die beginsel van aftrede met 'n minimum aantal toegangs. Buffer is veral effektief in die geval van ongelyke (in 'n statistiese sin) gedeelde toegang, eerstens tot verskillende lêers, en tweedens tot fragmente van elke lêer.

Die Cage-klas ondersteun I/O nie net deur data-adresse (wat die posisie en lengte van die skikking aandui, "vervang" van lêerstelselbewerkings), maar ook op 'n laer, "fisiese" vlak - deur bladsynommers in buffergeheue.

Die oorspronklike funksie word ondersteun vir Cage-voorwerpe "hibernasie" ("slaap") - hulle kan "inmekaargevou" word (byvoorbeeld in die geval van 'n verlies van verbinding met bedieners, of wanneer die toepassing gestop word, ens.) in 'n plaaslike stortingslêer aan die kliëntkant en vinnig herstel vanaf hierdie lêer (nadat kommunikasie hervat is, wanneer jy die toepassing herbegin). Dit maak dit moontlik om verkeer aansienlik te verminder wanneer die kliëntprogram geaktiveer word nadat dit tydelik "vanlyn" is, aangesien gereeld gebruikte lêerfragmente reeds in die kas sal wees.

Cage is ongeveer 3600 reëls kode.

Beginsels van bedienerkonstruksie

Cageserver-lêerbedieners kan uitgevoer word met 'n arbitrêre aantal poorte, waarvan een ("hoof") slegs vir magtiging van alle kliënte gebruik word, die res word vir data-uitruiling gebruik. Die Cage-bedienerprogram benodig slegs Python. In parallel kan die rekenaar met die lêerbediener enige ander werk verrig.

Die bediener begin aanvanklik as 'n versameling van twee hoofprosesse:

  1. "Verbindings" – 'n proses om die operasies uit te voer om kommunikasie met kliënte te vestig en dit op inisiatief van die bediener te beëindig;
  2. "Operasies" – 'n proses vir die uitvoering van take (operasies) van kliënte om met lêers te werk, asook vir die afsluiting van kommunikasiesessies gebaseer op kliëntbevele.

Beide prosesse is nie gesinchroniseer nie en word georganiseer as eindelose lusse van ontvangs en stuur van boodskappe gebaseer op multiproses-toue, proxy-objekte, slotte en voetstukke.
Die verbindingsproses ken 'n poort toe vir elke kliënt om data te ontvang en oor te dra. Die aantal poorte word gestel wanneer die bediener begin. Die kartering tussen poorte en kliënte word in interproses-gedeelde instaanbedienergeheue gestoor.

Die Bedryfsproses ondersteun die deel van lêerhulpbronne sodat verskeie verskillende kliënte kan deel (kwasi-parallel, aangesien toegang deur slotte beheer word) lees data van een lêer as dit toegelaat is toe dit aanvanklik deur die "eerste" kliënt oopgemaak is.

Verwerking van opdragte om lêers op die bediener te skep/vee/oop te maak/toe te maak, word uitgevoer in die "Bedryf"-proses self streng opeenvolgend deur die lêersubstelsel van die bediener-bedryfstelsel te gebruik.

Om oor die algemeen lees/skryf te bespoedig, word hierdie bewerkings uitgevoer in drade wat deur die "Operasies"-proses ontstaan ​​het. Die aantal drade is gewoonlik gelyk aan die aantal oop lêers. Lees-/skryftake van kliënte word by die algemene tou ingedien en die eerste gratis draad neem die taak van sy kop af. Spesiale logika laat jou toe om data-herskryfbewerkings in die bediener se RAM uit te skakel.

Die Bedryfsproses moniteer kliëntaktiwiteit en hou op om hulle te bedien óf op hul opdragte óf wanneer die onaktiwiteit-timeout oorskry word.

Om betroubaarheid te verseker, hou Cageserver logs van alle transaksies. Een algemene logboek bevat afskrifte van boodskappe van kliënte met take om lêers te skep/oopmaak/hernoem/vee. 'n Afsonderlike logboek word vir elke werklêer geskep, waarin afskrifte van boodskappe met take vir lees en skryf van data in hierdie werklêer aangeteken word, sowel as skikkings geskrewe (nuwe) data en skikkings data wat tydens oorskryf vernietig is (skryf nuwe data “bo-op oues). ).

Hierdie logs bied die vermoë om beide nuwe veranderinge aan rugsteun te herstel en huidige inhoud terug te rol na 'n punt in die verlede.

Cageserver is ongeveer 3100 reëls kode.

Cage Remote File Access System

Begin die Cageserver-lêerbedienerprogram

Wanneer jy begin, moet jy in die dialoog definieer:
— hoofhawe vir magtiging;
— die aantal poorte vir die uitruil van transaksies met gemagtigde kliënte (vanaf 1 of meer, die poel nommers begin by die een langs die hoofpoortnommer).

Gebruik die hokklas

klas hok.Cage( cage_name="", pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wag=0, awake=False, cache_file="" )

Voorwerpe word uit hierdie klas geskep wat interaksie het met lêerbedieners en buffergeheue bevat.

Parameters

  • hok_naam(str) - voorwaardelike naam van die voorwerp, wat gebruik word om kliënte aan die bedienerkant te identifiseer
  • bladsygrootte(int) — grootte van een bladsy buffergeheue (in grepe)
  • syfers(int) — aantal buffergeheuebladsye
  • maxstrlen(int) - die maksimum lengte van 'n greepstring in skryf- en leesbewerkings
  • bediener_ip(dikteer) - 'n woordeboek met die adresse van die bedieners wat gebruik word, waar die sleutel die voorwaardelike naam van die bediener is (bediener-ID binne die toepassing), en die waarde is 'n string met die adres: "ip-adres:poort" of "DNS: port” (die vergelyking van name en regte adresse is tydelik, dit kan verander word)
  • wag(int) - wagtyd vir 'n antwoord van die bediener wanneer poorte ontvang word (in sekondes)
  • wakker(boolean) — vlag van hoe die voorwerp geskep word (Vals - as 'n nuwe voorwerp geskep word, True - as 'n voorwerp geskep word vanaf 'n voorheen "ineengestorte" een - met behulp van die "hibernasie"-bewerking, Vals by verstek)
  • kas_lêer(str) - lêernaam vir hibernasie

metodes

Hok.lêer_skep( bediener, pad ) – skep 'n nuwe lêer

Hok.lêer_hernoem( bediener, pad, nuwe_naam ) – hernoem die lêer

Hok.lêer_verwyder( bediener, pad) - verwyder 'n lêer

Hok.oop( bediener, pad, mod ) - oop leêr

Opbrengste fkanaal kanaalnommer. Parameter mod - dit is die lêer openingsmodus: "wm" - eksklusief (lees/skryf), "rs" - leesalleen, en net gedeel vir lees deur ander kliënte, "ws" - lees/skryf, en net gedeel vir lees deur ander kliënte.

Hok.naby (fkanaal) – maak die lêer toe

Hok.skryf (fkanaal, begin, data ) – skryf 'n greepstring na 'n lêer

Hok.lees (fchannel, begin, len_data ) – lees 'n greepstring uit 'n lêer

Hok.sit_bladsye ( fkanaal ) – “stoot” vanaf die buffer na die bediener alle bladsye van die gespesifiseerde kanaal wat gewysig is. Dit word gebruik op daardie punte in die algoritme wanneer jy seker moet wees dat alle bewerkings op die kanaal fisies in 'n lêer op die bediener gestoor is.

Hok.druk_almal () – "stoot" vanaf die buffer na die bediener alle bladsye van alle kanale vir 'n geval van die Cage-klas wat gewysig is. Word gebruik wanneer jy seker moet wees dat alle bewerkings op alle kanale op die bediener gestoor is.

Bron: will.com

Voeg 'n opmerking