POSIX סמפורות עם תכנות C

Posix Semaphores With C Programming



POSIX מתייחס לממשק הנייד של מערכת ההפעלה, שהוא תקן IEEE, שפותח כדי לסייע לניידות של יישומים שונים. POSIX היא מאמץ לבנות גרסה סטנדרטית נפוצה של UNIX באמצעות שיתוף פעולה של ספקים. זה יקל על העברת אפליקציות בין פלטפורמות חומרה אם הן יעילות. Hewlett-Packard משלבת את POSIX בגירסת ה- MPE/iX OS המורשית של גרסת 5.0 ו- HP/UXX גירסה 10.0, בהתאמה (UNIX שלה).

לתקן POSIX יש הרבה יותר מעשרה חלקים, אולם שניהם ניתנים להשגה בקלות. POSIX.1 מתאר ממשקי תכנות C (כלומר ספריית שיחות מערכת) לקבצים, הליכים ומסופי קלט/פלט. ספריית החבילות C POSIX לפלטפורמות POSIX היא מסגרת של הספרייה הסטנדרטית C. זה נקבע במקביל לתקן ANSI C. כדי להפוך את POSIX לתואם לתקן C, נעשו מספר ניסיונות. POSIX מספקת תכונות נוספות לאלה המיושמות בתקן C.







POSIX סמפורות

סמפור הוא מבנה נתונים המשמש לעתים קרובות לסנכרון התהליכים ולסיוע לשרשורים ללא אינטראקציה ביניהם לפעול יחד. הממשק לסמפורות מצוין בתקן POSIX. זה לא חלק מ- Pthreads. עם זאת, רוב UNIX התומכים ב- Pthreads מספקים אפילו סמפורות. במסגרות דומות ל- Unix, כמו לינוקס, מיזוג סמפורות עם תורי הודעות וזיכרון משותף מתחת לשירותי תקשורת בין-תהליכית (IPC). מסמכי ה- V הישנים יותר והסמפורות המודרניות של POSIX הופכות לשני סוגים של סמפורות. שיחות POSIX סמפור הרבה יותר קלות משיחות מערכת V סמפור. למרות שקל יותר להשיג סמפורות של מערכת V, במיוחד בפלטפורמות קודמות דומות ל- Unix. יש צורך לחבר תוכניות באמצעות סמפורות POSIX לספריית Pthread. נסתכל על הסמפורות של POSIX במאמר זה.



מדוע POSIX סמפורות?

יש בעיה גדולה סביב האשכולות, שהם תנאי הגזע. זהו מצב בו שני נושאים מבקשים להשיג ולשנות את אותו המידע, ובכך להפוך אותו לסותר. כדי להימנע ממצב מירוץ, השתמשנו בסמפורות כבר הרבה מאוד זמן.



ניתן להשיג סמפורות בשני סוגים:





סמפור בינארי :

הוא מוכר גם כמנעול mutex. יהיו לו רק שני ערכים אפשריים, 0 ו- 1. הערך יאתחל כ- 1. הוא משמש לאכיפת תהליכים רבים כדי לפתור את הבעיה החמורה.



ספירת סמפור :

גודלו יכול להשתנות על פני תחום בלתי מוגבל. משתמשים בו כדי לקבל סמכות לגבי גישה למשאבים רבים.

למסגרת POSIX של Linux יש מאגר סמפור משולב. כדי להשתמש בו, עלינו:

  • הוסף semaphore.h
  • ערימת הקוד על -ידי חיבור עם -lpthread -lrt.

כמעט כל השיטות והצורות של POSIX Semaphore הן אב טיפוס או שצוינו ב- 'Semaphore.h'. נשתמש בסמפור כדי לתאר ישות או אובייקט כ:

>>sem_t sem_name;

להלן פונקציות שונות בהן נשתמש ב- POSIX סמפור.

Sem_init

כדי לאתחל סמפור, עליך להשתמש בשיטת sem_init. בפונקציה זו, sem תואם לאובייקט סמפור מאתחל. Pshared הוא כרזה או דגל המציין אם ניתן לשתף את הסמפור עם הליך מסולסל () או לא. סמפורות משותפות אינן מחוסמות כיום על ידי LinuxThreads. ערך הארגומנט הוא הערך ההתחלתי אליו נקבעת הסמפור.

>> intsem_init(sem_t*sem, intpshared, ללא חתימה intערך);

Sem_wait

נשתמש בשיטת ההמתנה למחצה/לנעול סמפור או לגרום לו להמתין. אם הסמפור קיבל ערך שלילי, מחזור השיחות ייחסם אוטומטית. בכל פעם שכל שרשור אחר קורא sem_post, אחד התהליכים שכבר סתומים מתעורר.

>> intsem_wait(sem_t*sem);

Sem_post

נשתמש בשיטת sem_post כדי להגדיל את הערך של סמפור. בעת ההתקשרות, sem_post יעלה את הערך, ואחד התהליכים שכבר סתומים או ממתינים מתעורר.

>> intsem_post(sem_t*sem);

ערך_גובה

אם אתה רוצה לדעת על הערך של סמפור, עליך להשתמש בפונקציה sem_getvalue להלן. הוא יקבל את הערך הנוכחי של הסמפור ויוצב ביעד המחודד.

>>Int sem_getvalue(sem_t*sem, int *גור כלבים);

Sem_destroy

אתה צריך להשתמש בשיטת sem_destroy אם אתה רוצה להרוס את הסמפור. אם מות הסמפור ימשיך, אף שרשור לא יחכה בסמפור.

>>Int sem_destroy(sem_t*sem);

התקן את כלי GCC

כדי לאסוף את קוד POSIX Semaphore C, עליך להתקין את כלי השירות gcc במערכת הלינוקס שלך. לשם כך, פתח את מסוף הפקודה ונסה את הפקודה שלהלן.

$סודו apt-get להתקין gcc

אשר את הפעולה שלך על ידי מכה וגם .

יישום POSIX סמפור עם תכנות C באובונטו

בהתחלה, עליך ליצור קובץ חדש עם סיומת .cpp במערכת אובונטו 20.04. לשם כך, עליך לנווט לכיוון מדריך הבית שלך וליצור קובץ ריק חדש בשם new.cpp. תוכל גם ליצור אותו באמצעות פקודת המגע במסוף הפקודות שלך.

אתה יכול לראות שקובץ new.cpp נוצר במדריך הבית.


לאחר יצירת קובץ .cpp, פתח אותו כעורך טקסט במערכת הלינוקס שלך וכתוב את הקוד שלהלן בקובץ זה כפי שהוא. לאחר מכן, שמור וסגור אותו.

בצע את תוכנית POSIX Semaphore C באובונטו 20.04

פתח את הטרמינל שלך באובונטו 20.04 ובצע את הפקודה להלן gcc ואחריה את שם הקובץ.

$gccfilename.c –lpthread –lrt

נוצרים 2 חוטים, אחד נוצר לאחר 2 שניות של השני. לאחר קבלת הבורג, החוט הראשון ישן במשך 4 שניות. אז, לאחר שהוא נקרא, השרשור השני לא יצטרף ישירות, וזה יופיע 4-2 = 2 שניות לאחר שהוא נקרא. להלן הפלט:

אם לא היינו משתמשים בסמפור, על פי החלפת הקשר, ייתכן שהתוצאה הייתה כפי שנצפה:

סיכום

במדריך זה ניתנה סקירה מפורטת של השימוש ב- POSIXSemaphore עם תכנות C באובונטו 20. על ידי שימוש בספריית POSIX או Pthread בכל קוד C מסוים, ניתן להשתמש ב- POSIX סמפור די בקלות למניעת תנאי גזע במהלך קידוד.