Odpowiedzi:
Powodem jest to, że Unix nie blokuje pliku wykonywalnego podczas jego wykonywania, a nawet jeśli działa podobnie jak Linux, ta blokada dotyczy i-węzła, a nie nazwy pliku. Oznacza to, że proces utrzymujący go w stanie otwiera dostęp do tych samych (starych) danych, nawet po usunięciu pliku (faktycznie odłączeniu) i zastąpieniu go nowym o tej samej nazwie, co jest zasadniczo tym, co robi aktualizacja pakietu.
To jedna z głównych różnic między Unixem a Windowsem. Ten ostatni nie może zaktualizować zablokowanego pliku, ponieważ brakuje warstwy między nazwami plików i i-węzłami, co utrudnia aktualizację, a nawet instalację niektórych pakietów, ponieważ zwykle wymaga pełnego ponownego uruchomienia.
Pliki wykonywalne są na ogół otwierane raz, dołączane do deskryptora pliku i nie mają deskryptora pliku do pliku binarnego ponownie otwieranego podczas jednego okresu wykonywania. Na przykład, jeśli wykonasz polecenie bash
, exec()
generalnie tworzy on tylko deskryptor pliku dla i-węzła wskazywanego przez /bin/bash
jednorazowe wywołanie.
Często oznacza to, że w przypadku prostych plików binarnych, które nie podejmują próby ponownego odczytania się podczas wykonywania (przy użyciu ścieżki, którą zostały wywołane), zawartość w pamięci podręcznej pozostaje ważna jako wiszący i-węzeł. Oznacza to, że istnieje zasadniczo replika poprzedniej wersji pliku wykonywalnego.
W bardziej skomplikowanych przypadkach może to powodować problemy. Na przykład plik konfiguracyjny może zostać zaktualizowany, a następnie ponownie odczytany, lub program może się ponownie uruchomić za pomocą ścieżki, z której został wykonany. Mogą również występować problemy, jeśli programy są ze sobą połączone, a jeden jest wykonywany przed aktualizacją, a drugi po (ewentualnie przez pierwszy program). Dotyczy to również niektórych bibliotek.
W przypadku prostych przypadków użycia uaktualnienie jest bezpieczne bez ponownego uruchamiania procesu.
bash
plik binarny ma około 200 stron 4K, nie jestem pewien, czy wszystkie są używane podczas przeciętnej sesji.
ialloc()
do struktury jądra podczas odczytu, a nie o mapowaniu pamięci samych stron. Czy nie mam racji, sądząc, że w nowoczesnych systemach plików ext * i-węzeł jest ostatecznie spójny w jądrze (i wewnątrz podsystemu VM)?