Procesy i wątki: praca samotna a korzystanie z autowspomnień

📖 11min read

Wiedza, np. 1-minutowa autoprezentacja na potrzeby rozmowy kwalifikacyjnej

„Jaka jest różnica między procesem a wątkiem?”

Kiedy szukałem pracy, to pytanie zawsze znajdowało się na liście „10 najczęstszych pytań na rozmowach kwalifikacyjnych”. Odpowiedziałem jak maszyna.

„Proces to działający program, a wątek to jednostka przepływu wykonywana w ramach procesu. Procesy nie współdzielą zasobów, ale wątki współdzielą zasoby.”

Prowadzący rozmowę skinął głową i założyłem, że doskonale rozumiem tę koncepcję. Jednak dopóki w praktyce nie zetknąłem się z „kwestią współbieżności”, nie miałem pojęcia, jaka prawdziwa obawa kryje się w tym zdaniu.

„Dlaczego liczba wyświetleń ma wzrosnąć o 100, a wzrosła tylko o 98?” „Dlaczego witryna zatrzymuje się, gdy pobieram Excel?”

Mój kod był doskonały, gdy uruchamiałem go samodzielnie, ale powstał bałagan, gdy jednocześnie korzystało z niego wielu użytkowników. Myślałem, że można to rozwiązać, po prostu zwiększając liczbę „pracowników”, ale nie wiedziałem, że wraz ze wzrostem liczby pracowników koszt zarządzania nimi (przełączanie kontekstu) rośnie wykładniczo.

Kiedy pracujesz sam, jest spokojnie, ale kiedy pracujesz z innymi, zaczyna się wojna.

Fabryka i pracownicy w cyfrowym centrum logistycznym

Powróćmy do naszego światopoglądu „cyfrowego centrum logistycznego”. Uruchamianie programu na komputerze przypomina konfigurowanie „fabryki” w centrum dystrybucyjnym.

1. Proces: Niezależne miejsce pracy

2. Temat: Pracownicy w warsztacie

Wątki mają zarówno „przestrzeń współdzieloną (sterta)”, jak i „przestrzeń niezależną (stos).

[Weryfikacja kodu] Tragedia podczas udostępniania (problem współbieżności)

„Wątki współdzielą zasoby.” W pokoju przesłuchań może to wydawać się zaletą, ale w praktyce może być zalążkiem „katastrofy”.

Czy pamiętasz „Stertę”, której nauczyliśmy się ostatnim razem? Wątki współdzielą ten obszar sterty. Oznacza to, że wątek B może przyjść i zastąpić dane, nad którymi pracuje wątek A.

Nazywa się to „warunkami wyścigu”. Sprawdźmy to za pomocą kodu.

public class RaceConditionTest {
    static int count = 0; // Zmienna dzielona przechowywana w Stercie (Heap)

    public static void main(String[] args) throws InterruptedException {
        // Zatrudnij dwoch pracownikow (watki)
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) count++;
        });
        
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) count++;
        });

        t1.start(); // Rozpocznij prace!
        t2.start(); // Rozpocznij prace!
        
        t1.join(); // Czekaj, az zakoncza prace
        t2.join(); // Czekaj, az zakoncza prace
        
        System.out.println("Wynik koncowy: " + count);
    }
}

Oczekiwany wynik: ponieważ dwie osoby dodały 10 000 razy, wynik powinien wynosić 20 000.

Rzeczywisty wynik: 15 482, 18 931… Wartość jest inna za każdym razem, gdy ją uruchamiam, a 20 000 nie jest wyświetlane.

Powód:

To jest istota błędu polegającego na tym, że w praktyce „czasami dane są przeżuwane”. To tragedia, która wydarzyła się, gdy pracownicy dotknęli tej samej księgi, nie rozmawiając ze sobą.

Jeśli porównamy tę sytuację z bazą danych (DB), będzie to to samo, co „sytuacja, w której wiele zapytań jest przesyłanych jednocześnie bez transakcji”. Jeśli saldo konta bankowego zostanie jednocześnie zmodyfikowane bez blokady, nastąpi straszny wypadek, w wyniku którego pieniądze wyparują. Tak jak chronimy dane za pomocą ROLLBACK lub COMMIT w bazie danych, tak urządzenie blokujące, takie jak Synchronized, jest absolutnie niezbędne na poziomie kodu.

Kompromis w praktyce: wieloprocesowość vs. wielowątkowość

Kiedy i czego używać w praktyce?

1. Najlepsza przeglądarka Chrome: wieloprocesowa

W starej przeglądarce Internet Explorer zatrzymanie jednej karty powodowało zamknięcie całej przeglądarki (metoda wielowątkowa). Jednak Chrome uruchamia każdą kartę jako „oddzielny proces (fabryczny)”.

2. Wybór serwera WWW (Spring, Node.js itp.): Wielowątkowy

Serwer musi obsłużyć tysiące żądań. Jeśli zbudujesz proces (fabrykę) dla każdego żądania, serwer ulegnie awarii. Jest więc przetwarzany poprzez umieszczenie wielu wątków (procesów roboczych) w jednym procesie.

Czy wolisz zbudować bezpieczną, ale kosztowną „fortecę”, czy latać szybkim, ale niebezpiecznym „dronem”?

Zakończenie: Samospalenie wiąże się z odpowiedzialnością

Dzisiaj przyjrzeliśmy się „procesom i wątkom”, czyli sposobowi pracy pracowników.

Teraz już wiesz, że termin „problemy współbieżności” nie odnosi się tylko do rozmowy kwalifikacyjnej. Wielu pracowników wątku stale przemieszcza się do i z wspólnego magazynu zwanego Stertą. Zaprowadzenie porządku w tym chaosie to umiejętność programisty zaplecza.

Ale poczekaj, jeśli jest wielu pracowników, jak decydujesz, kto powinien wykonać czyją pracę jako pierwszy? W jaki sposób kierownik fabryki (OS) zarządza setkami pracowników? Następnym razem porozmawiamy o najbardziej kłopotliwym zadaniu kierownika fabryki, „Planowaniu i przełączaniu kontekstu”.

Dodaj komentarz