Współdzielone zasoby, konflikty, współdzielony dostęp - 1

„Cześć, Amigo! Chcę ci opowiedzieć o dzieleniu się zasobami. Naturalnie w różnych wątkach.

„Ciągle mówię o problemach, które pojawiają się podczas pracy z wieloma wątkami i jak je rozwiązywać. Nie oznacza to, że używanie wątków jest złe. Wątki to bardzo potężne narzędzie. W rzeczywistości pozwalają przyspieszyć i ujednolicić program bardziej niezawodny. Im bardziej złożony jest program, tym więcej ma wątków i różnych niezależnych części."

„Podział programu na niezależne (luźno powiązane) części jest bardzo korzystny”.

„Wyobraź sobie, że Twój program jest wewnętrznie podzielony na 100 wątków. Ale masz tylko dwurdzeniowy procesor. Oznacza to, że średnio 50 wątków będzie wykonywanych na każdym rdzeniu”.

„Jeśli chcesz zwiększyć wydajność programu, po prostu kup dwuprocesorowy serwer i kilka świetnych procesorów. To może dać ci nawet 32 ​​rdzenie, co daje 2-20-krotny wzrost wydajności. W zależności od liczby z prawdziwie niezależnych części, na które jest podzielona”.

„To jeden z powodów, dla których Java dominuje w rozwoju przedsiębiorstw. Jeśli firma ma złożony program wewnętrzny napisany przez 20 programistów, to znacznie taniej jest kupić kolejny serwer niż podwoić wydajność programu poprzez optymalizację”.

— A więc o to w tym wszystkim chodzi.

„Ale! Za każdym razem, gdy programista decyduje się użyć innego wątku, rozwiązuje jeden problem i tworzy dwa. Coraz więcej wątków nie zwiększy w nieskończoność wydajności programu”.

„Po pierwsze, każdy program wykonuje pracę, której nie można rozdzielić i uruchomić równolegle na różnych wątkach. Po drugie, wszystkie wątki są wykonywane na tym samym procesorze. Im więcej masz wątków, tym wolniej każdy z nich działa”.

„A co najważniejsze, wątki często używają tych samych obiektów (zwykle nazywanych „zasobami współdzielonymi”)”.

„Na przykład wątek chce zapisać informacje o wykonanej pracy w pliku. Jeśli istnieje kilka takich wątków i chcą one zapisać informacje do tego samego pliku, będą się wzajemnie zakłócać. Aby plik nie stał się bałagan, dostęp do pliku jest ograniczony, tzn. gdy jeden wątek używa pliku, inne czekają."

„Tak, pamiętam. Robisz to za pomocą słowa kluczowego synchronized ”.

"Dokładnie tak."

„A co, jeśli wątki zapisują do różnych plików?”

„Formalnie są to różne obiekty, ale prawdopodobnie znajdują się na tym samym dysku twardym”.

„Więc czy naprawdę można zrównoleglić coś wewnątrz procesora?”

„Technicznie tak, ale gdy tylko twój wątek będzie potrzebował czegoś oprócz danych, które posiada, coś może być już zajęte przez inny wątek – a twój wątek będzie musiał poczekać”.

„Cóż, co powinienem wtedy zrobić? Skąd mam wiedzieć, czy powinienem robić dużo wątków, czy nie?”

„Jest to określone bezpośrednio przez architekturę twojego programu. Każdy projekt ma swojego własnego„ architekta ”, który zna wszystkie„ zasoby ”używane w programie, zna ich ograniczenia oraz to, jak dobrze/źle są zrównoleglone”.

— A jeśli nie wiem?

„Są dwie opcje:”

a) pracować pod nadzorem kogoś, kto to robi

b) zdobądź trochę brył, wymyślając to na własną rękę

„Jestem robotem: nie dostaję grudek – tylko wgniecenia”.

- No to zrób sobie kilka wgnieceń.

„Rozumiem. Dzięki. Wyjaśniłeś kilka rzeczy, nad którymi już zacząłem się zastanawiać”.