- ЋЎй п (б®ў¬Ґбв® ЁбЇ®«м§гҐ¬ п) Ї ¬пвм
- Ѓлбв஥ «®Є «м®Ґ ў§ Ё¬®¤Ґ©бвўЁҐ
- Њ®¤Ґ«м Ї ¬пвЁ
- ‚뤥«ҐЁҐ
- Џ®¤Є«о票Ґ Ё ®вЄ«о票Ґ
- “Їа ў«ҐЁҐ Ё ®бў®Ў®¦¤ҐЁҐ ®ЎйҐ© Ї ¬пвЁ
- ЏаЁ¬Ґа Їа®Ја ¬¬л
- ‡ Ё Їа®вЁў
- Разделяемая память linux shmget
- ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
- ОШИБКИ
- СООТВЕТСТВИЕ СТАНДАРТАМ
- ЗАМЕЧАНИЯ
- Ограничения общей памяти
- Разделяемая память linux shmget
- ОПИСАНИЕ
- СИСТЕМНЫЕ ВЫЗОВЫ
- ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
- НАЙДЕННЫЕ ОШИБКИ
- ЗАМЕЧАНИЯ
ЋЎй п (б®ў¬Ґбв® ЁбЇ®«м§гҐ¬ п) Ї ¬пвм
Ћ¤Ё Ё§ б ¬ле Їа®бвле ¬Ґв®¤®ў ¬Ґ¦Їа®жҐбб®ў®Ј® ў§ Ё¬®¤Ґ©бвўЁп — ЁбЇ®«м§®ў вм ®Ўйго Ї ¬пвм. ЋЎй п Ї ¬пвм Ї®§ў®«пҐв ¤ўг¬ Ё«Ё Ў®«ҐҐ Їа®жҐбб ¬ ®Ўа й вмбп Є ®¤®© Ё в®© ¦Ґ ®Ў« бвЁ Ї ¬пвЁ, Є Є Ўг¤в® ®Ё ўбҐ ўл§лў «Ё malloc Ё Ё¬ Ўл«Ё ў®§ўа йҐл гЄ § ⥫Ё ®¤г Ё вг ¦Ґ дЁ§ЁзҐбЄго Ї ¬пвм. Љ®Ј¤ ®¤Ё Їа®жҐбб Ё§¬ҐпҐв Ї ¬пвм, ўбҐ ¤агЈЁҐ Їа®жҐббл «ўЁ¤пв» ¬®¤ЁдЁЄ жЁо.
Ѓлбв஥ «®Є «м®Ґ ў§ Ё¬®¤Ґ©бвўЁҐ
ЋЎй п Ї ¬пвм — б ¬ п Ўлбва п д®а¬ ¬Ґ¦Їа®жҐбб®ў®Ј® ў§ Ё¬®¤Ґ©бвўЁп, Ї®в®¬г зв® ўбҐ Їа®жҐббл б®ў¬Ґбв® ЁбЇ®«м§гов ®¤г Ёвг ¦Ґ з бвм Ї ¬пвЁ. „®бвгЇ Є нв®© ®ЎйҐ© Ї ¬пвЁ ®бгйҐбвў«пҐвбп б в®© ¦Ґ бЄ®а®бвмо, зв® Ё ЇаЁ ®Ўа 饨Ё Є Ґб®ў¬Ґбв® ЁбЇ®«м§гҐ¬®© Ї ¬пвЁ, Ё нв® Ґ вॡгҐв бЁб⥬®Ј® ўл§®ў Ё«Ё ўе®¤ ў п¤а®. ќв® в Є¦Ґ Ґ вॡгҐв Ё§«ЁиҐЈ® Є®ЇЁа®ў Ёп ¤ ле.
Џ®бЄ®«мЄг п¤а® Ґ бЁеа®Ё§ЁагҐв ¤®бвгЇл Є б®ў¬Ґбв® ЁбЇ®«м§гҐ¬®© Ї ¬пвЁ, ўл ¤®«¦л б ¬Ё ®ЎҐбЇҐзЁвм бЁеа®Ё§ жЁо. Ќ ЇаЁ¬Ґа, Їа®жҐбб Ґ ¤®«¦Ґ зЁв вм Ё§ Ї ¬пвЁ, Ї®Є ¤ лҐ Ґ § ЇЁб л вг¤ , Ё ¤ў Їа®жҐбб Ґ ¤®«¦л ЇЁб вм Ї® ®¤®¬г Ё ⮬㠦Ґ ¤аҐбг Ї ¬пвЁ ў ®¤® Ё в® ¦Ґ ўаҐ¬п. ЋЎй п бва ⥣Ёп Ё§ЎҐ¦ Ёп гб«®ўЁ© Ј®ЄЁ б®бв®Ёв ў ⮬, зв®Ўл ЁбЇ®«м§®ў вм ᥬ д®ал.
Њ®¤Ґ«м Ї ¬пвЁ
—в®Ўл ЁбЇ®«м§®ў вм ᥣ¬Ґв ®ЎйҐ© Ї ¬пвЁ, ®¤Ё Їа®жҐбб ¤®«¦Ґ ўл¤Ґ«Ёвм ᥣ¬Ґв. ’®Ј¤ Є ¦¤л© Їа®жҐбб, ¦Ґ« ойЁ© ®Ўа й вмбп Є ᥣ¬Ґвг ¤®«¦Ґ Ї®¤Є«озЁвм ᥣ¬Ґв. Џ®б«Ґ ®Є®з Ёп ҐЈ® ЁбЇ®«м§®ў Ёп ᥣ¬Ґв , Є ¦¤л© Їа®жҐбб ®вЄ«оз Ґв ᥣ¬Ґв. ‚ ҐЄ®в®ал© ¬®¬Ґв, ®¤Ё Їа®жҐбб ¤®«¦Ґ ®бў®Ў®¤Ёвм ᥣ¬Ґв.
Џ®Ё¬ ЁҐ ¬®¤Ґ«Ё Ї ¬пвЁ Linux Ї®¬®Ј Ґв ®ЎкпбЁвм Їа®жҐбб ўл¤Ґ«ҐЁп Ё Ї®¤Є«о票п. Џ®¤ Linux , ўЁавг «м п Ї ¬пвм Є ¦¤®Ј® Їа®жҐбб а §ЎЁв бва Ёжл. Љ ¦¤л© Їа®жҐбб Ї®¤¤Ґа¦Ёў Ґв ®в®Ўа ¦ҐЁҐ ҐЈ® ¤аҐб®ў Ї ¬пвЁ нвЁ бва Ёжл ўЁавг «м®© Ї ¬пвЁ, Є®в®алҐ б®¤Ґа¦ в д ЄвЁзҐбЄЁҐ ¤ лҐ. € е®вп Є ¦¤л© Їа®жҐбб Ё¬ҐҐв б®ЎбвўҐлҐ ¤аҐб , ®в®Ўа ¦ҐЁп ¬®ЈЁе Їа®жҐбб®ў ¬®Јгв гЄ §лў вм ®¤г Ё вг ¦Ґ бва Ёжг, а §аҐи п б®ў¬Ґб⮥ ЁбЇ®«м§®ў ЁҐ Ї ¬пвЁ.
‚뤥«ҐЁҐ ®ў®Ј® ᥣ¬Ґв ®ЎйҐ© Ї ¬пвЁ ЇаЁў®¤Ёв Є б®§¤ Ёо бва Ёжл ўЁавг «м®© Ї ¬пвЁ. Џ®бЄ®«мЄг ўбҐ Їа®жҐббл ¦Ґ« ов ®Ўа вЁвмбп Є ®¤®¬г Ё ⮬㠦Ґ ®ЎйҐ¬г ᥣ¬Ґвг, в® в®«мЄ® ®¤Ё Їа®жҐбб ¤®«¦Ґ ўл¤Ґ«Ёвм ®ўл© ®ЎйЁ© ᥣ¬Ґв. ‚뤥«ҐЁҐ бгйҐбвўго饣® ᥣ¬Ґв Ґ б®§¤ Ґв ®ўле бва Ёж, ў®§ўа й Ґв Ё¤ҐвЁдЁЄ в®а ¤«п бгйҐбвўгойЁе. —в®Ўл а §аҐиЁвм Їа®жҐббг ЁбЇ®«м§®ў вм ᥣ¬Ґв ®ЎйҐ© Ї ¬пвЁ, Їа®жҐбб Ї®¤Є«оз Ґв ᥣ¬Ґв, Є®в®ал© ¤®Ў ў«пҐв ®в®Ўа ¦ҐЁҐ ҐЈ® ўЁавг «м®© Ї ¬пвЁ ®ЎйҐ¤®бвгЇлҐ бва Ёжл ᥣ¬Ґв . Љ®Ј¤ а Ў®в б ᥣ¬Ґв®¬ § ўҐаиҐ , нвЁ ®в®Ўа ¦ҐЁп г¤ «повбп. Љ®Ј¤ Ё ®¤Ё Ё§ Їа®жҐбб®ў Ґ е®зҐв ®Ўа й вмбп Є ᥣ¬Ґв ¬ ®ЎйҐ© Ї ¬пвЁ, Є Є®©-в® ®¤Ё Їа®жҐбб ¤®«¦Ґ ®бў®Ў®¤Ёвм бва Ёжл ўЁавг «м®© Ї ¬пвЁ. ‚ᥠᥣ¬Ґвл ®ЎйҐ© Ї ¬пвЁ ўл¤Ґ«повбп Ї®бва Ёз® Ё ®ЄагЈ«повбп ¤® а §¬Ґа бва Ёжл бЁб⥬л, Є®в®ал© пў«пҐвбп зЁб«®¬ Ў ©в®ў ў бва ЁжҐ Ї ¬пвЁ. Ќ бЁб⥬ е Linux , а §¬Ґа бва Ёжл а ўҐ 4 ЉЃ, ® ўл ¤®«¦л Ї®«гзЁвм нв® § 票Ґ, ўл§лў п дгЄжЁо getpagesize .
‚뤥«ҐЁҐ
Џа®жҐбб ўл¤Ґ«пҐв ᥣ¬Ґв ®ЎйҐ© Ї ¬пвЁ, ЁбЇ®«м§гп shmget (» SHared Memory GET «). …Ј® ЇҐаўл© Ї а ¬Ґва — 楫®зЁб«Ґл© Є«оз, Є®в®ал© ®ЇаҐ¤Ґ«пҐв, Є Є®© ᥣ¬Ґв б®§¤ вм. ЌҐбўп§ лҐ Їа®жҐббл ¬®Јгв ®Ўа й вмбп Є ®¤®¬г Ё ⮬㠦Ґ ᥣ¬Ґвг, ЁбЇ®«м§гп ®¤® Ё в® ¦Ґ Є«о祢®Ґ § 票Ґ. Љ ᮦ «ҐЁо, ¤агЈЁҐ Їа®жҐббл, ў®§¬®¦®, в Є¦Ґ ўлЎа «Ё в®в ¦Ґ б ¬л© Є«оз, зв® ¬®¦Ґв ЇаЁўҐбвЁ Є Є®д«ЁЄвг. €бЇ®«м§гп бЇҐжЁ «мго Є®бв вг IPC_PRIVATE Є Є Є«о祢®Ґ § 票Ґ, Ј а вЁагҐвбп, зв® б®§¤ бвбп б®ўҐа襮 ®ўл© ᥣ¬Ґв Ї ¬пвЁ.
…Ј® ўв®а®© Ї а ¬Ґва ®ЇаҐ¤Ґ«пҐв зЁб«® Ў ©в®ў ў ᥣ¬ҐвҐ. Џ®бЄ®«мЄг ᥣ¬Ґвл ўл¤Ґ«повбп Ї®бва Ёз®, зЁб«® д ЄвЁзҐбЄЁ ўл¤Ґ«Ґле Ў ©в ®ЄагЈ«пҐвбп ¤® а §¬Ґа бва Ёжл.
’аҐвЁ© Ї а ¬Ґва — Ї®а §а冷Ґ ¤ў®Ёз®Ґ Ё«Ё § 票© д« ¦Є , Є®в®алҐ ®ЇаҐ¤Ґ«пов ®ЇжЁЁ Є shmget . ‡ 票п д« ¦Є ўЄ«оз ов в ЄЁҐ Ї а ¬Ґвал:
- IPC_CREAT — нв®в д« ¦®Є гЄ §лў Ґв, зв® ¤®«¦Ґ Ўлвм б®§¤ ®ўл© ᥣ¬Ґв. ќв® а §аҐи Ґв б®§¤ ў вм ®ўл© ᥣ¬Ґв, ®ЇаҐ¤Ґ«пп Є«оз.
- IPC_EXCL — нв®в д« ¦®Є, Є®в®ал© ўбҐЈ¤ ЁбЇ®«м§гҐвбп б IPC_CREAT ,§ бв ў«пҐв shmget ў®§ўа й вм ®иЁЎЄг, Ґб«Ё ᥣ¬Ґвл© Є«оз ®ЇаҐ¤Ґ«Ґ, Є Є 㦥 бгйҐбвўгойЁ©. ќв® ЁбЇ®«м§гҐвбп ¤«п ўл¤Ґ«ҐЁп «нЄбЄ«о§Ёў®Ј®» ᥣ¬Ґв . …б«Ё нв®в д« ¦®Є Ґ ¤ Ґвбп, Ё Є«оз бгйҐбвўго饣® ᥣ¬Ґв ЁбЇ®«м§гҐвбп, shmget ў®§ўа й Ґв бгйҐбвўгойЁ© ᥣ¬Ґв ў¬Ґбв® в®Ј®, зв®Ўл б®§¤ вм ®ўл©.
- Mode flags — нв® § 票Ґ Ё§ 9 ЎЁв®ў, гЄ §лў ойЁе Їа ў , ЇаҐ¤®бв ў«ҐлҐ ў« ¤Ґ«мжг, ЈагЇЇҐ, Ё ¬Ёаг(®бв «мл¬), гЇа ў«ҐЁҐ ¤®бвгЇ®¬ Є ᥣ¬Ґвг. ЃЁвл ўлЇ®«ҐЁп ЁЈ®аЁаговбп. Џа®бв®© бЇ®б®Ў ®ЇаҐ¤Ґ«Ёвм Їа ў б®бв®Ёв ў ⮬, зв®Ўл ЁбЇ®«м§®ў вм Є®бв вл, ®ЇаҐ¤Ґ«ҐлҐ ў Ё ®ЇЁб лҐ ў а §¤Ґ«Ґ 2 stat man-бва Ёж . Ќ ЇаЁ¬Ґа, S_IRUSR Ё S_IWUSR ®ЇаҐ¤Ґ«пов Їа ў з⥨Ґ Ё § ЇЁбм ¤«п ў« ¤Ґ«мж ᥣ¬Ґв ®ЎйҐ© Ї ¬пвЁ, S_IROTH Ё S_IWOTH ®ЇаҐ¤Ґ«пов Їа ў з⥨Ґ Ё § ЇЁбм ¤«п ¤агЈЁе.
Ќ ЇаЁ¬Ґа, нв®в ўл§®ў shmget б®§¤ Ґв ®ўл© ᥣ¬Ґв ®ЎйҐ© Ї ¬пвЁ (Ё«Ё ®Ўа й Ґвбп Є бгйҐбвўго饬г, Ґб«Ё shm_key 㦥 ЁбЇ®«м§гҐвбп), б Їа ў ¬Ё зЁвҐЁҐ Ё § ЇЁбм ў« ¤Ґ«м楬, ® Ґ ¤агЈЁ¬Ё Ї®«м§®ў ⥫ﬨ.
…б«Ё ўл§®ў гбЇҐиҐ, shmget ў®§ўа й Ґв Ё¤ҐвЁдЁЄ в®а ᥣ¬Ґв . …б«Ё ᥣ¬Ґв ®ЎйҐ© Ї ¬п⨠㦥 бгйҐбвўгҐв, в® Їа ў ¤®бвгЇ Їа®ўҐаҐл, Ё Їа®ўҐаЄ Ј а вЁагҐв, з⮠ᥣ¬Ґв Ґ ®в¬ҐзҐ ¤«п г¤ «ҐЁп.
Џ®¤Є«о票Ґ Ё ®вЄ«о票Ґ
—в®Ўл ᤥ« вм ᥣ¬Ґв ®ЎйҐ© Ї ¬пвЁ ¤®бвгЇл¬, Їа®жҐбб ¤®«¦Ґ ЁбЇ®«м§®ў вм shmat , » SHared Memory ATtach » ЏҐаҐ¤ ©вҐ Ґ¬г Ё¤ҐвЁдЁЄ в®а ᥣ¬Ґв ®ЎйҐ© Ї ¬пвЁ SHMID , ў®§ўа йҐл© shmget . ‚в®а®© Ї а ¬Ґва — гЄ § ⥫м, Є®в®ал© ®ЇаҐ¤Ґ«пҐв, Ј¤Ґ ў ¤аҐб®¬ Їа®бва б⢥ ў 襣® Їа®жҐбб ўл е®вЁвҐ ®в®Ўа §Ёвм ®Ўйго Ї ¬пвм; Ґб«Ё ўл ЇҐаҐ¤ ¤ЁвҐ NULL , в® Linux ўлЎҐаҐв «оЎ®© ¤®бвгЇл© ¤аҐб. ’аҐвЁ© Ї а ¬Ґва — д« ¦®Є, Є®в®ал© ¬®¦Ґв ўЄ«озЁвм б«Ґ¤гойЁҐ Ї а ¬Ґвал:
- SHM_RND гЄ §лў Ґв, зв® ¤аҐб, ®ЇаҐ¤Ґ«Ґл© ¤«п ўв®а®Ј® Ї а ¬Ґва , ¤®«¦Ґ Ўлвм ®ЄагЈ«Ґ § ¤ Є ¬®¦ЁвҐ«о а §¬Ґа бва Ёжл. …б«Ё ‚л Ґ ®ЇаҐ¤Ґ«пҐвҐ нв®в д« ¦®Є, ‚л ¤®«¦л ўла®ўпвм Ја Ёжг бва Ёжл ўв®а®© Ї а ¬Ґва ЇҐаҐ¤ ў Ґ¬л© shmat б ¬®бв®п⥫м®.
- SHM_RDONLY гЄ §лў Ґв, з⮠ᥣ¬Ґв Ўг¤Ґв ¤®бвгЇҐ в®«мЄ® ¤«п з⥨п.
- ЃЁвл Їа ў ¤®бв Ї в ЄЁҐ ¦Ґ Є Є Ё ¤«п д ©«®ў.
…б«Ё ўл§®ў гбЇҐиҐ, ® ўҐаҐв ¤аҐб Ї®¤Є«о祮Ј® ®ЎйҐЈ® ᥣ¬Ґв . Џ®в®¬ЄЁ, б®§¤ лҐ ўл§®ў ¬Ё fork , б«Ґ¤гов Ї®¤Є«озҐлҐ ®ЎйЁҐ ᥣ¬Ґвл; ®Ё ¬®Јгв ®вЄ«озЁвм ᥣ¬Ґвл ®ЎйҐ© Ї ¬пвЁ, Ґб«Ё § е®впв.
Љ®Ј¤ ўл § Є®зЁ«Ё а Ў®вг б ᥣ¬Ґв®¬ ®ЎйҐ© Ї ¬пвЁ, ᥣ¬Ґв ¤®«¦Ґ Ўлвм ®вЄ«озҐ, ЁбЇ®«м§гп shmdt (» SHared Memory DeTach «). ЏҐаҐ¤ ©вҐ Ґ¬г ¤аҐб, ў®§ўа йҐл© shmat . …б«Ё ᥣ¬Ґв Ўл« ®бў®Ў®¦¤Ґ, Ё Ў®«миҐ Ґ ®бв «®бм Їа®жҐбб®ў, ЁбЇ®«м§гойЁе ҐЈ®, ® Ўг¤Ґв г¤ «Ґ. ‚л§®ўл exit Ё exec ўв®¬ вЁзҐбЄЁ ®вЄ«оз ов ᥣ¬Ґвл.
“Їа ў«ҐЁҐ Ё ®бў®Ў®¦¤ҐЁҐ ®ЎйҐ© Ї ¬пвЁ
Shmctl (» SHared Memory ConTrol «) ўл§®ў ў®§ўа й Ґв Ёд®а¬ жЁо ®Ў ᥣ¬ҐвҐ ®ЎйҐ© Ї ¬пвЁ Ё ¬®¦Ґв Ё§¬ҐЁвм ҐЈ®.ЏҐаўл© Ї а ¬Ґва — Ё¤ҐвЁдЁЄ в®а ᥣ¬Ґв ®ЎйҐ© Ї ¬пвЁ.
—в®Ўл Ї®«гзЁвм Ёд®а¬ жЁо ® ᥣ¬ҐвҐ ®ЎйҐ© Ї ¬пвЁ, ЇҐаҐ¤ ©вҐ IPC_STAT Є Є ўв®а®© Ї а ¬Ґва Ё гЄ § ⥫м struct shmid_ds .
—в®Ўл г¤ «Ёвм ᥣ¬Ґв, ЇҐаҐ¤ ©вҐ IPC_RMID Є Є ўв®а®© Ї а ¬Ґва, Ё ЇҐаҐ¤ ©вҐ NULL Є Є ваҐвЁ© Ї а ¬Ґва. ‘ҐЈ¬Ґв г¤ «Ґ, Є®Ј¤ Ї®б«Ґ¤Ё© Їа®жҐбб, Є®в®ал© Ї®¤Є«озЁ« ҐЈ®, ®вЄ«озЁв ҐЈ®.
Љ ¦¤л© ᥣ¬Ґв ®ЎйҐ© Ї ¬пвЁ ¤®«¦Ґ Ўлвм пў® ®бў®Ў®¦¤Ґ, ЁбЇ®«м§гп shmctl , Є®Ј¤ ‚л § Є®зЁ«Ё а Ў®вг б Ё¬, зв®Ўл Ё§ЎҐ¦ вм аг襨Ґ бЁб⥬®Ј® ЇаҐ¤Ґ« а §¬Ґа Є®«ЁзҐб⢠ᥣ¬Ґв®ў ®ЎйҐ© Ї ¬пвЁ. ‚л§®ўл exit Ё exec ®вЄ«оз в ᥣ¬Ґвл Ї ¬пвЁ, ® Ґ ®бў®Ў®¦¤пв Ёе.
‘¬®ваЁ shmctl man-бва Ёжг ¤«п ®ЇЁб Ёп ¤агЈЁе ®ЇҐа жЁ©, Є®в®алҐ ¬®¦® ўлЇ®«пвм б ᥣ¬Ґв ¬Ё ®ЎйҐ© Ї ¬пвЁ.
ЏаЁ¬Ґа Їа®Ја ¬¬л
Џа®Ја ¬¬ «ЁбвЁЈ 5.1 Ё««обваЁагҐв ЁбЇ®«м§®ў ЁҐ ®ЎйҐ© Ї ¬пвЁ.
Љ®¬ ¤ ipcs ЇаҐ¤®бв ў«пҐв Ёд®а¬ жЁо ®в®бЁвҐ«м® б।бвў ў§ Ё¬®¤Ґ©бвўЁп Їа®жҐбб®ў, ўЄ«оз п ®ЎйЁҐ ᥣ¬Ґвл Ї ¬пвЁ. €бЇ®«м§г©вҐ д« Ј -m , зв®Ўл Ї®«гзЁвм Ёд®а¬ жЁо ®Ў ®ЎйҐ© Ї ¬пвЁ. Ќ ЇаЁ¬Ґа, нв®в Є®¤ Ё««обваЁагҐв з⮠ᥣ¬Ґв ®ЎйҐ© Ї ¬пвЁ, Їа®г¬Ґа®ў л© 1627649, 室Ёвбп ў ЁбЇ®«м§®ў ЁЁ:
…б«Ё нв®в ᥣ¬Ґв Ї ¬пвЁ Ўл« ®иЁЎ®з® ®бв ў«Ґ Їа®Ја ¬¬®©, ўл ¬®¦ҐвҐ ЁбЇ®«м§®ў вм Є®¬ ¤г ipcrm , зв®Ўл г¤ «Ёвм ҐЈ®.
‡ Ё Їа®вЁў
CҐЈ¬Ґвл ®ЎйҐ© Ї ¬пвЁ Ї®§ў®«пов ®бгйҐбвў«пвм Ўлбваго ¤ўг Їа ў«Ґго бўп§м б।Ё «оЎ®Ј® зЁб« Їа®жҐбб®ў. Љ ¦¤л© Ї®«м§®ў вҐ«м ¬®¦Ґв Ё зЁв вм Ё ЇЁб вм, ® Їа®Ја ¬¬ ¤®«¦ гбв ®ўЁвм Ё б«Ґ¤®ў вм ҐЄ®в®а®¬г Їа®в®Є®«г ¤«п в®Ј®, зв®Ўл ЇаҐ¤®вўа вЁвм гб«®ўЁп Ј®ЄЁ вЁЇ ЇҐаҐ§ ЇЁбЁ Ёд®а¬ жЁЁ ЇаҐ¦¤Ґ, 祬 ® Їа®зЁв Ґвбп. Љ ᮦ «ҐЁо, Linux бва®Ј® Ґ Ј а вЁагҐв нЄбЄ«о§Ёўл© ¤®бвгЇ ¤ ¦Ґ Ґб«Ё ўл б®§¤ ¤ЁвҐ ®ўл© ®ЎйЁ© ᥣ¬Ґв б IPC_PRIVATE .
Ља®¬Ґ в®Ј®, ¤«п в®Ј® зв®Ў ҐбЄ®«мЄ® Їа®жҐбб®ў ¬®Ј«Ё ЁбЇ®«м§®ў вм ®Ўйго Ї ¬пвм, ®Ё ¤®«¦л ЇаЁпвм ¬Ґал, зв®Ўл Ґ ЁбЇ®«м§®ў вм ®¤Ё Ё в®в ¦Ґ Є«оз.
Источник
Разделяемая память linux shmget
Если в shmflg одновременно указаны IPC_CREAT и IPC_EXCL и для значения key уже существует общий сегмент памяти, то вызов shmget() завершается с ошибкой и errno присваивается EEXIST (такой же результат как с O_CREAT | O_EXCL у open(2)).
Значение shmflg составляется из следующих флагов:
IPC_CREAT Служит для создания нового сегмента. Если этого флага нет, то вызов shmget() будет искать сегмент, соответствующий key, и затем проверит, имеет ли пользователь права на доступ к сегменту. IPC_EXCL Этот флаг используется совместно с IPC_CREAT для того, чтобы этот вызов создал сегмент. Если сегмент уже существует, то вызов завершается с ошибкой. SHM_HUGETLB (начиная с Linux 2.6) Выделять сегмент используя «огромные страницы». Дополнительную информацию смотрите в файле исходного кода ядра Linux Documentation/vm/hugetlbpage.txt. SHM_HUGE_2MB, SHM_HUGE_1GB (начиная с Linux 3.8) Используется вместе с SHM_HUGETLB для выбора других размеров страниц hugetlb (2МБ и 1 МБ, соответственно) в системах, которые поддерживают несколько размеров страниц hugetlb.
Вообще, желаемые размер огромной страницы можно настроить закодировав логарифмом по основанию 2 желаемый размер страницы в шести битах смещения SHM_HUGE_SHIFT. Таким образом, приведённые выше константы определяются так:
Дополнительную информацию о схожих по имени константах смотрите в mmap(2).
SHM_NORESERVE (начиная с Linux 2.6.15) Этот флаг нужен для того же, что и флаг MAP_NORESERVE у mmap(2). Он указывает не резервировать место в пространстве подкачки для этого сегмента. Операцией резервирования места в пространстве подкачки гарантируется, что сегмент можно изменить. Если место не резервировать, то при записи можно получить сигнал SIGSEGV, если кончится физическая память. Смотрите также обсуждение файла /proc/sys/vm/overcommit_memory в proc(5).
В дополнении к перечисленным выше флагам в младших 9 битах shmflg задаются права для владельца, группы и всех остальных. Формат значения битов совпадает с аргументом mode вызова open(2). В данный момент бит выполнения системой не используются.
Если создаётся новый общий сегмент памяти, то его содержимое инициализируется нулями, а соответствующая ему структура данных shmid_ds (см. shmctl(2)) следующим образом:
Полям shm_perm.cuid и shm_perm.uid присваиваются значения эффективного идентификатора пользователя вызывающего процесса. Полям shm_perm.cgid и shm_perm.gid присваиваются значения эффективного идентификатора группы вызывающего процесса. Младшим 9 битам shm_perm.mode присваивается значение младших 9 бит shmflg. Полю shm_segsz присваивается значение size. Полям shm_lpid, shm_nattch, shm_atime и shm_dtime присваивается значение 0. Полю shm_ctime присваивается значение текущего времени.
Если общий сегмент памяти уже существует, то проверяются права доступа к нему и не помечен ли он для удаления.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
ОШИБКИ
СООТВЕТСТВИЕ СТАНДАРТАМ
SHM_HUGETLB и SHM_NORESERVE являются расширениями Linux.
ЗАМЕЧАНИЯ
IPC_PRIVATE — не поле флага, а тип key_t. Если key равно этому специальному значению, то системный вызов игнорирует всё кроме 9-ти младших битов shmflg и создаёт новый общий сегмент памяти.
Ограничения общей памяти
В Linux это ограничение можно прочитать и изменить через /proc/sys/kernel/shmmni. Начиная с 3.16, значение по умолчанию равно:
Эффект этого значения (которое подходит и для 32-разрядной, и для 64-разрядной системы) — не задать ограничение на выделения. Это значение, в отличии от ULONG_MAX, было выбрано в качестве значения по умолчанию, чтобы предотвратить некоторые случаи, когда старые приложения просто увеличивают существующий предел без начальной проверки его текущего значения. Такие приложения переполнили бы значение, если предел был равен ULONG_MAX.
В Linux 2.4 по Linux 3.15 значение по умолчанию этого ограничения было:
SHMMAX / PAGE_SIZE * (SHMMNI / 16)
Если SHMMAX и SHMMNI не изменены, то умножение результата этой формулы на размер страницы (для получения значения в байтах) даёт значение 8 ГБ — ограничение на общее количество памяти, используемой во всех общих сегментах памяти.
SHMMAX Максимальный размер общего сегмента памяти в байтах.
В Linux это ограничение можно прочитать и изменить через /proc/sys/kernel/shmmax. Начиная с 3.16, значение по умолчанию равно:
Эффект этого значения (которое подходит и для 32-разрядной, и для 64-разрядной системы) — не задать ограничение на выделения. Смотрите описание SHMALL о том, почему используется именно такое значение по умолчанию (а не ULONG_MAX).
В Linux 2.2 по Linux 3.15 значение по умолчанию этого ограничения было 0x2000000 (32МБ).
Так как невозможно отобразить только часть общего сегмента памяти, размер виртуальной памяти отличается от ограничения на максимальный размер подходящего сегмента: например, на i386 самые большие сегменты, которые можно отображать, имеют размер около 2.8ГБ, а на x86_64 — около 127ТБ.
SHMMIN Минимальный размер общего сегмента памяти в байтах в системе: зависит от реализации (в настоящий момент равно 1 байту, хотя на самом деле минимальный выделяемый размер равен PAGE_SIZE). SHMMNI Системный лимит на общее количество общих сегментов памяти. Начиная с Linux 2.2, значение по умолчанию равно 128; начиная с Linux 2.4, значение по умолчанию равно 4096.
В Linux это ограничение можно прочитать и изменить через /proc/sys/kernel/shmmni.
Реализацией не ограничивается максимальное количество общих сегментов памяти на процесс (SHMSEG).
Источник
Разделяемая память linux shmget
int shmget(key_t key , int size , int shmflg );
ОПИСАНИЕ
shmflg состоит из: IPC_CREAT служит для создания нового сегмента. Если этого флага нет, то функция shmget() будет искать сегмент, соответствующий ключу key и затем проверит, имеет ли пользователь права на доступ к сегменту. IPC_EXCL используется совместно с IPC_CREAT для того, чтобы не создавать существующий сегмент заново. mode_flags (младшие 9 битов) указывают на права хозяина, группы и др. В данный момент права системой не используются.
Если создается новый сегмент, то права доступа копируются из shmflg в shm_perm , являющийся членом структуры shmid_ds , которая определяет сегмент. Структура shmid_ds имеет такую форму:
When creating a new shared memory segment, the system call initializes the shmid_ds data structure
При создании нового сегмента разделяемой памяти системный вызов инициализирует структуру данных shmid_ds следующим образом: устанавливаемые значения shm_perm.cuid и shm_perm.uid становятся равными значению идентификатора эффективного пользователя вызывающего процесса. shm_perm.cgid и shm_perm.gid устанавливаются равными идентификатору эффективной группы пользователей вызывающего процесса. Младшим 9-и битам shm_perm.mode присваивается значение младших 9-и битов shmflg . shm_segsz присваивается значение size. Устанавливаемое значение shm_lpid , shm_nattch , shm_atime и shm_dtime становится равным нулю. shm_ctime устанавливается на текущее время.
Если сегмент уже существет, то права доступа подтверждаются, а проверка производится для того, чтобы убедиться, что сегмент не помечен на удаление.
СИСТЕМНЫЕ ВЫЗОВЫ
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
НАЙДЕННЫЕ ОШИБКИ
ЗАМЕЧАНИЯ
Ниже приведены ограничения для сегментов разделяемой памяти, которые могут отразиться на вызове shmget . SHMALL Максимальное количество страниц разделяемой памяти зависит от настроек системы. SHMMAX Максимальный размер сегмента в байтах зависит от системных настроек (обычно это 4M). SHMMIN Минимальный размер сегмента в байтах зависит от системных настроек (обычно он равен одному байту, поэтому PAGE_SIZE яляется минимальным эффективным размером). SHMMNI Максимальное количество сегментов разделяемой памяти зависит от настроек системы (сейчас оно равно 4096, было 128 до версии Linux 2.3.99).
От настроек не зависит количество сегментов, подключаемых процессом ( SHMSEG ).
Источник