Robert Love linux.-programowanie-systemowe full scan.pdf

(13980 KB) Pobierz
887657256.001.png
Otwieranie strumienia poprzez deskryptor pliku
81
Zamykanie strumieni
82
Czytanie ze strumienia
83
Pisanie do strumienia
86
Przykładowy program używający buforowanych operacji wejścia i wyjścia
88
Szukanie w strumieniu
89
Opróżnianie strumienia
91
Błędy i koniec pliku
92
Otrzymywanie skojarzonego deskryptora pliku
93
Parametry buforowania
93
Bezpieczeństwo wątków
95
Krytyczna analiza biblioteki typowych operacji wejścia i wyjścia
97
Zakończenie
98
4.
Zaawansowane operacje plikowe wejścia i wyjścia .................................................. 99
Rozproszone operacje wejścia i wyjścia
100
Interfejs odpytywania zdarzeń
105
Odwzorowywanie plików w pamięci
110
Porady dla standardowych operacji plikowych wejścia i wyjścia
123
Operacje zsynchronizowane, synchroniczne i asynchroniczne
126
Zarządcy operacji wejścia i wyjścia oraz wydajność operacji wejścia i wyjścia
129
Zakończenie
141
5.
Zarządzanie procesami ............................................................................................. 143
Identyfikator procesu
143
Uruchamianie nowego procesu
146
Zakończenie procesu
153
Oczekiwanie na zakończone procesy potomka
156
Użytkownicy i grupy
166
Grupy sesji i procesów
171
Demony
176
Zakończenie
178
6.
Zaawansowane zarządzanie procesami .................................................................. 179
Szeregowanie procesów
179
Udostępnianie czasu procesora
183
Priorytety procesu
186
Wiązanie procesów do konkretnego procesora
189
Systemy czasu rzeczywistego
192
Ograniczenia zasobów systemowych
206
4 | Spis treści
7.
Zarządzanie plikami i katalogami ............................................................................ 213
Pliki i ich metadane
213
Katalogi
228
Dowiązania
240
Kopiowanie i przenoszenie plików
245
Węzły urządzeń
248
Komunikacja poza kolejką
249
Śledzenie zdarzeń związanych z plikami
251
8.
Zarządzanie pamięcią ............................................................................................... 261
Przestrzeń adresowa procesu
261
Przydzielanie pamięci dynamicznej
263
Zarządzanie segmentem danych
273
Anonimowe odwzorowania w pamięci
274
Zaawansowane operacje przydziału pamięci
278
Uruchamianie programów, używających systemu przydzielania pamięci
281
Przydziały pamięci wykorzystujące stos
282
Wybór mechanizmu przydzielania pamięci
286
Operacje na pamięci
287
Blokowanie pamięci
291
Przydział oportunistyczny
295
9.
Sygnały ....................................................................................................................... 297
Koncepcja sygnałów
298
Podstawowe zarządzanie sygnałami
304
Wysyłanie sygnału
309
Współużywalność
311
Zbiory sygnałów
314
Blokowanie sygnałów
315
Zaawansowane zarządzanie sygnałami
316
Wysyłanie sygnału z wykorzystaniem pola użytkowego
324
Zakończenie
325
10.
Czas ............................................................................................................................ 327
Struktury danych reprezentujące czas
329
Zegary POSIX
332
Pobieranie aktualnego czasu
334
Ustawianie aktualnego czasu
337
Konwersje czasu
338
Spis treści | 5
Dostrajanie zegara systemowego
340
Stan uśpienia i oczekiwania
343
Liczniki
349
A
Rozszerzenia kompilatora GCC dla języka C ............................................................ 357
B
Bibliografia ................................................................................................................369
Skorowidz .................................................................................................................. 373
6 | Spis treści
ROZDZIAŁ 8.
Zarządzanie pamięcią
Pamięć należy do najbardziej podstawowych, a jednocześnie najważniejszych zasobów dostęp-
nych dla procesu. W rozdziale tym omówione zostaną tematy związane z zarządzaniem nią:
przydzielanie, modyfikowanie i w końcu zwalnianie pamięci.
Słowo przydzielanie — powszechnie używany termin, określający czynność udostępniania obszaru
pamięci — wprowadza w błąd, ponieważ wywołuje obraz wydzielania deficytowego zasobu,
dla którego wielkość żądań przewyższa wielkość zapasów. Na pewno wielu użytkowników
wolałoby mieć więcej dostępnej pamięci. Dla nowoczesnych systemów problem nie polega
jednak na rozdzielaniu zbyt małych zapasów dla zbyt wielu użytkowników, lecz właściwym
używaniu i monitorowaniu danego zasobu.
W tym rozdziale przeanalizowane zostaną wszystkie metody przydzielania pamięci dla różnych
obszarów programu, jednocześnie z ukazaniem ich zalet i wad. Przedstawimy również pewne
sposoby, pozwalające na ustawianie i modyfikację zawartości dowolnych obszarów pamięci,
a także wyjaśnimy, w jaki sposób należy zablokować dane w pamięci, aby w programach nie
trzeba było oczekiwać na operacje jądra, które zajmowałoby się przerzucaniem danych z obszaru
wymiany.
Przestrzeń adresowa procesu
Linux, podobnie jak inne nowoczesne systemy operacyjne, wirtualizuje swój fizyczny zasób
pamięci. Procesy nie adresują bezpośrednio pamięci fizycznej. Zamiast tego jądro wiąże każdy
proces z unikalną wirtualną przestrzenią adresową . Jest ona liniowa, a jej adresacja rozpoczyna się
od zera i wzrasta do pewnej granicznej wartości maksymalnej.
Strony i stronicowanie
Wirtualna przestrzeń adresowa składa się ze stron . Architektura systemu oraz rodzaj maszyny
determinują rozmiar strony, który jest stały: typowymi wartościami są na przykład 4 kB (dla
systemów 32-bitowych) oraz 8 kB (dla systemów 64-bitowych) 1 . Strony są albo prawidłowe,
1
Czasami systemy wspierają rozmiary stron, które mieszczą się w pewnym zakresie. Z tego powodu rozmiar
strony nie jest częścią interfejsu binarnego aplikacji (ABI). Aplikacje muszą w sposób programowy uzyskać
rozmiar strony w czasie wykonania. Zostało to opisane w rozdziale 4. i będzie jednym z tematów poruszonych
w tym rozdziale.
261
887657256.002.png 887657256.003.png
 
Zgłoś jeśli naruszono regulamin