Exer1.pdf

‫ﺗﻤﺮﻳﻦ هﺎﯼ درس ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ‬
‫ﺳﺮﯼ ‪١‬‬
‫‪ -1‬ﭼﻬﺎر ﺷﺮط ﺑﺮاي وﻗﻮع ‪ deadlock‬ﻻزم اﺳﺖ‪) mutual exclusion:‬ﻣﻤﺎﻧﻌﺖ دو ﺟﺎﻧﺒﻪ (‪،‬‬
‫‪) hold and wait‬ﺗﻮﻗﻒ واﻧﺘﻈﺎر( ‪ )No preemption،‬ﻋﺪم ﭘﻴﺸﺪﺳﺘﻲ ( و ‪Circular‬‬
‫‪) wait‬اﻧﺘﻈﺎر داﻳﺮه اي ( ‪ .‬ﺗﻮﺳﻂ ﻣﻜﺎﻧﻴﺰم ﺟﻠﻮﮔﻴﺮي از ‪deadlock ) deadlock‬‬
‫‪،( prevention‬ﺑﺎ ﺟﻠﻮﮔﻴﺮي از رخ دادن ﻳﻜﻲ از ﺷﺮاﻳﻂ ﮔﻔﺘﻪ ﺷﺪه ﺳﻴﺴﺘﻢ اﻃﻤﻴﻨﺎن ﭘﻴﺪا ﻣﻲ‬
‫ﻛﻨﺪ ﻛﻪ ‪ deadlock‬رخ ﻧﺨﻮاﻫﺪ داد‪ .‬ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﻛﻪ ﻫﺮ ﻛﺪام از ﺗﻜﻨﻴﻚ ﻫﺎي زﻳﺮ از ﻛﺪام‬
‫ﺷﺮاﻳﻂ ‪ deadlock‬ﺟﻠﻮﮔﻴﺮي ﻣﻲ ﻛﻨﺪ ‪:‬‬
‫‪a . Mutual exclusion‬‬
‫‪b . Hold and wait‬‬
‫‪c . No preemption‬‬
‫‪d . Circulat wait‬‬
‫• ﺑﺮاي اﺳﺘﻔﺎده از ﻣﻨﺎﺑﻊ ﺗﺮﺗﻴﺐ ﻗﺎﺋﻞ ﻣﻲ ﺷﻮد‬
‫• ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﭘﺮدازه ﺗﻘﺎﺿﺎي ﻳﻚ ﻣﻨﺒﻊ ﻣﻲ ﻛﻨﺪ ﻛﻪ در اﺧﺘﻴﺎر دﻳﮕﺮي اﺳﺖ‪ ،‬آن ﭘﺮدازه‬
‫ﻣﺠﺒﻮر ﻣﻲ ﺷﻮد ﺗﺎ ﻣﻨﺒﻊ را آزاد ﻛﻨﺪ‪.‬‬
‫• ﻓﻘﻂ ﻫﻨﮕﺎﻣﻲ ﻳﻚ ﭘﺮدازه ﻣﻲ ﺗﻮاﻧﺪ ﺗﻘﺎﺿﺎي ﻣﻨﺒﻌﻲ ﻛﻨﺪ ﻛﻪ ﻫﻴﭻ ﻣﻨﺒﻌﻲ در اﺧﺘﻴﺎر ﻧﺪاﺷﺘﻪ‬
‫ﺑﺎﺷﺪ‪.‬‬
‫• ﺑﻪ ﻫﻤﻪ ي ﭘﺮدازه ﻫﺎ اﺟﺎزه ي دﺳﺘﺮﺳﻲ ﻫﻤﺰﻣﺎن ﺑﻪ ﻣﻨﺎﺑﻊ داده ﻣﻲ ﺷﻮد‪.‬‬
‫• ﺑﻪ ﻳﻚ ﭘﺮدازه اﺟﺎزه داده ﻣﻲ ﺷﻮد ﺗﺎ ﻫﻤﻪ ي ﻣﻨﺎﺑﻊ ﻣﻮرد ﻧﻴﺎز ﺧﻮد را ﺑﻪ ﻳﻜﺒﺎره در اﺧﺘﻴﺎر‬
‫ﺑﮕﻴﺮد‪.‬‬
‫‪ -2‬ﻓﺮض ﻛﻨﻴﺪ ﻛﻪ ﻛﺎرﻫﺎي زﻳﺮ ﻗﺮار اﺳﺖ ﺗﻮﺳﻂ ﻳﻚ ﭘﺮدازﻧﺪه اﺟﺮا ﺷﻮد‪.‬ﺑﺮاي اﻟﮕﻮرﻳﺘﻢ ﻫﺎ ي ‪FCFS‬‬
‫و ‪ SJF‬زﻣﺎن اﻧﺘﻈﺎر ﻫﺮ ﻛﺎر را ﻣﺤﺎﺳﺒﻪ ﻛﻨﻴﺪ‪.‬‬
‫‪1‬‬
‫‪Job Arrival Time CPU time‬‬
‫‪5‬‬
‫‪0‬‬
‫‪A‬‬
‫‪4‬‬
‫‪2‬‬
‫‪B‬‬
‫‪5‬‬
‫‪4‬‬
‫‪C‬‬
‫‪2‬‬
‫‪6‬‬
‫‪D‬‬
‫‪ -3‬ﮔﺮاف ﺗﺨﺼﻴﺺ ﻣﻨﺎﺑﻊ ﺑﺎﻻ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪ .‬دﻧﺒﺎﻟﻪ اي از دﺳﺘﻮراﻟﻌﻤﻞ ﻫﺎ ي )(‪lock.acquire‬‬
‫ﻛﻪ ﺗﻮﺳﻂ ﭘﺮدازه ﻫﺎي ‪ p1,p2,p3‬ﺑﺮاي ﻣﻨﺎﺑﻊ ‪ R1,R2,R3‬اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ ﺑﮕﻮﻳﻴﺪ ﻛﻪ ﻣﻨﺠﺮ ﺑﻪ‬
‫ﺣﺎﻟﺖ زﻳﺮ در ﮔﺮاف ﺷﻮد‪.‬‬
‫‪ -4‬ﻳﻚ ﺣﺠﻢ ﻛﺎري ﺷﺎﻣﻞ ‪ 5‬ﻛﺎر ﻛﻪ ﻫﺮ ﻛﺪام زﻣﺎن ﻣﺴﺎوي ‪ x‬را ﻧﻴﺎز دارﻧﺪ و ﻋﻤﻠﻴﺎت ‪ I/O‬اﻧﺠﺎم‬
‫ﻧﻤﻴﺪﻫﻨﺪ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪ .‬ﺑﺮاي ﺣﺪاﻗﻞ ﻛﺮدن ﻣﺘﻮﺳﻂ زﻣﺎن اﻧﺘﻈﺎر ﻛﺎرﻫﺎ آﻳﺎ ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ از‬
‫اﻟﮕﻮرﻳﺘﻢ زﻣﺎن ﺑﻨﺪ ‪ FCFS‬و ﻳﺎ ‪ RR‬اﺳﺘﻔﺎده ﻛﻨﻴﻢ ؟‬
‫‪ -5‬ﻛﺪﻫﺎ ي ﻧﻤﻮﻧﻪ ي زﻳﺮ ﻛﻪ در ﺟﺎوا ﻧﻮﺷﺘﻪ ﺷﺪه اﻧﺪ ﻛﻼس ‪ Lock‬را ﺑﻪ دو ﻣﺘﺪ )(‪ acquire‬و‬
‫)(‪ release‬ﻧﺸﺎن ﻣﻲ دﻫﻨﺪ‪ .‬ﻣﻲ ﺗﻮاﻧﻴﺪ ﻓﺮض ﻛﻨﻴﺪ ﻛﻪ ﻫﺮ ﺑﺮﻧﺎﻣﻪ ﻗﺒﻞ از ورود ﺑﻪ ﻧﺎﺣﻴﻪ ي‬
‫ﺑﺤﺮاﻧﻲ )(‪ lock.acquire‬و ﺑﻌﺮ از ﺧﺎرج ﺷﺪن از آن )(‪ lock.release‬را ﺻﺪا ﻣﻲ ﻛﻨﺪ‪.‬ﺑﺮاي‬
‫ﭘﻴﺎده ﺳﺎزي اي ﻛﻪ اﺣﺘﻴﺎج ﺑﻪ ‪ ( thread id) tid‬دارد ﻓﺮض ﻛﻨﻴﺪ ﻛﻪ ‪ tid‬ﺻﻔﺮ ﻳﺎ ﻳﻚ اﺳﺖ‪.‬‬
‫ﺑﺮاي ﻫﺮ ﻛﺪ ﺑﻪ ﺳﻮال ﻫﺎي زﻳﺮ ﭘﺎﺳﺦ دﻫﻴﺪ‪:‬‬
‫‪2‬‬
‫ آﻳﺎ ﻛﺪ ﻣﻤﺎﻧﻌﺖ دو ﺟﺎﻧﺒﻪ را ﺗﻀﻤﻴﻦ ﻣﻲ ﻛﻨﺪ؟‬-1
‫ آﻳﺎ ﻛﺪ ﭘﻴﺸﺮﻓﺖ را ﺗﻀﻤﻴﻦ ﻣﻲ ﻛﻨﺪ؟‬-2
‫)ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﻋﺪم ﻛﺎرا ﺑﻮدن و‬.‫ ﻣﺤﺪودﻳﺖ ﻫﺎ ي دﻳﮕﺮي ﻛﻪ وﺟﻮد دارﻧﺪ را ﻣﺸﺨﺺ ﻛﻨﻴﺪ‬-3
( ‫ﻳﺎ ﻋﺪم وﺟﻮد ﻋﺪاﻟﺖ‬
1- class Lock {
private int turn = 0;
public void acquire(int tid) {
while (turn == (1 - tid));
}
public void release(int tid) {
turn = (1 - tid);
}
}
2- class Lock {
public void acquire() {
disableInterrupts();
}
public void release() {
enableInterrupts();
}
}
3- class Lock {
private int turn = 0;
private boolean lock[2] = {false, false};
public void acquire(int tid) {
lock[tid] = true;
turn = 1 - tid;
while (lock[1-tid] && turn == (1 - tid));
}
public void release(int tid) {
lock[tid] = false;
}
}
4- class Lock {
private boolean lock = true;
public void acquire() {
3
‫;)‪while (TestAndSet(lock, true‬‬
‫}‬
‫{ )(‪public void release‬‬
‫;‪lock = false‬‬
‫}‬
‫}‬
‫‪ -6‬ﻣﺰاﻳﺎ و ﻣﻌﺎﻳﺐ ﻃﺮاﺣﻲ ﻻﻳﻪ اي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻛﺪاﻣﻨﺪ؟ و ﺳﺮوﻳﺲ ﻫﺎي اﺻﻠﻲ ﻛﻪ ﺗﻮﺳﻂ ﻳﻚ‬
‫ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ اراﺋﻪ ﻣﻲ ﺷﻮﻧﺪ را ﺑﻪ اﺧﺘﺼﺎر ﺗﻮﺿﻴﺢ دﻫﻴﺪ‪.‬‬
‫‪ -7‬ﻳﻚ ﺳﻴﺴﺘﻢ ﭼﻨﺪ ﭘﺮدازﻧﺪه اي ﺑﺎ ﻣﺪل ‪ thread‬ﭼﻨﺪ ﺑﻪ ﭼﻨﺪ و ﻳﻚ ﺑﺮﻧﺎﻣﻪ ي ﭼﻨﺪ ‪thread‬ي را‬
‫ﻓﺮض ﻛﻨﻴﺪ ﻛﻪ ﺗﻌﺪاد ‪ thread‬ﻫﺎي ﺳﻄﺢ ﻛﺎرﺑﺮ از ﺗﻌﺪاد ﭘﺮدازه ﻫﺎ ﺑﻴﺸﺘﺮ ﺑﺎﺷﺪ‪ .‬در ﻣﻮرد ﻛﺎراﻳﻲ‬
‫ﺳﻴﺴﺘﻢ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻫﺮ ﻳﻚ از ﺳﻨﺎرﻳﻮ ﻫﺎي زﻳﺮ ﺑﺤﺚ ﻛﻨﻴﺪ‪:‬‬
‫• ﺗﻌﺪاد ‪ thread‬ﻫﺎي ﻫﺴﺘﻪ اﺧﺘﺼﺎص داد ﺷﺪه ﺑﻪ ﺑﺮﻧﺎﻣﻪ از ﺗﻌﺪاد ﭘﺮدازﻧﺪه ﻫﺎ ﻛﻤﺘﺮ اﺳﺖ‪.‬‬
‫• ﺗﻌﺪاد ‪ thread‬ﻫﺎ ي ﻫﺴﺘﻪ اﺧﺘﺼﺎص داده ﺷﺪه ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺮاﺑﺮ ﺑﺎ ﺗﻌﺪاد ﭘﺮدازﻧﺪه ﻫﺎﺳﺖ‪.‬‬
‫• ﺗﻌﺪاد ‪ thread‬ﻫﺎي ﻫﺴﺘﻪ اﺧﺘﺼﺎص داده ﺷﺪه ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺑﻴﺸﺘﺮ از ﺗﻌﺪاد ﭘﺮدازﻧﺪه ﻫﺎ وﻟﻲ ﻛﻤﺘﺮ‬
‫از ﺗﻌﺪاد ‪ thread‬ﻫﺎي ﺳﻄﺢ ﻛﺎرﺑﺮ ﻣﻲ ﺑﺎﺷﺪ‪.‬‬
‫‪5.4 -7‬و ‪ 5.5‬و ‪ 5.13‬و ‪ 6.1‬و ‪ 6.2‬و ‪. 6.9‬‬
‫‪ -8‬ﻓﺮض ﻛﻨﻴﺪ ﻛﺎرﺑﺮ ﻓﺮﻣﺎن زﻳﺮ را در ‪ shell‬وارد ﻛﺮده اﺳﺖ ‪:‬‬
‫‪cat file | tr -s -c '[:alpha:]' '[\n*]' | tr‬‬
‫‪'[:upper:]' '[:lower:]' | sort -u | wc -l‬‬
‫ﻣﻔﺴﺮ ﻓﺮﻣﺎن ﻫﺮ ﻓﺮﻣﺎن را ﺗﻮﺳﻂ ﭘﺮدازه ي ﺟﺪاﮔﺎﻧﻪ اي اﺟﺮا ﻣﻲ ﻛﻨﺪ‬
‫‪ -1‬ﺟﻨﺪ ﺑﺎ ر ﻓﺮاﺧﻮاﻧﻲ ﺑﻪ )(‪pipe() ,fork‬و)(‪ ,exec‬ﺑﺎﻳﺪ ﺻﻮرت ﮔﻴﺮد؟‬
‫‪4‬‬
‫‪ -2‬ﻳﻜﻲ از راه ﻫﺎي اﺟﺮاي ﻓﺮﻣﺎن ﻫﺎ ﺗﻮﺳﻂ ﻣﻔﺴﺮ اﻳﻦ اﺳﺖ ﻛﻪ ﻣﻔﺴﺮ ﻳﻚ ﭘﺮدازه ي ﺟﺪﻳـﺪ‬
‫‪ fork‬ﻛﺮده و ﻓﺮﻣﺎن ﻧﺨﺴﺖ را ‪ exec‬ﻛﻨﺪ‪ .‬ﺳﭙﺲ ﭘﺮدازه ي دﻳﮕﺮي ‪ fork‬ﻛـﺮده‬
‫و ﻓﺮﻣﺎن ﺑﻌﺪ را اﺟﺮا ﻛﻨﺪ و ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴﺐ‪ .‬ﻳﻚ دﻳﺎﮔﺮام ﺷـﺎﻣﻞ ﻫﻤـﻪ ي ﭘـﺮدازه ﻫـﺎ از‬
‫ﺟﻤﻠﻪ ‪ shell‬رﺳﻢ ﻛﻨﻴﺪ ﻛﻪ در آن ﻫﺮ ﭘﺮدازه ﺑﺎ ﻳﻚ ﻳﺎل ﺑﻪ ﭘﺪر ﺧﻮد اﺷﺎره ﻛﻨﺪ‪.‬‬
‫‪ -3‬در ﻗﺴﻤﺖ ﻗﺒﻞ ﭼﻪ ﭼﻴﺰ ﻣﻔﺴﺮ را از ﭘﺮداﺧﺘﻦ ﺑﻪ ﻓﺮﻣﺎن ﺑﻌﺪ ﭘـﻴﺶ از ﺗﻤـﺎم ﺷـﺪن ﺗﻤـﺎم‬
‫ﻓﺮﻣﺎن ﻫﺎ ﺑﺎز ﻣﻲ دارد؟‬
‫‪ -4‬ﻳﻚ راه دﻳﮕﺮ ﺑﺮاي اﺣﺮاي ﻓﺮﻣﺎن ﻫﺎ اﻳﻦ اﺳﺖ ﻛﻪ ﻣﻔﺴﺮ ﻳـﻚ ﭘـﺮدازه را ‪ fork‬ﻛﻨـﺪ و‬
‫اﻳﻦ ﭘﺮدازه و اﻳﻦ ﭘﺮدازه ﻓﺮﻣﺎن ﻧﺨﺴﺖ را اﺟﺮا ﻛﻨﺪ‪ .‬ﺳـﭙﺲ ﻣﻔـﺴﺮ ﭘـﺮدازه ي دﻳﮕـﺮي را‬
‫‪ fork‬ﻣــﻲ ﻛﻨــﺪ و اﻳــﻦ ﭘــﺮدازه ي ﺟﺪﻳــﺪ ‪ shell‬ﺟﺪﻳــﺪي ‪ exec‬ﻣــﻲ ﻛﻨــﺪ و‬
‫آرﮔﻮﻣﺎﻧﻲ در ﺧﻂ ﻓﺮﻣﺎن ﺑﻪ آن رد ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻣﺎﺑﻘﻲ ﻓﺮﻣﺎن ﻛﺎرﺑﺮ)ﺑﻪ ﺟﺰ ‪(cat‬را اﺟـﺮا‬
‫ﻛﻨﺪ‪ .‬و ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴﺐ‪ .‬ﻳﻚ دﻳﺎﮔﺮام ﺷﺎﻣﻞ ﻫﻤﻪ ي ﭘﺮدازه ﻫﺎ از ﺟﻤﻠﻪ ‪ shell‬رﺳـﻢ‬
‫ﻛﻨﻴﺪ ﻛﻪ در آن ﻫﺮ ﭘﺮدازه ﺑﺎ ﻳﻚ ﻳﺎل ﺑﻪ ﭘﺪر ﺧﻮد اﺷﺎره ﻛﻨﺪ‪.‬‬
‫‪ -5‬در ﻗﺴﻤﺖ ﭼﻪ ﭼﻴﺰ ﻣﻔﺴﺮ را از ﭘﺮداﺧﺘﻦ ﺑﻪ ﻓﺮﻣﺎن ﺑﻌﺪ ﭘﻴﺶ از ﺗﻤﺎم ﺷﺪن ﺗﻤﺎم ﻓﺮﻣـﺎن‬
‫ﻫﺎ ﺑﺎز ﻣﻲ دارد؟‬
‫‪ -6‬اﮔﺮ ﺷﻤﺎ ﻧﻮﻳﺴﻨﺪه ي ﻣﻔﺴﺮ ﺑﻮدﻳﺪ ﻛﺪام ﻳﻚ از ﻣﺸﻲ ﻫﺎي ﺑـﺎﻻ را اﻧﺘﺨـﺎب ﻣـﻲ ﻛﺮدﻳـﺪ؟‬
‫ﺗﻮﺿﻴﺢ دﻫﻴﺪ‪.‬‬
‫‪ -7‬اﻳﻦ ﻓﺮﻣﺎن ﭼﻪ ﻛﺎري اﻧﺠﺎم ﻣﻲ دﻫﺪ؟‬
‫ﻣﻬﻠﺖ ﺗﺤﻮﻳﻞ ‪. 85/2/7‬‬
‫ﺗﻤــﺮﻳﻦ ﻫــﺎ ي ﺧــﻮد را ﺑــﻪ آدرس ‪ [email protected]‬وﻳــﺎ ‪[email protected]‬‬
‫ﺑﻔﺮﺳﺘﻴﺪ‪.‬‬
‫‪5‬‬