unix chapter 6
TRANSCRIPT
Chapter 6 - System Calls 2 Shayke Bilu PhD
?מה בתכנית
המשך –שימוש בקריאות מערכת הפעלה
חזרה -תהליכים
העברת הודעות
תאום תהליכים
Chapter 6 - System Calls 3 Shayke Bilu PhD
קריאות מערכת הפעלה
משתמש יכול לגשת רק
לקריאות מערכת
הפעלה
פונקציות פנימיות של
מערכת הפעלה מוגנות
מפני המשתמש
תכניות משתמש
מערכת ההפעלה
חומרה
קריאות
מערכת
הפעלה
Chapter 6 - System Calls 4 Shayke Bilu PhD
תהליכים
של תכנית ביצועהוא תהליך
של הרצת מספר אשליהתהליכים יוצרים
אפליקציות במקביל
לתכנית אחת יכולים , תכנית אחת –לכל תהליך
להיות תהליכים רבים מתבצעים בו זמנית
Chapter 6 - System Calls 5 Shayke Bilu PhD
דיאגרמת מצבים -תהליך
SUSPENDED
CURRENT READY
SLEEPING
Create
suspend
resume
suspend
resched resched
sleep wake up
Chapter 6 - System Calls 6 Shayke Bilu PhD
create -יצירת תהליכים
XINU יצירת תהליך מתבצעת באמצעות. תומכת בריבוי תהליכים
createקריאת מערכת הפעלה
сreate( <שם הפונקציה הראשית>,
,<גודל מחסנית לתהליך>
,<עדיפות>
,<שם התהליך>
< פרמטרים' מס >, < 1' פרמ >, < 2' פרמ >, …, < n פרמ ' > );
Chapter 6 - System Calls 7 Shayke Bilu PhD
הכנסת תהליך מושעה לריצה
(תהליך חדש שנוצר כרגע: לדוגמא)תהליך מושעה
י קריאת"לריצה ע( READY)בו הוא מוכן עובר למצב
resume. מערכת הפעלה
resume ( <מזהה תהליך> );
ומהרגע הזה מחכה READYהתהליך עובר למצב
בתור לכניסה למעבד
Chapter 6 - System Calls 8 Shayke Bilu PhD
השעיית תהליך
ניתן להשעות תהליך מריצה באמצעות קריאת מערכת
.הפעלה
suspend( <מזהה תהליך> );
ניתן להשעות תהליך רק אם הוא רץ כרגע או מוכן
.לריצה
Chapter 6 - System Calls 9 Shayke Bilu PhD
סיום נורמלי של תהליך מתבצע כאשר מסתיימת
.הפונקציה הראשית שלו
על ידי( להרוג אותו)ניתן לגרום לסיום התהליך לפני כן
killה "קריאת מ
kill( <מזהה תהליך> );
:קריאת התאבדות. תהליך יכול להרוג את עצמו
kill(getpid());
getpid() – מחזיר את המזהה של התהליך
סיום תהליך
Chapter 6 - System Calls 10 Shayke Bilu PhD
<include <conf.h# דוגמה
#include <kernel.h>
xmain()
{
int prA(), prB();
resume( create)prA, INITSTK, INITPRIO, “proc 1”, 0) );
resume( create)prB, INITSTK, INITPRIO, “proc 2”, 0) );
}
prA()
{
while(1)
putc)CONSOLE, ‘A’(;
}
prB()
{
while(1)
putc)CONSOLE, ‘B’(;
}
:פלט
AAAAABBBBBBBAAAAA
AAAAAAAAAAAAAABBB
BAAAAAAAAAAAAAA
Chapter 6 - System Calls 11 Shayke Bilu PhD
תאום תהליכים
ניתן לתאם בין כמה תהליכים על ידי פנייה
אם קיימות )לקריאות מיוחדות של מערכת הפעלה
(.שם
כל תהליך המעוניין בתאום מבקש ממערכת
תעצרי אותי ותפעילי מחדש כשייתקימו התנאים "
"שאקבע
על כותב התכנית לדאוג , התאום לא יקרה אוטומטי
לכך שהתאום יתבצע
Chapter 6 - System Calls 12 Shayke Bilu PhD
תאום תהליכים
:התאום האפשרי
תהליך מחכה עד שתהליך אחר יסיים פעולה
(צרכן/יצרן)מסויימת
כך שלא , ביצוע מניעה הדדית על משאב משותף
ייתכן ששני תהליכים ישנו אותו באותו זמן
Chapter 6 - System Calls 13 Shayke Bilu PhD
תאום תהליכים
בנק הפועלים
מימשנו פונקציה למשיכת כסף מחשבון בנק.
int withdraw( account, amount) {
balance = get_balance( account );
balance -= amount;
put_balance( account, balance);
return balance;
}
ושני בעלי החשבון ניגשים לכספומטים שונים , 50000$בחשבון יש
.זמנית-בו 20000$-ו 30000$ומושכים
Chapter 6 - System Calls 14 Shayke Bilu PhD
?אין כסף –בנק הפועלים
על אותו )תהליך נפרד מבצע כל פעולת משיכה
(מעבד
.... 0$בחשבון
balance = get_balance(account);
balance -= amount; // 50K-30K
put_balance(account, balance);
return balance; // = 20K
balance = get_balance(account);
balance -= amount; // 20K-20K
put_balance(account, balance);
return balance; // = 0
Chapter 6 - System Calls 15 Shayke Bilu PhD
יש כסף –בנק הפועלים
על אותו )תהליך נפרד מבצע כל פעולת משיכה
(.מעבד
?מי שמח עכשיו
balance = get_balance(account);
balance -= amount; // 50K-20K
put_balance(account, balance);
return balance; // = 30K
balance = get_balance(account);
balance -= amount; // 50K-30K
put_balance(account, balance);
return balance; // = 20K
Chapter 6 - System Calls 16 Shayke Bilu PhD
צרכן/בעיית יצרן
קלט עבור מייצרתהליך ראשון . קיימים שני תהליכים
. תהליך שני
קלט המיוצר על ידי תהליך ראשון צורךתהליך שני
תהליך ראשון ממתין עד שהתהליך השני יצרוך את הקלט
שנוצר
Chapter 6 - System Calls 17 Shayke Bilu PhD
סדר אירועים –צרכן /בעיית יצרן
צרכן יצרן
צרוך
צור
צרוך
צור
צרוך
צור
.
.
.
יצרתי
צרכתי
צרכתי
צרכתי
יצרתי
יצרתי
יצרתי
Chapter 6 - System Calls 18 Shayke Bilu PhD
הדפסת מספרים –דוגמה
2000עד 1-להדפיס סדרת מספרים מ –המשימה
תוך כדי שימוש בשני תהליכים
תהליךprod – 2000עד 1-מייצר מספרים מ
תהליךcons – מדפים מספרים המיוצרים על ידי
prod
Chapter 6 - System Calls 19 Shayke Bilu PhD
הדפסת מספרים –דוגמה
:מימושים שונים 4נראה
המימוש הנאיבי
סינכרון באמצעות משתנים
סמפורים
שליחת הודעות
Chapter 6 - System Calls 20 Shayke Bilu PhD
int n=0;
xmain)(
{
int prod(), cons();
resume(create(cons,INITSTK,INITPRIO,"cons",0));
resume(create(prod,INITSTK,INITPRIO,"prod",0));
}
NEWSRC/ex41.c –מימוש נאיבי
prod()
{
int i;
for (i=0; i<2000; i++)
n++;
}
cons()
{
int i;
for (i=0; i<2000; i++)
printf)“n is %d\n”, n(;
}
מהו הפלט של
?התכנית
Chapter 6 - System Calls 21 Shayke Bilu PhD
(בחוברת 15' עמ)פלט –מימוש נאיבי
С:\XINU4WIN\NEWSRC\EXAMPLES> tcc –Ic:\xinu4win\newsrc ex41.c
c:\xinu4win\newsrc\xinu.lib
Turbo C++ Version3.0.0 Copyright(c) 1992 Borland International
: ex41.c
…
С:\XINU4WIN\NEWSRC\EXAMPLES> ex41.exe
Initializing…
….
__________________________________________________
n is 2000
n is 2000
n is 2000
n is 2000
n is 2000
n is 2000
….
מה לא
?בסדר ?איך מתקנים
!!!מסנכרנים
Chapter 6 - System Calls 22 Shayke Bilu PhD
int n=0;
volatile int produced, consumed;
xmain)(
{
int prod(), cons();
produced = 1;
consumed = 0;
resume(create(cons,INITSTK,INITPRIO,"cons",0));
resume(create(prod,INITSTK,INITPRIO,"prod",0));
}
NEWSRC/ex5a.c –סינכרון עם משתנים
produced, consumed –משתנים חדשים 2נוסיף
Chapter 6 - System Calls 23 Shayke Bilu PhD
NEWSRC/ex5a.c –סינכרון תהליכים
/* prod -- increment n 2000 times,*/
/* waiting for it to be consumed */
prod )(
{
int i, k;
for (i=1; i<=2000; i++)
{
while(consumed == 0)
;
n++;
produced = 1;
consumed = 0;
}
/* cons -- print n 2000 times, */
/* waiting for it to be produced */
cons)(
{
int i;
for (i=1; i<=2000; i++)
{
while(produced == 0)
;
printf("n is %d\n", n);
consumed = 1;
produced = 0;
}
?מה הבעיה. 1
Busy Wait , צריכה מוגברת של משאביCPU
?מהו הפלט. 2
Chapter 6 - System Calls 24 Shayke Bilu PhD
(בחוברת 17' עמ)פלט –מימוש נאיבי
С:\XINU4WIN\NEWSRC\EXAMPLES> tcc –Ic:\xinu4win\newsrc ex5a.c
c:\xinu4win\newsrc\xinu.lib
Turbo C++ Version3.0.0 Copyright(c) 1992 Borland International
: ex5a.c
…
С:\XINU4WIN\NEWSRC\EXAMPLES> ex5a.exe
Initializing…
….
__________________________________________________
…
n is 1994
n is 1995
n is 1996
n is 1997
n is 1998
n is 1999
n is 2000
….
Chapter 6 - System Calls 25 Shayke Bilu PhD
תאום באמצעות סמפורים
הוא אמצעי תאום עבור תהליכים סמפור
:לסמפור שני שדות
ערך שלם
תור של תהליכים ממתינים
[Dijkstra, 1968]
Chapter 6 - System Calls 26 Shayke Bilu PhD
פעולות על סמפור
wait(semaphore)
1-מקטין את ערך המונה ב
ממתינים עד שערכו של הסמפור
אינו שלילי
signal(semaphore)
1-מגדיל את ערך המונה ב
משחרר את אחד הממתינים
Chapter 6 - System Calls 27 Shayke Bilu PhD
תאום תהליכים באמצעות סמפורים
פעולתwait גורמת לתהליך לחכות עד אשר יתבצע
signal שישחרר אותו.
אם בוצעsignal לפני כן ,wait ממשיך בלי לחכות .
תאופשר signal על כל , יםsignalאם בוצעו כמה
.נוספת ללא המתנה waitפעולת
בעת אתחול הסמפור ניתן ערך המציין את מספר
ללא קריאות, שיכולות שלא לחכות wait-פעולות ה
.כלל signal-ל
Chapter 6 - System Calls 28 Shayke Bilu PhD
רק לאחד מותר : התשלום בקופה הוא קטע קריטי
לבצעו בכל רגע נתון
כניסה לתור :wait
רק קונה אחד מטופל בקופה, בכל רגע
בסיום התשלום : signal= < שחרור הקונה הבא
לתשלום בקופה
תור לקופה בקולנוע –דוגמה
Chapter 6 - System Calls 29 Shayke Bilu PhD
תור לקופה בקולנוע –דוגמה
:מקרי קצה
כאשר התור אינו ריק הקונה הבא תמיד יחכה
יש לזכור בנוסף אם הקונה : כאשר תור ריק
, ביצירת הסמפור התור ריק. הבא צריך לחכות
כדי שהקונה 1וערך ההתחלה צריך להיות
הראשון לא יחכה
Chapter 6 - System Calls 30 Shayke Bilu PhD
איתחול הסמפור
screate(<ערך התחלתי>);
screateתיצור סמפור חדש
הערך ההתחלתי מציין את מספר פעולות ה-wait
שלילי-ערך זה חייב להיות אי. שיכולות שלא לחכות
(שווה לאפס/כלומר גדול)
במקרה של כשלון תחזיר . מחזירה את מזהה הסמפור
SYSERR .
Chapter 6 - System Calls 31 Shayke Bilu PhD
Wait/Signal
wait (אם נדרש)מבצעת המתנה לסמפור
wait(<מזהה סמפור>);
signal גורמת ל-wait אם יש תהליכים. נוסף להצליח
מבין המחכיםwait ישתחרר הראשון שביקש , מחכים
signal( <מזהה סמפור> );
Chapter 6 - System Calls 32 Shayke Bilu PhD
דיאגרמת מצבים מעודכנת -תהליך
SUSPENDED
CURRENT READY
SLEEPING
Create
suspend
resume
suspend
resched resched
sleep wake up
WAITING
RECEIVING
receive send
wait signal
Chapter 6 - System Calls 33 Shayke Bilu PhD
int n=0;
xmain)(
{
int prod(), cons();
int produced, consumed;
consumed = screate(0);
produced = screate(1);
resume(create(prod,INITSTK,INITPRIO,"prod", 2, consumed, produced));
resume(create(cons,INITSTK,INITPRIO,"cons",2, consumed, produced));
}
NEWSRC/ex5.c –סינכרון עם סמפור
Chapter 6 - System Calls 34 Shayke Bilu PhD
NEWSRC/ex5.c –סינכרון עם סמפור
prod (consumed, produced)
int consumed, produced;
{
int i;
for (i=1; i<=2000; i++)
{
wait(consumed);
n++;
signal(produced);
}
cons)consumed, produced)
int consumed, produced
{
int i;
for (i=1; i<=2000; i++)
{
wait(produced);
printf("n is %d\n", n);
signal(consumed);
}
Chapter 6 - System Calls 35 Shayke Bilu PhD
1/0 –דוגמה של מספרים
cons_sem prod_sem prod cons
1 0
0 0 wait(cons_sem);
0 0 n++;
0 1 signal(prod_sem);
-1 1 wait(cons_sem);
-1 0 wait(prod_sem);
-1 0 printf)…(;
0 0 signal(cons_sem);
0 0 n++;
0 1 signal(prod_sem);
0 -1 wait(prod_sem);
Chapter 6 - System Calls 36 Shayke Bilu PhD
0/0 –דוגמה של מספרים
cons_sem prod_sem prod cons
0 0
-1 0 wait(cons_sem);
0 -1 wait(prod_sem);
!!!אף אחד לא מצליח להתקדם
Chapter 6 - System Calls 37 Shayke Bilu PhD
0/1 –דוגמה של מספרים
cons_sem prod_sem prod cons
0 1
1- 1 wait(cons_sem);
1- 0 wait(prod_sem);
-1 1 printf)…(; // print 0
0 1 signal(cons_sem);
0 0 n++;
0 1 signal(prod_sem);
-1 1 wait(cons_sem);
-1 0 wait(prod_sem);
-1 0 printf)…(; // print 1
0 0 signal(cons_sem);
Chapter 6 - System Calls 38 Shayke Bilu PhD
1/1 –דוגמה של מספרים
cons_sem prod_sem prod cons
1 1
0 1 wait(cons_sem);
0 1 n++;
0 2 signal(prod_sem);
-1 1 wait(cons_sem);
-1 1 wait(prod_sem);
-1 1 printf)…(; // print 1
0 1 signal(cons_sem);
0 0 printf)…(; // print 1
0 0 wait(prod_sem);
?מה נקבל בפלט
1 1 …. 2
Chapter 6 - System Calls 39 Shayke Bilu PhD
תהליכים יכולים לשלוח הודעות אחד לשני
גודל ההודעה ב-XINU הואint (16 ביט)
סינכרוני או אסינכרוני –אופן קבלת ההודעה
שיכולה להכיל הודעה אחת " תיבה"לכל תהליך יש
שלא נקראה
העברת הודעות
Chapter 6 - System Calls 40 Shayke Bilu PhD
send( <הודעה> ,<מזהה תהליך> )
send שולחת הודעה לתהליך שהמזהה שלו ניתן
כפרמטר
שליחת הודעה
Chapter 6 - System Calls 41 Shayke Bilu PhD
שליחת הודעה
send שולחת הודעה לתהליך שמזהה התהליך שלו
ניתן כפרמטר
אם לתהליך כבר קיימת הודעה שעדיין לא נקראה
send נכשלת וההודעה לא נשלחת
send מחזירה SYSERR במקרה של כישלון ואת
הערך של ההודעה במקרה של הצלחה
send לא מחכה עד שהתהליך המקבל יקרא את
אבל בודק אם התהליך הממתין מחכה , ההודעה
READY –הוא ישחרר אותו ל , אם כן. להודעה
Chapter 6 - System Calls 42 Shayke Bilu PhD
שליחת הודעה
sendf( <הודעה> ,<מזהה תהליך> )
sendf שולחת הודעה בדומה ל-send אך דורסת
הודעה קודמת אם עדיין לא נקראה אצל המקבל
Chapter 6 - System Calls 43 Shayke Bilu PhD
קבלת הודעה
receive();
מחכה לקבלת הודעה ומחזירה אותה כשמגיעה
אם קיימת הודעה חדשה בזמן הקריאה ל-receive ,
תקרא ההודעה מבלי לחכות
Chapter 6 - System Calls 44 Shayke Bilu PhD
קבלת הודעה
receiveclr();
קוראת את ההודעה המחכה אם יש כזאת.
מוחזר , אם אין הודעה מחכהOK
בכל מקרהrecvclr לא תחכה
Chapter 6 - System Calls 45 Shayke Bilu PhD
int n=0;
int produced;
Int consumed;
xmain)(
{
int prod(), cons();
consumed = create(cons,INITSTK,INITPRIO,"cons",0);
produced = create(prod,INITSTK,INITPRIO,"prod",0);
resume(consumed);
resume(produced);
}
NEWSRC/ex7.c –הודעות
Chapter 6 - System Calls 46 Shayke Bilu PhD
NEWSRC/ex7.c –הודעות
prod )(
{
int i, k;
for (i=1; i<=2000; i++) {
n++;
send(consumed, n);
k = receive )(;
}
} cons )(
{
int i, msg;
for (i=1; i<=2000; i++) {
msg = receive )(;
printf("n is %d\n", msg);
send(produced, 1);
}
}
מה יהיה הפלט של התכנית? 1-התכנית מדפיסה מספרים מ>>
2000עד
Chapter 6 - System Calls 47 Shayke Bilu PhD
deadlock -מצבי קיפאון
מצב קיפאון נוצר אם יש קבוצת תהליכים שבה כל
תהליך ממתין למאורע שיכול להגרם רק על ידי
תהליך אחר בקבוצה
Chapter 6 - System Calls 48 Shayke Bilu PhD
deadlock -מצבי קיפאון
תהליך ב תהליך א
wait(sem1)
wait(sem2)
wait(sem2)
wait(sem1)
signal(sem1)
signal(sem2)
signal(sem2)
signal(sem1)
Chapter 6 - System Calls 49 Shayke Bilu PhD
livelock -מצבי קיפאון
pid2' תהליך ב pid1' תהליך א
send(pid2, msg);
send(pid1, msg);
while (send(pid2,msg2) == SYSERR);
while (send(pid1, msg2) == SYSERR);
gmsg = receive();
gmsg2 = receive(); gmsg = receive();
gmsg2 = receive();