Semafory POSIX z programowaniem w C

Posix Semaphores With C Programming



POSIX odnosi się do przenośnego interfejsu systemu operacyjnego, który jest standardem IEEE opracowanym w celu ułatwienia przenoszenia różnych aplikacji. POSIX jest próbą zbudowania wspólnej, standardowej wersji UNIX poprzez współpracę dostawców. Ułatwiłoby to przenoszenie aplikacji na platformy sprzętowe, gdyby były skuteczne. Hewlett-Packard integruje POSIX ze swoimi licencjonowanymi systemami operacyjnymi MPE/iX w wersji 5.0 i HP/UXX w wersji 10.0 (jego UNIX).

Standard POSIX ma znacznie więcej niż dziesięć części, jednak dwie są łatwo dostępne. POSIX.1 opisuje interfejsy programistyczne C (tj. bibliotekę 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 semaforów jest określony przez standard POSIX. Nie jest częścią Pthreads. Jednak większość systemów UNIX obsługujących Pthreads udostępnia 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 System V Semaphore. Chociaż semafory z Systemu V są łatwiejsze do zdobycia, szczególnie na wcześniejszych platformach uniksopodobnych. Istnieje potrzeba podłączenia programów wykorzystujących semafory POSIX do biblioteki Pthread. W tym artykule przyjrzymy się semaforom POSIX.



Dlaczego semafory POSIX?

Istnieje duży problem dotyczący wątków, a mianowicie wyścig. Jest to okoliczność, w której dwie wątki dążą do uzyskania i zmiany tych samych informacji, 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żywana do wymuszania 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 sem_name;

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ć współdzielony 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.

>> intsem_init(sem_t*pół, intpshared, bez znaku intwartość);

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.

>> intsem_czekaj(sem_t*pół);

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.

>> intsem_post(sem_t*pół);

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 wskazywanym przez valp.

>>Int sem_getvalue(sem_t*pół, int *szczeniak);

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*pół);

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 ORAZ .

Implementacja POSIX Semaphore z programowaniem w C w Ubuntu

Na samym początku musisz stworzyć nowy plik z rozszerzeniem .cpp w systemie Ubuntu 20.04. 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ń.

Możesz zobaczyć, że nowy plik.cpp został utworzony w katalogu domowym.


Po utworzeniu pliku .cpp otwórz go jako Edytor tekstu w systemie Linux i zapisz poniższy kod w tym pliku bez zmian. Następnie zapisz i zamknij.

Uruchom program POSIX Semaphore C w Ubuntu 20.04

Otwórz terminal W Ubuntu 20.04 i wykonaj poniższe polecenie gcc, a następnie nazwę pliku.

$gccnazwapliku.c –lpthread –lrt

Powstają 2 nitki, jedna powstaje po 2 sekundach od drugiej. Po otrzymaniu śruby pierwszy wątek śpi przez 4 sekundy. Tak więc po wywołaniu drugi wątek nie dołącza się bezpośrednio, a to pojawi się 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.