В чем разница между разделяемой памятью для IPC и разделяемой памятью потоков?

Давайте использовать разделяемую память POSIX, например, shmget() - общий вызов для координации межпроцессного взаимодействия. Как вызов shmget () и координация взаимодействия в сегменте разделяемой памяти отличаются от того, как Linux реализует разделяемую память и синхронизацию между потоками в одном процессе. Один из них более легкий?

2 ответа

Решение

SHM для IPC в нескольких процессах. В современной ОС каждый процесс не может видеть пространство памяти друг друга. Использование общего ключа для shmget() чтобы получить общую память и используя shmat() сопоставить страницу общей памяти с адресом локальной памяти внутри каждого процесса. Отображенный адрес совместно используемой памяти может отличаться из-за разного использования памяти и совместно используемых библиотек, загружаемых в каждое пространство процесса. И ключ SHM, размер предопределен и зафиксирован среди этих процессов.

Что касается памяти потоков, мы можем не называть ее разделяемой памятью, поскольку все потоки находятся в одной области памяти процесса. Они могут видеть и читать / писать в одном и том же пространстве процесса.

Честно говоря, не так много. В Linux нет потоков на уровне ОС. Один процесс, один поток. Поэтому, когда вы используете pthreads, вы на самом деле используете несколько процессов, которые совместно используют всю память, кроме областей памяти, специфичных для потоков. На другой UNIX, такой как OSX, однако, это может быть не так. Но вы можете убедиться в этом сами. Вы делаете простой процесс pthreads, создаете фон и набираете ps в командной строке.

Другие вопросы по тегам