При взгляде на подход Go и Erlang на concurrency я заметил, что оба они полагаются на передачу сообщений.
Этот подход, очевидно, устраняет необходимость сложных блокировок, потому что нет общего состояния.
Однако рассмотрим случай, когда многие клиенты хотят параллельного доступа только для чтения к одной большой структуре данных в памяти - как массив суффикса.
Мои вопросы:
-
Будет ли использование общего состояния быстрее и меньше памяти, чем передача сообщений, поскольку блокировки в большинстве случаев не нужны, потому что данные доступны только для чтения и должны существовать только в одном месте?
-
Как к этой проблеме можно будет обратиться в контексте передачи сообщений? Будет ли один процесс с доступом к структуре данных, и клиентам просто нужно будет последовательно запрашивать данные из него? Или, если возможно, будут ли данные разбиваться на несколько процессов, которые содержат фрагменты?
-
Учитывая архитектуру современных процессоров и памяти, существует большая разница между этими двумя решениями - т.е. совместная память может считываться параллельно несколькими ядрами, то есть отсутствует узкое место в оборудовании, которое в противном случае реализации примерно одинаковы?