የእኔ የቀለበት ቋት በNOR ብልጭታ ውስጥ

prehistory

የራሳችን ንድፍ ያላቸው የሽያጭ ማሽኖች አሉ። በ Raspberry Pi ውስጥ እና አንዳንድ ገመዶች በተለየ ሰሌዳ ላይ። ሳንቲም ተቀባይ፣ ቢል ተቀባይ፣ የባንክ ተርሚናል ተገናኝተዋል... ሁሉም ነገር የሚቆጣጠረው በራስ የተጻፈ ፕሮግራም ነው። ሙሉው የስራ ታሪክ በፍላሽ አንፃፊ (ማይክሮ ኤስዲ) ላይ ባለው መዝገብ ላይ ይፃፋል፣ ከዚያም በኢንተርኔት (በዩኤስቢ ሞደም በመጠቀም) ወደ አገልጋዩ የሚተላለፈው በመረጃ ቋቱ ውስጥ ይከማቻል። የሽያጭ መረጃ በ1c ውስጥ ተጭኗል፣ ለክትትል ቀላል የሆነ የድር በይነገጽም አለ፣ ወዘተ።

ያም ማለት መጽሔቱ በጣም አስፈላጊ ነው - ለሂሳብ አያያዝ (ገቢ, ሽያጭ, ወዘተ), ክትትል (ሁሉንም አይነት ውድቀቶች እና ሌሎች የኃይል ሁኔታዎች); ይህ፣ አንድ ሰው ስለዚህ ማሽን ያለን መረጃ ሁሉ ነው ሊባል ይችላል።

ችግር

ፍላሽ አንፃፊዎች በጣም አስተማማኝ ያልሆኑ መሳሪያዎች መሆናቸውን ያሳያሉ። በሚያስቀና መደበኛነት ይወድቃሉ። ይህ ወደ ሁለቱም የማሽን ማቆያ ጊዜ እና (በሆነ ምክንያት ምዝግብ ማስታወሻው በመስመር ላይ ሊተላለፍ የማይችል ከሆነ) ወደ የውሂብ መጥፋት ይመራል።

ይህ ፍላሽ አንፃፊዎችን የመጠቀም የመጀመሪያ ተሞክሮ አይደለም ፣ ከዚህ በፊት ከመቶ በላይ መሳሪያዎች ያሉት ሌላ ፕሮጀክት ነበር ፣ መጽሔቱ በዩኤስቢ ፍላሽ አንፃፊዎች ላይ ተከማችቷል ፣ በአስተማማኝነት ላይ ችግሮችም ነበሩ ፣ አንዳንድ ጊዜ ያልተሳካላቸው ሰዎች ቁጥር አንድ ወር በደርዘኖች ውስጥ ነበር. የተለያዩ ፍላሽ አንፃፊዎችን ሞክረናል፣ብራንድ ያላቸው SLC ማህደረ ትውስታ ያላቸው፣እና አንዳንድ ሞዴሎች ከሌሎቹ የበለጠ አስተማማኝ ናቸው፣ነገር ግን ፍላሽ አንፃፊዎችን መተካት ችግሩን ከስር መሰረቱ አልፈታውም።

እባክዎ ልብ ይበሉ! ረጅም አንብብ! "ለምን" ፍላጎት ከሌለዎት ነገር ግን "እንዴት" ላይ ብቻ, በቀጥታ መሄድ ይችላሉ በስተመጨረሻ መጣጥፎች

ዉሳኔ

ወደ አእምሯችን የሚመጣው የመጀመሪያው ነገር ማይክሮ ኤስዲውን ይተዉት ፣ ለምሳሌ ኤስኤስዲ ይጫኑ እና ከእሱ ያስነሱ። በንድፈ-ሀሳብ ይቻላል፣ ምናልባት፣ ግን በአንጻራዊነት ውድ፣ እና በጣም አስተማማኝ አይደለም (USB-SATA አስማሚ ተጨምሯል፣ የበጀት ኤስኤስዲዎች ውድቀት ስታቲስቲክስ እንዲሁ አበረታች አይደለም)።

ዩኤስቢ ኤችዲዲ በተለይ የሚስብ መፍትሄ አይመስልም።

ስለዚህ እኛ ወደዚህ አማራጭ ደርሰናል-ከማይክሮ ኤስዲ ማስነሳትን ይተዉ ፣ ግን በንባብ-ብቻ ሁነታ ይጠቀሙባቸው ፣ እና የቀዶ ጥገና ምዝግብ ማስታወሻውን ያከማቹ (እና ለአንድ የተወሰነ የሃርድዌር ክፍል ልዩ የሆኑ ሌሎች መረጃዎች - የመለያ ቁጥር ፣ የዳሳሽ መለኪያዎች ፣ ወዘተ.) ሌላ ቦታ። .

ለ Raspberries ንባብ-ብቻ FS ርዕሰ ጉዳይ ቀድሞውኑ በውስጥም ሆነ በውጭ ተጠንቷል ፣ በዚህ ጽሑፍ ውስጥ በአተገባበር ዝርዝሮች ላይ አልቆይም ። (ፍላጎት ካለ ግን በዚህ ርዕስ ላይ ትንሽ ጽሑፍ እጽፋለሁ). ማስተዋል የምፈልገው ብቸኛው ነጥብ ከግል ልምዳቸውም ሆነ ቀደም ሲል ከተተገበሩት ግምገማዎች በአስተማማኝ ሁኔታ ውስጥ ትርፍ አለ። አዎ ፣ ብልሽቶችን ሙሉ በሙሉ ለማስወገድ የማይቻል ነው ፣ ግን ድግግሞቻቸውን በከፍተኛ ሁኔታ መቀነስ በጣም ይቻላል። እና ካርዶቹ የተዋሃዱ እየሆኑ ነው, ይህም ለአገልግሎት ሰራተኞች መተካት በጣም ቀላል ያደርገዋል.

ሃርድ ዌር

ስለ ማህደረ ትውስታ አይነት ምርጫ ምንም ልዩ ጥርጣሬ አልነበረም - NOR Flash.
ነጋሪ እሴቶች

  • ቀላል ግንኙነት (ብዙውን ጊዜ ቀደም ሲል የመጠቀም ልምድ ያለው የ SPI አውቶቡስ, ስለዚህ ምንም የሃርድዌር ችግሮች አይታዩም);
  • አስቂኝ ዋጋ;
  • መደበኛ የአሠራር ፕሮቶኮል (ትግበራው ቀድሞውኑ በሊኑክስ ከርነል ውስጥ አለ ፣ ከፈለጉ ፣ የሶስተኛ ወገን መውሰድ ይችላሉ ፣ እሱም እንዲሁ ይገኛል ፣ ወይም የራስዎን ይፃፉ ፣ እንደ እድል ሆኖ ሁሉም ነገር ቀላል ነው);
  • አስተማማኝነት እና ሀብት;
    ከተለመደው የውሂብ ሉህ: መረጃ ለ 20 ዓመታት ይከማቻል, ለእያንዳንዱ እገዳ 100000 የማጥፋት ዑደት;
    ከሶስተኛ ወገን ምንጮች: እጅግ በጣም ዝቅተኛ BER, የስህተት ማስተካከያ ኮዶች አያስፈልጉም (አንዳንድ ስራዎች ECCን ለNOR ይመለከታሉ፣ነገር ግን አብዛኛውን ጊዜ MLC NOR ማለት ነው፣ይህም ይከሰታል).

ለድምጽ እና ለሀብት የሚያስፈልጉትን መስፈርቶች እንገምት.

ውሂቡ ለብዙ ቀናት እንዲቀመጥ ዋስትና እንዲሰጠው እፈልጋለሁ። ይህ በማንኛውም የግንኙነት ችግር ውስጥ የሽያጭ ታሪክ እንዳይጠፋ አስፈላጊ ነው. በዚህ ጊዜ ውስጥ በ 5 ቀናት ላይ እናተኩራለን (ቅዳሜና እሁድን እና በዓላትን እንኳን ግምት ውስጥ በማስገባት) ችግሩ ሊፈታ ይችላል.

በአሁኑ ጊዜ በቀን ወደ 100 ኪ.ባ የምዝግብ ማስታወሻዎች እንሰበስባለን (3-4 ሺህ ግቤቶች), ነገር ግን ቀስ በቀስ ይህ ቁጥር እያደገ ነው - ዝርዝሩ እየጨመረ ነው, አዳዲስ ክስተቶች እየተጨመሩ ነው. በተጨማሪም ፣ አንዳንድ ጊዜ ፍንዳታዎች አሉ (አንዳንድ ዳሳሾች በውሸት አወንታዊ መረጃዎች አይፈለጌ መልእክት ማድረግ ይጀምራሉ ፣ ለምሳሌ)። ለ 10 ሺህ መዛግብት እናሰላለን 100 ባይት እያንዳንዳቸው - ሜጋባይት በቀን።

በአጠቃላይ 5 ሜባ ንጹህ (በደንብ የተጨመቀ) ውሂብ ይወጣል. ለእነሱ የበለጠ (ግምታዊ ግምት) 1 ሜባ የአገልግሎት ውሂብ።

ማለትም መጭመቂያ ካልተጠቀምን 8MB ቺፕ ወይም ከተጠቀምንበት 4MB ያስፈልገናል። ለዚህ ዓይነቱ ማህደረ ትውስታ በጣም እውነተኛ ቁጥሮች።

ሀብቱን በተመለከተ፡- የማስታወስ ችሎታው በ 5 ቀናት ውስጥ ከአንድ ጊዜ በላይ እንዲጻፍ ካቀድን ከ 10 ዓመታት በላይ አገልግሎት ከአንድ ሺህ ያነሱ የድጋሚ ዑደቶችን እናገኛለን።
አምራቹ አንድ መቶ ሺህ ቃል እንደገባ ላስታውስዎ.

ስለ NOR vs NAND ትንሽ

ዛሬ, በእርግጥ, NAND ማህደረ ትውስታ በጣም ታዋቂ ነው, ነገር ግን ለዚህ ፕሮጀክት አልጠቀምበትም: NAND, ከ NOR በተለየ, የግድ የስህተት ማስተካከያ ኮዶችን, የመጥፎ እገዳዎች ጠረጴዛ, ወዘተ እና እንዲሁም የእግር እግር ያስፈልገዋል. NAND ቺፕስ ብዙውን ጊዜ የበለጠ።

የ NOR ጉዳቶች የሚከተሉትን ያካትታሉ:

  • አነስተኛ መጠን (እና, በዚህ መሠረት, በአንድ ሜጋባይት ከፍተኛ ዋጋ);
  • ዝቅተኛ የመገናኛ ፍጥነት (በአብዛኛው ምክንያት ተከታታይ በይነገጽ ጥቅም ላይ የሚውለው, ብዙውን ጊዜ SPI ወይም I2C);
  • ቀስ ብሎ መደምሰስ (በእገዳው መጠን ላይ በመመስረት ከሰከንድ ክፍልፋይ እስከ ብዙ ሰከንዶች ይወስዳል)።

ለእኛ ምንም ወሳኝ ነገር ያለ አይመስልም, ስለዚህ እንቀጥላለን.

ዝርዝሮቹ ትኩረት የሚስቡ ከሆነ, ማይክሮ ሰርኩቱ ተመርጧል በ25df321a (ይሁን እንጂ, ይህ አስፈላጊ አይደለም, በገበያ ላይ በፒንኦውት እና በትእዛዝ ስርዓት ውስጥ የሚጣጣሙ ብዙ አናሎግዎች አሉ; ምንም እንኳን ማይክሮ ሰርኩዌን ከተለያዩ አምራቾች እና / ወይም የተለየ መጠን መጫን ብንፈልግ, ሁሉም ነገር ሳይቀይር ይሰራል. ኮድ).

በሊኑክስ ከርነል ውስጥ የተሰራውን ሾፌር እጠቀማለሁ፤ በ Raspberry ላይ፣ ለመሳሪያው ዛፍ ተደራቢ ድጋፍ ምስጋና ይግባውና ሁሉም ነገር በጣም ቀላል ነው - የተቀናበረውን ተደራቢ በ/boot/overlays ላይ ማድረግ እና በትንሹ ማሻሻል/boot/config.txt ያስፈልግዎታል።

ምሳሌ dts ፋይል

እውነቱን ለመናገር, ያለምንም ስህተቶች መጻፉን እርግጠኛ አይደለሁም, ግን ይሰራል.

/*
 * 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?";
    };
};

እና በ config.txt ውስጥ ሌላ መስመር

dtoverlay=at25:spimaxfrequency=50000000

ቺፑን ከ Raspberry Pi ጋር የማገናኘት መግለጫውን እተወዋለሁ። በአንድ በኩል, እኔ የኤሌክትሮኒክስ ውስጥ ኤክስፐርት አይደለሁም, በሌላ በኩል, እዚህ ሁሉም ነገር ለእኔ እንኳ banal ነው: microcircuit ብቻ 8 እግሮች አሉት, ይህም መሬት, ኃይል, SPI (CS, SI, SO, SCK) ያስፈልገናል. ); ደረጃዎቹ ከ Raspberry Pi ጋር ተመሳሳይ ናቸው, ምንም ተጨማሪ ሽቦ አያስፈልግም - የተጠቆሙትን 6 ፒን ብቻ ያገናኙ.

የችግሩ ቀመር

እንደተለመደው የችግሩ መግለጫ በበርካታ ድግግሞሾች ውስጥ ያልፋል, እና ለቀጣዩ ጊዜው አሁን እንደሆነ ይሰማኛል. ስለዚህ ቆም ብለን የተጻፈውን አንድ ላይ ሰብሰብ አድርገን በጥላ ውስጥ የቀሩትን ዝርዝሮች እናብራራ።

ስለዚህ, ምዝግብ ማስታወሻው በ SPI NOR Flash ውስጥ እንዲከማች ወስነናል.

ለማያውቁት ፍላሽ ምንድን ነው?

ይህ ሶስት ክንዋኔዎችን የሚያደርጉበት የማይለዋወጥ ማህደረ ትውስታ ነው-

  1. ንባብ
    በጣም የተለመደው ንባብ: አድራሻውን እናስተላልፋለን እና የምንፈልገውን ያህል ባይት እናነባለን;
  2. ቅዳ
    ወደ NOR ፍላሽ መፃፍ መደበኛ ይመስላል፣ ግን አንድ ልዩ ባህሪ አለው፡ 1 ወደ 0 ብቻ መቀየር ይችላሉ፣ ግን በተቃራኒው አይደለም። ለምሳሌ ፣በማህደረ ትውስታ ሴል ውስጥ 0x55 ከነበረን ፣ ከዚያ 0x0f ከፃፍን በኋላ ፣ 0x05 ቀድሞውኑ እዚያ ይከማቻል። (ከታች ያለውን ሰንጠረዥ ይመልከቱ);
  3. ደምስስ
    እርግጥ ነው, ተቃራኒውን ቀዶ ጥገና ማድረግ መቻል አለብን - 0 ወደ 1 ይቀይሩ, ይህ የማጥፋት ስራው በትክክል ነው. ከመጀመሪያዎቹ ሁለቱ በተለየ በባይት ሳይሆን በብሎኮች ነው የሚሰራው (በተመረጠው ቺፕ ውስጥ ያለው አነስተኛ መደምሰስ 4 ኪባ ነው)። ማጥፋት ሙሉውን ብሎክ ያጠፋል እና 0 ወደ 1 ለመለወጥ ብቸኛው መንገድ ነው. ስለዚህ በፍላሽ ማህደረ ትውስታ ሲሰሩ ብዙውን ጊዜ የውሂብ መዋቅሮችን ወደ መደምሰስ ወሰን ማመጣጠን አለብዎት.
    በNOR ፍላሽ መቅዳት፡

ሁለትዮሽ ውሂብ

ነበር
01010101

ተመዝግቧል
00001111

ሆኗል
00000101

ምዝግብ ማስታወሻው ራሱ ተለዋዋጭ ርዝመት ያላቸውን መዝገቦች ቅደም ተከተል ያሳያል። የተለመደው የመዝገብ ርዝመት 30 ባይት (በርካታ ኪሎባይት ርዝመት ያላቸው መዝገቦች አንዳንድ ጊዜ ይከሰታሉ)። በዚህ አጋጣሚ ከእነሱ ጋር በቀላሉ እንደ ባይት ስብስብ እንሰራለን፣ ነገር ግን ፍላጎት ካለህ፣ CBOR በመዝገቦቹ ውስጥ ጥቅም ላይ ይውላል።

ከምዝግብ ማስታወሻው በተጨማሪ አንዳንድ "ቅንጅቶች" መረጃዎችን ማከማቸት አለብን, ሁለቱም የተዘመኑ እና ያልሆኑ: የተወሰነ የመሳሪያ መታወቂያ, ሴንሰር መለኪያዎች, "መሣሪያው ለጊዜው ተሰናክሏል" ባንዲራ, ወዘተ.
ይህ መረጃ በ CBOR ውስጥ የተከማቸ የቁልፍ ዋጋ መዛግብት ነው። ብዙ መረጃ የለንም (ቢበዛ ጥቂት ኪሎባይት) እና አልፎ አልፎ ይሻሻላል።
በሚከተለው አውድ እንለዋለን።

ይህ ጽሑፍ የት እንደጀመረ ካስታወስን, አስተማማኝ የመረጃ ማከማቻ እና, ከተቻለ, የሃርድዌር ውድቀቶች / የውሂብ ብልሽት ቢከሰትም, ቀጣይነት ያለው አሠራር ማረጋገጥ በጣም አስፈላጊ ነው.

ምን ዓይነት የችግሮች ምንጮች ሊታዩ ይችላሉ?

  • በመጻፍ/በማጥፋት ጊዜ ኃይል ያጥፉ። ይህ ከ"ክሮውባር ላይ ምንም ተንኮል የለም" ከሚለው ምድብ ነው።
    መረጃ ከ ውይይቶች በ stackexchange ላይ፡ በፍላሽ ሲሰራ ኃይሉ ሲጠፋ ሁለቱም ይደምስሱ (ወደ 1 ተቀናብረዋል) እና ይፃፉ (ወደ 0) ወደ ያልተገለጸ ባህሪ ይመራሉ፡ ዳታ ሊፃፍ ይችላል ከፊል ይፃፋል (በማለት 10 ባይት/80 ቢት አስተላልፈናል) , ነገር ግን ገና 45 ቢት ብቻ መጻፍ አይቻልም), እንዲሁም አንዳንድ ቢት በ "መካከለኛ" ሁኔታ ውስጥ ሊሆኑ ይችላሉ (ማንበብ ሁለቱንም 0 እና 1 ሊያመጣ ይችላል);
  • በፍላሽ ማህደረ ትውስታ በራሱ ውስጥ ስህተቶች.
    BER, በጣም ዝቅተኛ ቢሆንም, ከዜሮ ጋር እኩል ሊሆን አይችልም;
  • የአውቶቡስ ስህተቶች
    በ SPI በኩል የሚተላለፈው መረጃ በማንኛውም መንገድ የተጠበቀ አይደለም፤ ሁለቱም ነጠላ ስህተቶች እና የማመሳሰል ስህተቶች ሊከሰቱ ይችላሉ - ቢት መጥፋት ወይም ማስገባት (ይህም ወደ ከፍተኛ የውሂብ መዛባት ያመራል)።
  • ሌሎች ስህተቶች / ጉድለቶች
    በኮዱ ውስጥ ስህተቶች፣ Raspberry glitches፣ እንግዳ ጣልቃ ገብነት...

መስፈርቶችን አዘጋጅቻለሁ ፣ በእኔ አስተያየት ፣ ታማኝነትን ለማረጋገጥ አስፈላጊ የሆኑትን መሟላት

  • መዝገቦች ወዲያውኑ ወደ ፍላሽ ሜሞሪ መግባት አለባቸው፣ የተዘገዩ ፅሁፎች ግምት ውስጥ አይገቡም ፣ - ስህተት ከተፈጠረ በተቻለ ፍጥነት ተገኝቶ መስራት አለበት ፣ - ስርዓቱ ከተቻለ ከስህተቶች ማገገም አለበት።
    (የህይወት ምሳሌ "እንዴት መሆን እንደሌለበት", ሁሉም ሰው አጋጥሞታል ብዬ አስባለሁ: ከአደጋ ጊዜ ዳግም ማስነሳት በኋላ, የፋይል ስርዓቱ "ተሰብሯል" እና ስርዓተ ክወናው አይነሳም)

ሀሳቦች, አቀራረቦች, ነጸብራቆች

ስለዚህ ችግር ማሰብ ስጀምር ብዙ ሃሳቦች በጭንቅላቴ ውስጥ ፈነዱ፣ ለምሳሌ፡-

  • የውሂብ መጭመቂያ ይጠቀሙ;
  • ብልህ የመረጃ አወቃቀሮችን ይጠቀሙ ፣ ለምሳሌ ፣ የሪኮርድ ራስጌዎችን ከመዝገቦቹ ራሳቸው ማከማቸት ፣ ስለሆነም በማንኛውም መዝገብ ውስጥ ስህተት ካለ ፣ የቀረውን ያለ ምንም ችግር ማንበብ ይችላሉ ፣
  • ኃይሉ ሲጠፋ የመቅዳትን ማጠናቀቅ ለመቆጣጠር የቢት መስኮችን ይጠቀሙ;
  • የማከማቻ ቼኮች ለሁሉም ነገር;
  • አንዳንድ አይነት ድምጽን የሚቋቋም ኮድ ይጠቀሙ።

ከእነዚህ ሃሳቦች መካከል አንዳንዶቹ ጥቅም ላይ ውለው ነበር, ሌሎች ደግሞ ለመተው ተወስነዋል. በቅደም ተከተል እንሂድ.

የውሂብ መጭመቂያ

በመጽሔቱ ውስጥ የምንቀዳቸው ክስተቶች እራሳቸው ተመሳሳይ እና ሊደገሙ የሚችሉ ናቸው (“5 ሩብል ሳንቲም ጣለ”፣ “ለውጥ ለመስጠት ቁልፉን ተጫን”፣…)። ስለዚህ, መጭመቅ በጣም ውጤታማ መሆን አለበት.

የመጨመቂያው በላይ ዋጋ የለውም (የእኛ ፕሮሰሰር በጣም ኃይለኛ ነው ፣ የመጀመሪያው ፒ እንኳን አንድ ኮር በ 700 ሜኸር ድግግሞሽ አለው ፣ የአሁኑ ሞዴሎች ከአንድ ጊጋኸርትዝ በላይ ድግግሞሽ ያላቸው ብዙ ኮሮች አሏቸው) ፣ ከማከማቻው ጋር ያለው የምንዛሬ ዋጋ ዝቅተኛ ነው (በርካታ ሜጋባይት በሰከንድ), የመዝገቦቹ መጠን ትንሽ ነው. በአጠቃላይ, መጨናነቅ በአፈፃፀም ላይ ተጽእኖ ካሳደረ, አዎንታዊ ብቻ ይሆናል. (ፍፁም ትችት የለሽ፣ በመግለጽ ብቻ). በተጨማሪም ፣ እኛ እውነተኛ የተከተተ ፣ ግን መደበኛ ሊኑክስ የለንም - ስለዚህ አተገባበሩ ብዙ ጥረት አያስፈልገውም (ቤተ-መጽሐፍቱን ማገናኘት እና ከእሱ ብዙ ተግባራትን መጠቀም ብቻ በቂ ነው)።

የምዝግብ ማስታወሻው አንድ ቁራጭ ከሚሰራ መሳሪያ (1.7 ሜባ ፣ 70 ሺህ ምዝግቦች) ተወስዶ በመጀመሪያ በኮምፒዩተር ላይ የሚገኘው gzip ፣ lz4 ፣ lzop ፣ bzip2 ፣ xz ፣ zstd በመጠቀም መጭመቂያ መኖሩን ተረጋገጠ።

  • gzip፣ xz፣ zstd ተመሳሳይ ውጤቶችን አሳይቷል (40Kb)።
    እኔ ፋሽን xz እዚህ gzip ወይም zstd ደረጃ ላይ ራሱን ማሳየቱ ተገረምኩ;
  • lzip በነባሪ ቅንጅቶች ትንሽ የከፋ ውጤቶችን ሰጥቷል;
  • lz4 እና lzop በጣም ጥሩ ውጤት አላሳዩም (150Kb);
  • bzip2 በሚያስደንቅ ሁኔታ ጥሩ ውጤት (18 ኪባ) አሳይቷል።

ስለዚህ ውሂቡ በደንብ ተጨምቋል።
ስለዚህ (ለሞት የሚዳርጉ ጉድለቶች ካላገኘን) መጨናነቅ ይኖራል! ተጨማሪ መረጃ በተመሳሳዩ ፍላሽ አንፃፊ ላይ ስለሚገባ ብቻ።

ስለ ጉዳቶቹ እናስብ።

የመጀመሪያ ችግር፡ እያንዳንዱ መዝገብ ወዲያውኑ ወደ ብልጭታ መሄድ እንዳለበት አስቀድመን ተስማምተናል። በተለምዶ፣ መዝገቡ ቅዳሜና እሁድ ለመጻፍ ጊዜው እንደሆነ እስኪወስን ድረስ ከግቤት ዥረቱ ላይ መረጃን ይሰበስባል። ወዲያውኑ የታመቀ የውሂብ ብሎክ መቀበል እና በማይለዋወጥ ማህደረ ትውስታ ውስጥ ማከማቸት አለብን።

ሶስት መንገዶችን አያለሁ።

  1. ከላይ ከተገለጹት ስልተ ቀመሮች ይልቅ መዝገበ ቃላትን በመጠቀም እያንዳንዱን መዝገብ ጨመቁ።
    ሙሉ በሙሉ የሚሰራ አማራጭ ነው, ግን አልወደውም. ብዙ ወይም ባነሰ ጨዋ የመጨመቅ ደረጃን ለማረጋገጥ መዝገበ ቃላቱ ለተወሰኑ መረጃዎች “የተበጁ” መሆን አለባቸው፤ ማንኛውም ለውጥ የጨመቁት ደረጃ በአሰቃቂ ሁኔታ እንዲወድቅ ያደርጋል። አዎን, ችግሩ አዲስ የመዝገበ-ቃላትን ስሪት በመፍጠር ሊፈታ ይችላል, ነገር ግን ይህ ራስ ምታት ነው - ሁሉንም የመዝገበ-ቃላት ስሪቶች ማከማቸት ያስፈልገናል; በእያንዳንዱ ግቤት በየትኛው የመዝገበ-ቃላቱ ስሪት እንደተጨመቀ መጠቆም አለብን።
  2. "ክላሲካል" ስልተ ቀመሮችን በመጠቀም እያንዳንዱን መዝገብ ጨመቅ፣ ግን ከሌሎቹ በተለየ።
    ከግምት ውስጥ ያሉት የመጭመቂያ ስልተ ቀመሮች ከዚህ መጠን (በአስር ባይት) መዝገቦች ጋር ለመስራት የተነደፉ አይደሉም ፣ የመጭመቂያው ጥምርታ በግልፅ ከ 1 ያነሰ ይሆናል (ይህም ከመጨመቅ ይልቅ የመረጃውን መጠን ይጨምራል)።
  3. ከእያንዳንዱ ቅጂ በኋላ FLUSH ያድርጉ።
    ብዙ መጭመቂያ ቤተ-ፍርግሞች ለ FLUSH ድጋፍ አላቸው። ይህ ትእዛዝ (ወይም የመጨመቂያው ሂደት ልኬት) ነው ፣ ሲደርሰው ማህደሩ የታመቀ ዥረት ይመሰርታል ስለዚህም ወደነበረበት መመለስ ይጠቅማል። ሁሉም አስቀድሞ የደረሰው ያልተጨመቀ ውሂብ። እንደዚህ ያለ አናሎግ sync በፋይል ስርዓቶች ወይም commit በካሬ.
    አስፈላጊው ነገር ቀጣይ የማመቅ ስራዎች የተከማቸ መዝገበ-ቃላትን መጠቀም መቻል እና የመጨመቂያው ጥምርታ ልክ እንደ ቀድሞው ስሪት አይጎዳውም.

ሦስተኛውን አማራጭ እንደመረጥኩ ግልጽ ነው ብዬ አስባለሁ, የበለጠ በዝርዝር እንመልከተው.

ተገኝቷል ታላቅ መጣጥፍ ስለ FLUSH በዝሊብ።

በጽሁፉ ላይ በመመስረት የጉልበት ሙከራ አድርጌያለሁ፣ ከእውነተኛ መሳሪያ 70 ሺህ የምዝግብ ማስታወሻዎችን ወስጃለሁ ፣ የገጽ መጠን 60 ኪባ (ወደ ገጽ መጠን በኋላ እንመለሳለን) ተቀብለዋል፡

ጥሬ ውሂብ
መጭመቂያ gzip -9 (ፍሉሽ የለም)
zlib ከZ_PARTIAL_FLUSH ጋር
zlib ከZ_SYNC_FLUSH ጋር

መጠን፣ ኪ.ቢ
1692
40
352
604

በመጀመሪያ እይታ፣ በ FLUSH የሚከፈለው ዋጋ ከመጠን በላይ ከፍ ያለ ነው፣ ነገር ግን በእውነቱ እኛ ብዙም ምርጫ የለንም - ጨርሶ ላለመጨመቅ ወይም በ FLUSH ለመጭመቅ (እና በጣም ውጤታማ በሆነ መንገድ)። 70 መዝገቦች እንዳለን መዘንጋት የለብንም በZ_PARTIAL_FLUSH የቀረበው ተደጋጋሚነት በአንድ መዝገብ 4-5 ባይት ብቻ ነው። እና የመጨመቂያው ጥምርታ ወደ 5፡1 ሊጠጋ ቻለ፣ ይህም ከጥሩ ውጤት በላይ ነው።

ሊያስገርም ይችላል ነገር ግን Z_SYNC_FLUSH FLUSH ለማድረግ የበለጠ ቀልጣፋ መንገድ ነው

Z_SYNC_FLUSHን ሲጠቀሙ የእያንዳንዱ ግቤት የመጨረሻዎቹ 4 ባይት ሁልጊዜ 0x00፣ 0x00፣ 0xff፣ 0xff ይሆናሉ። እና ካወቅናቸው, ከዚያም ማከማቸት የለብንም, ስለዚህ የመጨረሻው መጠን 324 ኪ.ባ ብቻ ነው.

ያገናኘሁት ጽሁፍ ማብራሪያ አለው፡-

ባዶ ይዘት ያለው አዲስ ዓይነት 0 ብሎክ ተጨምሯል።

ባዶ ይዘት ያለው ዓይነት 0 ብሎክ የሚከተሉትን ያጠቃልላል

  • የሶስት-ቢት እገዳ ራስጌ;
  • ከ 0 እስከ 7 ቢት ከዜሮ ጋር እኩል የሆነ, የባይት አሰላለፍ ለመድረስ;
  • ባለአራት ባይት ቅደም ተከተል 00 00 FF FF.

በቀላሉ እንደሚመለከቱት ከነዚህ 4 ባይት በፊት ባለው የመጨረሻ ብሎክ ውስጥ ከ3 እስከ 10 ዜሮ ቢት አሉ። ነገር ግን፣ ልምምድ እንደሚያሳየው በእውነቱ ቢያንስ 10 ዜሮ ቢትዎች አሉ።

እንዲህ ዓይነቱ አጫጭር የመረጃ ቋቶች ብዙውን ጊዜ (ሁልጊዜ?) በ 1 ኛ ዓይነት (ቋሚ ብሎክ) የተመሰጠሩ ናቸው ፣ እሱም በግድ በ 7 ዜሮ ቢት ያበቃል ፣ በድምሩ ከ10-17 ዋስትና ያለው ዜሮ ቢት (የተቀረውም ይሆናል) ወደ 50% የመሆን እድሉ ዜሮ መሆን።

ስለዚህ, በሙከራ መረጃ ላይ, በ 100% ከሚሆኑ ጉዳዮች ከ 0x00, 0x00, 0xff, 0xff በፊት አንድ ዜሮ ባይት አለ, እና ከሶስተኛው በላይ በሆኑ ጉዳዮች ውስጥ ሁለት ዜሮ ባይት አለ. (ምናልባትም እውነታው እኔ ሁለትዮሽ CBORን እጠቀማለሁ ፣ እና ጽሑፍ JSON በምጠቀምበት ጊዜ ፣ ​​የ 2 ዓይነት ብሎኮች - ተለዋዋጭ እገዳዎች በጣም የተለመዱ ይሆናሉ ፣ በቅደም ተከተል ፣ ያለ ተጨማሪ ዜሮ ባይት ብሎኮች ከ 0x00 ፣ 0x00 ፣ 0xff ፣ 0xff በፊት ይገናኛሉ).

በጠቅላላው፣ ያለውን የሙከራ መረጃ በመጠቀም፣ ከ250Kb ባነሰ የተጨመቀ መረጃ ውስጥ ማስገባት ይቻላል።

ቢትስ በማንሳት ትንሽ ተጨማሪ መቆጠብ ይችላሉ፡ ለአሁን በብሎኩ መጨረሻ ላይ ጥቂት ዜሮ ቢት መኖራቸውን ችላ ብለን፣ በብሎኩ መጀመሪያ ላይ ያሉ ጥቂት ቢትስ እንዲሁ አይለወጡም...
ግን ከዚያ ለማቆም በጠንካራ ፍላጎት ውሳኔ ወሰንኩ ፣ ካልሆነ ግን በዚህ ፍጥነት የራሴን መዝገብ ቤት ማዘጋጀት እችላለሁ።

በአጠቃላይ፣ ከፈተናዬ መረጃ 3-4 ባይት በፅሁፍ ተቀብያለሁ፣የመጨመቂያው ጥምርታ ከ6፡1 በላይ ሆኗል። እውነት እላለሁ: እንደዚህ አይነት ውጤት አልጠበቅኩም ነበር, በእኔ አስተያየት, ከ 2: 1 የተሻለ ነገር ቀድሞውኑ የጨመቁትን አጠቃቀም የሚያጸድቅ ውጤት ነው.

ሁሉም ነገር ደህና ነው፣ ነገር ግን ዝሊብ (deflate) አሁንም ጥንታዊ፣ በሚገባ የተገባ እና ትንሽ የቆየ የመጭመቂያ ስልተ-ቀመር ነው። ያለፈው 32 ኪባ ያልተጨመቀ የውሂብ ዥረት እንደ መዝገበ-ቃላት ጥቅም ላይ መዋሉ ዛሬ እንግዳ ይመስላል (ማለትም አንዳንድ የውሂብ እገዳዎች ከ40 ኪባ በፊት በግቤት ዥረቱ ውስጥ ከነበረው ጋር በጣም ተመሳሳይ ከሆኑ እንደገና በማህደር መቀመጥ ይጀምራል። እና ያለፈውን ክስተት አያመለክትም). በፋሽኑ ዘመናዊ መዛግብት ውስጥ, የመዝገበ-ቃላቱ መጠን ብዙውን ጊዜ ከኪሎባይት ይልቅ በሜጋባይት ይለካሉ.

ስለዚህ የኛን አነስተኛ የመዝገብ ቤት ጥናት እንቀጥላለን።

በመቀጠል bzip2ን ሞከርን (ያለ FLUSH ይህ ወደ 100፡1 የሚደርስ ድንቅ የመጨመቂያ ምጥጥን አሳይቷል)። እንደ አለመታደል ሆኖ፣ በFLUSH በጣም ደካማ አፈጻጸም አሳይቷል፤ የተጨመቀው ውሂብ መጠን ካልተጨመቀው ውሂብ የበለጠ ሆነ።

ስለ ውድቀቱ ምክንያቶች የእኔ ግምቶች

Libbz2 የሚያቀርበው አንድ የማፍሰሻ አማራጭ ብቻ ነው፣ እሱም መዝገበ ቃላቱን የሚያጸዳ የሚመስለው (በዚሊብ ውስጥ ከZ_FULL_FLUSH ጋር ተመሳሳይ ነው)፤ ከዚህ በኋላ ስለ ምንም ውጤታማ መጭመቅ ምንም ንግግር የለም።

እና የመጨረሻው የተፈተነው zstd ነው። በመለኪያዎቹ ላይ በመመስረት፣ ወይ በ gzip ደረጃ፣ ግን በጣም ፈጣን፣ ወይም ከጂዚፕ የተሻለ ይጨመቃል።

ወዮ፣ በ FLUSH በጣም ጥሩ አልሰራም፡ የተጨመቀው መረጃ መጠን 700Kb አካባቢ ነበር።

Я ስል ጠየኩ። በፕሮጀክቱ የጊትዩብ ገጽ ላይ ለእያንዳንዱ የታመቀ መረጃ እስከ 10 ባይት የአገልግሎት ውሂብ መቁጠር እንዳለብዎ መልስ አግኝቻለሁ ፣ ይህም ከተገኘው ውጤት ጋር ቅርብ ነው ፣ ከመጥፋት ጋር ለመያዝ ምንም መንገድ የለም።

ከመዝገብ ቤቶች ጋር ባደረኩት ሙከራ በዚህ ጊዜ ለማቆም ወሰንኩ ( xz, lzip, lzo, lz4 ያለ FLUSH በሙከራ ደረጃ ላይ እንኳን እራሳቸውን እንዳላሳዩ እና የበለጠ ያልተለመዱ የመጭመቂያ ስልተ ቀመሮችን ግምት ውስጥ አላስገባኝም)።

ወደ ማህደር ማስቀመጥ ችግሮች እንመለስ።

ሁለተኛው (በእሴቱ ሳይሆን በቅደም ተከተል እንደሚሉት) ችግር የተጨመቀው መረጃ አንድ ነጠላ ዥረት ነው, በውስጡም ያለማቋረጥ ወደ ቀደሙት ክፍሎች ማጣቀሻዎች አሉ. ስለዚህ ፣ የታመቀ መረጃ ክፍል ከተበላሸ ፣ ያልተጨመቀ መረጃን ብቻ ሳይሆን ሁሉንም ተከታይ የሆኑትንም እናጣለን ።

ይህንን ችግር ለመፍታት አንድ ዘዴ አለ-

  1. ችግሩ እንዳይከሰት ይከላከሉ - በተጨመቀው መረጃ ላይ ድግግሞሽ ይጨምሩ ፣ ይህም ስህተቶችን ለመለየት እና ለማስተካከል ያስችልዎታል ። ስለዚህ ጉዳይ በኋላ እንነጋገራለን;
  2. ችግር ከተከሰተ ውጤቱን ይቀንሱ
    አስቀድመን እያንዳንዱን የውሂብ ብሎክ በተናጥል መጭመቅ እንደምትችል ተናግረናል ችግሩ በራሱ ይጠፋል (በአንድ ብሎክ ላይ የሚደርሰው ጉዳት ለዚህ ብሎክ ብቻ የውሂብ መጥፋት ያስከትላል)። ሆኖም፣ ይህ የውሂብ መጨናነቅ ውጤታማ የማይሆንበት እጅግ በጣም ከባድ ጉዳይ ነው። ተቃራኒው ጽንፍ፡ ሁሉንም 4MB የእኛን ቺፕ እንደ አንድ ማህደር ይጠቀሙ፣ ይህም እጅግ በጣም ጥሩ መጭመቂያ ይሰጠናል፣ ነገር ግን በመረጃ መበላሸት ጊዜ አስከፊ መዘዝ።
    አዎን፣ ከአስተማማኝነት አንፃር ስምምነት ያስፈልጋል። ነገር ግን እጅግ በጣም ዝቅተኛ BER እና ለ20 አመታት በታወጀ የውሂብ ማከማቻ ጊዜ ለተለዋዋጭ ያልሆኑ ማህደረ ትውስታ የውሂብ ማከማቻ ቅርጸት እየሰራን መሆኑን ማስታወስ አለብን።

በሙከራዎቹ ወቅት፣ በመጨመቂያው ደረጃ ላይ ብዙ ወይም ያነሰ የሚታይ ኪሳራዎች ከ10 ኪባ ባነሰ መጠን በተጨመቁ የውሂብ ብሎኮች ላይ እንደሚጀምሩ ተረድቻለሁ።
ቀደም ሲል ጥቅም ላይ የዋለው ማህደረ ትውስታ በገጽ ላይ እንደሚገኝ ተጠቅሷል ፣ “አንድ ገጽ - አንድ የታመቀ ዳታ አንድ ብሎክ” የመልእክት ልውውጥ ጥቅም ላይ የማይውልበት ምክንያት አይታየኝም።

ማለትም ዝቅተኛው ምክንያታዊ የገጽ መጠን 16 ኪባ ነው (ለአገልግሎት መረጃ ከተያዘ)። ይሁን እንጂ እንዲህ ዓይነቱ ትንሽ ገጽ መጠን በከፍተኛው የመዝገብ መጠን ላይ ከፍተኛ ገደቦችን ያስገድዳል.

ምንም እንኳን ከጥቂት ኪሎባይት በላይ የሆኑ መዝገቦችን በተጨመቀ መልኩ እስካሁን ባልጠብቅም፣ 32Kb ገጾችን ለመጠቀም ወሰንኩ (በአጠቃላይ 128 ገፆች በአንድ ቺፕ)።

ማጠቃለያ-

  • zlib (deflate) በመጠቀም የተጨመቀ መረጃን እናከማቻለን;
  • ለእያንዳንዱ ግቤት Z_SYNC_FLUSH አዘጋጅተናል።
  • ለእያንዳንዱ የታመቀ መዝገብ፣ ተከታይ ባይት እንቆርጣለን። (ለምሳሌ 0x00፣ 0x00፣ 0xff፣ 0xff); በርዕሱ ውስጥ ምን ያህል ባይት እንደቆረጥን እንጠቁማለን ።
  • መረጃን በ 32Kb ገጾች ውስጥ እናከማቻለን; በገጹ ውስጥ አንድ ነጠላ የታመቀ ውሂብ አለ ፣ በእያንዳንዱ ገጽ ላይ እንደገና መጭመቅ እንጀምራለን.

እና ፣በመጭመቅ ከመጨረስዎ በፊት ፣በእያንዳንዱ መዝገብ ውስጥ ጥቂት ባይት የተጨመቀ መረጃ ብቻ እንዳለን ትኩረትዎን ለመሳል እፈልጋለሁ ፣ስለዚህ የአገልግሎት መረጃን ላለማስፋት እጅግ በጣም አስፈላጊ ነው ፣እያንዳንዱ ባይት እዚህ ይቆጠራል።

የውሂብ ራስጌዎችን ማከማቸት

የተለዋዋጭ ርዝመት መዛግብት ስላለን፣ የመዝገቦችን አቀማመጥ/ወሰን እንደምንም መወሰን አለብን።

ሶስት መንገዶችን አውቃለሁ

  1. ሁሉም መዝገቦች በተከታታይ ዥረት ውስጥ ይከማቻሉ፣ መጀመሪያ ርዝመቱን የያዘ የሪከርድ ርዕስ አለ፣ ከዚያም መዝገቡ ራሱ።
    በዚህ መልክ፣ ሁለቱም ራስጌዎች እና መረጃዎች ተለዋዋጭ ርዝመት ሊኖራቸው ይችላል።
    በመሠረቱ, ሁል ጊዜ ጥቅም ላይ የሚውል ነጠላ የተገናኘ ዝርዝር እናገኛለን;
  2. ራስጌዎች እና መዝገቦቹ እራሳቸው በተለየ ጅረቶች ውስጥ ይቀመጣሉ።
    ቋሚ ርዝመት ያላቸውን ራስጌዎች በመጠቀም፣ በአንዱ ራስጌ ላይ የሚደርሰው ጉዳት ሌሎቹን እንደማይጎዳ እናረጋግጣለን።
    ተመሳሳይ አቀራረብ ጥቅም ላይ ይውላል, ለምሳሌ, በብዙ የፋይል ስርዓቶች;
  3. መዝገቦች በተከታታይ ዥረት ውስጥ ይከማቻሉ, የመመዝገቢያ ወሰን የሚወሰነው በተወሰነ ምልክት ማድረጊያ (በመረጃ እገዳዎች ውስጥ የተከለከለ ቁምፊ / የቁምፊዎች ቅደም ተከተል) ነው. በመዝገቡ ውስጥ ምልክት ማድረጊያ ካለ, ከዚያም በተወሰኑ ቅደም ተከተሎች እንተካለን (አምለጥነው).
    ተመሳሳይ አቀራረብ ለምሳሌ በፒ.ፒ.ፒ. ፕሮቶኮል ውስጥ ጥቅም ላይ ይውላል.

በምሳሌ እገልጻለሁ።

አማራጭ 1:
የእኔ የቀለበት ቋት በNOR ብልጭታ ውስጥ
እዚህ ሁሉም ነገር በጣም ቀላል ነው: የመዝገቡን ርዝመት ማወቅ, የሚቀጥለውን ራስጌ አድራሻ ማስላት እንችላለን. ስለዚህ በ 0xff (ነጻ አካባቢ) የተሞላ አካባቢ ወይም የገጹ መጨረሻ እስክንገናኝ ድረስ በአርእስቶቹ ውስጥ እንጓዛለን።

አማራጭ 2:
የእኔ የቀለበት ቋት በNOR ብልጭታ ውስጥ
በተለዋዋጭ የመዝገብ ርዝመት ምክንያት በገጽ ምን ያህል መዝገቦች (እና ስለዚህ ራስጌዎች) እንደሚያስፈልጉን አስቀድመን መናገር አንችልም። ራስጌዎችን እና ውሂቡን እራሳቸው በተለያዩ ገፆች ላይ ማሰራጨት ይችላሉ, ግን የተለየ አቀራረብ እመርጣለሁ: ሁለቱንም ራስጌዎች እና ውሂቡን በአንድ ገጽ ላይ እናስቀምጣለን, ነገር ግን ራስጌዎች (ቋሚ ​​መጠን ያላቸው) ከገጹ መጀመሪያ ላይ ይመጣሉ, እና ውሂብ (የተለዋዋጭ ርዝመት) የሚመጣው ከመጨረሻው ነው. ልክ “እንደተገናኙ” (ለአዲስ ግቤት በቂ ነፃ ቦታ የለም)፣ ይህ ገጽ እንደተጠናቀቀ እንቆጥረዋለን።

አማራጭ 3:
የእኔ የቀለበት ቋት በNOR ብልጭታ ውስጥ
በርዕሱ ውስጥ ስለ መረጃው ቦታ ርዝማኔ ወይም ሌላ መረጃ ማከማቸት አያስፈልግም, የመዝገቦቹን ወሰን የሚያመለክቱ ጠቋሚዎች በቂ ናቸው. ነገር ግን, ሲጽፉ / ሲያነቡ ውሂቡ መደረግ አለበት.
0xffን እንደ ምልክት ማድረጊያ እጠቀማለሁ (ከጠፋ በኋላ ገጹን ይሞላል) ስለዚህ ነፃው ቦታ በእርግጠኝነት እንደ ውሂብ አይቆጠርም።

የንጽጽር ሰንጠረዥ፡

አማራጭ 1
አማራጭ 2
አማራጭ 3

ስህተት መቻቻል
-
+
+

አስተማማኝነት።
+
-
+

የትግበራ ውስብስብነት
*
**
**

አማራጭ 1 ገዳይ ጉድለት አለው: ማንኛውም ራስጌዎች ከተበላሹ, ቀጣዩ ሰንሰለት በሙሉ ተደምስሷል. የተቀሩት አማራጮች ከፍተኛ ጉዳት ቢደርስም አንዳንድ መረጃዎችን መልሰው እንዲያገኙ ያስችሉዎታል.
እዚህ ግን ውሂቡን በተጨመቀ መልክ ለማስቀመጥ እንደወሰንን ማስታወሱ ተገቢ ነው ፣ እና ስለዚህ “ከተሰበረ” መዝገብ በኋላ በገጹ ላይ ያለውን መረጃ ሁሉ እናጣለን ፣ ምንም እንኳን በሠንጠረዡ ውስጥ ቅናሽ ቢኖርም ፣ እኛ አናደርግም። ግምት ውስጥ ያስገቡ.

ውሱንነት፡-

  • በመጀመሪያው አማራጭ ርዝማኔን ብቻ በርዕሱ ውስጥ ማከማቸት አለብን ፣ ተለዋዋጭ ርዝመት ኢንቲጀር ከተጠቀምን ፣ ከዚያ በአብዛኛዎቹ ሁኔታዎች በአንድ ባይት ማግኘት እንችላለን ፣
  • በሁለተኛው አማራጭ የመነሻ አድራሻውን እና ርዝመቱን ማከማቸት ያስፈልገናል; መዝገቡ ቋሚ መጠን መሆን አለበት, በእያንዳንዱ መዝገብ 4 ባይት እገምታለሁ (ሁለት ባይት ለማካካሻ እና ሁለት ባይት ርዝመቱ);
  • ሦስተኛው አማራጭ የቀረጻውን መጀመሪያ ለማመልከት አንድ ቁምፊ ብቻ ይፈልጋል ፣ በተጨማሪም ቀረጻው ልሹ በመከለያ ምክንያት ከ1-2% ይጨምራል። በአጠቃላይ ፣ ከመጀመሪያው አማራጭ ጋር በግምት ተመሳሳይነት።

መጀመሪያ ላይ, ሁለተኛውን አማራጭ እንደ ዋናው (እንዲያውም አተገባበሩን ጽፌ ነበር). የተውኩት በመጨረሻ መጭመቂያ ለመጠቀም ስወስን ነው።

ምናልባት አንድ ቀን አሁንም ተመሳሳይ አማራጭ እጠቀማለሁ. ለምሳሌ፣ በመሬት እና በማርስ መካከል ለሚጓዝ መርከብ የመረጃ ማከማቻን ማስተናገድ ካለብኝ፣ ለታማኝነት፣ ለኮስሚክ ጨረሮች፣ ... ሙሉ ለሙሉ የተለያዩ መስፈርቶች ይኖራሉ።

ስለ ሦስተኛው አማራጭ: በመከለያ ዙሪያ መጨናነቅ, በሂደቱ ውስጥ ያለውን ርዝመት መቀየር, ወዘተ ስለማልወድ ብቻ ለትግበራው አስቸጋሪነት ሁለት ኮከቦችን ሰጠሁት. አዎ፣ ምናልባት አድሏዊ ነኝ፣ ግን ኮዱን መፃፍ አለብኝ - ለምን እራስህን የማትወደውን ነገር እንድታደርግ አስገድድ።

ማጠቃለያ- የማከማቻ አማራጩን በሰንሰለት መልክ እንመርጣለን "ራስጌ ከርዝመት - ተለዋዋጭ ርዝመት ያለው ውሂብ" በአፈፃፀም እና ቀላልነት ምክንያት.

የመፃፍ ስራዎችን ስኬት ለመከታተል ቢት መስኮችን መጠቀም

ሃሳቡን ከየት እንዳገኘሁት አሁን አላስታውስም፣ ግን ይህን ይመስላል።
ለእያንዳንዱ ግቤት ባንዲራዎችን ለማስቀመጥ ብዙ ቢት እንመድባለን።
ቀደም ብለን እንደተናገርነው ከመጥፋት በኋላ ሁሉም ቢትስ በ 1s ተሞልተዋል, እና 1 ወደ 0 መቀየር እንችላለን, ግን በተቃራኒው አይደለም. ስለዚህ "ባንዲራው አልተዘጋጀም" ለሚለው 1 እንጠቀማለን "ባንዲራው ተቀምጧል" 0 እንጠቀማለን.

የተለዋዋጭ-ርዝመት መዝገብ ወደ ፍላሽ ማስገባት ምን ሊመስል እንደሚችል እነሆ፡-

  1. "ርዝመት ቀረጻ ተጀምሯል" የሚለውን ባንዲራ ያዘጋጁ;
  2. ርዝመቱን ይመዝግቡ;
  3. "የውሂብ ቀረጻ ተጀምሯል" የሚለውን ባንዲራ ያዘጋጁ;
  4. መረጃን እንመዘግባለን;
  5. የ"ቀረጻ አልቋል" ባንዲራ አዘጋጅ።

በተጨማሪም፣ በአጠቃላይ 4 ቢት ባንዲራዎች የ"ስህተት ተከስቷል" ባንዲራ ይኖረናል።

በዚህ ሁኔታ ሁለት የተረጋጋ ግዛቶች አሉን "1111" - ቀረጻ አልተጀመረም እና "1000" - ቀረጻ የተሳካ ነበር; የቀረጻው ሂደት ባልተጠበቀ ሁኔታ መቋረጥ በሚከሰትበት ጊዜ መካከለኛ ግዛቶችን እንቀበላለን, ከዚያም ፈልጎ ማግኘት እና ማካሄድ እንችላለን.

አቀራረቡ አስደሳች ነው, ነገር ግን ከድንገተኛ የኤሌክትሪክ መቆራረጥ እና ተመሳሳይ ውድቀቶች ብቻ ይጠብቃል, በእርግጥ አስፈላጊ ነው, ነገር ግን ይህ ከሚቻሉት ውድቀቶች ብቸኛው (ወይም ዋናው) ምክንያት በጣም የራቀ ነው.

ማጠቃለያ- ጥሩ መፍትሄ ፍለጋ እንቀጥል።

ቼኮች

ቼክሱም እንዲሁ መፃፍ የነበረብንን በትክክል እያነበብን መሆኑን (በተመጣጣኝ እድል) ለማረጋገጥ ያስችላል። እና, ከላይ ከተገለጹት የቢት መስኮች በተለየ, ሁልጊዜም ይሰራሉ.

ከላይ የተመለከትናቸው የችግሮች ምንጭ ሊሆኑ የሚችሉትን ዝርዝር ከግምት ውስጥ ካስገባን ቼክሱሙ ከየትኛውም መነሻው ምንም ይሁን ምን ስህተትን ማወቅ ይችላል (ምናልባትም ከተንኮል አዘል መጻተኞች በስተቀር - ቼክሱንም ሊፈጥሩ ይችላሉ).

ስለዚህ ግባችን መረጃው ያልተነካ መሆኑን ማረጋገጥ ከሆነ፣ ቼኮች በጣም ጥሩ ሀሳብ ናቸው።

ቼክሱን ለማስላት የአልጎሪዝም ምርጫ ምንም አይነት ጥያቄ አላነሳም - CRC. በአንድ በኩል ፣የሂሣብ ባህሪያት የተወሰኑ ስህተቶችን 100% ለመያዝ ያስችላሉ ፣ በሌላ በኩል ፣ በዘፈቀደ መረጃ ላይ ይህ ስልተ-ቀመር ብዙውን ጊዜ የግጭቶችን ዕድል ከንድፈ-ሀሳባዊ ወሰን ብዙም ያልበለጠ ያሳያል። የእኔ የቀለበት ቋት በNOR ብልጭታ ውስጥ. በጣም ፈጣኑ ስልተ-ቀመር ላይሆን ይችላል, ወይም ሁልጊዜ ከግጭቶች ብዛት አንጻር ዝቅተኛው አይደለም, ነገር ግን በጣም ጠቃሚ ጥራት አለው: ባጋጠሙኝ ሙከራዎች ውስጥ, በግልጽ ያልተሳካላቸው ምንም ቅጦች አልነበሩም. በዚህ ጉዳይ ላይ መረጋጋት ዋናው ጥራት ነው.

የድምጽ መጠን ጥናት ምሳሌ፡- ьасть 1, ьасть 2 (ወደ narod.ru አገናኞች፣ ይቅርታ).

ሆኖም፣ የቼክ ክፍያን የመምረጥ ተግባር አልተጠናቀቀም፤ CRC ሙሉ የቼክ ሱም ቤተሰብ ነው። ርዝመቱን መወሰን ያስፈልግዎታል, እና ከዚያ ፖሊኖሚል ይምረጡ.

የቼክሰም ርዝመትን መምረጥ በመጀመሪያ በጨረፍታ እንደሚመስለው ቀላል ጥያቄ አይደለም.

በምሳሌ ላስረዳ፡-
በእያንዳንዱ ባይት ውስጥ የስህተት እድል ይኑረን የእኔ የቀለበት ቋት በNOR ብልጭታ ውስጥ እና ጥሩ የፍተሻ ሂሳብ፣ እስቲ በአማካይ የስህተት ብዛት በሚሊዮን መዛግብት እናሰላ።

ውሂብ፣ ባይት
Checksum፣ ባይት
ያልተገኙ ስህተቶች
የውሸት ስህተት ማወቂያ
ጠቅላላ የውሸት አዎንታዊ ውጤቶች

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

ሁሉም ነገር ቀላል ይመስላል - እንደተጠበቀው መረጃ ርዝመት በመወሰን የቼክሱን ርዝመት በትንሹ የተሳሳቱ አዎንታዊ ነገሮችን ይምረጡ - እና ብልሃቱ በከረጢቱ ውስጥ ነው።

ነገር ግን፣ በአጭር ቼኮች ላይ ችግር ይፈጠራል፡ ምንም እንኳን ነጠላ ስህተቶችን በመለየት ረገድ ጥሩ ቢሆኑም፣ በጣም ከፍተኛ በሆነ ዕድል ሙሉ በሙሉ የዘፈቀደ መረጃን እንደ ትክክለኛ መቀበል ይችላሉ። ሀበሬን የሚገልጽ ጽሑፍ አስቀድሞ ነበር። በእውነተኛ ህይወት ውስጥ ችግር.

ስለዚህ፣ የዘፈቀደ የቼክሰም ግጥሚያ ፈጽሞ የማይቻል ለማድረግ፣ 32 ቢት ወይም ከዚያ በላይ ርዝመት ያላቸውን ቼኮች መጠቀም ያስፈልግዎታል። (ከ64 ቢት በላይ ለሆኑ ርዝመቶች፣ ምስጠራ ሃሽ ተግባራት ብዙውን ጊዜ ጥቅም ላይ ይውላሉ).

በማንኛውም መንገድ ቦታ መቆጠብ እንዳለብን ቀደም ብዬ የጻፍኩት ቢሆንም፣ አሁንም ባለ 32-ቢት ቼክ እንጠቀማለን (16 ቢት በቂ አይደሉም፣ የመጋጨት እድሉ ከ 0.01% በላይ ነው፣ እና 24 ቢት እንደነሱ)። እዚህ ወይም እዚያ አይደሉም ይበሉ) .

እዚህ ተቃውሞ ሊነሳ ይችላል፡ አሁን 4 ባይት በአንድ ጊዜ ለመስጠት እያንዳንዱን ባይት መጭመቅን በምንመርጥበት ጊዜ አስቀምጠናል? ቼክ ሳታጨቁኑ ወይም ባይጨምሩ አይሻልም? በእርግጥ አይደለም, ምንም መጭመቅ የለም ማለት አይደለም።, የታማኝነት ማረጋገጥ አያስፈልገንም.

ፖሊኖሚል በምንመርጥበት ጊዜ ተሽከርካሪውን እንደገና አንፈጥርም, ነገር ግን አሁን ታዋቂ የሆነውን CRC-32C ይውሰዱ.
ይህ ኮድ እስከ 6 ባይት በሚደርሱ እሽጎች ላይ 22 ቢት ስህተቶችን (ምናልባትም ለእኛ በጣም የተለመደው ጉዳይ)፣ 4 ቢት ስህተቶች እስከ 655 ባይት ድረስ ባሉ እሽጎች ላይ (ለእኛም የተለመደ ጉዳይ)፣ 2 ወይም ማንኛውም እንግዳ የሆኑ የቢት ስህተቶች በፓኬቶች ላይ ለማንኛውም ምክንያታዊ ርዝመት.

ዝርዝሮቹን የሚፈልግ ካለ

Wikipedia article ሾለ CRC.

የኮድ መለኪያዎች crc-32c ላይ Koopman ድር ጣቢያ - ምናልባት በፕላኔቷ ላይ መሪ CRC ስፔሻሊስት.

В የእሱ ጽሑፍ ናት ሌላ አስደሳች ኮድ, ይህም ለእኛ ተዛማጅነት ላላቸው የፓኬት ርዝማኔዎች ትንሽ የተሻሉ መለኪያዎችን ያቀርባል, ነገር ግን ልዩነቱን ትልቅ ግምት ውስጥ አላስገባኝም, እና ከመደበኛ እና በደንብ ከተመረመረው ይልቅ ብጁ ኮድ ለመምረጥ በቂ ብቃት ነበረኝ.

እንዲሁም የእኛ መረጃ የተጨመቀ ስለሆነ ጥያቄው የሚነሳው-የተጨመቀ ወይም ያልተጨመቀ መረጃን ቼክ እናሰላለን?

ያልተጨመቀ የውሂብ ቼክ ድምርን ለማስላት የሚደግፉ ክርክሮች፡-

  • በመጨረሻም የውሂብ ማከማቻውን ደህንነት ማረጋገጥ አለብን - ስለዚህ እኛ በቀጥታ እንፈትሻለን (በተመሳሳይ ጊዜ የመጭመቂያ / የጭንቀት ትግበራ ላይ ሊሆኑ የሚችሉ ስህተቶች, በተሰበረ ማህደረ ትውስታ ምክንያት የሚደርስ ጉዳት, ወዘተ. ይመረመራሉ);
  • በዝሊብ ውስጥ ያለው የዲፍላት ስልተ-ቀመር በትክክል የበሰለ አተገባበር አለው። አይገባም “የተጣመመ” የግቤት ውሂብ ይወድቃል ፣ በተጨማሪም ፣ ብዙውን ጊዜ በግቤት ዥረቱ ውስጥ ያሉ ስህተቶችን በተናጥል ማወቅ ይችላል ፣ ይህም ስህተትን የማወቅ አጠቃላይ እድልን ይቀንሳል (በአጭር መዝገብ ውስጥ አንድ ቢት በመገልበጥ ሙከራ አድርጓል ፣ zlib ስህተት አግኝቷል) ከጉዳዮች አንድ ሦስተኛ ገደማ)።

ያልተጨመቀ የውሂብ ቼክ ድምርን ለማስላት የሚቃወሙ ክርክሮች፡-

  • CRC በተለይ ለፍላሽ ማህደረ ትውስታ ባህሪ ለሆኑት ጥቂት ቢት ስህተቶች "የተበጀ" ነው (በተጨመቀ ዥረት ውስጥ ትንሽ ስህተት በውጤቱ ዥረቱ ላይ ትልቅ ለውጥ ሊያመጣ ይችላል ፣ በንድፈ-ሀሳብ ብቻ ግጭትን "መያዝ" እንችላለን);
  • ሊበላሹ የሚችሉ መረጃዎችን ወደ ዲኮምፕሬተር የማስተላለፍ ሀሳብን በእውነት አልወድም። ማን ያውቃልእንዴት ምላሽ እንደሚሰጥ.

በዚህ ፕሮጀክት ውስጥ ያልተጨመቀ መረጃን ቼክ ለማከማቸት በአጠቃላይ ተቀባይነት ካለው አሠራር ለመራቅ ወሰንኩ.

ማጠቃለያ- CRC-32C እንጠቀማለን, ቼኩን ከመረጃው ላይ እናሰላለን (ከጨመቀ በኋላ) በተፃፉበት ቅጽ ላይ.

ድግግሞሽ

ተደጋጋሚ ኮድ መጠቀም በእርግጥ የውሂብ መጥፋትን አያስወግድም, ነገር ግን, በከፍተኛ ሁኔታ (ብዙውን ጊዜ በብዙ ትዕዛዞች) ሊመለስ የማይችል የውሂብ መጥፋት እድልን ይቀንሳል.

ስህተቶችን ለማስተካከል የተለያዩ የድጋሚ ዓይነቶችን መጠቀም እንችላለን።
ሃሚንግ ኮዶች ነጠላ ስህተቶችን፣ ሪድ-ሰሎሞን የቁምፊ ኮዶችን፣ በርካታ የውሂብ ቅጂዎችን ከቼኮች ጋር በማጣመር፣ ወይም እንደ RAID-6 ያሉ ኢንኮዲንግ ከፍተኛ ሙስና ቢፈጠርም መረጃን መልሶ ለማግኘት ይረዳል።
መጀመሪያ ላይ ስሕተትን የሚቋቋም ኮድ መስጠትን በሰፊው ለመጠቀም ቆርጬ ነበር፣ ነገር ግን በመጀመሪያ ራሳችንን ከየትኞቹ ስህተቶች መጠበቅ እንደምንፈልግ እና ከዚያም ኮድ ማድረግን መምረጥ እንዳለብን ተገነዘብኩ።

ቀደም ሲል ስህተቶች በተቻለ ፍጥነት መያዝ እንዳለባቸው ተናግረናል. ስህተቶችን በምን ነጥብ ላይ ልናገኝ እንችላለን?

  1. ያልጨረሰ ቀረጻ (በተቀረጸበት ወቅት በሆነ ምክንያት ኃይሉ ጠፍቷል፣ Raspberry በረዶ፣ ...)
    ወዮ, እንደዚህ አይነት ስህተት ሲከሰት, የሚቀረው ልክ ያልሆኑ መዝገቦችን ችላ ማለት እና የጠፋውን ውሂብ ግምት ውስጥ ማስገባት ነው;
  2. ስህተቶችን ይፃፉ (በተወሰኑ ምክንያቶች ወደ ፍላሽ ማህደረ ትውስታ የተጻፈው የተጻፈው አይደለም)
    ከተቀዳ በኋላ ወዲያውኑ የንባብ ሙከራ ካደረግን እንደነዚህ ያሉትን ስህተቶች ወዲያውኑ ማግኘት እንችላለን;
  3. በማከማቻ ጊዜ በማህደረ ትውስታ ውስጥ የውሂብ ማዛባት;
  4. የንባብ ስህተቶች
    ለማረም, ቼክሱም የማይመሳሰል ከሆነ, ንባቡን ብዙ ጊዜ መድገም በቂ ነው.

ማለትም የሦስተኛው ዓይነት ስህተቶች ብቻ (በማከማቻ ጊዜ ድንገተኛ የውሂብ ብልሹነት) ያለ ስህተት ተከላካይ ኮድ ሊታረሙ አይችሉም። እንደዚህ ያሉ ስህተቶች አሁንም በጣም የማይቻሉ ይመስላል.

ማጠቃለያ- ተደጋጋሚ ኮድ መስጠትን ለመተው ተወስኗል ፣ ግን ክዋኔው የዚህን ውሳኔ ስህተት ካሳየ ወደ ጉዳዩ ይመለሱ (በድክመቶች ላይ ቀድሞውኑ የተከማቸ ስታቲስቲክስ ፣ ይህም ትክክለኛውን ኮድ መምረጥ ያስችላል)።

Прочее

እርግጥ ነው, የጽሁፉ ቅርጸት እያንዳንዱን ነገር በቅርጸቱ ላይ ለማጽደቅ አይፈቅድም (እና ጥንካሬዬ ቀድሞውኑ አልቋል)ስለዚህ ከዚህ ቀደም ያልተነኩ አንዳንድ ነጥቦችን ባጭሩ እመለከታለሁ።

  • ሁሉንም ገጾች "እኩል" ለማድረግ ተወስኗል.
    ማለትም፣ ሜታዳታ፣የተለያዩ ክሮች፣ወዘተ ያሉ ልዩ ገፆች አይኖሩም ይልቁንም ሁሉንም ገጾች በየተራ የሚጽፍ ነጠላ ክር።
    ይህ ገጾች ላይ እንኳ መልበስ ያረጋግጣል, ውድቀት ምንም ነጠላ ነጥብ, እና እኔ ልክ እንደ;
  • የቅርጸቱን ስሪት ማቅረብ አስፈላጊ ነው.
    በርዕሱ ውስጥ ያለ የስሪት ቁጥር ቅርጸት መጥፎ ነው!
    በገጹ ራስጌ ላይ የተወሰነ የአስማት ቁጥር (ፊርማ) ያለው መስክ ማከል በቂ ነው, ይህም ጥቅም ላይ የዋለውን ቅርጸት ስሪት ያሳያል. (በተግባር አንድ ደርዘን እንኳን የሚቀሩ አይመስለኝም);
  • በአብዛኛዎቹ ጉዳዮች 1 ባይት ረጅም ለማድረግ በመሞከር ለመዝገቦች (ከዚህ ውስጥ ብዙ ያሉ) ተለዋዋጭ-ርዝመት ራስጌን ይጠቀሙ።
  • የራስጌውን ርዝመት እና የተከረከመውን የተጨመቀውን መዝገብ ክፍል ርዝመት ለመደበቅ፣ ተለዋዋጭ ርዝመት ያላቸውን ሁለትዮሽ ኮዶች ይጠቀሙ።

ብዙ ረድቷል። የመስመር ላይ ጀነሬተር የሃፍማን ኮዶች በጥቂት ደቂቃዎች ውስጥ አስፈላጊውን ተለዋዋጭ ርዝመት ኮዶች መምረጥ ቻልን.

የውሂብ ማከማቻ ቅርጸት መግለጫ

ባይት ትእዛዝ

ከአንድ ባይት በላይ የሆኑ መስኮች በትልቁ ኢንዲያን ቅርጸት (የአውታረ መረብ ባይት ቅደም ተከተል) ይቀመጣሉ፣ ማለትም፣ 0x1234 በ 0x12፣ 0x34 ተጽፏል።

ፔጅኒሽን

ሁሉም የፍላሽ ማህደረ ትውስታ እኩል መጠን ያላቸው ገፆች ይከፈላሉ.

ነባሪ የገጽ መጠን 32 ኪባ ነው፣ ነገር ግን ከጠቅላላው የማህደረ ትውስታ ቺፕ መጠን ከ 1/4 አይበልጥም (ለ 4MB ቺፕ 128 ገፆች ይገኛሉ)።

እያንዳንዱ ገጽ ከሌሎቹ ተለይቶ መረጃን ያከማቻል (ይህም በአንድ ገጽ ላይ ያለው ውሂብ በሌላ ገጽ ላይ መረጃን አይጠቅስም)።

ሁሉም ገፆች በተፈጥሮ ቅደም ተከተል ተቆጥረዋል (በአድራሻዎች ቅደም ተከተል) ፣ ከቁጥር 0 ጀምሮ (ገጽ ዜሮ በአድራሻ 0 ይጀምራል ፣ የመጀመሪያው ገጽ በ 32 ኪባ ይጀምራል ፣ ሁለተኛው ገጽ በ 64 ኪባ ይጀምራል ፣ ወዘተ.)

የማስታወሻ ቺፕ እንደ ሳይክል ቋት (ቀለበት ቋት) ጥቅም ላይ ይውላል፣ ማለትም፣ መጀመሪያ መፃፍ ወደ ገጽ ቁጥር 0፣ ከዚያም ወደ ቁጥር 1፣ ...፣ የመጨረሻውን ገጽ ስንሞላ አዲስ ዑደት ይጀምራል እና ቀረጻ ከገጽ ዜሮ ይቀጥላል። .

በገጹ ውስጥ

የእኔ የቀለበት ቋት በNOR ብልጭታ ውስጥ
በገጹ መጀመሪያ ላይ ባለ 4 ባይት ገጽ ራስጌ ይከማቻል፣ ከዚያም የራስጌ ቼክ (CRC-32C)፣ ከዚያም መዝገቦች በ "ራስጌ፣ ዳታ፣ ቼክሰም" ቅርጸት ይቀመጣሉ።

የገጹ ርዕስ (በሥዕላዊ መግለጫው ላይ ቆሻሻ አረንጓዴ) የሚከተሉትን ያጠቃልላል

  • ባለ ሁለት ባይት የአስማት ቁጥር መስክ (እንዲሁም የቅርጸቱ ስሪት ምልክት)
    ለአሁኑ የቅርጸቱ ስሪት እንደ ይሰላል 0xed00 ⊕ номер страницы;
  • ባለ ሁለት ባይት ቆጣሪ "የገጽ ስሪት" (የማህደረ ትውስታ ዑደት ቁጥር እንደገና ይፃፉ).

በገጹ ላይ ያሉ ግቤቶች በተጨመቀ መልክ ይቀመጣሉ (የዲፍላቱ አልጎሪዝም ጥቅም ላይ ይውላል)። በአንድ ገጽ ላይ ያሉ ሁሉም መዝገቦች በአንድ ክር ውስጥ ተጨምቀዋል (የተለመደ መዝገበ-ቃላት ጥቅም ላይ ይውላሉ) እና በእያንዳንዱ አዲስ ገጽ ላይ መጭመቅ እንደገና ይጀምራል። ያም ማለት, ማንኛውንም መዝገብ ለማጥፋት, ከዚህ ገጽ ሁሉም ቀዳሚ መዝገቦች (እና ይህ ብቻ) ያስፈልጋሉ.

እያንዳንዱ መዝገብ በZ_SYNC_FLUSH ባንዲራ ይጨመቃል፣ እና በተጨመቀው ዥረት መጨረሻ ላይ 4 ባይት 0x00፣ 0x00፣ 0xff፣ 0xff፣ ምናልባትም ከአንድ ወይም ሁለት ተጨማሪ ዜሮ ባይት ይቀድማል።
ወደ ፍላሽ ማህደረ ትውስታ ስንጽፍ ይህንን ቅደም ተከተል (4, 5 ወይም 6 ባይት ርዝመት) እናስወግዳለን.

የመዝገቡ ራስጌ 1፣ 2 ወይም 3 ባይት ማከማቻ ነው፡-

  • አንድ ቢት (ቲ) የመዝገቡን አይነት የሚያመለክት: 0 - አውድ, 1 - ሎግ;
  • ተለዋዋጭ የርዝመት መስክ (ኤስ) ከ 1 እስከ 7 ቢት, የራስጌውን ርዝመት እና "ጅራት" ለመበስበስ ወደ መዝገብ ውስጥ መጨመር ያለበትን መወሰን;
  • የመዝገብ ርዝመት (L).

ኤስ እሴት ሰንጠረዥ፡

S
የራስጌ ርዝመት፣ ባይት
በጽሑፍ፣ ባይት ተጥሏል።

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)

በምሳሌ ለማስረዳት ሞከርኩ፣ እንዴት በግልፅ እንደ ሆነ አላውቅም፡-
የእኔ የቀለበት ቋት በNOR ብልጭታ ውስጥ
ቢጫ እዚህ T መስክ, ነጭ S መስክ, አረንጓዴ L (የታመቀ ውሂብ በባይት ርዝመት) ሰማያዊ የታመቀ ውሂብ, ቀይ ወደ ፍላሽ ማህደረ ትውስታ ያልተፃፈውን የታመቀ ውሂብ የመጨረሻ ባይት.

ስለዚህ, በጣም የተለመደው ርዝመት (እስከ 63 + 5 ባይት በተጨመቀ ቅርጽ) ሪኮርድ አርእስቶችን በአንድ ባይት መጻፍ እንችላለን.

ከእያንዳንዱ መዝገብ በኋላ CRC-32C ቼክ ይከማቻል፣ በዚህ ውስጥ የቀደመው ቼክ የተገለበጠ ዋጋ እንደ መጀመሪያው እሴት (init) ጥቅም ላይ ይውላል።

CRC የ"ቆይታ" ንብረት አለው፣ የሚከተለው ቀመር ይሰራል (በሂደቱ ውስጥ የትንሽ መገለባበጥ ሲደመር ወይም ሲቀነስ) የእኔ የቀለበት ቋት በNOR ብልጭታ ውስጥ.
ያም ማለት፣ በእውነቱ፣ በዚህ ገጽ ላይ ያሉትን ሁሉንም የቀደምት ባይት ባይት እና ውሂብ CRC እናሰላለን።

ቼክሱን በቀጥታ መከተል የሚቀጥለው መዝገብ ራስጌ ነው።

ራስጌው የተነደፈው የመጀመሪያው ባይት ሁል ጊዜ ከ0x00 እና 0xff በሚለይበት መንገድ ነው (ከመጀመሪያው ባይት ራስጌ ፈንታ 0xff ካጋጠመን ይህ ማለት ጥቅም ላይ ያልዋለ ቦታ ነው ማለት ነው፣ 0x00 ስህተትን ያሳያል)።

ምሳሌ አልጎሪዝም

ከፍላሽ ማህደረ ትውስታ ማንበብ

ማንኛውም ንባብ ከቼክ ቼክ ጋር ይመጣል።
ቼክሱም የማይመሳሰል ከሆነ ትክክለኛውን መረጃ ለማንበብ ተስፋ በማድረግ ንባቡ ብዙ ጊዜ ይደጋገማል።

(ይህ ምክንያታዊ ነው፣ ሊኑክስ ከNOR ፍላሽ መሸጎጫ አይነበብም፣ ተፈትኗል)

ወደ ፍላሽ ማህደረ ትውስታ ይፃፉ

መረጃውን እንመዘግባለን.
እናንብባቸው።

የተነበበው መረጃ ከተፃፈው መረጃ ጋር የማይመሳሰል ከሆነ, ቦታውን በዜሮዎች እንሞላለን እና ስህተት እንዳለ ምልክት እናደርጋለን.

አዲስ ማይክሮ ሰርኩዌት ለመሥራት በማዘጋጀት ላይ

ለመጀመር፣ ሥሪት 1 ያለው ራስጌ ወደ መጀመሪያው (ወይም ይልቁንስ ዜሮ) ገጽ ይጻፋል።
ከዚያ በኋላ, የመነሻ አውድ ወደዚህ ገጽ ይጻፋል (የማሽኑን UUID እና ነባሪ ቅንብሮችን ይዟል).

ያ ነው ፣ የፍላሽ ማህደረ ትውስታ ለአገልግሎት ዝግጁ ነው።

ማሽኑን በመጫን ላይ

በሚጫኑበት ጊዜ የእያንዳንዱ ገጽ የመጀመሪያዎቹ 8 ባይት (ራስጌ + ሲአርሲ) ይነበባሉ፣ ያልታወቀ የአስማት ቁጥር ወይም የተሳሳተ CRC ያላቸው ገጾች ችላ ይባላሉ።
ከ "ትክክለኛ" ገጾች, ከፍተኛው ስሪት ያላቸው ገጾች ተመርጠዋል, እና ከፍተኛ ቁጥር ያለው ገጽ ከነሱ ይወሰዳል.
የመጀመሪያው መዝገብ ተነቧል, የ CRC ትክክለኛነት እና የ "አውድ" ባንዲራ መገኘት ተረጋግጧል. ሁሉም ነገር ጥሩ ከሆነ, ይህ ገጽ እንደ ወቅታዊ ይቆጠራል. ካልሆነ፣ “የቀጥታ” ገጽ እስክናገኝ ድረስ ወደ ቀደመው እንመለሳለን።
እና በተገኘው ገጽ ላይ ሁሉንም መዝገቦች እናነባለን, ከ "አውድ" ባንዲራ ጋር የምንጠቀመው.
የዝሊብ መዝገበ ቃላት አስቀምጥ (ወደዚህ ገጽ ለመጨመር አስፈላጊ ይሆናል)።

ያ ብቻ ነው, ማውረዱ ተጠናቅቋል, አውድ ተመልሷል, መስራት ይችላሉ.

የጆርናል ግቤት መጨመር

Z_SYNC_FLUSHን በመግለጽ መዝገቡን በትክክለኛው መዝገበ-ቃላት እናጭቀዋለን።የተጨመቀው መዝገብ አሁን ባለው ገጽ ላይ ይስማማ እንደሆነ እናያለን።
የማይመጥን ከሆነ (ወይም በገጹ ላይ የCRC ስህተቶች ነበሩ) አዲስ ገጽ ይጀምሩ (ከዚህ በታች ይመልከቱ)።
መዝገቡን እና CRCን እንጽፋለን. ስህተት ከተፈጠረ, አዲስ ገጽ ይጀምሩ.

አዲስ ገጽ

ዝቅተኛው ቁጥር ያለው ነፃ ገጽ እንመርጣለን (ነፃ ገጽ በአርዕስት ላይ የተሳሳተ ቼክ ወይም ከአሁኑ ያነሰ ስሪት ያለው ገጽ ነው ብለን እንቆጥራለን)። እንደዚህ አይነት ገጾች ከሌሉ, አሁን ካለው ጋር እኩል የሆነ ስሪት ካላቸው ዝቅተኛው ቁጥር ያለውን ገጽ ይምረጡ.
የተመረጠውን ገጽ እንሰርዛለን. ይዘቱን በ 0xff እንፈትሻለን. የሆነ ነገር ከተሳሳተ፣ ቀጣዩን ነፃ ገጽ ይውሰዱ፣ ወዘተ.
በተደመሰሰው ገጽ ላይ አርዕስት እንጽፋለን, የመጀመሪያው ግቤት አሁን ያለው የአውድ ሁኔታ ነው, ቀጣዩ ያልተጻፈ የምዝግብ ማስታወሻ (ካለ) ነው.

ተግባራዊነት ቅርጸት

በእኔ አስተያየት፣ ማንኛውም ተጨማሪ ወይም ባነሰ ሊታመቁ የሚችሉ የመረጃ ዥረቶችን (ግልጽ ጽሑፍ፣ JSON፣ MessagePack፣ CBOR፣ ምናልባትም ፕሮቶቡፍ) በNOR Flash ውስጥ ለማከማቸት ጥሩ ቅርጸት ሆኖ ተገኝቷል።

በእርግጥ ቅርጸቱ ለSLC NOR ፍላሽ "የተበጀ" ነው።

እንደ NAND ወይም MLC NOR ካሉ ከፍተኛ የ BER ሚዲያዎች ጋር መጠቀም የለበትም (እንዲህ ያለ ማህደረ ትውስታ ለሽያጭ እንኳን ይገኛል? እኔ የማየው በማረም ኮዶች ላይ ብቻ ነው).

ከዚህም በላይ የራሳቸው ኤፍቲኤል ካላቸው መሳሪያዎች ጋር መጠቀም የለበትም: ዩኤስቢ ፍላሽ, ኤስዲ, ማይክሮ ኤስዲ, ወዘተ (ለእንደዚህ ዓይነቱ ማህደረ ትውስታ የገጽ መጠን 512 ባይት ፣ በእያንዳንዱ ገጽ መጀመሪያ ላይ ፊርማ እና ልዩ የመዝገብ ቁጥሮችን የያዘ ቅርጸት ፈጠርኩ - አንዳንድ ጊዜ ሁሉንም መረጃዎች ከ “የተሳሳተ” ፍላሽ አንፃፊ በቀላል ተከታታይ ንባብ መመለስ ይቻል ነበር).

በተግባሮቹ ላይ በመመስረት, ቅርጸቱ ከ 128Kbit (16Kb) እስከ 1Gbit (128MB) በፍላሽ አንፃፊዎች ላይ ያለ ለውጥ መጠቀም ይቻላል. ከተፈለገ በትልልቅ ቺፖች ላይ ሊጠቀሙበት ይችላሉ, ግን ምናልባት የገጹን መጠን ማስተካከል ያስፈልግዎታል (ነገር ግን እዚህ ላይ የኢኮኖሚ አዋጭነት ጥያቄ ቀድሞውኑ ተነስቷል, ትልቅ መጠን ያለው NOR ፍላሽ ዋጋ አበረታች አይደለም).

አንድ ሰው ቅርጸቱን አስደሳች ሆኖ ካገኘው እና ክፍት በሆነ ፕሮጀክት ውስጥ ሊጠቀምበት ከፈለገ, ይፃፉ, ጊዜውን ለማግኘት እሞክራለሁ, ኮዱን አሻሽለው እና በ github ላይ ለመለጠፍ.

መደምደሚያ

እንደሚመለከቱት, በመጨረሻ ቅርጸቱ ቀላል ሆኖ ተገኝቷል እና እንዲያውም አሰልቺ.

በአንቀፅ ውስጥ የእኔን አመለካከት ዝግመተ ለውጥ ለማንፀባረቅ አስቸጋሪ ነው, ነገር ግን እመኑኝ: መጀመሪያ ላይ በቅርብ ርቀት ላይ የኑክሌር ፍንዳታ እንኳን ሳይቀር ለመትረፍ የሚያስችል ውስብስብ, የማይበላሽ, የሆነ ነገር መፍጠር እፈልግ ነበር. ሆኖም፣ ምክንያት (ተስፋ አደርጋለሁ) አሁንም አሸንፏል እና ቀስ በቀስ ቅድሚያ የሚሰጣቸው ነገሮች ወደ ቀላልነት እና ውሱንነት ተሸጋገሩ።

ተሳስቼ ሊሆን ይችላል? አወ እርግጥ ነው. ምናልባት ጥሩ ሊሆን ይችላል, ለምሳሌ, ዝቅተኛ ጥራት ያላቸው ማይክሮ ሰርኮች ስብስብ ገዛን. ወይም በሌላ ምክንያት መሳሪያው አስተማማኝነት የሚጠበቁትን አያሟላም.

ለዚህ እቅድ አለኝ? እኔ እንደማስበው ጽሑፉን ካነበቡ በኋላ እቅድ እንዳለ አይጠራጠሩም. እና ብቻውን አይደለም.

በትንሹ ከበድ ያለ ማስታወሻ፣ ቅርጸቱ እንደ የስራ አማራጭ እና እንደ “የሙከራ ፊኛ” ተዘጋጅቷል።

በአሁኑ ጊዜ በጠረጴዛው ላይ ያለው ነገር ሁሉ በጥሩ ሁኔታ እየሰራ ነው, በጥሬው በሌላ ቀን መፍትሄው ይተላለፋል (በግምት) በመቶዎች በሚቆጠሩ መሳሪያዎች ላይ, በ "ውጊያ" አሠራር ውስጥ ምን እንደሚፈጠር እንይ (እንደ እድል ሆኖ, ቅርጸቱ ውድቀቶችን በአስተማማኝ ሁኔታ ለመለየት እንደሚፈቅድልዎት ተስፋ አደርጋለሁ, ስለዚህ ሙሉ ስታቲስቲክስን መሰብሰብ ይችላሉ). በጥቂት ወራቶች ውስጥ መደምደሚያዎችን ማድረግ ይቻላል (እና እድለኛ ካልሆንክ ቀደም ብሎም ቢሆን).

በአጠቃቀም ውጤቶች ላይ በመመርኮዝ ከባድ ችግሮች ከተገኙ እና ማሻሻያዎች ከተፈለገ በእርግጠኝነት ስለእሱ እጽፋለሁ ።

ስነፅሁፍ

ረጅም አሰልቺ የሆኑ ያገለገሉ ስራዎች ዝርዝር ማውጣት አልፈለኩም፤ ለነገሩ ሁሉም ሰው ጎግል አለው።

እዚህ በተለይ ለእኔ አስደሳች የሚመስሉትን ግኝቶች ዝርዝር ለመተው ወሰንኩ ፣ ግን ቀስ በቀስ በቀጥታ ወደ መጣጥፉ ጽሑፍ ተሰደዱ ፣ እና አንድ ንጥል በዝርዝሩ ውስጥ ቀርቷል ።

  1. መገልገያ infgen ከደራሲው ዝሊብ. የdeflate/zlib/gzip ማህደሮችን ይዘቶች በግልፅ ማሳየት ይችላል። የዲፌት (ወይም gzip) ቅርፀትን ውስጣዊ መዋቅር መቋቋም ካለብዎት በጣም እመክራለሁ.

ምንጭ: hab.com

አስተያየት ያክሉ