POSIX semaforai su C programavimu

Posix Semaphores With C Programming



POSIX reiškia OS nešiojamąją sąsają, kuri yra IEEE standartas, sukurtas padėti perkelti įvairias programas. POSIX - tai pastangos sukurti bendrą standartizuotą UNIX versiją bendradarbiaujant su pardavėjais. Tai palengvintų programų perkėlimą iš aparatinės įrangos platformų, jei jos būtų veiksmingos. „Hewlett-Packard“ integruoja POSIX į licencijuotą MPE/iX OS 5.0 ir HP/UXX 10.0 versijas (UNIX).

POSIX standartas turi daug daugiau nei dešimt dalių, tačiau dvi yra lengvai prieinamos. POSIX.1 aprašomos failų, procedūrų ir įvesties/išvesties terminalų C programavimo sąsajos (t. Y. Sistemos skambučių biblioteka). C POSIX paketų biblioteka, skirta POSIX platformoms, yra C standartinės bibliotekos sistema. Tai nustatoma tuo pačiu metu kaip ir standartinis ANSI C. Kad POSIX atitiktų C standartą, buvo bandyta keletą kartų. POSIX suteikia papildomų funkcijų nei tos, kurios įdiegtos C standarte.







POSIX semaforai

Semaforas yra duomenų struktūra, dažnai naudojama sinchronizuoti procesus ir padėti gijoms, nesuderinant jų tarpusavyje, veikti kartu. Semaforų sąsaja nurodyta POSIX standarte. Tai nėra „Pthreads“ dalis. Tačiau dauguma UNIX, palaikančių „Pthreads“, netgi teikia semaforus. „Unix“ tipo sistemose, tokiose kaip „Linux“, semaforai sujungiami su pranešimų eilėmis ir bendra atmintimi, esančia tarpprocesinio ryšio (IPC) paslaugose. Senesni rėmo V semaforai ir šiuolaikiniai POSIX semaforai tampa dviejų tipų semaforais. POSIX „Semaphore“ skambinimas yra daug lengvesnis nei „System V Semafor“ skambučiai. Nors „System V“ semaforus lengviau gauti, ypač ankstesnėse „Unix“ platformose. Reikia prijungti programas naudojant POSIX semaforus prie „Pthread“ bibliotekos. Šiame straipsnyje apžvelgsime POSIX semaforus.



Kodėl POSIX semaforai?

Aplink siūlus yra didelė problema, tai yra lenktynių būklė. Tai yra aplinkybė, kai dvi gijos siekia gauti ir pakeisti tą pačią informaciją, todėl tampa prieštaringos. Kad išvengtume lenktynių sąlygų, semaforus naudojame labai ilgą laiką.



Semaforai yra dviejų tipų:





Dvejetainis semaforas :

Jis taip pat atpažįstamas kaip „mutex“ užraktas. Ji turėtų tik dvi galimas reikšmes: 0 ir 1. Vertė bus inicijuota kaip 1. Ji naudojama daugeliui procesų vykdyti, kad būtų išspręsta rimta skyriaus problema.



Semaforo skaičiavimas :

Jo dydis gali skirtis neribotame domene. Jis naudojamas norint turėti prieigą prie daugelio egzempliorių išteklių.

„Linux POSIX“ sistemoje yra integruota „Semaphore“ saugykla. Norėdami jį naudoti, turime:

  • Pridėti semaforą.h
  • Surinkite kodą prisijungę prie -lpthread -lrt.

Beveik visi POSIX Semaforo metodai ir formos yra prototipai arba nurodyti skiltyje „Semaphore.h“. Mes naudosime Semaforą, kad apibūdintume subjektą ar objektą taip:

>>sem_t sem_name;

Čia yra skirtingos funkcijos, kurias naudosime „POSIX Semaphore“.

Sem_init

Norėdami inicijuoti semaforą, turite naudoti sem_init metodą. Šioje funkcijoje sem atitinka inicijuotą semaforo objektą. „Pshared“ yra reklamjuostė arba vėliava, nurodanti, ar semaforą galima bendrinti naudojant šakotą () procedūrą, ar ne. „LinuxThreads“ šiuo metu nesudaro bendrų semaforų. Argumento reikšmė yra pradinė vertė, prie kurios fiksuojamas semaforas.

>> tarptsem_init(sem_t*sem, tarptpshared, nepasirašytas tarptvertės);

Sem_laukti

Mes naudosime sem-wait metodą, kad sulaikytume/užrakintume semaforą arba priverstume jį laukti. Jei semaforo vertė buvo neigiama, skambučių ciklas bus automatiškai užblokuotas. Kai kuri kita gija skambina sem_post, vienas iš jau užsikimšusių procesų atsibunda.

>> tarptsem_laukti(sem_t*sem);

Sem_post

Norėdami padidinti semaforo vertę, naudosime metodą sem_post. Skambinus, sem_post padidins vertę, o vienas iš jau užsikimšusių ar laukiančių procesų atsibus.

>> tarptsem_post(sem_t*sem);

Sem_getvalue

Jei norite sužinoti apie semaforo vertę, turite naudoti žemiau esančią funkciją sem_getvalue. Jis gaus dabartinę semaforo vertę ir bus patalpintas į skylę nukreiptą paskirties vietą.

>>Int sem_getvalue(sem_t*sem, tarpt *šuniukas);

Sem_destroy

Jei norite sunaikinti semaforą, turėtumėte naudoti sem_destroy metodą. Jei semaforas žlugs, tęstųsi semaforas.

>>Int sem_destroy(sem_t*sem);

Įdiekite „GCC Utility“

Norėdami surinkti „POSIX Semaphore C“ kodą, „Linux“ sistemoje turite įdiegti „gcc“ įrankį. Šiuo tikslu atidarykite komandų terminalą ir išbandykite žemiau pateiktą komandą.

$sudo apt-get install gcc

Patvirtinkite savo veiksmus smūgiu IR .

POSIX Semaforo diegimas su C programavimu Ubuntu

Pačioje pradžioje turite sukurti naują failą su .cpp plėtiniu „Ubuntu 20.04“ sistemoje. Norėdami tai padaryti, turite pereiti prie savo namų katalogo ir sukurti naują tuščią failą pavadinimu new.cpp. Jį taip pat galite sukurti naudodami jutiklinę komandą savo komandų terminale.

Galite matyti, kad naujas katalogas „failas“ buvo sukurtas namų kataloge.


Sukūrę .cpp failą, atidarykite jį kaip teksto rengyklę savo „Linux“ sistemoje ir parašykite žemiau esantį kodą šiame faile. Po to išsaugokite ir uždarykite.

Vykdykite „POSIX Semaphore C“ programą „Ubuntu 20.04“

Atidarykite savo terminalą „Ubuntu 20.04“ ir vykdykite žemiau esančią komandą gcc, po to - failo pavadinimą.

$gccfailo pavadinimas.c –liefread –lrt

Yra suformuoti 2 siūlai, vienas suformuojamas po 2 sekundžių. Gavęs varžtą, pats pirmasis sriegis miega 4 sekundes. Taigi, paskambinus, antroji gija tiesiogiai neprisijungs ir tai pasirodys praėjus 4-2 = 2 sekundėms po to, kai ji buvo iškviesta. Štai išvestis:

Jei nebūtume naudoję semaforo, pagal konteksto perjungimą rezultatas galėjo būti toks:

Išvada

Šiame vadove pateikta išsami „POSIXSemaphore“ su C programavimu „Ubuntu 20“ naudojimo apžvalga. Naudojant tik POSIX arba Pthread biblioteką tam tikrame C kode, POSIX Semaforas gali būti gana lengvai naudojamas siekiant užkirsti kelią lenktynių sąlygoms kodavimo metu.