- ЋЎй п (б®ў¬Ґбв® ЁбЇ®«м§гҐ¬ п) Ї ¬пвм
- Ѓлбв஥ «®Є «м®Ґ ў§ Ё¬®¤Ґ©бвўЁҐ
- Њ®¤Ґ«м Ї ¬пвЁ
- ‚뤥«ҐЁҐ
- Џ®¤Є«о票Ґ Ё ®вЄ«о票Ґ
- “Їа ў«ҐЁҐ Ё ®бў®Ў®¦¤ҐЁҐ ®ЎйҐ© Ї ¬пвЁ
- ЏаЁ¬Ґа Їа®Ја ¬¬л
- ‡ Ё Їа®вЁў
- Русские Блоги
- Несколько видов разделяемой памяти в Linux
- Использование общей памяти
- Отображение совместного использования памяти mmap
- Общая память XSI
- Общая память POSIX
- Изменить конфигурацию ядра с общей памятью
- Интеллектуальная рекомендация
- Пошаговая загрузка файла Spring MVC-09 (на основе файла загрузки клиента Servlet3.0 + Html5)
- Создайте многоканальное окно в приложениях Win32
- Путь к рефакторингу IOS-APP (3) Введение в модульное тестирование
- Tree——No.617 Merge Two Binary Trees
ЋЎй п (б®ў¬Ґбв® ЁбЇ®«м§гҐ¬ п) Ї ¬пвм
Ћ¤Ё Ё§ б ¬ле Їа®бвле ¬Ґв®¤®ў ¬Ґ¦Їа®жҐбб®ў®Ј® ў§ Ё¬®¤Ґ©бвўЁп — ЁбЇ®«м§®ў вм ®Ўйго Ї ¬пвм. ЋЎй п Ї ¬пвм Ї®§ў®«пҐв ¤ўг¬ Ё«Ё Ў®«ҐҐ Їа®жҐбб ¬ ®Ўа й вмбп Є ®¤®© Ё в®© ¦Ґ ®Ў« бвЁ Ї ¬пвЁ, Є Є Ўг¤в® ®Ё ўбҐ ўл§лў «Ё 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
Использование общей памяти
Есть много ограничений на использование файлов или каналов для межпроцессного взаимодействия. Каналы могут использоваться только между родительским процессом и дочерним процессом; из-за совместного использования файлов эффективность обработки ухудшается, а доступ к файловым дескрипторам не так удобен, как доступ к адресам памяти.
Система Linux предлагает три решения с общей памятью для программирования:
- Отображение совместного использования памяти mmap
- Общая память XSI
- Общая память POSIX
Отображение совместного использования памяти mmap
mmap изначально был функцией отображения памяти. Он может отображать файл в память и напрямую использовать адрес памяти для доступа к содержимому файла в программе.
Linux разделяет адресное пространство памяти между дочерним процессом и родительским процессом, полученным из системного вызова fork. Linux mmap реализует способ разделения адресов памяти между родительским и дочерним процессами.
- Родительский процесс устанавливает для параметра flags значение MAP_SHARED, чтобы применить к разделу памяти через mmap. Память может быть отображена в конкретный файл (fd) или нет (fd установлен в -1, флаг установлен в MAP_ANONYMOUS).
- Родительский процесс вызывает fork для порождения дочернего процесса, а затем адрес, возвращаемый mmap, может быть доступен в родительском и дочернем процессах, а память может использоваться совместно.
Использование этой разделяемой памяти обусловлено гонкой. Межпроцессное взаимодействие не только так же просто, как общение, но и позволяет иметь дело с аналогичными кодами критических секций. Здесь для обработки могут использоваться файловые блокировки. Однако использование файловых блокировок для разделяемой памяти не очень скоординировано. Помимо неудобств и неэффективности, блокировки файлов не позволяют выполнять более сложное управление процессами. Здесь семафоры, более сложный примитив управления синхронизацией процессов, могут использоваться для реализации связанных функций.
Следующая программа используется, чтобы помочь понять использование памяти mmap.
Подайте заявку на объем памяти почти 2 ГБ и установите для него значение 0. Наблюдайте за изменениями памяти.
Видно, что эта память была записана в разделяемую и буферную / кеш-память.
Одним из недостатков mmap является то, что разделяемая память может использоваться только между родительским процессом и дочерним процессом, порожденным fork, а другие процессы не могут получить адрес сегмента разделяемой памяти.
Общая память XSI
XSI — это набор стандартов интерфейса (X / Open System Interface), определенных организацией X / Open для UNIX. Реализация разделяемой памяти XSI в нижней части Linux существенно не отличается от mmap, за исключением метода использования.
Третий параметр shmget указывает флаг создания. Поддерживаемые флаги: IPC_CREAT, IPC_EXCL. Начиная с Linux 2.6, также была представлена разделяемая память, поддерживающая большие страницы, с пометкой: SHM_HUGETLB, SHM_HUGE_2MB и т. Д. Помимо создания новой общей памяти, shemget также может получить доступ к существующей памяти.В настоящее время вы можете установить для shmflg значение 0 и открыть его без каких-либо флагов.
Shmid типа int, возвращаемый shmget, похож на дескриптор файла. Обратите внимание, что это только похожая, а не та же реализация. Поэтому такие методы, как select, poll и epoll, не могут использоваться для управления общей памятью XSI. Для разделяемой памяти XSI ее ключ является глобально уникальным в системе, что удобно для других процессов, которые могут использовать тот же ключ для открытия того же раздела совместно используемой памяти для межпроцессного взаимодействия. Вместо этого дочерний процесс, сгенерированный fork, может напрямую обращаться к соответствующему сегменту разделяемой памяти через shmid. В этом суть ключа: глобальный уникальный идентификатор разделяемой памяти XSI в системе.
Ключ генерируется функцией ftok с использованием согласованного имени файла и proj_id. ftok не будет создавать файл, поэтому вы должны указать путь, который существует и доступен процессу. Кроме того, ftok не генерирует ключи на основе пути и имени файла файла. В конкретной реализации он использует номер inode указанного файла и номер устройства устройства, на котором находится файл. Следовательно, разные имена файлов также могут иметь один и тот же ключ (разные имена файлов указывают на один и тот же индекс, жесткую ссылку). Одно и то же имя файла не обязательно может иметь одинаковый ключ. Имя файла может быть удалено и перестроено. Такое поведение приведет к изменению inode.
В некоторых случаях также можно создать общую память без использования ключа. В это время вы можете заполнить IPC_PRIVATE в месте расположения ключевого параметра, чтобы ядро создавало новый раздел общей памяти без конфликтующего идентификатора сегмента общей памяти. Поскольку его можно только создать, бит флага должен иметь значение IPC_CREAT. Вы можете передать shmid дочернему процессу.
Когда получен shmid, shmat можно использовать для сопоставления адресов. После shmat доступ к сегменту разделяемой памяти можно получить, обратившись к возвращенному виртуальному адресу текущего процесса. Обратите внимание, что shmdt необходимо вызвать для отмены сопоставления после использования, иначе адрес виртуальной памяти может быть пропущен для длительно работающих программ. shmdt не может удалить сегмент общей памяти, а только удаляет взаимосвязь между сегментом общей памяти и виртуальным адресом процесса. Пока существует сегмент разделяемой памяти, соответствующий shmid, вы можете использовать shmat для продолжения сопоставления. Чтобы удалить сегмент общей памяти, вам необходимо использовать инструкцию shmctl IPC_RMID или использовать ipcrm в командной строке для удаления указанного идентификатора или ключа общей памяти.
shmctl также может просматривать и изменять связанные атрибуты общей памяти, которые можно просмотреть в man 2 shmctl. В системе вы также можете использовать команду ipcs -m для просмотра информации обо всей разделяемой памяти в системе.
В системе Linux при вызове shmget с использованием общей памяти XSI вы можете подать заявку на получение огромных страниц, установив параметр shmflg.
Преимущество использования большой страничной памяти заключается в повышении эффективности обработки ядра для управления памятью. Поскольку в случае того же объема памяти использование большой страничной памяти (2 МБ на страницу) значительно сократит количество операций управления страницами памяти, чем использование общих страниц памяти (4 КБ на страницу), тем самым уменьшив нагрузку на кеш для записей таблицы страниц памяти и кеш-памяти ЦП. Давление отображения адреса кэш-памяти. Но есть некоторые моменты, на которые следует обратить внимание:
- Память больших страниц не может быть заменена местами (SWAP)
- Неправильное использование может вызвать большие утечки памяти
- Для большой страничной памяти требуются права root
- Необходимо изменить конфигурацию системы
Если вы хотите подать заявку на большую страничную память ниже 2 ГБ, системе необходимо зарезервировать большую страничную память выше 2 ГБ.
2048 — это количество страниц, 2M на страницу.
Также нужно обратить внимание на ограничения разделяемой памяти:
/ proc / sys / kernel / shmall: ограничить общее количество страниц памяти, используемых системой в общей памяти. Страница обычно 4k (можно просмотреть через getconf PAGE_SIZE)
/ proc / sys / kernel / shmmax: ограничить максимальную длину сегмента разделяемой памяти в байтах.
/ proc / sys / kernel / shmmni: ограничить максимальное количество сегментов разделяемой памяти, которые может создать вся система.
Общая память POSIX
В общей памяти POSIX на самом деле нет ничего нового. По сути, это отображение mmap в совместное использование файлов, но оно отображает файлы в файловой системе tmpfs.
Tmpfs использует часть памяти в качестве файловой системы, которая обычно находится в каталоге / dev / shm.
Совместно используемая память POSIX, предоставляемая Linux, фактически создает файл в / dev / shm и сопоставляет его адрес памяти после mmap. Вы можете просмотреть использование через man shm_overview.
При компиляции этого кода вам необходимо указать библиотеку -lrt, которая является библиотекой Linux в реальном времени.
- Параметр SHMPATH в shm_open — это путь, который по умолчанию помещается в каталог / dev / shm системы. Это инкапсулируется shm_open, чтобы гарантировать, что файл должен находиться в tmpfs.
- Использование ftruncate для изменения размера разделяемой памяти фактически изменяет длину файла.
- shm_unlink на самом деле представляет собой пакет системных вызовов unlink. Если операция отмены связи не выполняется, файл всегда будет существовать в каталоге / dev / shm.
- Чтобы закрыть дескриптор разделяемой памяти, используйте close.
Изменить конфигурацию ядра с общей памятью
Максимальный размер (в байтах), который процесс может выделить для конца совместно используемой памяти в своем виртуальном адресном пространстве.
Количество сегментов разделяемой памяти в масштабе всей системы
Этот параметр устанавливает количество страниц, которые могут использоваться в общей памяти в рамках всей системы. Единица измерения — PAGE_SIZE (обычно 4096, можно передать getconf PAGE_SIZE получения).
выполненный ipcs -m Просмотреть всю разделяемую память в системе. в случае status Поле есть dest , Указывая на то, что эту общую память необходимо удалить.
Интеллектуальная рекомендация
Пошаговая загрузка файла Spring MVC-09 (на основе файла загрузки клиента Servlet3.0 + Html5)
пример тестовое задание Исходный код Несмотря на загрузку файлов в Servlet3.0 +, мы можем очень легко программировать на стороне сервера, но пользовательский интерфейс не очень дружелюбен. Одна HTML-ф.
Создайте многоканальное окно в приложениях Win32
Создайте многоканальное окно в приложениях Win32, создайте несколько оконных объектов одного и того же класса Windows, а окна объектов разных классов окон. .
Путь к рефакторингу IOS-APP (3) Введение в модульное тестирование
IOS-APP реконструкция дороги (1) структура сетевых запросов IOS-APP реконструкция дороги (два) Модельный дизайн При рефакторинге нам нужна форма, позволяющая вносить смелые изменения, обеспечивая при .
Tree——No.617 Merge Two Binary Trees
Problem: Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not. You need to merge them into a new bin.
Источник