unix chapter 6

50
מערכות הפעלהUNIX תרגול6 קריאות מערכת ההפעלהShayke Bilu PhD Chapter 6 - System Calls 1

Upload: sce

Post on 20-Apr-2023

2 views

Category:

Documents


0 download

TRANSCRIPT

UNIX מערכות הפעלה

קריאות מערכת ההפעלה – 6תרגול

Shayke Bilu PhD Chapter 6 - System Calls 1

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();

Chapter 6 - System Calls 50 Shayke Bilu PhD

ה לניהול זכרון"קריאות מ

עדיפויות

מבנה ה-PC

...בשעור הבא