Temat Jak komputer przetwarza dane – od bitów po aplikacje obejmuje całościowy proces przemiany sygnałów elektrycznych w funkcjonalne programy dostępne dla użytkownika.
Reprezentacja danych na poziomie bitów i bajtów
Zrozumienie bitów i kodowania
Pojedynczy bit to najmniejsza jednostka informacji w systemie cyfrowym. Jego wartość może być zerem lub jedynką, co pozwala na implementację logiki dwójkowej. Grupy ośmiu bitów tworzą bajt, który stanowi podstawę kodowania znaków i liczb. Współczesne systemy wykorzystują standardy takie jak ASCII i Unicode, aby każdy symbol tekstowy miał unikalną reprezentację. Liczby całkowite i zmiennoprzecinkowe zapisuje się w formacie binarnym z uwzględnieniem znaku oraz precyzji, co wpływa na zakres i dokładność obliczeń.
Architektura logiczna układów cyfrowych
- Bramek logicznych (AND, OR, NOT) używa się do budowy bardziej złożonych bloków, jak ALU czy multipleksery.
- Układy kombinacyjne bez pamięci wykonują operacje na bieżących sygnałach, podczas gdy układy sekwencyjne używają przerzutników do zapamiętywania stanów.
- Projektowanie układów wymaga poszanowania późnień propagacyjnych i synchronizacji sygnałów z użyciem zegara.
Wykonywanie instrukcji – rola procesora
Cykl maszynowy
Procesor przetwarza instrukcje w powtarzalnym schemacie zwanym cyklem maszynowym. Składa się on z kolejnych faz:
- Pobranie instrukcji (fetch) z pamięci operacyjnej.
- Odszyfrowanie instrukcji (decode) przez jednostkę sterującą.
- Wykonanie instrukcji (execute) przez ALU lub inne jednostki funkcyjne.
- Dostęp do pamięci (memory access) w razie potrzeby odczytu lub zapisu danych.
- Zapisywanie wyniku (write back) do rejestrów lub pamięci.
Każda faza może wymagać różnych zasobów, co prowadzi do projektowania potoków (pipeline) i mechanizmów przewidywania skoków.
Rejestry i jednostki funkcyjne
Rejestry to ultraszybkie obszary pamięci wewnątrz procesora, przechowujące operandy podczas obliczeń. Zazwyczaj wyróżnia się:
- Rejestry ogólnego przeznaczenia – do operacji arytmetycznych i logicznych.
- Rejestry specjalne – licznik rozkazów, rejestr stanu czy wskaźnik stosu.
- Jednostki arytmetyczno-logiczne (ALU) realizujące operacje bitowe i liczbowe.
- Jednostki zmiennoprzecinkowe (FPU) do obliczeń wymagających większej precyzji.
Koncepcja superskalarności pozwala na równoczesne wykonywanie wielu instrukcji, jeśli dostępne są wolne jednostki funkcyjne.
Pamięć i hierarchia pamięci
Pamięć podręczna i RAM
Aby zminimalizować opóźnienia przy odczycie i zapisie danych, stosuje się hierarchię pamięci:
- Cache L1 – najmniejsza pojemność, najniższe czasy dostępu, najbliżej rdzenia procesora.
- Cache L2 i L3 – większe pojemności, dłuższe opóźnienia, nadal szybkości rzędu nanosekund.
- RAM – pamięć dynamiczna (DRAM) o większej pojemności, lecz wyższym czasie dostępu.
Optymalizacja oprogramowania polega na zwiększeniu lokalności odwołań, aby częściej korzystać z cache niż bezpośrednio z RAM.
Magazyn masowy
Do trwałego przechowywania danych służą:
- HDD – talerzowe dyski magnetyczne, niższe ceny za gigabajt, ale wyższe opóźnienia i niższa przepustowość.
- SSD – pamięci flash NAND o znacznie lepszych parametrach losowego dostępu.
- Nośniki NVMe – wykorzystujące magistralę PCIe, oferują bardzo wysokie transfery sekwencyjne.
- Chmura obliczeniowa – zdalne serwery udostępniające zasoby elastycznie skalowane.
Różnorodność warstw magazynowania wymusza strategię buforowania i przenoszenia danych między nimi.
Od kodu źródłowego po aplikacje użytkowe
Rola systemu operacyjnego
Kernel systemu operacyjnego to most między sprzętem a oprogramowaniem. Odpowiada za:
- Zarządzanie procesami – przydział czasu procesora i obsługa wielozadaniowości.
- Kontrolę dostępu do pamięci – przydzielanie i ochrona przestrzeni adresowej.
- Sterowanie wejściem/wyjściem – komunikację z urządzeniami peryferyjnymi.
- Zarządzanie plikami – struktury katalogów i system plików.
Dzięki abstrakcji sprzętu procesy użytkownika nie muszą znać szczegółów fizycznych interfejsów, co przyspiesza rozwój oprogramowania.
Warstwy kompilacji i wykonania
Proces tworzenia aplikacji przebiega przez kilka etapów:
- Kod źródłowy – zapis w języku wysokiego poziomu.
- Kompilator – tłumaczy kod na język pośredni lub bezpośrednio na kod maszynowy.
- Linkowanie – łączenie modułów i bibliotek w jeden plik wykonywalny.
- Ładowanie do pamięci – loader przenosi program do przestrzeni użytkownika.
- Wykonanie – CPU wykonuje kolejne instrukcje zgodnie z harmonogramem jądra.
W przypadku języków interpretowanych (Python, JavaScript) kod jest analizowany i przetwarzany podczas działania, co wpływa na wydajność i elastyczność.
Architektury wielordzeniowe i równoległość
Współczesne procesory mają kilka, kilkanaście lub nawet kilkadziesiąt rdzeni. Programy wielowątkowe pozwalają na:
- Wykorzystanie wielu rdzeni do przetwarzania zadań równolegle.
- Optymalizację obliczeń naukowych i graficznych z użyciem GPGPU.
- Zarządzanie wątkami i procesami przez system operacyjny w celu uzyskania maksymalnej wydajności.
Programowanie równoległe wymaga synchronizacji wątków i unikania konfliktów przy dostępie do wspólnych zasobów.