POSIX odnosi się do przenośnego interfejsu systemu operacyjnego, który jest standardem IEEE opracowanym w celu ułatwienia przenoszenia różnych aplikacji. POSIX to próba zbudowania wspólnej, znormalizowanej wersji UNIX poprzez współpracę dostawców. Ułatwiłoby to przenoszenie aplikacji między platformami sprzętowymi, gdyby były skuteczne. Hewlett-Packard integruje POSIX z licencjonowanym systemem operacyjnym MPE/iX w wersji 5.0 i HP/UXX wersja 10.0, odpowiednio (jego UNIX).
Standard POSIX ma znacznie więcej niż dziesięć części, jednak dwie są łatwo dostępne. POSIX.1 opisuje interfejsy programowania C (i.mi., biblioteka wywołań systemowych) dla plików, procedur i terminali I/O. Biblioteka pakietów C POSIX dla platform POSIX jest szkieletem standardowej biblioteki C. Jest to ustalone w tym samym czasie, co standard ANSI C. Aby uczynić POSIX zgodnym ze standardem C, podjęto kilka prób. POSIX zapewnia dodatkowe funkcje do tych zaimplementowanych w standardzie C.
Semafory POSIX
Semafor to struktura danych często używana do synchronizowania procesów i wspomagania wątków bez ich wzajemnej interakcji w celu wspólnego działania. Interfejs dla semaforów jest określony przez standard POSIX. Nie jest częścią Pthreads. Jednak większość systemów UNIX obsługujących Pthreads zapewnia nawet semafory. W frameworkach uniksowych, takich jak Linux, semafory są łączone z kolejkami komunikatów i wspólną pamięcią pod usługami komunikacji międzyprocesowej (IPC). Starsze semafory frameworka V i nowoczesne semafory POSIX stają się dwoma typami semaforów. Wywoływanie POSIX Semaphore jest o wiele łatwiejsze niż wywołania Semaphore System V. Chociaż semafory z Systemu V są łatwiejsze do uzyskania, szczególnie na wcześniejszych platformach uniksopodobnych. Istnieje potrzeba podłączenia programów używających semaforów POSIX do biblioteki Pthread. W tym artykule przyjrzymy się semaforom POSIX.
Dlaczego semafory POSIX?
Wokół wątków jest duży problem, czyli „warunki wyścigu”. Jest to okoliczność, w której dwie wątki starają się uzyskać i zmienić te same informacje, przez co stają się one sprzeczne. Aby uniknąć sytuacji wyścigu, używamy semaforów od bardzo dawna.
Semafory dostępne są w 2 rodzajach:
Semafor binarny:
Jest również rozpoznawany jako blokada mutex. Miałby tylko dwie możliwe wartości, 0 i 1. Wartość zostanie zainicjowana jako 1. Jest używany do egzekwowania wielu procesów w celu rozwiązania poważnego problemu z sekcją.
Liczenie semaforów:
Jego rozmiar może się różnić w całej domenie bez ograniczeń. Jest używany do sprawowania władzy nad dostępem do zasobów o wielu instancjach.
Framework Linux POSIX ma swoje zintegrowane repozytorium Semaphore. Aby z niego skorzystać, musimy:
- Dodaj semafor.h
- Ułóż kod, łącząc się z -lpthread -lrt.
Prawie wszystkie metody i formularze POSIX Semaphore są prototypowane lub określone w 'Semaphore'.h. Będziemy używać semafora do opisania bytu lub obiektu jako:
>> sem_t nazwa_sem;Oto różne funkcje, których używalibyśmy w POSIX Semaphore.
Sem_init
Aby zainicjować semafor, musisz użyć metody sem_init. W tej funkcji sem odpowiada zainicjowanemu obiektowi semafora. Pshared to baner lub flaga określająca, czy semafor może być udostępniany za pomocą procedury forked(), czy nie. Współdzielone semafory nie są obecnie wspierane przez LinuxThreads. Wartość argumentu jest wartością początkową, przy której semafor jest ustalony.
>> int sem_init(sem_t *sem, int pshared, unsigned int value);Sem_czekaj
Będziemy używać metody sem-wait, aby zatrzymać/zablokować semafor lub sprawić, by czekał. Jeżeli semaforowi podano wartość ujemną, cykl wywołań zostanie automatycznie zablokowany. Za każdym razem, gdy jakikolwiek inny wątek wywoła sem_post, budzi się jeden z już zatkanych procesów.
>> int sem_czekaj(sem_t *sem);Sem_post
Użyjemy metody sem_post, aby zwiększyć wartość semafora. Po wywołaniu sem_post zwiększy wartość i obudzi się jeden z już zatkanych lub oczekujących procesów.
>> int sem_post(sem_t *sem);Sem_getvalue
Jeśli chcesz wiedzieć o wartości semafora, musisz użyć poniższej funkcji sem_getvalue . Uzyska aktualną wartość semafora i zostanie umieszczony w miejscu docelowym valp-point.
>> Int sem_getvalue(sem_t *sem, int *valp);Sem_destroy
Powinieneś użyć metody sem_destroy, jeśli chcesz zniszczyć semafor. Jeśli upadek semafora ma postępować, żaden wątek nie będzie czekał w semaforze.
>> Int sem_destroy(sem_t *sem);Zainstaluj narzędzie GCC
Aby skompilować kod POSIX Semaphore C, musisz mieć zainstalowane narzędzie gcc w swoim systemie Linux. W tym celu otwórz terminal poleceń i wypróbuj poniższe polecenie.
$ sudo apt-get install gcc
Potwierdź swoją akcję, naciskając Tak.
Implementacja POSIX Semaphore z programowaniem w C w Ubuntu
Na samym początku musisz utworzyć nowy plik z .rozszerzenie cpp na Ubuntu 20.04 system. W tym celu musisz przejść do katalogu domowego i utworzyć nowy pusty plik o nazwie nowy.cpp. Możesz go również utworzyć za pomocą polecenia dotykowego w terminalu poleceń.
Widać, że nowy.Plik cpp został utworzony w katalogu domowym.
Po utworzeniu .cpp, otwórz go jako edytor tekstu w systemie Linux i napisz poniższy kod w tym pliku tak, jak jest. Następnie zapisz i zamknij.
Uruchom program POSIX Semaphore C w Ubuntu 20.04
Otwórz swój terminal w Ubuntu 20.04 i wykonaj poniższe polecenie gcc, a następnie nazwę pliku.
$ nazwa pliku gcc.c -lpthread -lrt
Powstają 2 nitki, jedna powstaje po 2 sekundach drugiej. Po otrzymaniu śruby pierwszy wątek śpi przez 4 sekundy. Tak więc, po jego wywołaniu, drugi wątek nie dołączyłby bezpośrednio i pojawi się to 4-2=2 sekundy po jego wywołaniu. Oto wynik:
Gdybyśmy nie używali semafora, zgodnie z przełączaniem kontekstu, wynik mógłby wyglądać tak:
Wniosek
W tym przewodniku podano szczegółowy przegląd użycia POSIXSemaphore z programowaniem w C w Ubuntu 20. Używając jedynie biblioteki POSIX lub Pthread w pewnym kodzie C, semafor POSIX może być dość łatwo użyty do zapobiegania wyścigom podczas kodowania.