Mo chur an gnĂŹomh bufair fĂ inne ann an NOR flash
ro-eachdraidheil
Tha innealan reic den dealbhadh againn fhèin. Taobh a-staigh an Raspberry Pi agus beagan uèirleadh air bòrd air leth. Tha neach-gabhail buinn, neach-gabhail cunntasan, ionad banca ceangailte... Tha a h-uile cĂ il fo smachd prògram fèin-sgrĂŹobhte. Tha an eachdraidh obrach gu lèir air a sgrĂŹobhadh gu log air draibheadh ââââflash (MicroSD), a thèid an uairsin a ghluasad tron ââââeadar-lĂŹn (aâ cleachdadh modem USB) chun t-seirbheisiche, far a bheil e air a stòradh ann an stòr-dĂ ta. Tha fiosrachadh reic air a luchdachadh a-steach do 1c, tha eadar-aghaidh lĂŹn sĂŹmplidh ann cuideachd airson sgrĂšdadh, msaa.
Is e sin, tha an iris deatamach - airson cunntasachd (teachd-a-steach, reic, msaa), sgrĂšdadh (gach seòrsa fĂ illigeadh agus suidheachaidhean force majeure eile); Is e seo, dhâ fhaodadh duine a rĂ dh, a h-uile fiosrachadh a thâ againn mun inneal seo.
duilgheadas
Tha draibhearan Flash aâ nochdadh gur e innealan fĂŹor neo-earbsach a thâ annta. Bidh iad a 'fĂ illigeadh le cunbhalachd iongantach. Bidh seo aâ leantainn gu an dĂ chuid Ăšine downt inneal agus (mura bâ urrainnear an loga a ghluasad air-loidhne airson adhbhar air choireigin) gu call dĂ ta.
Chan e seo aâ chiad eòlas air a bhith aâ cleachdadh draibhearan flash, roimhe seo bha pròiseact eile ann le còrr air ceud inneal, far an robh an iris air a stòradh air draibhearan USB flash, bha duilgheadasan ann cuideachd le earbsachd, aig amannan bha an Ă ireamh den fheadhainn a dhâ fhĂ illig ann. bha mĂŹos anns na dusan. Dhâfheuch sinn diofar dhrĂ ibhearan flash, aâ toirt a-steach feadhainn le suaicheantas le cuimhne SLC, agus tha cuid de mhodalan nas earbsaiche na cuid eile, ach cha do dhâ fhuasgail e an duilgheadas gu mòr le bhith aâ cur an Ă ite dhrĂ ibhearan flash.
Thoir aire! Leughadh fada! Mura h-eil Ăšidh agad ann an âcarsonâ, ach dĂŹreach ann an âciamarâ, faodaidh tu a dhol dĂŹreach Aig aâ cheann thall artaigilean.
co-dhĂšnadh
Is e aâ chiad rud a thig gu inntinn: trèig MicroSD, stĂ laich, mar eisimpleir, SSD, agus bròg bhuaithe. Gu teòiridheach comasach, is dòcha, ach gu ĂŹre mhath daor, agus chan eil e cho earbsach (tha inneal-atharrachaidh USB-SATA air a chur ris; chan eil staitistig fĂ illigeadh airson SSDs buidseit cuideachd brosnachail).
Chan eil USB HDD cuideachd aâ coimhead coltach ri fuasgladh air leth tarraingeach.
Mar sin, thà inig sinn chun roghainn seo: fà g booting bho MicroSD, ach cleachd iad ann am modh leughaidh a-mhà in, agus stòraich an loga obrachaidh (agus fiosrachadh eile a tha gun samhail airson pÏos bathar-cruaidh sònraichte - à ireamh sreathach, calibrations mothachaidh, msaa) an à iteigin eile .
Chaidh cuspair FS le leughadh a-mhĂ in airson sĂšbh-craoibh a sgrĂšdadh a-staigh agus a-muigh, cha bhith mi aâ fuireach air mion-fhiosrachadh buileachaidh san artaigil seo (ach ma tha Ăšidh ann, is dòcha gun sgrĂŹobh mi mion-artaigil air aâ chuspair seo). Is e an aon phuing a bu mhath leam a thoirt fa-near gu bheil an dĂ chuid bho eòlas pearsanta agus bho lèirmheasan air an fheadhainn a tha air a chuir an gnĂŹomh mar-thĂ , gu bheil buannachd ann an earbsachd. Tha, tha e do-dhèanta faighinn cuidhteas briseadh sĂŹos gu tur, ach tha e comasach gu mòr am tricead a lughdachadh. Agus tha na cairtean a 'fĂ s aonaichte, a tha ga dhèanamh nas fhasa do luchd-seirbheis ath-nuadhachadh.
Bathar cruaidh
Cha robh teagamh sam bith ann mun roghainn seòrsa cuimhne - NOR Flash.
Argumaidean:
ceangal sÏmplidh (mar as trice am bus SPI, a tha eòlas agad mu thrà th air a chleachdadh, agus mar sin chan eil dÚil ri duilgheadasan bathar-cruaidh);
prÏs gòrach;
protocol obrachaidh à bhaisteach (tha am buileachadh mar-thà anns an kernel Linux, ma thogras tu, faodaidh tu fear treas-phà rtaidh a ghabhail, a tha cuideachd an là thair, no eadhon do chuid fhèin a sgrÏobhadh, gu fortanach tha a h-uile dad sÏmplidh);
earbsachd agus goireas:
bho dhuilleag-dà ta à bhaisteach: tha dà ta air a stòradh airson 20 bliadhna, 100000 cearcall sguabaidh airson gach bloc;
bho stòran treas pĂ rtaidh: BER gu math ĂŹosal, aâ postadh nach eil feum air còdan ceartachaidh mhearachdan (bidh cuid de dhâ obraichean aâ beachdachadh air ECC airson NOR, ach mar as trice bidh iad fhathast aâ ciallachadh MLC NOR; bidh seo aâ tachairt cuideachd).
Bheir sinn tuairmse air na riatanasan airson meud agus goireas.
Bu mhath leam gum biodh an dĂ ta cinnteach gun tèid a shĂ bhaladh airson grunn lĂ ithean. Tha seo riatanach gus nach tèid an eachdraidh reic a chall ma tha duilgheadasan conaltraidh ann. Cuiridh sinn fòcas air 5 latha, rè na h-Ăšine seo (eadhon aâ gabhail a-steach deireadh-sheachdainean agus saor-lĂ ithean) faodar an duilgheadas fhuasgladh.
Tha sinn an-drĂ sta aâ cruinneachadh mu 100kb de logaichean gach latha (3-4 mĂŹle inntrigeadh), ach mean air mhean tha am figear seo aâ fĂ s - tha am mion-fhiosrachadh aâ dol am meud, tha tachartasan Ăšra gan cur ris. A bharrachd air an sin, uaireannan bidh spreadhaidhean ann (bidh cuid de luchd-mothachaidh a 'tòiseachadh a' spamadh le rudan ceĂ rr, mar eisimpleir). Obraichidh sinn airson 10 mĂŹle clĂ r 100 bytes gach - megabytes gach latha.
Gu h-iomlan, thig 5MB de dhĂ ta glan (gu math teann) a-mach. Tuilleadh dhaibh (tuairmse garbh) 1MB de dhĂ ta seirbheis.
Is e sin, feumaidh sinn chip 8MB mura cleachd sinn teannachadh, no 4MB ma chleachdas sinn e. Ăireamhan gu math fĂŹrinneach airson an seòrsa cuimhne seo.
A thaobh aâ ghoireas: ma tha sinn an dĂšil gun tèid an cuimhne gu lèir ath-sgrĂŹobhadh gun a bhith nas fhaide na aon uair gach 5 latha, an uairsin thairis air 10 bliadhna de sheirbheis gheibh sinn nas lugha na mĂŹle cearcall ath-sgrĂŹobhaidh.
Leig leam do chuimhneachadh gu bheil an neach-dèanamh a 'gealltainn ceud mÏle.
Beagan mu NOR vs NAND
An-diugh, gu dearbh, tha cuimhne NAND tòrr nas mòr-chòrdte, ach cha bhithinn ga chleachdadh airson aâ phròiseict seo: tha NAND, eu-coltach ri NOR, gu riatanach aâ cur feum air còdan ceartachaidh mhearachdan, clĂ r de dhroch bhlocaichean, msaa, agus cuideachd casan nan Mar as trice bidh sgoltagan NAND tòrr a bharrachd.
Am measg eas-bhuannachdan NOR tha:
tomhas beag (agus, a rèir sin, prÏs à rd gach megabyte);
astar conaltraidh Ïosal (gu Ïre mhòr air sgà th gu bheil eadar-aghaidh sreathach air a chleachdadh, mar as trice SPI no I2C);
sguab Ă s gu slaodach (a rèir meud aâ bhloca, bheir e bho bloigh diog gu grunn diogan).
Tha e coltach nach eil dad deatamach dhuinn, agus mar sin leanaidh sinn oirnn.
Ma tha am mion-fhiosrachadh inntinneach, chaidh am microcircuit a thaghadh aig 25df321a(ge-tĂ , tha seo neo-chudromach, tha tòrr analogues air aâ mhargaidh a tha co-chosmhail ri pinout agus siostam Ă ithne; eadhon ged a tha sinn airson microcircuit a chuir a-steach bho neach-dèanamh eadar-dhealaichte agus / no meud eadar-dhealaichte, obraichidh a h-uile cĂ il gun a bhith ag atharrachadh an còd).
Bidh mi aâ cleachdadh an draibhear a chaidh a thogail a-steach don kernel Linux; air Raspberry, le taing dha taic ath-chòmhdach craoibhe inneal, tha a h-uile dad gu math sĂŹmplidh - feumaidh tu an ath-chòmhdach cruinnichte a chuir a-steach / boot/overlays agus beagan atharrachadh /boot/config.txt.
Eisimpleir faidhle dts
Gus a bhith onarach, chan eil mi cinnteach gu bheil e sgrĂŹobhte gun mhearachdan, ach tha e ag obair.
/*
* Device tree overlay for at25 at spi0.1
*/
/dts-v1/;
/plugin/;
/ {
compatible = "brcm,bcm2835", "brcm,bcm2836", "brcm,bcm2708", "brcm,bcm2709";
/* disable spi-dev for spi0.1 */
fragment@0 {
target = <&spi0>;
__overlay__ {
status = "okay";
spidev@1{
status = "disabled";
};
};
};
/* the spi config of the at25 */
fragment@1 {
target = <&spi0>;
__overlay__ {
#address-cells = <1>;
#size-cells = <0>;
flash: m25p80@1 {
compatible = "atmel,at25df321a";
reg = <1>;
spi-max-frequency = <50000000>;
/* default to false:
m25p,fast-read ;
*/
};
};
};
__overrides__ {
spimaxfrequency = <&flash>,"spi-max-frequency:0";
fastread = <&flash>,"m25p,fast-read?";
};
};
Agus loidhne eile ann an config.txt
dtoverlay=at25:spimaxfrequency=50000000
FĂ gaidh mi an tuairisgeul mu bhith aâ ceangal aâ chip ris an Raspberry Pi. Air an aon lĂ imh, chan eil mi nam eòlaiche ann an electronics, air an lĂ imh eile, tha a h-uile dad an seo banal eadhon dhòmhsa: chan eil ach casan 8 aig a âmicrocircuit, agus feumaidh sinn talamh, cumhachd, SPI (CS, SI, SO, SCK) ); tha na h-ĂŹrean an aon rud ris an fheadhainn aig an Raspberry Pi, chan eil feum air uèirleadh a bharrachd - dĂŹreach ceangail na prĂŹnichean 6 comharraichte.
Aithris dhuilgheadas
Mar as Ă bhaist, bidh aithris na trioblaid aâ dol tro ghrunn thursan, agus tha e coltach riumsa gu bheil an t-Ă m ann airson an ath fhear. Mar sin stadamaid, cuir ri chèile na chaidh a sgrĂŹobhadh mu thrĂ th, agus soilleireachadh am mion-fhiosrachadh a tha air fhĂ gail san dubhar.
Mar sin, tha sinn air co-dhÚnadh gum bi an loga air a stòradh ann an SPI NOR Flash.
Dè a thâ ann an NOR Flash dhaibhsan aig nach eil fios?
Is e cuimhne neo-luaineach a tha seo leis an urrainn dhut trÏ obrachaidhean a dhèanamh:
Leughadh:
An leughadh as cumanta: bidh sinn aâ sgaoileadh an t-seòlaidh agus aâ leughadh na h-uimhir de bytes a dhâ fheumas sinn;
ClĂ radh:
Tha sgrÏobhadh gu NOR flash coltach ri fear à bhaisteach, ach tha aon rud sònraichte ann: chan urrainn dhut ach 1 gu 0 atharrachadh, ach chan ann a chaochladh. Mar eisimpleir, nam biodh 0x55 againn ann an cealla cuimhne, an uairsin às deidh dhuinn 0x0f a sgrÏobhadh thuige, bidh 0x05 air a stòradh an sin mu thrà th (faic an clà r gu h-Ïosal);
Cuir Ă s:
Gu dearbh, feumaidh sinn a bhith comasach air an obair eile a dhèanamh - atharraich 0 gu 1, is e seo dÏreach airson a tha an obair sguabaidh. Eu-coltach ris a 'chiad dhà , bidh e ag obrachadh chan ann le bytes, ach le blocaichean (is e 4kb am bloc sguabaidh as lugha anns a' chip taghte). Bidh Erase a 'sgrios a' bhloc gu lèir agus is e an aon dòigh air atharrachadh 0 gu 1. Mar sin, nuair a bhios tu ag obair le cuimhne flash, gu tric feumaidh tu structaran dà ta a cho-thaobhadh ris a 'chrÏoch bloca sguabaidh.
ClĂ radh ann an NOR Flash:
DĂ ta binary
Bha 01010101
Air a chlĂ radh 00001111
Air fĂ s 00000101
Tha an log fhèin aâ riochdachadh sreath de chlĂ ran de dhâfhaid caochlaideach. Tha fad Ă bhaisteach clĂ r timcheall air 30 bytes (ged a bhios clĂ ran a tha grunn kilobytes de dh'fhaid uaireannan aâ nochdadh). Anns a 'chĂšis seo, bidh sinn ag obair còmhla riutha dĂŹreach mar sheata de bytes, ach, ma tha Ăšidh agad, tha CBOR air a chleachdadh taobh a-staigh nan clĂ ran
A bharrachd air an loga, feumaidh sinn beagan fiosrachaidh âsuidheachadhâ a stòradh, an dĂ chuid Ăšrachadh agus nach eil: ID inneal sònraichte, calibrations mothachaidh, bratach âinneal air a chiorramachadh airson Ăšineâ, msaa.
Tha am fiosrachadh seo na sheata de chlĂ ran prĂŹomh luach, cuideachd air an stòradh ann an CBOR. Chan eil mòran den fhiosrachadh seo againn (beagan kilobytes aig aâ char as motha), agus is ann ainneamh a thèid Ăšrachadh.
Anns na leanas canaidh sinn co-theacs ris.
Ma chuimhnicheas sinn far an do thòisich an artaigil seo, tha e glè chudromach dèanamh cinnteach Ă stòradh dĂ ta earbsach agus, ma ghabhas e dèanamh, obrachadh leantainneach eadhon ma dhâ fhĂ illig bathar-cruaidh / coirbeachd dĂ ta.
Dè na stòran de dhuilgheadasan air am faodar beachdachadh?
Cuir dheth cumhachd rè obair sgrĂŹobhaidh / sguabaidh Ă s. Tha seo bhon roinn âchan eil cleas an-aghaidh crowbar.â
Fiosrachadh bho còmhraidhean air stackexchange: nuair a thèid an cumhachd a chuir dheth fhad âs a tha thu ag obair le flash, bidh an dĂ chuid cuir Ă s (suidhichte gu 1) agus sgrĂŹobh (suidhich gu 0) aâ leantainn gu giĂšlan neo-mhĂŹnichte: faodar dĂ ta a sgrĂŹobhadh, ann am pĂ irt sgrĂŹobhte (can, ghluais sinn 10 bytes / 80 bits , ach chan eil e comasach fhathast 45 pĂŹosan a sgrĂŹobhadh), tha e comasach cuideachd gum bi cuid de na pĂŹosan ann an staid âmeadhanachâ (faodaidh leughadh an dĂ chuid 0 agus 1 a thoirt gu buil);
Mearachdan sa chuimhne flash fhèin.
Chan urrainn dha BER, ged a tha e glè Ïosal, a bhith co-ionann ri neoni;
Mearachdan bus
Chan eil dĂ ta a thèid a ghluasad tro SPI air a dhĂŹon ann an dòigh sam bith; faodaidh an dĂ chuid mearachdan aon-phĂŹos agus mearachdan sioncronaidh tachairt - call no cuir a-steach pĂŹosan (a dhâ adhbhraicheas saobhadh dĂ ta mòr);
Mearachdan/glitches eile
Mearachdan sa chòd, glitches sÚbh-craoibhe, eadar-theachd coimheach ...
Tha mi air na riatanasan a chuir ri chèile, agus tha feum air an coileanadh, nam bheachd-sa, gus dèanamh cinnteach à earbsachd:
feumaidh clĂ ran a dhol a-steach don chuimhne flash sa bhad, chan eilear aâ beachdachadh air sgrĂŹobhaidhean dĂ il; - ma thachras mearachd, feumar a lorg agus a phròiseasadh cho trĂ th âs a ghabhas; - feumaidh an siostam, ma ghabhas e dèanamh, faighinn seachad air mearachdan. (eisimpleir bho bheatha âmar nach bu chòir dha a bhithâ, a tha mi aâ smaoineachadh a choinnich a h-uile duine: Ă s deidh ath-thòiseachadh èiginneach, tha an siostam faidhle âbristeâ agus chan eil an siostam obrachaidh a âbrògadh)
Beachdan, dòighean-obrach, meòrachadh
Nuair a thòisich mi aâ smaoineachadh mun duilgheadas seo, chaidh tòrr bheachdan tro mo cheann, mar eisimpleir:
cleachdadh dlĂšthadh dĂ ta;
cleachd structaran dà ta ciallach, mar eisimpleir, a 'stòradh cinn clà ran air leth bho na clà ran fhèin, gus an urrainn dhut an còrr a leughadh gun duilgheadas sam bith ma tha mearachd ann an clà r sam bith;
cleachd raointean bit gus smachd a chumail air crÏoch a chuir air clà radh nuair a thèid an cumhachd a chuir dheth;
stòradh checksums airson a h-uile cà il;
cleachd seòrsa de chòd dÏon-fuaim.
Chaidh cuid de na beachdan sin a chleachdadh, agus chaidh co-dhÚnadh cuid eile a thrèigsinn. Rachamaid ann an òrdugh.
DĂšmhlachd dĂ ta
Tha na tachartasan fhèin a tha sinn aâ clĂ radh anns an iris gu math coltach agus ath-aithris (âthilg bonn 5 rublesâ, âbrĂšth am putan airson atharrachadh a thoirt seachadâ, ...). Mar sin, bu chòir teannachadh a bhith gu math èifeachdach.
Tha an teannachadh os cionn beag beag (tha am pròiseasar againn gu math cumhachdach, bha aon chridhe aig eadhon aâ chiad Pi le tricead 700 MHz, tha grunn choraichean aig modalan gnĂ thach le tricead thairis air gigahertz), tha an ĂŹre iomlaid leis an stòradh ĂŹosal (grunn megabytes gach diog), tha meud nan clĂ ran beag. San fharsaingeachd, ma bheir teannachadh buaidh air coileanadh, cha bhi e ach deimhinneach. (gu tur neo-bhreithneachail, dĂŹreach ag rĂ dh). A bharrachd air an sin, chan eil fĂŹor freumhachadh againn, ach Linux cunbhalach - mar sin cha bu chòir gum biodh feum air mòran oidhirp air a bhuileachadh (tha e gu leòr dĂŹreach an leabharlann a cheangal agus grunn ghnĂŹomhan a chleachdadh bhuaithe).
Chaidh pĂŹos den log a thoirt bho inneal obrach (1.7 MB, 70 mĂŹle inntrigeadh) agus chaidh a sgrĂšdadh an-toiseach airson compressibility aâ cleachdadh gzip, lz4, lzop, bzip2, xz, zstd ri fhaighinn air aâ choimpiutair.
sheall gzip, xz, zstd toraidhean co-chosmhail (40Kb).
Chuir e iongnadh orm gun do sheall an xz fasanta e fhèin an seo aig Ïre gzip no zstd;
thug lzip le roghainnean bunaiteach toraidhean beagan nas miosa;
Cha do sheall lz4 agus lzop toraidhean fĂŹor mhath (150Kb);
sheall bzip2 toradh iongantach math (18Kb).
Mar sin, tha an dĂ ta air a dhlĂšthadh gu math.
Mar sin (mura lorg sinn lochdan marbhtach) bidh teannachadh ann! DĂŹreach air sgĂ th 's gum faod barrachd dĂ ta a bhith a' freagairt air an aon dhrĂ ibhear flash.
Leig dhuinn smaoineachadh mu na h-eas-bhuannachdan.
A 'chiad dhuilgheadas: tha sinn air aontachadh mar-thĂ gum feum a h-uile clĂ r a dhol gu flash sa bhad. Mar as trice, bidh an tasglann aâ cruinneachadh dĂ ta bhon t-sruth a-steach gus an co-dhĂšin e gu bheil an t-Ă m ann sgrĂŹobhadh air an deireadh-sheachdain. Feumaidh sinn bloca dĂ ta teann fhaighinn sa bhad agus a stòradh ann an cuimhne neo-luaineach.
ChÏ mi trÏ dòighean:
Dèan teannachadh air gach clĂ r aâ cleachdadh teannachadh faclair an Ă ite na h-algorithms a chaidh a dheasbad gu h-Ă rd.
Tha e na roghainn gu tur obrachail, ach cha toil leam e. Gus dèanamh cinnteach gum bi ĂŹre teannachaidh nas fheĂ rr no nas lugha, feumaidh am faclair a bhith âair a dhealbhadhâ gu dĂ ta sònraichte; bidh atharrachadh sam bith aâ leantainn gu tuiteam gu tubaisteach aig an ĂŹre teannachaidh. Seadh, faodar an duilgheadas fhuasgladh le bhith aâ cruthachadh dreach Ăšr den fhaclair, ach is e ceann goirt a tha seo - feumaidh sinn a h-uile dreach den fhaclair a stòradh; anns gach inntrigeadh feumaidh sinn innse dè an dreach den fhaclair a chaidh a dhlĂšthadh...
Dèan teannachadh air gach clĂ r aâ cleachdadh algorithms âclasaigeachâ, ach gu neo-eisimeileach bhon fheadhainn eile.
Chan eil na h-algorithms teannachaidh air a bheilear aâ beachdachadh air an dealbhadh gus obrachadh le clĂ ran den mheud seo (deichean de bytes), bidh e soilleir gum bi an co-mheas teannachaidh nas lugha na 1 (is e sin, Ă rdachadh meud dĂ ta an Ă ite teannachadh);
Dèan FLUSH às deidh gach clà radh.
Tha taic aig mòran de leabharlannan teannachaidh airson FLUSH. Is e seo Ă ithne (no paramadair don mhodh teannachaidh), nuair a gheibh e sin bidh an tasglann aâ cruthachadh sruth teann gus an gabh a chleachdadh airson ath-nuadhachadh uile dĂ ta neo-dhĂšmhlaichte a chaidh fhaighinn mu thrĂ th. A leithid de analogues sync ann an siostaman faidhle no commit ann an sql.
Is e an rud a tha cudromach gum bi e comasach do ghnĂŹomhachd teannachaidh Ă s deidh sin am faclair cruinnichte a chleachdadh agus nach bi an co-mheas teannachaidh aâ fulang cho mòr ris an dreach roimhe.
Tha mi aâ smaoineachadh gu bheil e follaiseach gun do thagh mi an treas roghainn, leig dhuinn sĂšil nas mionaidiche a thoirt air.
Rinn mi deuchainn glÚin stèidhichte air an artaigil, thug mi 70 mÏle inntrigeadh log bho inneal fÏor, le meud duilleag de 60Kb (tillidh sinn gu meud na duilleige nas fhaide air adhart) fhuair:
Fiosrachadh cruaidh
Compression gzip -9 (gun FLUSH)
zlib le Z_PARTIAL_FLUSH
zlib le Z_SYNC_FLUSH
Meud, KB
1692
40
352
604
Aig aâ chiad sealladh, tha aâ phrĂŹs a chuir FLUSH a-steach ro Ă rd, ach ann an da-rĂŹribh chan eil mòran roghainn againn - an dĂ rna cuid gun a bhith aâ teannachadh idir, no a bhith aâ teannachadh (agus gu h-èifeachdach) le FLUSH. Cha bu chòir dhuinn dĂŹochuimhneachadh gu bheil 70 mĂŹle clĂ r againn, chan eil an call obrach a thug Z_PARTIAL_FLUSH a-steach ach 4-5 bytes gach clĂ r. Agus thionndaidh an co-mheas teannachaidh gu bhith cha mhòr 5: 1, a tha nas motha na toradh sĂ r-mhath.
Is dòcha gum bi e na iongnadh, ach tha Z_SYNC_FLUSH gu dearbh na dhòigh nas èifeachdaiche air FLUSH a dhèanamh
Nuair a bhios tu aâ cleachdadh Z_SYNC_FLUSH, bidh na 4 bytes mu dheireadh de gach inntrigeadh an-còmhnaidh 0x00, 0x00, 0xff, 0xff. Agus ma tha sinn eòlach orra, chan fheum sinn an stòradh, agus mar sin chan eil am meud mu dheireadh ach 324Kb.
Tha mĂŹneachadh san artaigil ris an do rinn mi ceangal:
Tha bloc seòrsa 0 Úr le susbaint falamh air a chur ris.
Ann am bloc seòrsa 0 le susbaint falamh tha:
am bann-cinn trĂŹ-phĂŹos;
0 gu 7 pĂŹosan co-ionann ri neoni, gus co-thaobhadh byte a choileanadh;
an sreath ceithir-byte 00 00 FF FF.
Mar a chĂŹ thu gu furasta, anns aâ bhloc mu dheireadh ro na 4 bytes sin tha bho 3 gu 10 pĂŹosan neoni. Ach, tha cleachdadh air sealltainn gu bheil co-dhiĂš 10 pĂŹosan neoni ann.
Tha e a 'tionndadh a-mach gu bheil a leithid de bhlocaichean goirid de dhà ta mar as trice (an-còmhnaidh?) air an còdachadh le bhith a' cleachdadh bloc de sheòrsa 1 (bloc stèidhichte), a tha gu riatanach a 'crÏochnachadh le 7 pÏosan neoni, a' toirt seachad 10-17 pÏosan neoni cinnteach (agus an còrr. a bhith neoni le coltachd de mu 50%).
Mar sin, air dà ta deuchainn, ann an 100% de chÚisean tha aon byte neoni ro 0x00, 0x00, 0xff, 0xff, agus ann an còrr air trian de chÚisean tha dà neoni bytes ann. (is dòcha gur e an fhÏrinn gu bheil mi a 'cleachdadh CBOR binary, agus nuair a bhios mi a' cleachdadh teacsa JSON, bhiodh blocaichean de sheòrsa 2 - bloc fiÚghantach nas cumanta, fa leth, blocaichean gun neoni bytes a bharrachd ro 0x00, 0x00, 0xff, 0xff bhiodh iad a 'tachairt).
Gu h-iomlan, aâ cleachdadh an dĂ ta deuchainn a tha ri fhaighinn, tha e comasach faighinn a-steach do nas lugha na 250Kb de dhĂ ta teann.
Faodaidh tu beagan a bharrachd a shĂ bhaladh le bhith a âdèanamh beagan juggling: airson a-nis bidh sinn aâ seachnadh lĂ thaireachd beagan phĂŹosan neoni aig deireadh a âbhloc, chan eil cuid de phĂŹosan aig toiseach aâ bhloc cuideachd ag atharrachadh ...
Ach an uairsin rinn mi co-dhĂšnadh lĂ idir airson stad, air neo aig an ĂŹre seo bâ urrainn dhomh an tasglann agam fhĂŹn a leasachadh.
Gu h-iomlan, bhon dĂ ta deuchainn agam fhuair mi 3-4 bytes gach sgrĂŹobhadh, thionndaidh an co-mheas teannachaidh a-mach gu bhith nas Ă irde na 6: 1. Bidh mi onarach: cha robh dĂšil agam ri leithid de thoradh; nam bheachd-sa, tha dad nas fheĂ rr na 2: 1 mar thoradh mar-thĂ a tha aâ fĂŹreanachadh cleachdadh teannachaidh.
Tha a h-uile dad gu math, ach tha zlib (deflate) fhathast na algairim teannachaidh Ă rsaidh, airidh air agus beagan seann-fhasanta. Tha an fhĂŹrinn gu bheil an 32Kb mu dheireadh den t-sruth dĂ ta neo-bhrĂšichte air a chleachdadh mar fhaclair aâ coimhead neònach an-diugh (is e sin, ma tha cuid de bhloca dĂ ta glè choltach ris na bha san t-sruth cuir a-steach 40Kb air ais, tòisichidh e air a thasgadh a-rithist, agus cha toir e iomradh air tachartas roimhe). Ann an tasglannan fasanta an latha an-diugh, bidh meud an fhaclair gu tric air a thomhas ann am megabytes seach kilobytes.
Mar sin leanaidh sinn ar mion-sgrĂšdadh air tasglannan.
An uairsin rinn sinn deuchainn air bzip2 (cuimhnich, às aonais FLUSH sheall e co-mheas teannachaidh math faisg air 100: 1). Gu mÏ-fhortanach, rinn e glè dhroch le FLUSH; bha meud an dà ta teannachaidh nas motha na an dà ta neo-bhrÚichte.
Na barailean agam mu na h-adhbharan airson an fhĂ illigeadh
Chan eil Libbz2 aâ tabhann ach aon roghainn flush, a tha coltach gu bheil e aâ glanadh am faclair (co-chosmhail ri Z_FULL_FLUSH ann an zlib); chan eilear aâ bruidhinn air teannachadh èifeachdach Ă s deidh seo.
Agus bâ e zstd am fear mu dheireadh a chaidh a dhearbhadh. A rèir nam paramadairean, bidh e a âteannachadh an dĂ rna cuid aig ĂŹre gzip, ach fada nas luaithe, no nas fheĂ rr na gzip.
Gu mÏ-fhortanach, le FLUSH cha do rinn e glè mhath: bha meud an dà ta teannachaidh timcheall air 700Kb.
ĐŻ dh'fhaighnich ceist air duilleag github aâ phròiseict, fhuair mi freagairt gum bu chòir dhut cunntadh air suas ri 10 bytes de dhĂ ta seirbheis airson gach bloca de dhĂ ta teann, a tha faisg air na toraidhean a fhuaireadh; chan eil dòigh ann grèim fhaighinn air deflate.
Cho-dhÚin mi stad aig an Ïre seo anns na deuchainnean agam le tasglannan (leig dhomh do chuir an cuimhne nach do sheall xz, lzip, lzo, lz4 iad fhèin eadhon aig an Ïre deuchainn às aonais FLUSH, agus cha do bheachdaich mi air algorithms teannachaidh nas annasaiche).
Rachamaid air ais gu duilgheadasan tasglann.
Is e an dĂ rna duilgheadas (mar a chanas iad ann an òrdugh, chan ann ann an luach) gu bheil an dĂ ta teannachaidh na aon shruth, anns a bheil an-còmhnaidh iomraidhean air earrannan roimhe. Mar sin, ma thèid earrann de dhĂ ta teann a mhilleadh, bidh sinn aâ call chan e a-mhĂ in am bloca co-cheangailte de dhĂ ta neo-bhrĂšichte, ach cuideachd a h-uile gin Ă s deidh sin.
Tha dòigh ann airson an duilgheadas seo fhuasgladh:
Cuir casg air an duilgheadas bho bhith aâ tachairt - cuir cus feum air an dĂ ta teann, a leigeas leat mearachdan aithneachadh agus a cheartachadh; bruidhnidh sinn mu dheidhinn seo nas fhaide air adhart;
LĂšghdaich buaidhean ma tha duilgheadas ann
Tha sinn mu thrĂ th air a rĂ dh na bu thrĂ ithe gun urrainn dhut gach bloc dĂ ta a dhlĂšthadh gu neo-eisimeileach, agus falbhaidh an duilgheadas leis fhèin (bidh milleadh air dĂ ta aon bhloca aâ leantainn gu call dĂ ta a-mhĂ in airson a âbhloc seo). Ach, is e fĂŹor chĂšis a tha seo far nach bi teannachadh dĂ ta neo-èifeachdach. An fhĂŹor cheann eile: cleachd a h-uile 4MB den chip againn mar aon thasglann, a bheir dhuinn teannachadh sĂ r-mhath, ach builean tubaisteach gun fhios nach bi truailleadh dĂ ta ann. Tha, tha feum air co-rèiteachadh a thaobh earbsachd. Ach feumaidh sinn cuimhneachadh gu bheil sinn aâ leasachadh cruth stòraidh dĂ ta airson cuimhne neo-luaineach le BER gu math ĂŹosal agus Ăšine stòraidh dĂ ta dearbhte de 20 bliadhna.
Rè na deuchainnean, fhuair mi a-mach gu bheil call mòr no nas lugha anns an ĂŹre teannachaidh aâ tòiseachadh air blocaichean de dhĂ ta teannachaidh nas lugha na 10 KB ann am meud.
Chaidh iomradh a thoirt roimhe gu bheil duilleag air aâ chuimhne a thathar aâ cleachdadh; chan eil mi aâ faicinn adhbhar carson nach bu chòir an conaltradh âaon duilleag - aon bhloca de dhĂ ta teannachaidhâ a chleachdadh.
Is e sin, is e 16Kb am meud duilleag reusanta as ĂŹsle (le tèarmann airson fiosrachadh seirbheis). Ach, tha meud duilleag cho beag aâ cur bacadh mòr air aâ mheud clĂ raidh as Ă irde.
Ged nach eil mi fhathast a 'sĂšileachadh clĂ ran nas motha na beagan kilobytes ann an cruth teann, chuir mi romhpa duilleagan 32Kb a chleachdadh (airson duilleagan 128 gu h-iomlan gach sgiob).
GeĂ rr-chunntas:
Bidh sinn aâ stòradh dĂ ta teannaichte le bhith aâ cleachdadh zlib (deflate);
Airson gach inntrigeadh shuidhich sinn Z_SYNC_FLUSH;
Airson gach clĂ r teannachaidh, bidh sinn a 'gearradh nam bytes air falbh (me 0x00, 0x00, 0xff, 0xff); anns a' cheann-cinn tha sinn a' sealltainn cia mheud bytes a gheĂ rr sinn dheth;
Bidh sinn aâ stòradh dĂ ta ann an duilleagan 32Kb; tha aon shruth de dhĂ ta teannaichte am broinn na duilleige; Air gach duilleag bidh sinn aâ tòiseachadh air teannachadh a-rithist.
Agus, mus cuir thu crĂŹoch air le teannachadh, bu mhath leam d âaire a tharraing chun fhĂŹrinn nach eil againn ach beagan bytes de dhĂ ta teannachaidh gach clĂ r, agus mar sin tha e air leth cudromach gun a bhith ag Ă rdachadh fiosrachadh na seirbheis, tha a h-uile byte aâ cunntadh an seo.
Aâ stòradh cinn-cinn dĂ ta
Leis gu bheil clà ran againn de dh'fhaid caochlaideach, feumaidh sinn dòigh air choireigin suidheachadh/crÏochan chlà ran a dhearbhadh.
Tha fios agam air trÏ dòighean-obrach:
Tha a h-uile clà r air a stòradh ann an sruth leantainneach, an toiseach tha bann-cinn clà raidh anns a bheil an fhaid, agus an uairsin an clà r fhèin.
Anns an sgeadachadh seo, faodaidh an dĂ chuid cinn agus dĂ ta a bhith de dh'fhaid caochlaideach.
Gu bunaiteach, gheibh sinn liosta aon-cheangailte a tha air a chleachdadh fad na h-Ăšine;
Bidh cinn-cinn agus na clà ran fhèin air an stòradh ann an sruthan fa leth.
Le bhith aâ cleachdadh bannan-cinn seasmhach, bidh sinn aâ dèanamh cinnteach nach toir milleadh air aon cheann-cinn buaidh air an fheadhainn eile.
Tha dòigh-obrach coltach ris air a chleachdadh, mar eisimpleir, ann an iomadh siostam faidhle;
Tha clĂ ran air an stòradh ann an sruth leantainneach, tha crĂŹoch aâ chlĂ ir air a dhearbhadh le comharra sònraichte (caractar / sreath de charactaran a tha toirmisgte taobh a-staigh blocaichean dĂ ta). Ma tha comharradh taobh a-staigh a 'chlĂ ir, an uairsin cuiridh sinn sreath eile na Ă ite (teich e).
Tha dòigh-obrach coltach ris air a chleachdadh, mar eisimpleir, ann am protocol PPP.
Seallaidh mi.
Roghainn 1:
Tha a h-uile dad gu math sĂŹmplidh an seo: le fios fad a âchlĂ ir, is urrainn dhuinn seòladh an ath chinn a thomhas. Mar sin gluaisidh sinn tro na cinn gus an coinnich sinn ri raon lĂ n de 0xff (raon an-asgaidh) no deireadh na duilleige.
Roghainn 2:
Air sgĂ th cho fada âs a tha an clĂ r caochlaideach, chan urrainn dhuinn innse ro-lĂ imh cia mheud clĂ r (agus mar sin bann-cinn) a dhâ fheumas sinn airson gach duilleag. Faodaidh tu na cinn-cinn agus an dĂ ta iad fhèin a sgaoileadh thairis air diofar dhuilleagan, ach is fheĂ rr leam dòigh-obrach eadar-dhealaichte: bidh sinn aâ cur an dĂ chuid na cinn agus an dĂ ta air aon duilleag, ach tha na cinn-cinn (de mheud cunbhalach) aâ tighinn bho thoiseach na duilleige, agus an tha dĂ ta (de dh'fhaid caochlaideach) a' tighinn bhon deireadh. Cho luath âs a bhios iadâ a âcoinneachadhâ (chan eil Ă ite gu leòr ann airson inntrigeadh Ăšr), tha sinn den bheachd gu bheil an duilleag seo coileanta.
Roghainn 3:
Chan eil feum air an fhaid no fiosrachadh eile a stòradh mu shuidheachadh an dĂ ta anns a âcheann; tha comharran aâ comharrachadh crĂŹochan nan clĂ ran gu leòr. Ach, feumar an dĂ ta a phròiseasadh nuair a thathar aâ sgrĂŹobhadh/leughadh.
Chleachdainn 0xff mar chomharradh (a lÏonas an duilleag às deidh a dhubhadh à s), agus mar sin cha tèid an raon an-asgaidh a là imhseachadh mar dhà ta.
ClĂ r coimeas:
Roghainn 1
Roghainn 2
Roghainn 3
Fulangas mearachd
-
+
+
Compactness
+
-
+
Iom-fhillteachd buileachaidh
*
**
**
Tha locht marbhtach air Roghainn 1: ma thèid gin de na cinn a mhilleadh, thèid an t-sreath gu lèir a sgrios. Leigidh na roghainnean a tha air fhà gail dhut beagan dà ta fhaighinn air ais eadhon ma tha milleadh mòr ann.
Ach an seo tha e iomchaidh cuimhneachadh gun do chuir sinn romhainn an dĂ ta a stòradh ann an cruth teann, agus mar sin bidh sinn aâ call an dĂ ta gu lèir air an duilleag Ă s deidh clĂ r âbristeâ, agus mar sin ged a tha minus sa chlĂ r, cha bhith sinn thoir an aire dha.
Compactness:
anns a 'chiad roghainn, feumaidh sinn an fhaid a stòradh a-mhà in anns a' bhann-cinn; ma chleachdas sinn à ireamhairean de dh'fhaid caochlaideach, sa mhòr-chuid de chÚisean gheibh sinn seachad le aon byte;
anns an dà rna roghainn feumaidh sinn an seòladh tòiseachaidh agus an fhad a stòradh; feumaidh an clà r a bhith de mheud cunbhalach, tha mi a 'toirt tuairmse air 4 bytes gach clà r (dà bytes airson a' chothromachadh, agus dà bytes airson an fhaid);
chan fheum an treas roghainn ach aon charactar gus toiseach aâ chlĂ raidh a chomharrachadh, agus Ă rdaichidh an clĂ radh fhèin 1-2% air sgĂ th dĂŹon. San fharsaingeachd, timcheall air co-ionannachd leis aâ chiad roghainn.
An toiseach, bheachdaich mi air an dà rna roghainn mar am prÏomh fhear (agus eadhon sgrÏobh e am buileachadh). Cha do thrèig mi e ach nuair a cho-dhÚin mi mu dheireadh teannachadh a chleachdadh.
Is dòcha aon latha gun cleachd mi an aon roghainn fhathast. Mar eisimpleir, ma dh'fheumas mi dèiligeadh ri stòradh dà ta airson bà ta a tha a 'siubhal eadar an Talamh agus Mars, bidh riatanasan gu tur eadar-dhealaichte ann airson earbsachd, rèididheachd cosmaigeach, ...
A thaobh an treas roghainn: thug mi dà rionnag dha airson an duilgheadas a thaobh buileachadh dÏreach air sgà th 's nach toil leam a bhith a' cluich le dÏon, ag atharrachadh an fhaid sa phròiseas, msaa. Tha, is dòcha gu bheil mi claon, ach feumaidh mi an còd a sgrÏobhadh - carson a bheir thu ort rudeigin a dhèanamh nach toil leat.
GeĂ rr-chunntas: Bidh sinn aâ taghadh an roghainn stòraidh ann an cruth slabhraidhean âceann-cinn le faid - dĂ ta de dhâ fhaid caochlaideach" air sgĂ th èifeachdas agus furasta a bhuileachadh.
Aâ cleachdadh Bit Fields gus sĂšil a chumail air soirbheachas gnĂŹomhachd sgrĂŹobhaidh
Chan eil cuimhne agam a-nis cĂ ite an dâ fhuair mi am beachd, ach tha e aâ coimhead rudeigin mar seo:
Airson gach inntrigeadh, bidh sinn a 'riarachadh grunn phĂŹosan airson brataichean a stòradh. Mar a thuirt sinn na bu trĂ ithe, an dèidh a sguabadh Ă s a h-uile pĂŹosan a lĂŹonadh le 1s, agus faodaidh sinn atharrachadh 1 gu 0, ach chan ann a chaochladh. Mar sin airson âchan eil aâ bhratach air a suidheachadhâ bidh sinn aâ cleachdadh 1, airson âtha aâ bhratach suidhichteâ bidh sinn aâ cleachdadh 0.
Seo cò ris a dhâ fhaodadh a bhith aâ cur clĂ r de dhâfhaid caochlaideach ann am flash coltach:
Suidhich aâ bhratach âtha clĂ radh faid air tòiseachadhâ;
ClĂ raich an fhaid;
Suidhich am bratach âtha clĂ radh dĂ ta air tòiseachadhâ;
A bharrachd air an sin, bidh bratach âThachair mearachdâ againn, airson brataichean 4 bit gu h-iomlan.
Anns a 'chÚis seo, tha dà stà ite seasmhach againn "1111" - chan eil clà radh air tòiseachadh agus "1000" - bha clà radh soirbheachail; ma thachras briseadh ris nach robh dÚil sa phròiseas clà raidh, gheibh sinn stà itean eadar-mheadhanach, as urrainn dhuinn an uairsin a lorg agus a phròiseasadh.
Tha an dòigh-obrach inntinneach, ach chan eil e a 'dÏon ach an aghaidh briseadh cumhachd gu h-obann agus fà illigeadh coltach ris, a tha, gu dearbh, cudromach, ach tha seo fada bhon aon adhbhar (no eadhon am prÏomh) airson fà illigidhean a dh'fhaodadh a bhith ann.
GeĂ rr-chunntas: Rachamaid air adhart a 'lorg fuasgladh math.
Checksums
Bidh checksums cuideachd ga dhèanamh comasach dèanamh cinnteach (le coltachd reusanta) gu bheil sinn aâ leughadh dĂŹreach na bu chòir a bhith sgrĂŹobhte. Agus, eu-coltach ris na raointean beaga air an deach beachdachadh gu h-Ă rd, bidh iad an-còmhnaidh ag obair.
Ma bheachdaicheas sinn air an liosta de thÚsan dhuilgheadasan air an do bhruidhinn sinn gu h-à rd, bidh e comasach don t-seic mearachd aithneachadh ge bith cò às a thà inig e. (ach a-mhà in, is dòcha, airson coigrich droch-rÚnach - faodaidh iad an checksum a chruthachadh cuideachd).
Mar sin mas e ar n-amas dearbhadh gu bheil an dĂ ta slĂ n, is e deagh bheachd a thâ ann an checksums.
Cha do thog an roghainn algairim airson Ă ireamhachadh an t-seic ceist sam bith - CRC. Air an aon lĂ imh, tha feartan matamataigeach ga dhèanamh comasach cuid de mhearachdan a ghlacadh 100%; air an lĂ imh eile, air dĂ ta air thuaiream mar as trice bidh an algairim seo a âsealltainn coltachd tubaistean nach eil mòran nas Ă irde na aâ chrĂŹoch teòiridheach. . Is dòcha nach e seo an algairim as luaithe, agus chan e an-còmhnaidh an ĂŹre as ĂŹsle a thaobh an Ă ireamh de thubaistean, ach tha cĂ ileachd fĂŹor chudromach aige: anns na deuchainnean a choinnich mi, cha robh pĂ train sam bith ann far an do dh'fhĂ illig e gu soilleir. Is e seasmhachd am prĂŹomh chĂ ileachd sa chĂšis seo.
Eisimpleir de sgrĂšdadh tomhas-lĂŹonaidh: pĂ irt de 1, pĂ irt de 2(ceanglaichean gu narod.ru, duilich).
Ach, chan eil an obair airson checksum a thaghadh coileanta; Tha CRC na theaghlach iomlan de checksums. Feumaidh tu co-dhĂšnadh mun fhad, agus an uairsin tagh polynomial.
Chan e ceist cho sĂŹmplidh a thâ ann a bhith aâ taghadh fad an t-seic mar a tha e coltach aig aâ chiad sealladh.
Leig leam sealltainn:
Leig leinn gu bheil coltachd mearachd anns gach byte agus fĂŹor dheagh sgrĂšdadh, leig dhuinn obrachadh a-mach an Ă ireamh chuibheasach de mhearachdan gach millean clĂ r:
DĂ ta, byte
Checksum, byte
Mearachdan neo-aithnichte
Lorgaidh mearachdan meallta
Dearbhaidhean meallta iomlan
1
0
1000
0
1000
1
1
4
999
1003
1
2
â 0
1997
1997
1
4
â 0
3990
3990
10
0
9955
0
9955
10
1
39
990
1029
10
2
â 0
1979
1979
10
4
â 0
3954
3954
1000
0
632305
0
632305
1000
1
2470
368
2838
1000
2
10
735
745
1000
4
â 0
1469
1469
Bhiodh e coltach gu bheil a h-uile dad sĂŹmplidh - a rèir dè cho fada âs a tha an dĂ ta air a dhĂŹon, tagh fad an t-seic leis aâ char as lugha de nithean ceĂ rr - agus tha an cleas anns a âbhaga.
Ach, tha duilgheadas ag èirigh le sgrĂšdaidhean goirid: ged a tha iad math air mearachdan aon-phĂŹos a lorg, faodaidh iad le coltachd gu math Ă rd gabhail ri dĂ ta gu tur air thuaiream mar a tha ceart. Bha artaigil ann mu thrĂ th air HabrĂŠ aâ toirt cunntas air duilgheadas ann am fĂŹor bheatha.
Mar sin, gus dèanamh cinnteach gu bheil maids dearbhaidh air thuaiream cha mhòr do-dhèanta, feumaidh tu checksums a chleachdadh a tha 32 pÏosan no nas fhaide de dh'fhaid. (airson faid nas motha na 64 pÏosan, mar as trice bidh gnÏomhan hash criptografach air an cleachdadh).
A dhâ aindeoin gun do sgrĂŹobh mi na bu thrĂ ithe gum feum sinn Ă ite a shĂ bhaladh anns a h-uile dòigh, bidh sinn fhathast aâ cleachdadh checksum 32-bit (chan eil pĂŹosan 16 gu leòr, tha coltachd tubaist nas Ă irde na 0.01%; agus 24 pĂŹosan, mar a tha iad). rĂ dh, Nach 'eil aon chuid an so no ann).
Faodaidh gearan èirigh an seo: an do shĂ bhail sinn a h-uile byte nuair a thagh sinn teannachadh gus a-nis 4 byte a thoirt seachad aig an aon Ă m? Nach biodh e na bâ fheĂ rr gun a bhith aâ teannachadh no aâ cur checksum ris? Gu dearbh chan eil, chan eil teannachadh ann chan eil ciall, nach fheum sinn sgrĂšdadh iomlanachd.
Nuair a bhios sinn aâ taghadh polynomial, cha bhith sinn ag ath-thòiseachadh aâ chuibhle, ach aâ gabhail an CRC-32C a tha mòr-chòrdte a-nis.
Bidh an còd seo aâ lorg mhearachdan 6 bit air pacaidean suas gu 22 bytes (is dòcha aâ chĂšis as cumanta dhuinne), mearachdan 4 bit air pacaidean suas gu 655 bytes (cuideachd cĂšis chumanta dhuinn), 2 no Ă ireamh neònach sam bith de mhearachdan air pacaidean de fhad reusanta sam bith.
Ma tha Ăšidh aig duine anns aâ mhion-fhiosrachadh
Рan artaigil aige tha còd inntinneach eile, a bheir seachad crÏochan beagan nas fheà rr airson na faid pacaid a tha buntainneach dhuinne, ach cha do bheachdaich mi air an eadar-dhealachadh mòr, agus bha mi comasach gu leòr còd à bhaisteach a thaghadh an à ite an tè à bhaisteach agus air a dheagh sgrÚdadh.
Cuideachd, leis gu bheil an dĂ ta againn air a dhlĂšthadh, tha aâ cheist ag èirigh: am bu chòir dhuinn Ă ireamhachadh dĂ ta teann no neo-bhrĂšichte obrachadh a-mach?
Argamaidean airson a bhith aâ tomhas an t-seic de dhĂ ta neo-bhrĂšichte:
Feumaidh sinn mu dheireadh sgrĂšdadh a dhèanamh air sĂ bhailteachd stòradh dĂ ta - mar sin bidh sinn ga sgrĂšdadh gu dĂŹreach (aig an aon Ă m, thèid mearachdan a dhâ fhaodadh a bhith ann an cur an gnĂŹomh teannachadh / dĂŹ-dhĂšmhlachadh, milleadh bho chuimhne briste, msaa);
Tha buileachadh gu math aibidh aig an algairim deflate ann an zlib agus cha bu chòir tuiteam le dĂ ta cuir a-steach âcamâ; a bharrachd air an sin, gu tric bidh e comasach dha mearachdan a lorg gu neo-eisimeileach anns an t-sruth cuir a-steach, a âlughdachadh an coltachd iomlan gun lorgar mearachd (rinn e deuchainn le bhith aâ tionndadh aon phĂŹos ann an clĂ r goirid, lorg zlib mearachd ann an timcheall air trian de chĂšisean).
Argamaidean an aghaidh Ă ireamhachadh an t-seic de dhĂ ta neo-bhrĂšichte:
Tha CRC âair a dhealbhadh gu sònraichteâ gu sònraichte airson na beagan mhearachdan a tha Ă bhaisteach do chuimhne flash (faodaidh beagan mearachd ann an sruth teann atharrachadh mòr adhbhrachadh anns an t-sruth toraidh, air an urrainn dhuinn, gu teòiridheach a-mhĂ in, âbualadhâ a ghlacadh);
Cha toil leam am beachd a bhith aâ toirt seachad dĂ ta a dhâ fhaodadh a bhith briste chun an decompressor, Cò aig tha fiosciamar a bheir e freagairt.
Anns aâ phròiseact seo, chuir mi romham gluasad bhon chleachdadh ris an gabhar san fharsaingeachd a bhith aâ stòradh seic de dhĂ ta neo-bhrĂšichte.
GeĂ rr-chunntas: Bidh sinn aâ cleachdadh CRC-32C, bidh sinn aâ tomhas an t-seic bhon dĂ ta anns an fhoirm anns a bheil iad air an sgrĂŹobhadh gu flash (Ă s deidh teannachadh).
Iomallachd
Chan eil cleachdadh còdadh gun fheum, gu dearbh, aâ cur Ă s do chall dĂ ta, ge-tĂ , faodaidh e gu mòr (gu tric le iomadh òrdugh meudachd) lĂšghdachadh a dhèanamh air an coltas gun tèid dĂ ta neo-ruigsinneach a chall.
Faodaidh sinn diofar sheòrsaichean call-obrach a chleachdadh gus mearachdan a cheartachadh.
Faodaidh còdan hamming mearachdan aon-phÏos a cheartachadh, faodaidh còdan caractar Reed-Solomon, ioma leth-bhreac de dhà ta còmhla ri checksums, no còdachadh mar RAID-6 cuideachadh gus dà ta fhaighinn air ais eadhon ma thachras coirbeachd mòr.
An toiseach, bha mi dealasach a thaobh cleachdadh farsaing de chòdadh a tha an aghaidh mhearachdan, ach an uairsin thuig mi gum feum sinn an toiseach beachd a bhith againn air dè na mearachdan a tha sinn airson sinn fhèin a dhÏon, agus an uairsin tagh còdadh.
Thuirt sinn na bu thrĂ ithe gum feumar mearachdan a lorg cho luath âs a ghabhas. Dè na h-amannan as urrainn dhuinn a thighinn tarsainn air mearachdan?
ClĂ radh neo-chrĂŹochnaichte (airson adhbhar air choireigin aig Ă m clĂ raidh chaidh an cumhachd a chuir dheth, chaidh an sĂšbh-craoibhe a reothadh, ...)
Gu mÏ-fhortanach, ma thachras mearachd mar sin, chan eil air fhà gail ach dearmad a dhèanamh air clà ran neo-dhligheach agus beachdachadh air an dà ta a chaidh a chall;
SgrĂŹobh mearachdan (airson adhbhar air choireigin, cha bâ e na chaidh a sgrĂŹobhadh chun chuimhne flash na chaidh a sgrĂŹobhadh)
Is urrainn dhuinn a leithid de mhearachdan a lorg sa bhad ma nĂŹ sinn deuchainn air a leughadh dĂŹreach Ă s deidh clĂ radh;
Saobhadh dà ta ann an cuimhne aig à m stòraidh;
Mearachdan leughaidh
Gus a cheartachadh, mura h-eil an t-seic a 'freagairt, tha e gu leòr an leughadh ath-aithris grunn thursan.
Is e sin, chan urrainnear ach mearachdan den treas seòrsa (truailleadh dà ta gun spionnadh rè stòradh) a cheartachadh às aonais còdadh a tha an aghaidh mearachd. Tha e coltach gu bheil mearachdan mar sin fhathast gu math eu-coltach.
GeĂ rr-chunntas: chaidh co-dhĂšnadh còdadh gun fheum a thrèigsinn, ach ma tha gnĂŹomhachd aâ nochdadh mearachd a âcho-dhĂšnaidh seo, an uairsin till air ais gu beachdachadh air aâ chĂšis (le staitistig cruinnichte mu thrĂ th air fĂ illigidhean, a leigeas le bhith a âtaghadh an seòrsa còdaidh as fheĂ rr).
ĐŃĐžŃоо
Gu dearbh, chan eil cruth na h-artaigil a 'toirt cothrom dhuinn a h-uile pÏos den chruth a dhÏon (agus tha mo neart air ruith a-mach mu thrà th), mar sin thèid mi gu h-aithghearr thairis air cuid de phuingean nach deach suathadh roimhe.
Chaidh co-dhĂšnadh a h-uile duilleag a dhèanamh âco-ionannâ
Is e sin, cha bhi duilleagan sònraichte ann le meata-dà ta, snà ithleanan fa leth, msaa, ach an à ite sin aon snà ithlean a bhios ag ath-sgrÏobhadh a h-uile duilleag mu seach.
Bidh seo aâ dèanamh cinnteach gum bi eadhon caitheamh air na duilleagan, gun aon phuing fĂ iligeadh, agus is toil leam e;
Tha e riatanach ullachadh airson dreachdadh den chruth.
Tha cruth gun Ă ireamh dreach anns aâ bhann-cinn olc!
Tha e gu leòr raon le Ă ireamh draoidheachd sònraichte (ainm-sgrĂŹobhte) a chuir ri bann-cinn na duilleige, a sheallas an dreach den chruth a chaidh a chleachdadh (Chan eil mi aâ smaoineachadh gum bi eadhon dusan dhiubh ann an cleachdadh);
Cleachd bann-cinn fad caochlaideach airson clà ran (le tòrr dhiubh), a 'feuchainn ri dhèanamh 1 byte fada sa mhòr-chuid de chÚisean;
Gus fad aâ chinn agus fad aâ phĂ irt trim den chlĂ r teann a chòdachadh, cleachd còdan binary fad caochlaideach.
Chuidich e gu mòr gineadair air-loidhne Còdan airson Huffman. Ann am beagan mhionaidean bha e comasach dhuinn na còdan faid caochlaideach a bha a dhÏth a thaghadh.
Tuairisgeul air cruth stòradh dà ta
Ărdugh byte
Tha raointean nas motha na aon byte air an stòradh ann an cruth mòr-endian (òrdugh lÏonra byte), is e sin, tha 0x1234 sgrÏobhte mar 0x12, 0x34.
Duilleagadh
Tha a h-uile cuimhne flash air a roinn ann an duilleagan den aon mheud.
Is e meud na duilleige Ă bhaisteach 32Kb, ach chan eil barrachd air 1/4 de mheud iomlan aâ chip cuimhne (airson chip 4MB, gheibhear 128 duilleag).
Bidh gach duilleag aâ stòradh dĂ ta gu neo-eisimeileach bhon fheadhainn eile (is e sin, chan eil dĂ ta air aon duilleag aâ toirt iomradh air dĂ ta air duilleag eile).
Tha na duilleagan uile air an Ă ireamhachadh ann an òrdugh nĂ darrach (ann an òrdugh dĂŹreadh nan seòlaidhean), aâ tòiseachadh le Ă ireamh 0 (bidh duilleag neoni aâ tòiseachadh aig seòladh 0, aâ chiad duilleag aâ tòiseachadh aig 32Kb, an dĂ rna duilleag aâ tòiseachadh aig 64Kb, msaa.)
Tha aâ chip cuimhne air a chleachdadh mar bufair cearcallach (bufair fĂ inne), is e sin, an toiseach bidh sgrĂŹobhadh aâ dol gu duilleag Ă ireamh 0, an uairsin Ă ireamh 1, ..., nuair a lĂŹonas sinn an duilleag mu dheireadh, bidh cearcall Ăšr aâ tòiseachadh agus tha clĂ radh aâ leantainn bho dhuilleag neoni. .
Taobh a-staigh na duilleige
Aig toiseach na duilleige, tha bann-cinn duilleag 4-byte air a stòradh, an uairsin sgrĂšdadh cinn (CRC-32C), an uairsin tha clĂ ran air an stòradh anns an fhòrmat âheader, data, checksumâ.
Tha tiotal na duilleige (uaine salach san dealbh) air a dhèanamh suas de:
raon dĂ -byte Magic Number (cuideachd na chomharra air an dreach cruth)
airson an dreach lĂ ithreach den chruth tha e air a thomhas mar 0xed00 â Đ˝ĐžĐźĐľŃ ŃŃŃаниŃŃ;
cuntair dĂ -byte âDreach duilleagâ (ath-sgrĂŹobh Ă ireamh cearcall cuimhne).
Tha inntrigidhean air an duilleag air an stòradh ann an cruth teann (tha an algairim deflate air a chleachdadh). Tha a h-uile clĂ r air aon duilleag air a dhlĂšthadh ann an aon snĂ ithlean (tha faclair cumanta air a chleachdadh), agus air gach duilleag Ăšr bidh teannachadh aâ tòiseachadh Ă s Ăšr. Is e sin, gus clĂ r sam bith a dhĂŹ-dhĂšmhlachadh, tha feum air a h-uile clĂ r roimhe bhon duilleag seo (agus dĂŹreach am fear seo).
Bidh gach clĂ r air a dhlĂšthadh leis aâ bhratach Z_SYNC_FLUSH, agus aig deireadh an t-srutha dhlĂšthaichte bidh 4 bytes 0x00, 0x00, 0xff, 0xff, is dòcha aon no dhĂ a bharrachd neoni bytes ro lĂ imh.
Bidh sinn aâ tilgeadh air falbh an t-sreath seo (4, 5 no 6 bytes fada) nuair a bhios sinn aâ sgrĂŹobhadh gu cuimhne flash.
Is e bann-cinn aâ chlĂ ir 1, 2 no 3 bytes aâ stòradh:
aon bhÏosa (T) a 'sealltainn an seòrsa clà r: 0 - co-theacsa, 1 - log;
raon de dh'fhaid caochlaideach (S) bho 1 gu 7 pĂŹosan, a 'mĂŹneachadh fad a' chinn agus an "earball" a dh'fheumar a chur ris a 'chlĂ r airson dĂŹ-dhĂšmhlachadh;
fad clĂ r (L).
S clĂ r luach:
S
Fad cinn, bytes
Air a chuir air falbh air sgrĂŹobhadh, byte
0
1
5 (00 00 00 ff ff)
10
1
6 (00 00 00 00 ff ff)
110
2
4 (00 00 ff ff)
1110
2
5 (00 00 00 ff ff)
11110
2
6 (00 00 00 00 ff ff)
1111100
3
4 (00 00 ff ff)
1111101
3
5 (00 00 00 ff ff)
1111110
3
6 (00 00 00 00 ff ff)
Dhâ fheuch mi ri sealltainn, chan eil fhios agam dè cho soilleir âs a thionndaidh e a-mach:
Tha buidhe an seo aâ comharrachadh an raon T, geal an raon S, uaine L (fad an dĂ ta teannachaidh ann am bytes), gorm an dĂ ta teannachaidh, dearg na bytes deireannach den dĂ ta teannachaidh nach eil sgrĂŹobhte gu cuimhne flash.
Mar sin, is urrainn dhuinn cinn-cinn clĂ ran den fhad as cumanta (suas gu 63 + 5 bytes ann an cruth teann) a sgrĂŹobhadh ann an aon byte.
Ăs deidh gach clĂ r, thèid seic CRC-32C a stòradh, anns a bheil luach inverted an t-seic roimhe air a chleachdadh mar an luach tĂšsail (init).
Tha seilbh aig CRC âfadâ, tha an fhoirmle a leanas ag obair (a bharrachd air no Ă s aonais tionndadh bit sa phròiseas): .
Is e sin, gu dearbh, bidh sinn ag obrachadh a-mach an CRC de gach bytes de chinn-cinn agus dĂ ta roimhe air an duilleag seo.
DĂŹreach Ă s deidh an t-seic tha ceann-cinn an ath chlĂ r.
Tha an bann-cinn air a dhealbhadh ann an dòigh is gum bi aâ chiad byte aige an-còmhnaidh eadar-dhealaichte bho 0x00 agus 0xff (ma choinnicheas sinn ri 0xff an Ă ite aâ chiad byte den cheann-cinn, tha seo aâ ciallachadh gur e raon gun chleachdadh a tha seo; tha 0x00 aâ comharrachadh mearachd).
Algorithms eisimpleir
A ' leughadh bho flash cuimhne
Bidh leughadh sam bith aâ tighinn le seic checksum.
Mura h-eil an t-seic a 'freagairt, thèid an leughadh a-rithist grunn thursan an dòchas an dà ta ceart a leughadh.
(tha seo a 'dèanamh ciall, chan eil Linux a' clà radh leughaidhean bho NOR Flash, air a dhearbhadh)
SgrĂŹobh gu cuimhne flash
Bidh sinn aâ clĂ radh an dĂ ta.
Leughaidh sinn iad.
Mura h-eil an dĂ ta leughaidh aâ freagairt ris an dĂ ta sgrĂŹobhte, lĂŹonaidh sinn an raon le neamhan agus comharraichidh sinn mearachd.
Ag ullachadh microcircuit Ăšr airson obrachadh
Airson tòiseachadh, tha bann-cinn le dreach 1 air a sgrÏobhadh chun chiad duilleag (no an à ite neoni).
Ăs deidh sin, tha aâ chiad cho-theacsa air a sgrĂŹobhadh chun duilleag seo (anns a bheil UUID an inneil agus na roghainnean bunaiteach).
Sin e, tha an cuimhne flash deiseil airson a chleachdadh.
A 'luchdachadh an inneal
Nuair a thèid an luchdachadh, thèid aâ chiad 8 byte de gach duilleag (cinn-cinn + CRC) a leughadh, thathas aâ toirt aire do dhuilleagan le Ăireamh Draoidheachd neo-aithnichte no CRC ceĂ rr.
Bho na duilleagan âceartâ, tha duilleagan leis an dreach as Ă irde air an taghadh, agus tha an duilleag leis an Ă ireamh as Ă irde air a thoirt bhuapa.
Tha aâ chiad chlĂ r air a leughadh, thathas aâ sgrĂšdadh ceartachd an CRC agus lĂ thaireachd aâ bhratach âco-theacsaâ. Ma tha a h-uile cĂ il ceart gu leòr, thathas den bheachd gu bheil an duilleag seo gnĂ thach. Mura h-eil, bidh sinn aâ dol air ais chun fhear roimhe gus an lorg sinn duilleag âbeòâ.
agus air an duilleag a chaidh a lorg leugh sinn na clĂ ran gu lèir, an fheadhainn a bhios sinn aâ cleachdadh leis aâ bhratach âco-theacsaâ.
SĂ bhail am faclair zlib (bidh feum air airson a chur ris an duilleag seo).
Sin e, tha an luchdachadh sĂŹos deiseil, tha an co-theacsa air ath-nuadhachadh, faodaidh tu obrachadh.
A' cur a-steach iris-latha
Bidh sinn a' teannachadh a' chlà ir leis an fhaclair cheart, a' sònrachadh Z_SYNC_FLUSH ChÏ sinn a bheil an clà r teannaichte a' freagairt air an duilleag là ithreach.
Mura h-eil e iomchaidh (no bha mearachdan CRC air an duilleag), tòisich duilleag Úr (faic gu h-Ïosal).
Bidh sinn a 'sgrÏobhadh sÏos an clà r agus CRC. Ma thachras mearachd, tòisich duilleag Úr.
Duilleag Ăšr
Bidh sinn aâ taghadh duilleag an-asgaidh leis an Ă ireamh as lugha (tha sinn den bheachd gur e duilleag an-asgaidh a thâ ann an duilleag le seic ceĂ rr anns aâ bhann-cinn no le dreach nas lugha na an tè a thâ ann an-drĂ sta). Mura h-eil na duilleagan sin ann, tagh an duilleag leis an Ă ireamh as lugha bhon fheadhainn aig a bheil dreach co-ionann ris an fhear a thâ ann an-drĂ sta.
Sgrios sinn an duilleag taghte. Bidh sinn aâ sgrĂšdadh na tha ann le 0xff. Ma tha rudeigin ceĂ rr, gabh an ath dhuilleag an-asgaidh, msaa.
Bidh sinn aâ sgrĂŹobhadh bann-cinn air an duilleag a chaidh a dhubhadh Ă s, is e aâ chiad inntrig staid aâ cho-theacsa mar a tha e an-drĂ sta, is e an ath rud an inntrigeadh log neo-sgrĂŹobhte (ma tha fear ann).
Co-fhreagarrachd cruth
Nam bheachd-sa, thionndaidh e a-mach gur e cruth math a bhâ ann airson sruthan fiosrachaidh nas motha no nas lugha a stòradh (teacsa shĂŹmplidh, JSON, MessagePack, CBOR, is dòcha protobuf) ann an NOR Flash.
Gu dearbh, tha an cruth âair a dhealbhadh gu sònraichteâ airson SLC NOR Flash.
Cha bu chòir a chleachdadh le meadhanan BER à rd leithid NAND no MLC NOR (A bheil a leithid de chuimhne eadhon ri fhaighinn airson a reic? Chan fhaca mi ach iomradh air ann an obraichean air còdan ceartachaidh).
A bharrachd air an sin, cha bu chòir a chleachdadh le innealan aig a bheil an FTL aca fhèin: USB flash, SD, MicroSD, msaa (airson a leithid de chuimhne chruthaich mi cruth le meud duilleag de 512 bytes, ainm-sgrĂŹobhte aig toiseach gach duilleag agus Ă ireamhan clĂ raidh sònraichte - uaireannan bha e comasach an dĂ ta gu lèir fhaighinn air ais bho dhrĂ ibhear flash âglitchedâ le leughadh sreath sĂŹmplidh).
A rèir nan gnĂŹomhan, faodar an cruth a chleachdadh gun atharrachadh air draibhearan flash bho 128Kbit (16Kb) gu 1Gbit (128MB). Ma thogras tu, faodaidh tu a chleachdadh air sgoltagan nas motha, ach is dòcha gum feum thu meud na duilleige atharrachadh (Ach an seo tha a âcheist mu ion-dhèantachd eaconamach ag èirigh mar-thĂ ; chan eil aâ phrĂŹs airson meud mòr NOR Flash brosnachail).
Ma tha an cruth inntinneach aig cuideigin agus gu bheil e airson a chleachdadh ann am pròiseact fosgailte, sgrĂŹobh, feuchaidh mi ris an Ăšine a lorg, snas a chur air aâ chòd agus ga phostadh air github.
co-dhĂšnadh
Mar a chĂŹ thu, aig a 'cheann thall thionndaidh an cruth a-mach gu bhith sĂŹmplidh agus eadhon sgĂŹth.
Tha e duilich a bhith aâ nochdadh mean-fhĂ s mo bheachd ann an artaigil, ach creid mi: an toiseach bha mi airson rudeigin sòlaimte, do-sheachanta a chruthachadh, comasach air mairsinn eadhon spreadhadh niĂšclasach faisg air lĂ imh. Ach, bhuannaich adhbhar (tha mi an dòchas) fhathast agus mean air mhean ghluais prĂŹomhachasan a dhâ ionnsaigh sĂŹmplidheachd agus dlĂšth-chomas.
Am faodadh e bhith gun robh mi ceĂ rr? Seadh, cinnteach. Is dòcha gu bheil e aâ tionndadh a-mach, mar eisimpleir, gun do cheannaich sinn baidse de microcircuits de chĂ ileachd ĂŹosal. No airson adhbhar air choireigin eile cha bhith an uidheamachd aâ coinneachadh ri dĂšilean earbsachd.
A bheil plana agam airson seo? Tha mi aâ smaoineachadh Ă s deidh dhut an artaigil a leughadh nach eil teagamh sam bith agad gu bheil plana ann. Agus chan eil eadhon na aonar.
Air nota beagan nas cunnartaiche, chaidh an cruth a leasachadh an dĂ chuid mar roghainn obrach agus mar âbailiĂšn deuchainnâ.
Aig an Ă m seo tha a h-uile dad air a 'bhòrd ag obair gu math, gu litearra an latha eile thèid am fuasgladh a chleachdadh (mu thimcheall) air ceudan de dhâ innealan, chĂŹ sinn dè thachras ann an gnĂŹomhachd âsabaidâ (gu fortanach, tha mi an dòchas gun leig an cruth leat fĂ illigidhean a lorg gu earbsach; gus an urrainn dhut lĂ n staitistig a chruinneachadh). Ann am beagan mhĂŹosan bidh e comasach co-dhĂšnaidhean a tharraing (agus ma tha thu mĂŹ-shealbhach, eadhon nas trĂ ithe).
Ma lorgar, stèidhichte air toraidhean cleachdaidh, droch dhuilgheadasan agus gu bheil feum air leasachaidhean, bidh mi gu cinnteach aâ sgrĂŹobhadh mu dheidhinn.
Litreachas
Cha robh mi airson liosta fada tedious de dhâ obraichean cleachdte a dhèanamh; Ă s deidh a h-uile cĂ il, tha Google aig a h-uile duine.
An seo chuir mi romhpa liosta de thoraidhean fhĂ gail a bha coltas gu sònraichte inntinneach dhomh, ach mean air mhean rinn iad imrich gu dĂŹreach a-steach do theacsa an artaigil, agus dhâ fhan aon rud air an liosta:
Goireasach infgen bhon Ăšghdar zlib. Is urrainn dhaibh na tha ann an tasglann deflate/zlib/gzip a thaisbeanadh gu soilleir. Ma dhâ fheumas tu dèiligeadh ri structar a-staigh an cruth deflate (no gzip), tha mi gu mòr ga mholadh.