- ЋЎй п (б®ў¬Ґбв® ЁбЇ®«м§гҐ¬ п) Ї ¬пвм
- Ѓлбв஥ «®Є «м®Ґ ў§ Ё¬®¤Ґ©бвўЁҐ
- Њ®¤Ґ«м Ї ¬пвЁ
- ‚뤥«ҐЁҐ
- Џ®¤Є«о票Ґ Ё ®вЄ«о票Ґ
- “Їа ў«ҐЁҐ Ё ®бў®Ў®¦¤ҐЁҐ ®ЎйҐ© Ї ¬пвЁ
- ЏаЁ¬Ґа Їа®Ја ¬¬л
- ‡ Ё Їа®вЁў
- Разделяемая память, семафоры и очереди сообщений в ОС Linux
- Разделяемая память
- Разделяемая память, очереди сообщений и семафоры (System V IPC)
- Разделяемая память (System V IPC)
- Разделяемая память (BSD)
- Разделяемая память (POSIX)
- Семафоры и очереди сообщений
- Семафоры (System V IPC)
ЋЎй п (б®ў¬Ґбв® ЁбЇ®«м§гҐ¬ п) Ї ¬пвм
Ћ¤Ё Ё§ б ¬ле Їа®бвле ¬Ґв®¤®ў ¬Ґ¦Їа®жҐбб®ў®Ј® ў§ Ё¬®¤Ґ©бвўЁп — ЁбЇ®«м§®ў вм ®Ўйго Ї ¬пвм. ЋЎй п Ї ¬пвм Ї®§ў®«пҐв ¤ўг¬ Ё«Ё Ў®«ҐҐ Їа®жҐбб ¬ ®Ўа й вмбп Є ®¤®© Ё в®© ¦Ґ ®Ў« бвЁ Ї ¬пвЁ, Є Є Ўг¤в® ®Ё ўбҐ ўл§лў «Ё 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
Разделяемая память
Каналы и сокеты являются удобными средствами обмена информацией между процессами, но их использование при интенсивном обмене или обмене объемными данными приводит к значительным накладными расходам. Разделяемая память является специализированным средством взаимодействия, имеющим минимальные издержки использования.
В листинге ниже при помощи команды ipcs показаны созданные в системе сегменты разделяемой памяти, массивы семафоров и очереди сообщений — средства межпроцессного взаимодействия svipc, «унаследованные» Linux от W:[UNIX System V].
Экземпляры средств System VIPC идентифицируются при помощи глобально уникальных ключей, или локальных идентификаторов shmid (shared memory identifier), semid (semaphore identifier) и msqid (message queue identifier), и сродни файлам имеют владельцев и права доступа.
Идентификаторы IPC (сродни индексным и файловым дескрипторам файлов) изменяются при пересоздаиии/переоткрытии экземпляра, а ключи IPC (подобно именам файлов) — нет.
Разделяемая память, очереди сообщений и семафоры (System V IPC)
$ ipcs
—— Сегменты совм. исп. памяти ——
ключ shmid владелец права байты nattch состояние
0x00000000 11567165 fitz 600 393216 2 назначение
0X06000000 10944514 fitz 700 1694060 2 назначение
6×06000606 11206666 fitz 600 393216 2 назначение
—— Массивы семафоров ——
ключ semid владелец права nsems
—— Очереди сообщений ——
ключ msqid владелец права исп. байты сообщения
Разделяемая память System VIPC реализуется ядром на основе механизма страничного отображения при помощи совместного использования страничных кадров страницами разных процессов.
При помощи системного вызова shmget один из взаимодействующих процессов создает сегмент памяти, состоящий из страничных кадров без отображения на какой-либо файл. Впоследствии кадры этого сегмента при помощи системного вызова shmat (shared memory attach) отображаются на страницы всех взаимодействующих процессов, за счет чего эти процессы и используют выделенную память совместно.
Иллюстрация применения разделяемой памяти приведена в листинге ниже, где сегмент разделяемой памяти с идентификатором 842138010 был создан (cpid, creator pid) процессом PID=8636 программы Х-клиента skype, а последнее обращение к нему (lpid, last operation pid) осуществлялось процессом PID=1461 программы X-сервера Xorg.
В данном конкретном случае X-клиент и X-сервер для эффективного обмена значительными объемами растровых изображений используют расширение X-протокола W: [MIT-SHM], основанное на использовании разделяемой памяти.
Разделяемая память (System V IPC)
—— Shared Memory Creator/Last-op PIDs ——
shmid владелец cpid ipid
11567105 fitz 16738 31382
10944514 fitz 4207 1461
8421380 fitz 8636 1461
$ dc -e 16ol0i8421380p
$ ps -fp 16738,31382,4207,1461,8636
UID PID PPID C STIME TTY TIME CMD
root 1461 1410 0 Feb22 tty7 01:23:02 /usr/bin/X :0 -auth /var/run/lig
fitz 4207 1 0 Feb26 ? 00:05:52 /usr/lib/virtualbox/VirtualBox
fitz 8636 1 1 Feb26 ? 00:39:15 skype
fitz 16738 1 1 Feb27 ? 00:20:35 /usr/lib/chromium-browser/chromi
99e23000 2176K rw-s- [ shmld=0x838005 ]
9a043000 3828K rw-s- [ shmld=0x830006 ]
9cc2f000 484K rw-s- [ shnld=0x828007 ]
9f541000 384K rw-s- [ shnlct=0x808004 ]
bf905000 132K rw— [ stack ]
total 632708K
$ sudo pmap
1461: /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch …
b5a5a000 384K rw-s- [ shmid=0xb28003 ]
b5abaeoe 384K rw-s- [ shmid=0x808004 ]
b5b3e000 384K rw-s- [ shmid=0xab000a ]
bfcd9000 144K rw— [ stack ]
total 107220K
Анализ карт памяти взаимодействующих процессов при помощи команды pmap подтверждает, что Страничные кадры сегмента разделяемой s памяти 842138016 (80800416) были отображены на страницы обоих взаимодействующих процессов по разным виртуальным адресам.
Еще один вариант реализации разделяемой памяти, пришедший в Linux из W:[BSD], основывается на «разделяемом» (shared) отображении одного файла в память разных процессов при помощи «штатного» механизма mmap. В листинге ниже показан типичный пример использования совместного отображения файла /var/cache/nscd/hosts в память процесса PID = 14566, nscd (name service cache daemon) и многих других процессов, пользующихся его услугами.
Служба имен (name service) предназначена для извлечения свойств различных каталогизируемых сущностей по их имени. Например, по имени интернет-узла из каталога системы доменных имен DNS служба имен извлекает IP-адрес этого узла, и наоборот, по IP-адресу — имя.
При большом количестве повторяющихся запросов к службе имен в течение промежутка времени, в который изменения запрашиваемой информации в соответствующем каталоге объектов не происходит, «бесполезные» повторные запросы к каталогу могут быть сокращены при помощи сохранения и использования предыдущих ответов (кэширования), чем и занимается демон nscd.
В частности, ответы из DNS сохраняются, процессом nscd в страничных кадрах памяти отображенного файла /var/cache/nscd/hosts, а остальные процессы совместно их используют, отображая тот же файл в страницы своей памяти.
Разделяемая память (BSD)
$ sudo fuser -v /var/cache/nscd/hosts
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/var/cache/nscd/hosts:
root 14566 F…m nscd
fitz 16724 ….m ubuntu-geoip-pr
fitz 16738 ….m chromium-browse
fitz 15895 …m unity-scope-vid
fitz 8636 …m skype
$ sudo pmap 14566
14566: /usr/sbin/nscd
b1240000 32768K rw-s- /var/cache/nscd/hosts
bf8c5000 132K rw— [stack ]
total 153556K
$ pmap 8636
8636: skype
ab21e000 212K r—s- /var/cache/nscd/hosts
bf905000 132K rw— [ stack ]
total 632708K
Организация межпроцессного взаимодействия при помощи разделяемой памяти на основе «штатного» механизма отображения файлов в память процессов имеет один значительный недостаток. Так как изменяемые страничные кадры такого общего сегмента памяти требуют сохранения в дисковый файл, то производительность взаимодействия ограничивается операциями дискового ввода-вывода, а не скоростью работы оперативной памяти.
В примере с демоном nscd этого вполне достаточно, тем более что создаваемый им кэш все равно должен сохраняться при перезагрузках.
В случаях, когда взаимодействие процессов требует максимальной производительности, разделяемая память на основе отображения дисковых файлов в память является не лучшим механизмом. Элегантное решение данной проблемы используется в Linux-реализации разделяемой памяти стандарта POSIX, что проиллюстрировано в листинге ниже.
Псевдофайловая система tmpfs специально придумана для «временного» размещения файлов непосредственно в оперативной памяти, что в совокупности со «штатным» механизмом их отображения в память взаимодействующих процессов и дает желаемые характеристики производительности.
Разделяемая память (POSIX)
$ find mnt /dev/shn
TARGET SOURCE FSTYPE OPTIONS
/rw/shm tmpfs rw, nosuid, nodev, relatime
$ ls -l /dev/shm
lrwxrwxrwx 1 root root 8 нояб 19 09:50 /dev/shn -> /run/shm
$ sudo fuser -v /dev/shm/*
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/run/shm/pulse-shm-2012073053:
fitz 16738 ….m chromium-browse
/run/shm/pulse-shm-2024923292:
fitz 2907 ….m pulseaudio
fitz 8636 ….m skype
$ pmap 8636
8636: skype
93cee000 65540K rw-s- /run/shm/pulse-shm-2024923292
bf905000 132K rw— [ stack ]
total 632708K
$ pmap 2907
2907: /usr/bin/pulseaudio — start — log-target=syslog
ad4ff000 65540K r—s- /run/shm/pulse-shm-2024923292
ad5a5000 64K rw-s- /dev/snd/pcmC0D0c
b15ес000 64K rw-s- /dev/snd/pcnC0O0p
bfel5000 132K rw— [ stack ]
total 167156K
В примере из листинга выше показано, как разделяемую память POSIX использует звуковая служба pulseaudio, позволяющая осуществлять совместный (мультиплексированный) доступ приложений к устройствам аудиоввода и аудиовывода /dev/snd/*.
Семафоры и очереди сообщений
Разделяемая память требует синхронизации действий процессов из-за эффекта гонки (race), возникающего между конкурентными, выполняющимися параллельно процессами. Для синхронизации процессов при совместном доступе к разделяемой памяти и прочим разделяемым ресурсам предназначено еще одно специализированное средство их взаимодействия — семафоры.
В большинстве случаев семафорами System V или POSIX пользуются многопроцессные сервисы, такие как, например, SQL-сервер postgres, который синхронизует доступ своих параллельных процессов к сегментам их общей памяти.
Семафоры (System V IPC)
——- Сегменты совм. исп. памяти ——
ключ shmid владелец права байты nattch состояние
0х0052е2с1 378241026 postgres 600 30482432 4
—— Массивы семафоров ——
ключ shmid владелец права nsems
0х0052е2с1 1081344 postgres 600 17
0х0052е2с2 1114113 postgres 600 17
0х0052е2сЗ 1146882 postgres 600 17
0х0052е2с4 1179651 postgres 600 17
0х0052е2с5 1212420 postgres 600 17
0х0052е2с6 1245189 postgres 600 17
0х0052е2с7 1277958 postgres 600 17
Очереди сообщений являются средствами взаимодействия между процессами, реализующими еще один интерфейс передачи сообщений (message passing inerface), подобно каналам и сокетам. По своей природе они похожи на дейтаграммный SOCK_DGRAM режим передачи поверх именованных локальных сокетов unix.
Основное отличие очередей сообщений от сокетов заключается в том, что время их жизни не ограничивается временем существования процессов, которые их создали. На практике очереди сообщений являются настолько малораспространенными, что их иллюстрация на среднестатистической инсталляции Linux практически невозможна.
Источник