2012-07-19 16 views
5

Po przemyśleniu całej koncepcji pamięci współdzielonej, pojawiło się pytanie:Proces VS wątku: czy dwa procesy mogą współużytkować tę samą pamięć współdzieloną? czy dwa wątki?

Czy dwa procesy mogą współużytkować ten sam segment pamięci wspólnej? czy dwa wątki mogą mieć tę samą wspólną pamięć?

Po przemyśleniu tego nieco jaśniej, jestem niemal pewien, że dwa procesy mogą współdzielić ten sam segment pamięci współdzielonej, gdzie pierwszy to ojciec, a drugi to syn, który został utworzony z fork(), ale a co z dwoma wątkami?

Dzięki

Odpowiedz

10

dwa procesy mogą dzielić tego samego segmentu pamięci wspólnej?

Tak i nie. Zazwyczaj w przypadku nowoczesnych systemów operacyjnych, gdy inny proces jest od forked inny, mają one tę samą przestrzeń pamięci z zestawem "copy-on-write" na wszystkich stronach. Wszelkie aktualizacje dokonane na dowolnej ze stron pamięci do odczytu i zapisu powodują wykonanie kopii strony, tak że będą dwie kopie, a strona pamięci nie będzie już współużytkowana pomiędzy procesem nadrzędnym i podrzędnym. Oznacza to, że tylko strony lub strony tylko do odczytu, które nie zostały zapisane, będą udostępniane.

Jeśli proces ma , a nie został rozwidlony z innego, to nie współużytkuje żadnej pamięci. Jedynym wyjątkiem jest sytuacja, w której uruchomione są dwa wystąpienia tego samego programu, dlatego mogą one udostępniać code and maybe even static data segments, ale nie będą udostępniane żadne inne strony.

Istnieje również specific memory-map calls, aby udostępnić ten sam segment pamięci. Wywołanie określa, czy mapa jest tylko do odczytu, czy do odczytu i zapisu. Jak to zrobić zależy od systemu operacyjnego.

czy dwa wątki mogą mieć tę samą pamięć współdzieloną?

Oczywiście. Zazwyczaj cała pamięć wewnątrz procesu wielowątkowego jest "współdzielona" przez wszystkie wątki. Jest to zwykle definicja wątków, ponieważ wszystkie one działają w tej samej przestrzeni pamięci.

Wątki mają również dodatkową złożoność polegającą na posiadaniu cached memory segments w pamięci o wysokiej prędkości związanej z procesorem/rdzeniem. Ta buforowana pamięć nie jest udostępniana i aktualizowana na stronach pamięci w centralnej pamięci w zależności od operacji synchronizacji.

+0

Re "Ta pamięć podręczna nie jest współużytkowana, a aktualizacje stron pamięci są przepłukiwane do pamięci centralnej w zależności od operacji synchronizacji": czy to dobrze czy źle? – Pacerier

+0

Re "Wątki mają również dodatkową złożoność posiadania buforowanych segmentów pamięci w szybkiej pamięci związanej z procesorem/jądrem": czy to jest nawet coś z jądra systemu operacyjnego ?, czy tylko funkcja biblioteki językowej oprogramowania? – Pacerier

+0

To bardzo dobra rzecz @Pacerier. Lokalna pamięć podręczna pamięci procesora zapewnia większą wydajność w programach wielowątkowych. Jest to obsługiwane przez _hardware_, a nie system operacyjny i oprogramowanie. Oprogramowanie musi uwzględniać pamięci podręczne pod względem barier w pamięci, które kontrolują spłukiwanie i aktualizowanie, ale zdarzają się automagicznie z powodu projektowania procesora. – Gray

1

Tak, dwa procesy mogą jednocześnie dołączyć do segmentu pamięci współużytkowanej. Segment pamięci współużytkowanej nie byłby przydatny, gdyby nie było to prawdą, ponieważ jest to podstawowa idea wspólnego segmentu pamięci - dlatego jest jedną z kilku form IPC (komunikacja między procesami).

Dwa wątki w tym samym procesie mogą również dołączyć do segmentu pamięci współużytkowanej, ale biorąc pod uwagę, że już udostępniają całą przestrzeń adresową procesu, którego są częścią, prawdopodobnie nie ma większego sensu (chociaż prawdopodobnie ktoś będzie Zobacz, że wyzwaniem jest stworzenie mniej lub bardziej uzasadnionego sposobu użycia).

+0

Podejrzewam, że jest bliższa "mniej ważna" niż więcej :) Proszę, nie sugeruj programistom, że robią jeszcze więcej dziwnych rzeczy z wątkami, jest wystarczająco źle, ponieważ jest to

2

Zasadniczo głównym punktem procesów jest zapobieganie udostępnianiu pamięci! Komunikacja między procesami za pośrednictwem segmentu pamięci współdzielonej jest z pewnością możliwa na najpopularniejszym systemie operacyjnym, ale mechanizmy nie istnieją domyślnie. Nieudana konfiguracja i zarządzanie wspólnym obszarem prawdopodobnie doprowadzi do segFault/AV, jeśli masz szczęście i UB, jeśli nie.

Wątki należące do tego samego procesu, jednak nie mają takiego sprzętu do zarządzania pamięcią, mogą dzielić wszystko, co się im podoba, oczywistym minusem jest to, że mogą uszkodzić prawie wszystko, co chcą. Nigdy nie uważałem tego za ogromny problem, szczególnie. z nowoczesnymi językami OO, które mają tendencję do "konstruowania" wskaźników jako instancji obiektu, (Java, C#, Delphi).

0

Ogólnie mówiąc, każdy proces zajmuje przestrzeń pamięci oddzieloną od wszystkich innych w celu uniknięcia niepożądanych interakcji (w tym takich, które reprezentują kwestie bezpieczeństwa). Jednak zwykle istnieje sposób na procesy udostępniania części pamięci. Czasami robi się to, aby zmniejszyć ilość pamięci RAM ("zainstalowane pliki" w VAX/VMS jest/było jednym z takich przykładów). Może to również być bardzo skuteczny sposób komunikacji między współpracującymi procesami. Sposób, w jaki udostępnianie jest zaimplementowane/zorganizowane/zarządzane (np. Rodzic/dziecko), zależy od funkcji zapewnianych przez określony system operacyjny i wyboru projektu zaimplementowanego w kodzie aplikacji.

W ramach procesu każdy wątek ma dostęp do dokładnie tej samej przestrzeni pamięci, co wszystkie inne wątki tego samego procesu. Jedyną rzeczą, która ma unikalny dla siebie wątek, jest "kontekst wykonawczy", którego częścią jest stos (chociaż nic nie stoi na przeszkodzie, by jeden wątek miał dostęp do stosu "przynależnego" do innego wątku tego samego procesu lub nim manipulował).

Powiązane problemy