Agar ip kutish kerak bo'lsa, uni a ichiga qo'yingbloklangan iplar navbatisemaforda kutish.
Semaforlar
Aslida, semafor bir tuzilmadir:
struct semafor {
int hisobi;
Mavzu *navbat;/* bloklangan */
};/* mavzular */
struct Semaphore S;
S.countmanfiy bo'lmagan qiymatga ishga tushirilishi kerak (ilovaga qarab)
Semaforlar
Aslida, semafor bir tuzilmadir:
struct semafor {
int hisobi;
Mavzu *navbat;/* bloklangan */
};/* mavzular */
struct Semaphore S;
S.countmanfiy bo'lmagan qiymatga ishga tushirilishi kerak (ilovaga qarab)
OS Semaforlari - PASTGA(S) yoki kuting(S)
Agar jarayon S semaforini kutishi kerak bo'lsa, u bloklanadi va semaforning navbatiga qo'yiladi.
PASTGA(lar):
S.count--;
if (S.count < 0) { bu mavzuni bloklash
bu mavzuni S.queuega joylashtiring
}
OS semaforlari - UP(S) yoki signal(S)
TheYUQARIyokisignaloperatsiya bir ipni navbatdan olib tashlaydi va uni tayyor iplar ro'yxatiga kiritadi
UPS): S.count++; agar (S.count <= 0) { S.dan ipni olib tashlang T. bu ipni T ni Tayyor roʻyxatga qoʻying }
T3
T1
T5
Tayyor navbat
T7
UPS)
OS Semaforlari - Kuzatishlar
QachonS.count >= 0
-thebajarilishi mumkin bo'lgan iplar sonikutish(lar)bloklanmasdan tengdirS.count
QachonS. soni < 0
-S da kutayotgan iplar soni | ga tengS.count|
Atomlik va o'zaro istisno
yo'q2 ta mavzu bo'lishi mumkinkuting(S)vasignal(lar)(bir xil S da) bir vaqtning o'zida
shuning uchunkodni aniqlash bloklarikuting(S)vasignal(lar)aslida muhim bo'limlardir
CS muammolarini hal qilish uchun semaforlardan foydalanish
Mavzu Ti: DOWN(S); UPS); CSda faqat bitta ipga ruxsat berish uchun (o'zaro istisno):
-ishga tushirishS.countuchun
Nimaqiymati bo'lishi kerakSCS da k ta ipga ruxsat berish kerakmi?
-ishga tushirishS.countuchun
Oldingi muammoni hal qilish
Semaforlarni bajarish uchun o'zaro istisno qilish uchun foydalaningcnt++
/* T2 mavzu tartibi */ void * hisoblash (void *arg) { int i; uchun (i=0; i<10; i++)cnt++; NULLni qaytarish; } /* T1 mavzu tartibi */ void * hisoblash (void *arg) { int i; uchun (i=0; i<10; i++)cnt++; NULLni qaytarish; } Etiboringiz uchun rahmat!!!