OS-HW1.pdf

‫ﺳﯿﺴﺘﻢﻫﺎی ﻋﺎﻣﻞ‬
‫ﻧﯿﻢﺳﺎل دوم ‪٩٣-٩٢‬‬
‫ﻣﺪرس‪ :‬ﺣﻤﯿﺪ ﺑﯿ‬
‫داﻧﺸ ﺪهی ﻣﻬﻨﺪﺳ ﮐﺎﻣﭙﯿﻮﺗﺮ‬
‫ﺗﻤﺮﯾﻦ اول‬
‫ﻣﻬﻠﺖ ارﺳﺎل‪ ٣١ :‬ﻓﺮوردﯾﻦﻣﺎه‬
‫ﺳﺆال ‪ .١‬ﺿﺮب ﻣﺎﺗﺮﯾﺲﻫﺎ‬
‫در اﯾﻦ ﺗﻤﺮﯾﻦ ﻣ ﺧﻮاﻫﯿﻢ ﺑﺎ ﮐﻤ ﺑﺮﻧﺎﻣﻪﻧﻮﯾﺴ ﻣﻮازی‪ ،‬ﺳﺮﻋﺖ ﺿﺮب ﻣﺎﺗﺮﯾﺲﻫﺎ را اﻓﺰاﯾﺶ دﻫﯿﻢ‪ .‬ﺑﺮﻧﺎﻣﻪ ﺑﺎ ﮔﺮﻓﺘﻦ‬
‫ﯾ ﻓﺎﯾﻞ ﺣﺎوی ﻣﺎﺗﺮﯾﺲﻫﺎ ﺑﺎﯾﺪ ﻧﺘﯿﺠﻪ ﺿﺮب آنﻫﺎ در ﺧﺮوﺟ اﺳﺘﺎﻧﺪارد ﻧﻤﺎﯾﺶ دﻫﺪ‪ .‬ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺷ ﻞ زﯾﺮ اﺟﺮا‬
‫ﻣ ﺷﻮد‪:‬‬
‫‪./ matrixmult matrices .txt‬‬
‫ﻓﺎﯾﻞ ﺣﺎوی ﻣﺎﺗﺮﯾﺲﻫﺎ در ﻗﺎﻟﺐ زﯾﺮ ﺑﺎﯾﺪ ﺑﺎﺷﺪ‪:‬‬
‫] ‪[matrices - count‬‬
‫] ‪[matrix1 -rows]x[matrix1 - columns‬‬
‫] ‪[ matrix1‬‬
‫] ‪[matrix2 -rows]x[matrix2 - columns‬‬
‫] ‪[ matrix2‬‬
‫‪...‬‬
‫ﺑﺮای ﻧﻤﻮﻧﻪ ﯾ‬
‫ﻓﺎﯾﻞ ورودی ﻣ ﺗﻮاﻧﺪ ﺑﻪ ﺷ ﻞ زﯾﺮ ﺑﺎﺷﺪ‪:‬‬
‫‪2‬‬
‫‪2x4‬‬
‫‪8 2 3 4‬‬
‫‪9 3 5 7‬‬
‫‪4x2‬‬
‫‪2 3‬‬
‫‪4 5‬‬
‫‪6 7‬‬
‫‪9 3‬‬
‫ﺑﺮﻧﺎﻣﻪی ﺷﻤﺎ ﭘﺲ از ﺧﻮاﻧﺪن ﻓﺎﯾﻞ ورودی‪ ،‬در ﺻﻮرﺗ ﮐﻪ اﺑﻌﺎد ﻣﺎﺗﺮﯾﺲﻫﺎ ﺑﺮای ﺿﺮب درﺳﺖ ﻧﺒﺎﺷﻨﺪ‪ ،‬ﺑﺎﯾﺪ ﺑﺎ ﻧﻤﺎﯾﺶ‬
‫ﺧﻄﺎﯾﯽ ﻣﺘﻮﻗﻒ ﺷﻮد‪.‬‬
‫ﻣﻮازیﺳﺎزی‬
‫ﺑﺮای ﻣﻮازی ﮐﺮدن ﺿﺮب ﻣﺎﺗﺮﯾﺲﻫﺎ ﺑﺎﯾﺪ ﺑﺎ ﻧﯿﻢ ﮐﺮدن ﻣﺎﺗﺮﯾﺲﻫﺎ ﺿﺮب ﻫﺮ ﺑﺨﺶ را در ﯾ رﯾﺴﻪی ﺟﺪا اﻧﺠﺎم دﻫﯿﺪ‪.‬‬
‫ﻧﯿﻢ ﮐﺮدن ﻣﺎﺗﺮﯾﺲﻫﺎ ﺑﺎﯾﺪ ﺗﺎ ﺟﺎﯾﯽ اداﻣﻪ ﭘﯿﺪا ﮐﻨﺪ ﮐﻪ ﻫﺮ ﺑﺨﺶ ﺣﺪاﮐﺜﺮ ‪ ٢‬ﻣﺎﺗﺮﯾﺲ داﺷﺘﻪ ﺑﺎﺷﺪ‪ .‬ﺑﺮای ﻣﺜﺎل ﺑﺮای‬
‫ﺿﺮب ﻣﺎﺗﺮﯾﺲﻫﺎی زﯾﺮ‪:‬‬
‫‪A x B x C x D x E‬‬
‫‪١‬‬
‫در ﻣﺮﺣﻠﻪ اول ﺑﻪ ﺷ ﻞ زﯾﺮ ﺑﺨﺶﺑﻨﺪی ﻣ ﮐﻨﯿﻢ‪:‬‬
‫)‪(A x B) x (C x D x E‬‬
‫ﺳﭙﺲ‪:‬‬
‫))‪(A x B) x ((C) x (D x E‬‬
‫در اداﻣﻪ ﺿﺮب ﻫﺮ ﺑﺨﺶ در رﯾﺴﻪی ﺧﻮد اﻧﺠﺎم ﻣ ﺷﻮد‪ .‬ﺑﺮای اﻧﺠﺎم ﻋﻤﻠﯿﺎت ﺿﺮب ﻣﺎﺗﺮﯾﺲ ﻫﻢ ﻣ ﺧﻮاﻫﯿﻢ از‬
‫رﯾﺴﻪﻫﺎی ﺟﺪاﯾﯽ اﺳﺘﻔﺎده ﮐﻨﯿﻢ‪ .‬ﺑﺮای اﯾﻨﮑﺎر ﺿﺮب ﻫﺮ ﺳﻄﺮ ﻣﺎﺗﺮﯾﺲ اول در ﻣﺎﺗﺮﯾﺲ دوم ﺑﺎﯾﺪ در ﯾ رﯾﺴﻪی ﺟﺪا‬
‫اﻧﺠﺎم ﺷﻮد‪ .‬ﺑﺮای ﻣﺜﺎل ﺿﺮب دو ﻣﺎﺗﺮﯾﺲ ﺑﺎ اﺑﻌﺎد ‪ ۴ × ۵‬و ‪ ۵ × ٧‬ﺑﺎﯾﺪ در ‪ ۴‬رﯾﺴﻪی ﺟﺪا اﻧﺠﺎم ﮔﯿﺮد‪ .‬در ﺷ ﻞ زﯾﺮ‬
‫ﻧﻤﻮﻧﻪای از رﯾﺴﻪﻫﺎﯾﯽ ﮐﻪ ﺑﺎﯾﺪ ﺑﺮای ﻋﻤﻠﯿﺎت ﺿﺮب دو ﻣﺎﺗﺮﯾﺲ ﺳﺎﺧﺘﻪ ﺷﻮﻧﺪ را ﻣ ﺗﻮاﻧﯿﺪ ﺑﺒﯿﻨﯿﺪ‪:‬‬
‫‪m n o p‬‬
‫‪q r s t‬‬
‫‪u v w x‬‬
‫ریسه ‪۱‬‬
‫ریسه ‪۲‬‬
‫ریسه ‪۳‬‬
‫×‬
‫‪a b c‬‬
‫‪e f g‬‬
‫‪i j k‬‬
‫ﺷ ﻞ ‪ :١‬رﯾﺴﻪﻫﺎی ﺳﺎﺧﺘﻪ ﺷﺪه ﻫﻨﮕﺎم ﺿﺮب دو ﻣﺎﺗﺮﯾﺲ‬
‫در ﻧﻬﺎﯾﺖ ﺑﻌﺪ از اﻧﺠﺎم ﺿﺮب‪ ،‬ﻣﻘﺪار ﺣﺎﺻﻞ ﺑﺎﯾﺪ در رﯾﺴﻪی ﭘﺪر در ﺑﻘﯿﻪی ﻣﺎﺗﺮﯾﺲﻫﺎ ﺿﺮب ﺷﻮد‪:‬‬
‫= ))‪(A x B) x ((C) x (D x E‬‬
‫= )‪AB x (C x DE‬‬
‫= ‪AB x CDE‬‬
‫‪ABCDE‬‬
‫در اﯾﻦ ﻣﺜﺎل اﺑﺘﺪا دو رﯾﺴﻪ ﺟﺪا ﺳﺎﺧﺘﻪ ﻣ ﺷﻮد‪ ،‬رﯾﺴﻪی اول ﺑﻪ ﻃﻮر ﻣﻮازی ‪ AB‬را ﻣﺤﺎﺳﺒﻪ ﻣ ﮐﻨﺪ وﻟ رﯾﺴﻪی دوم‬
‫ﭼﻮن ﺑﯿﺸﺘﺮ از دو ﻣﺎﺗﺮﯾﺲ دارد‪ ،‬اﺑﺘﺪا ﻣﺎﺗﺮﯾﺲﻫﺎ را ﺑﻪ دو ﻧﯿﻤﻪ ﺗﻘﺴﯿﻢ ﻣ ﮐﻨﺪ‪ ،‬ﻧﯿﻤﻪی اول ﭼﻮن ﻓﻘﻂ ﯾ ﻣﺎﺗﺮﯾﺲ‬
‫دارد‪ ،‬ﻧﯿﺎزی ﺑﻪ ﻣﺤﺎﺳﺒﻪ ﻧﺪارد‪ ،‬وﻟ ﺑﺮای ﻧﯿﻤﻪی دوم ﯾ رﯾﺴﻪی ﺟﺪﯾﺪ ﺳﺎﺧﺘﻪ ﻣ ﺷﻮد ﮐﻪ ﺑﺎﯾﺪ ‪ DE‬را ﻣﺤﺎﺳﺒﻪ ﮐﻨﺪ‪.‬‬
‫در اداﻣﻪ‪ C ،‬در ﻧﺘﯿﺠﻪی ﺣﺎﺻﻞ‪ ،‬ﺿﺮب ﻣ ﺷﻮد‪ .‬در ﻧﻬﺎﯾﺖ دو رﯾﺴﻪی اوﻟﯿﻪ ﭘﺲ از ﻣﺤﺎﺳﺒﻪی ﺿﺮب ﻣﺎﺗﺮﯾﺲﻫﺎی‬
‫ﺑﺨﺶ ﺧﻮد‪ ،‬ﻧﺘﯿﺠﻪ را ﺑﻪ ﺑﺮﻧﺎﻣﻪی اﺻﻠ ﺑﺮ ﻣ ﮔﺮداﻧﻨﺪ ﺗﺎ ﻧﺘﯿﺠﻪی ﻧﻬﺎﯾﯽ ﺑﺎ ﺿﺮب ‪ AB‬در ‪ CDE‬ﻣﺤﺎﺳﺒﻪ ﺷﻮد‪:‬‬
‫‪Thread Main‬‬
‫‪AxBxCxDxE‬‬
‫‪Thread 2‬‬
‫)‪(A x B‬‬
‫‪Thread 3‬‬
‫)‪(C x D x E‬‬
‫‪Thread 4‬‬
‫)‪(D x E‬‬
‫ﺷ ﻞ ‪ :٢‬رﯾﺴﻪﻫﺎی ﺳﺎﺧﺘﻪ ﺷﺪه ﻫﻨﮕﺎم ﺑﺨﺶﺑﻨﺪی ﻣﺎﺗﺮﯾﺲﻫﺎ‬
‫‪٢‬‬
‫ﺳﺆال ‪ .٢‬ﺳﺎﻣﺎﻧﻪی ‪ATM‬‬
‫در اﯾﻦ ﺗﻤﺮﯾﻦ ﻗﺼﺪ دارﯾﻢ رﻓﺘﺎر ﭼﻨﺪ ‪ ATM‬را در ﯾ ﺳﺎﻣﺎﻧﻪی ﺑﺎﻧﮑ ﺷﺒﯿﻪﺳﺎزی ﮐﻨﯿﻢ‪ .‬ﺑﺮای اﯾﻦ ﻣﻨﻈﻮر ﺑﺎ اﺟﺮای‬
‫ﺑﺮﻧﺎﻣﻪ‪ ،‬ﻫﺮ ‪ ATM‬ﺑﺎﯾﺪ در ﯾ رﯾﺴﻪی ﺟﺪا آﻣﺎدهی ﺳﺮوﯾﺲدﻫ ﺑﻪ ﻣﺸﺘﺮﯾﺎن ﺑﺎﺷﺪ‪ .‬ﻫﺮ ‪ ATM‬ﺳﺮوﯾﺲﻫﺎی زﯾﺮ را‬
‫ﺑﻪ ﻣﺸﺘﺮﯾﺎن اراﺋﻪ ﻣ دﻫﺪ‪:‬‬
‫‪ .١‬وارﯾﺰ وﺟﻪ ﺑﻪ ﺣﺴﺎب‬
‫‪ .٢‬ﺑﺮداﺷﺖ وﺟﻪ از ﺣﺴﺎب‬
‫‪ .٣‬اﻧﺘﻘﺎل وﺟﻪ‬
‫‪ .۴‬ﻣﺸﺎﻫﺪهی ﻣﻮﺟﻮدی‬
‫ﻫﺮ ‪ ATM‬ﺑﺎ ﮔﺮﻓﺘﻦ ﯾ‬
‫ﺑﺮﻧﺎﻣﻪ اﺟﺮا ﺷﻮد‪:‬‬
‫ﻓﺎﯾﻞ ﺑﻪ ﻋﻨﻮان ورودی ﻟﯿﺴﺘ از ﮐﺎرﻫﺎی ﻓﻮق را ﺑﺎﯾﺪ اﻧﺠﺎم دﻫﺪ‪ .‬ﺑﺎ اﺟﺮای دﺳﺘﻮر زﯾﺮ ﺑﺎﯾﺪ‬
‫‪./ bank accounts -file atm -count atm1 -file atm2 -file ...‬‬
‫ﻫﺮ ﺳﻄﺮ ﻓﺎﯾﻞ ﻫﺮ ‪ ATM‬ﺣﺎوی ﯾ‬
‫ﺑﻮد‪:‬‬
‫از ﻋﻤﻠﯿﺎت ﻣﻤ ﻦ ‪ ATM‬اﺳﺖ‪ .‬ﻋﻤﻠﯿﺎت ﺑﻪ ﯾ‬
‫از ﭼﻬﺎر ﺷ ﻞ زﯾﺮ ﺧﻮاﻫﻨﺪ‬
‫] ‪transfer [account -number - source ] [account -number - destination ] [ amount‬‬
‫] ‪withdraw [account - number ] [ amount‬‬
‫] ‪deposit [account - number ] [ amount‬‬
‫] ‪balance [account - number‬‬
‫ﺑﺮای ﻧﻤﻮﻧﻪ ﺑﺮای وارﯾﺰ ‪ ١٠٠٠٠‬رﯾﺎل ﺑﻪ ﺣﺴﺎب ‪ ١٣٩٢٧٨٠٩٢٣‬ﭼﻨﯿﻦ ﺳﻄﺮی در ﻓﺎﯾﻞ ﺧﻮاﻫﯿﻢ داﺷﺖ‪:‬‬
‫‪deposit 1392780923 10000‬‬
‫ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﯿﺪ ﮐﻪ واﺣﺪ ﺗﻤﺎﻣ ﭘﻮلﻫﺎ در اﯾﻦ ﺳﺎﻣﺎﻧﻪ ﺑﻪ رﯾﺎل اﺳﺖ‪.‬‬
‫ﻓﺎﯾﻞ ‪ accounts-file‬ﺣﺎوی ﺷﻤﺎره ﺣﺴﺎبﻫﺎ ﺑﻪ ﻫﻤﺮاه ﻣﻮﺟﻮدی اوﻟﯿﻪ ﻫﺮ ﺣﺴﺎب اﺳﺖ‪ .‬ﻫﺮ ﺳﻄﺮ اﯾﻦ ﻓﺎﯾﻞ ﺑﻪ ﺷ ﻞ‬
‫زﯾﺮ اﺳﺖ‪:‬‬
‫] ‪[account - number ] [ balance‬‬
‫ﺑﺮای ﻣﺜﺎل‪:‬‬
‫‪1392780923 10000000‬‬
‫‪1391873210 39975000‬‬
‫وارﯾﺰ وﺟﻪ ﺑﻪ ﺣﺴﺎب‬
‫اﻧﺠﺎم اﯾﻦ ﻋﻤﻞ ﺑﺎ ﮔﺮﻓﺘﻦ ﯾ ﺷﻤﺎره ﺣﺴﺎب و ﻣﻘﺪار ﭘﻮل ﺻﻮرت ﻣ ﮔﯿﺮد‪ .‬ﺑﺎ اﻧﺠﺎم اﯾﻦ ﻋﻤﻞ ﺑﻪ ﻣﻘﺪار ﻣﺸﺨﺺ‬
‫ﺷﺪه ﺑﺎﯾﺪ ﺑﻪ ﻣﻮﺟﻮدی ﺣﺴﺎب اﺿﺎﻓﻪ ﺷﻮد‪ .‬ﺣﯿﻦ اﻧﺠﺎم اﯾﻦ ﻋﻤﻞ ﻫﯿﭻ ﻋﻤﻠﯿﺎت دﯾ ﺮی روی اﯾﻦ ﺣﺴﺎب ﻧﻤ ﺗﻮان‬
‫‪٣‬‬
‫اﻧﺠﺎم داد‪ .‬ﺑﻌﺪ از اﻧﺠﺎم ﻋﻤﻞ وارﯾﺰ وﺟﻪ‪ ،‬ﺣﺴﺎب ﻣﻮردﻧﻈﺮ ﺑﺎﯾﺪ ﺑﻪ ﻣﺪت ﯾ ﺛﺎﻧﯿﻪ ﻗﻔﻞ ﺑﻤﺎﻧﺪ‪ .‬ﺑﻌﺪ از اﯾﻦ زﻣﺎن‪ ،‬ﺑﺎﯾﺪ‬
‫ﭘﯿﻐﺎم زﯾﺮ در ﻻگ ﻣﺮﺑﻮط ﺑﻪ اﯾﻦ ‪ ATM‬ﺛﺒﺖ ﺷﻮد )ﺑﺨﺶ ﻻگ ﻋﻤﻠﯿﺎت را ﺑﺒﯿﻨﯿﺪ(‪:‬‬
‫] ‪[time ]: deposited [ amount ] rials for [account - number‬‬
‫ﺑﺮداﺷﺖ وﺟﻪ از ﺣﺴﺎب‬
‫اﻧﺠﺎم اﯾﻦ ﻋﻤﻞ ﺑﺎ ﮔﺮﻓﺘﻦ ﯾ ﺷﻤﺎره ﺣﺴﺎب و ﻣﻘﺪار ﭘﻮل ﺻﻮرت ﻣ ﮔﯿﺮد‪ .‬ﺣﯿﻦ اﻧﺠﺎم اﯾﻦ ﻋﻤﻞ ﻫﯿﭻ ﻋﻤﻠﯿﺎت دﯾ ﺮی‬
‫روی ﺣﺴﺎب ﻧﻤ ﺗﻮان اﻧﺠﺎم داد‪ .‬اﯾﻦ ﻋﻤﻞ ﺑﺎ ﮐﺎﺳﺘﻦ ﻣﻘﺪار ﻣﺸﺨﺺ ﺷﺪه از ﺣﺴﺎب ﻣﻮرد ﻧﻈﺮ اﻧﺠﺎم ﻣ ﺷﻮد‪ .‬ﺑﻌﺪ‬
‫از اﻧﺠﺎم ﻋﻤﻞ ﺑﺮداﺷﺖ وﺟﻪ‪ ،‬ﺣﺴﺎب ﻣﺸﺨﺺ ﺷﺪه ﺑﺎﯾﺪ ﺑﻪ ﻣﺪت ﯾ ﺛﺎﻧﯿﻪ ﻗﻔﻞ ﺑﻤﺎﻧﺪ‪ .‬در ﺻﻮرﺗ ﮐﻪ ﻣﻮﺟﻮدی‬
‫ﺣﺴﺎب ﮐﻤﺘﺮ از ﻣﯿﺰان ﻣﻮردﻧﻈﺮ ﺑﺎﺷﺪ‪ ،‬ﻋﻤﻠﯿﺎت ﺑﺮداﺷﺖ وﺟﻪ اﻧﺠﺎم ﻧﻤ ﺷﻮد وﻟ ﮐﻤﺎﮐﺎن ﺣﺴﺎب ﺑﻪ ﻣﺪت ﯾ ﺛﺎﻧﯿﻪ‬
‫ﻗﻔﻞ ﻣ ﻣﺎﻧﺪ‪ .‬ﻫﻤﭽﻨﯿﻦ ﭘﯿﻐﺎم زﯾﺮ ﺑﺎﯾﺪ در ﻻگ ﻣﺮﺑﻮط ﺑﻪ اﯾﻦ ‪ ATM‬ﺛﺒﺖ ﺷﻮد‪:‬‬
‫] ‪[time ]: not enough balance for [account - number‬‬
‫در ﺻﻮرﺗ ﮐﻪ ﻋﻤﻠﯿﺎت ﻣﻮﻓﻘﯿﺖ آﻣﯿﺰ ﺑﻮد‪ ،‬ﺑﻌﺪ از ﭘﺎﯾﺎن ﯾﺎﻓﺘﻦ زﻣﺎن ﻗﻔﻞ‪ ،‬ﭘﯿﻐﺎم زﯾﺮ ﺑﺎﯾﺪ ﺛﺒﺖ ﺷﻮد‪:‬‬
‫] ‪[time ]: withdrew [ amount ] rials from [account - number‬‬
‫اﻧﺘﻘﺎل وﺟﻪ‬
‫اﻧﺠﺎم اﯾﻦ ﻋﻤﻞ ﺑﺎ ﮔﺮﻓﺘﻦ ﯾ ﺷﻤﺎره ﺣﺴﺎب ﻣﺒﺪأ و ﻣﻘﺼﺪ و ﻣﻘﺪار ﭘﻮل ﺻﻮرت ﻣ ﮔﯿﺮد‪ .‬ﺣﯿﻦ اﻧﺠﺎم اﯾﻦ ﻋﻤﻞ ﻫﯿﭻ‬
‫ﻋﻤﻠﯿﺎت دﯾ ﺮی روی ﺣﺴﺎب ﻣﺒﺪأ و ﻣﻘﺼﺪ ﻧﻤ ﺗﻮان اﻧﺠﺎم داد‪ .‬اﯾﻦ ﻋﻤﻞ ﺑﺎ ﮐﺎﺳﺘﻦ ﻣﻘﺪار ﻣﺸﺨﺺ ﺷﺪه از ﺣﺴﺎب‬
‫ﻣﺒﺪأ و اﻓﺰودن آن ﺑﻪ ﺣﺴﺎب ﻣﻘﺼﺪ اﻧﺠﺎم ﻣ ﺷﻮد‪ .‬ﺑﻌﺪ از اﻧﺠﺎم ﻋﻤﻞ اﻧﺘﻘﺎل وﺟﻪ‪ ،‬ﺣﺴﺎب ﻣﺒﺪأ و ﻣﻘﺼﺪ ﺑﺎﯾﺪ ﺑﻪ‬
‫ﻣﺪت دو ﺛﺎﻧﯿﻪ ﻗﻔﻞ ﺑﻤﺎﻧﻨﺪ‪ .‬ﻃ اﻧﺠﺎم اﯾﻦ ﻋﻤﻞ ﺑﺎﯾﺪ ‪ ۵٠٠٠‬رﯾﺎل از ﺣﺴﺎب ﻣﺒﺪأ ﺑﺮای ﻫﺰﯾﻨﻪ اﻧﺘﻘﺎل ﮐﺴﺮ ﺷﻮد‪ .‬در‬
‫ﺻﻮرﺗ ﮐﻪ ﻣﻮﺟﻮدی ﺣﺴﺎب ﻣﺒﺪأ ﮐﻤﺘﺮ از ﻣﯿﺰان ﻣﻮردﻧﻈﺮ ﺑﻪ اﺿﺎﻓﻪی ‪ ۵٠٠٠‬رﯾﺎل ﻫﺰﯾﻨﻪ اﻧﺘﻘﺎل وﺟﻪ ﺑﺎﺷﺪ‪ ،‬ﻋﻤﻠﯿﺎت‬
‫اﻧﺘﻘﺎل وﺟﻪ اﻧﺠﺎم ﻧﻤ ﺷﻮد وﻟ ﮐﻤﺎﮐﺎن دو ﺣﺴﺎب ﺑﻪ ﻣﺪت دو ﺛﺎﻧﯿﻪ ﻗﻔﻞ ﻣ ﻣﺎﻧﻨﺪ‪ .‬ﻫﻤﭽﻨﯿﻦ ﭘﯿﻐﺎم زﯾﺮ ﺑﺎﯾﺪ در ﻻگ‬
‫ﻣﺮﺑﻮط ﺑﻪ اﯾﻦ ‪ ATM‬ﺛﺒﺖ ﺷﻮد‪:‬‬
‫] ‪[time ]: not enough balance to transfer from [ source ] to [ destination‬‬
‫در ﺻﻮرﺗ ﮐﻪ ﻋﻤﻠﯿﺎت ﻣﻮﻓﻘﯿﺖ آﻣﯿﺰ ﺑﻮد‪ ،‬ﺑﻌﺪ از ﭘﺎﯾﺎن ﯾﺎﻓﺘﻦ زﻣﺎن ﻗﻔﻞ‪ ،‬ﭘﯿﻐﺎم زﯾﺮ ﺑﺎﯾﺪ ﺛﺒﺖ ﺷﻮد‪:‬‬
‫] ‪[time ]: transferred [ amount ] rials from [ source ] to [ destination‬‬
‫ﻣﺸﺎﻫﺪهی ﻣﻮﺟﻮدی‬
‫اﻧﺠﺎم اﯾﻦ ﻋﻤﻞ ﺑﺎ ﮔﺮﻓﺘﻦ ﯾ ﺷﻤﺎره ﺣﺴﺎب ﺻﻮرت ﻣ ﮔﯿﺮد‪ .‬ﺑﺎ اﻧﺠﺎم اﯾﻦ ﻋﻤﻞ ﺑﺎﯾﺪ ﻣﻘﺪار ﻣﻮﺟﻮدی ﺑﻪ ﺷ ﻞ زﯾﺮ‬
‫در ﻻگ ﻣﺮﺑﻮط ﺑﻪ اﯾﻦ ‪ ATM‬ﺛﺒﺖ ﺷﻮد‪:‬‬
‫‪۴‬‬
‫‪[time ]: balance for [account - number ]: [ amount ] rials‬‬
‫ﺣﯿﻦ اﻧﺠﺎم اﯾﻦ ﻋﻤﻞ ﻫﯿﭻ ﻋﻤﻠﯿﺎت دﯾ ﺮی روی اﯾﻦ ﺣﺴﺎب ﻧﻤ ﺗﻮان اﻧﺠﺎم داد‪ .‬ﺑﻌﺪ از اﻧﺠﺎم ﻋﻤﻞ ﻣﺸﺎﻫﺪهی‬
‫ﻣﻮﺟﻮدی‪ ،‬ﺣﺴﺎب ﻣﻮردﻧﻈﺮ ﺑﺎﯾﺪ ﺑﻪ ﻣﺪت ﯾ ﺛﺎﻧﯿﻪ ﻗﻔﻞ ﺑﻤﺎﻧﺪ‪.‬‬
‫وﻗﻔﻪﻫﺎ‬
‫ﺑﺮﻧﺎﻣﻪی ﺷﻤﺎ ﺑﺎﯾﺪ در ﺻﻮرت درﯾﺎﻓﺖ دو وﻗﻔﻪی زﯾﺮ ﮐﺎرﻫﺎی ﻣﺸﺨﺺ ﺷﺪه را اﻧﺠﺎم دﻫﺪ‪:‬‬
‫وﻗﻔﻪ‬
‫‪SIGINT‬‬
‫‪SIGTSTP‬‬
‫ﻋﻤﻠﯿﺎت‬
‫ﺗﻤﺎم ﻋﻤﻠﯿﺎﺗ ﮐﻪ اﻧﺠﺎم ﺷﺪهاﻧﺪ و در وﺿﻌﯿﺖ ﻗﻔﻞ ﺑﻪ ﺳﺮ ﻣ ﺑﺮﻧﺪ‪ ،‬ﺑﺎز ﮔﺮداﻧ ﻣ ﺷﻮﻧﺪ‬
‫ﻣﻮﺟﻮدی ﻧﻬﺎﯾﯽ ﻫﺮ ﺣﺴﺎب در ﯾ ﻓﺎﯾﻞ ﺑﻪ ﻧﺎم ‪ balance.log‬ﻧﻮﺷﺘﻪ ﻣ ﺷﻮد‪،‬‬
‫ﺳﭙﺲ اﺟﺮای ﺑﺮﻧﺎﻣﻪ ﻣﺘﻮﻗﻒ ﻣ ﺷﻮد‬
‫ﺑﺮای ﺛﺒﺖ ﻣﻮﺟﻮدی ﻧﻬﺎﯾﯽ ﻫﺮ ﺣﺴﺎب از ﻗﺎﻟﺐ زﯾﺮ اﺳﺘﻔﺎده ﮐﻨﯿﺪ‪:‬‬
‫] ‪[account - number ] [ balance‬‬
‫ﻫﻨﮕﺎم درﯾﺎﻓﺖ وﻗﻔﻪی ‪ ،SIGTSTP‬ﻫﻤﻪی رﯾﺴﻪﻫﺎ ﭘﺲ از ﭘﺎﯾﺎن ﯾﺎﻓﺘﻦ ﻋﻤﻠﯿﺎت ﮐﻨﻮﻧ ‪ ،‬از اﺟﺮای اداﻣﻪی ﻋﻤﻠﯿﺎت‬
‫دﺳﺖ ﻣ ﮐﺸﻨﺪ و ﺑﺮﻧﺎﻣﻪ ﺑﺎ ﭘﺎﯾﺎن ﯾﺎﻓﺘﻦ ﻫﻤﻪی رﯾﺴﻪﻫﺎ‪ ،‬ﻓﺎﯾﻞ ‪ balance.log‬را ﻣ ﺳﺎزد و ﺳﭙﺲ ﺧﺎﺗﻤﻪ ﻣ ﯾﺎﺑﺪ‪ .‬در‬
‫ﺣﺎﻟﺘ ﻫﻢ ﮐﻪ ﺑﺪون رخ دادن وﻗﻔﻪی ‪ SIGTSTP‬اﺟﺮای ﻫﻤﻪی رﯾﺴﻪﻫﺎ ﺑﻪ ﭘﺎﯾﺎن ﺑﺮﺳﺪ‪ ،‬ﮐﻤﺎﮐﺎن ﻓﺎﯾﻞ ‪balance.log‬‬
‫ﺑﺎﯾﺪ ﺑﺎ ﭘﺎﯾﺎن ﺑﺮﻧﺎﻣﻪ ﺳﺎﺧﺘﻪ ﺷﻮد‪.‬‬
‫ﺑﺎزﮔﺮداﻧ ﻋﻤﻠﯿﺎت‬
‫در ﺻﻮرﺗ ﮐﻪ وﻗﻔﻪی ‪ SIGINT‬اﯾﺠﺎد ﺷﻮد‪ ،‬ﺗﻤﺎﻣ ﻋﻤﻠﯿﺎﺗ ﮐﻪ اﻧﺠﺎم ﺷﺪهاﻧﺪ و در وﺿﻌﯿﺖ ﻗﻔﻞ ﺑﻌﺪ از ﻋﻤﻠﯿﺎت‬
‫ﺑﻪ ﺳﺮ ﻣ ﺑﺮﻧﺪ‪ ،‬ﭘﺲ از ﭘﺎﯾﺎن ﯾﺎﻓﺘﻦ زﻣﺎن ﻗﻔﻞ‪ ،‬ﺑﻪ ﺣﺎﻟﺖ ﻗﺒﻞ از ﻋﻤﻠﯿﺎت ﺑﺎزﮔﺮداﻧ ﻣ ﺷﻮﻧﺪ‪ .‬ﺑﺎزﮔﺮداﻧ ﻓﻘﻂ ﺑﺮای وارﯾﺰ‬
‫وﺟﻪ‪ ،‬اﻧﺘﻘﺎل وﺟﻪ و ﺑﺮداﺷﺖ وﺟﻪ ﻣ ﺗﻮاﻧﺪ رخ دﻫﺪ و ﺑﺮای اﻧﺘﻘﺎل وﺟﻪ ‪ ۵٠٠٠‬رﯾﺎل ﻫﺰﯾﻨﻪ ﺗﺮاﮐﻨﺶ ﻫﻢ ﺑﻪ ﺣﺴﺎب‬
‫ﻣﺒﺪأ ﺑﺎﯾﺪ ﺑﺎزﮔﺮداﻧﺪه ﺷﻮد‪ .‬ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﯿﺪ ﮐﻪ در ﺣﯿﻦ اﻧﺠﺎم ﻋﻤﻠﯿﺎت ﺑﺎزﮔﺮداﻧ ﻫﻢ ﺑﺎﯾﺪ ﺣﺴﺎبﻫﺎی درﮔﯿﺮ ﻗﻔﻞ‬
‫ﺷﻮﻧﺪ‪ .‬در ﺿﻤﻦ دﻗﺖ ﮐﻨﯿﺪ ﮐﻪ در ﺻﻮرت ﺑﺎزﮔﺮداﻧ ﯾ ﻋﻤﻞ‪ ،‬ﭘﯿﻐﺎم ﻣﺮﺑﻮط ﺑﻪ ﻣﻮﻓﻘﯿﺖ آﻣﯿﺰ ﺑﻮدن ﻋﻤﻞ دﯾ ﺮ ﻧﺒﺎﯾﺪ‬
‫ﺛﺒﺖ ﺷﻮد‪ .‬ﺑﻌﺪ از ﭘﺎﯾﺎن اﯾﻦ ﻋﻤﻞ ﭘﯿﻐﺎم زﯾﺮ ﺑﺎﯾﺪ در ﻻگ ‪ ATM‬ﺛﺒﺖ ﺷﻮد‪:‬‬
‫]} ‪[time ]: reversal of [type ={ transfer ,deposit , withdraw‬‬
‫ﻻگ ﻋﻤﻠﯿﺎت‬
‫ﺑﺮای ﻫﺮ ‪ ATM‬ﺑﺎﯾﺪ ﯾ‬
‫ﻓﺎﯾﻞ ﻻگ ﺑﺎ ﻧﺎم زﯾﺮ ﺳﺎﺧﺘﻪ ﺷﻮد‪:‬‬
‫‪atm[id ]. log‬‬
‫ﺑﺮای ﻣﺜﺎل ‪ ATM‬ﺳﻮم ﺑﺎﯾﺪ ﯾ‬
‫ﻻگ ﺑﺎ اﺳﻢ زﯾﺮ ﺗﻮﻟﯿﺪ ﮐﻨﺪ‪:‬‬
‫‪atm3.log‬‬
‫‪۵‬‬
‫ ﻫﻤﭽﻨﯿﻦ ﺑﺮای ﺷﺮوع ﻫﻤﻪی ﻋﻤﻠﯿﺎت ﺑﺎﯾﺪ ﭘﯿﻐﺎمﻫﺎی زﯾﺮ‬.‫ﺗﻤﺎﻣ ﭘﯿﻐﺎمﻫﺎی ﮔﻔﺘﻪ ﺷﺪه ﺑﺎﯾﺪ در اﯾﻦ ﻓﺎﯾﻞ ﺛﺒﺖ ﺷﻮﻧﺪ‬
:‫ﺛﺒﺖ ﺷﻮﻧﺪ‬
[time ]:
[time ]:
[time ]:
[time ]:
begin
begin
begin
begin
transfer [ source ] [ destination ] [ amount ]
withdraw [account - number ] [ amount ]
deposit [account - number ] [ amount ]
balance [account - number ]
:‫ ﻣ ﺗﻮاﻧﺪ ﺑﻪ ﺷ ﻞ زﯾﺮ ﺑﺎﺷﺪ‬ATM
[22:10:30.00]:
[22:10:32.03]:
[22:10:32.21]:
[22:10:32.55]:
[22:10:33.89]:
[22:10:34.94]:
[22:10:35.28]:
[22:10:35.78]:
‫ﻓﺎﯾﻞ ﻧﻤﻮﻧﻪی ﻻگ ﺑﺮای ﯾ‬
‫ﯾ‬
begin transfer 1392780923 1391873210 1000000
transferred 1000000 rials from 1392780923 to 1391873210
begin withdraw 1392780923 9910000
not enough balance for 1392780923
begin deposit 1392780923 10000000000
reversal of deposit
begin balance 1392780923
balance for 1392780923: 455 rials
.‫ ﻣ ﺗﻮاﻧﯿﺪ اﺳﺘﻔﺎده ﮐﻨﯿﺪ‬،‫ﺑﺮای ﻧﻤﺎﯾﺶ زﻣﺎن از ﻫﺮ ﻗﺎﻟﺐ دﯾ ﺮی ﮐﻪ ﺣﺪاﻗﻞ ﺛﺎﻧﯿﻪی ﻋﻤﻠﯿﺎت را ﻧﺸﺎن دﻫﺪ‬
۶
‫ﻧﮑﺎت ﻧﻬﺎﯾﯽ‬
‫• اﯾﻦ ﺗﻤﺮﯾﻦ را ﺑﺎﯾﺪ ﺑﺎ زﺑﺎن ‪ C‬ﯾﺎ ‪ C++‬اﻧﺠﺎم دﻫﯿﺪ و ﻓﻘﻂ از ﮐﺘﺎﺑﺨﺎﻧﻪ ‪ pthread‬ﻣ ﺗﻮاﻧﯿﺪ اﺳﺘﻔﺎده ﮐﻨﯿﺪ‪.‬‬
‫• ﺗﻮاﺑﻊ ﻧﻮﺷﺘﻦ در ﻓﺎﯾﻞ و ﺧﺮوﺟ اﺳﺘﺎﻧﺪارد در زﺑﺎن ‪ C‬و ‪ C++‬ﻫﯿﭽ ﺪام ‪ thread-safe‬ﻧﺒﻮده و در ﺻﻮرت‬
‫ﻧﯿﺎز ﺑﻪ ﻧﻮﺷﺘﻦ ﻫﻤﺰﻣﺎن در ﯾ ﻓﺎﯾﻞ ﯾﺎ ﺧﺮوﺟ اﺳﺘﺎﻧﺪارد از ﭼﻨﺪ رﯾﺴﻪ‪ ،‬ﺑﺎﯾﺪ ﯾ ﻗﻔﻞ ﺑﺮای ﻋﻤﻠﯿﺎت در ﻧﻈﺮ‬
‫ﺑ ﯿﺮﯾﺪ‪.‬‬
‫• ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﯿﺪ ﮐﻪ ﺳﺎﺧﺘﻦ ﺗﻌﺪاد زﯾﺎدی رﯾﺴﻪ در اﮐﺜﺮ ﻣﻮارد ﺑﺎﻋﺚ ﮐﺎﻫﺶ ﮐﺎرآﯾﯽ ﺧﻮاﻫﺪ ﺷﺪ و ﺳﺎﺧﺘﻦ‬
‫ﺗﻌﺪاد زﯾﺎد آنﻫﺎ در اﯾﻦ ﺗﻤﺮﯾﻦ ﺻﺮﻓﺎً ﺟﻨﺒﻪی آﻣﻮزﺷ دارد‪ .‬در ﻣﺤﯿﻂ واﻗﻌ ‪ ،‬ﺑﺎﯾﺪ ﮐﺎر ﺑﯿﻦ ﺗﻌﺪاد ﻣﺤﺪودی‬
‫رﯾﺴﻪ ﭘﺨﺶ ﺷﻮد‪.‬‬
‫• از ﺑﻪ اﺷﺘﺮاک ﮔﺬاﺷﺘﻦ ﮐﺪ ﺧﻮد ﺑﺎ دﯾ ﺮان ﺑﭙﺮﻫﯿﺰﯾﺪ‪ .‬در ﺻﻮرت ﻣﺸﺎﻫﺪهی ﮐﺪﻫﺎی ﻣﺸﺎﺑﻪ‪ ،‬ﻧﻤﺮه ﻫﺮ دو ﻃﺮف‬
‫ﺑﺮاﺑﺮ ﺑﺎ ﻣﻨﻔ ﻧﻤﺮه ﮐﻞ ﺗﻤﺮﯾﻦ ﺧﻮاﻫﺪ ﺷﺪ‪.‬‬
‫• ﺳﻮاﻻت ﺧﻮد را ﭘﯿﺮاﻣﻮن اﯾﻦ ﺗﻤﺮﯾﻦ از آﻗﺎی اﻟﻠﻬﻮردی و رﺷﯿﺪﯾﺎن ﺑﭙﺮﺳﯿﺪ‪.‬‬
‫‪٧‬‬