Thursday, March 27, 2008

SW316 Лаб/ажил 3

Лабораторийн ажил 3

Сэдэв: Нөөцийн төлөөх өрсөлдөөн

Хугацаа: IV/10-11

Оноо: 4 хүртэл оноо

Бодлогын нөхцөл: Деккерийн алгоритмуудыг загварчлах

Бодогын өгөгдөл: Системд 2 загвар байгаа гэж үзнэ. Процессуудын юу хийхийг оюутан өөрөө шийднэ.

Онолын товчоо
Нөөцийн төлөөх өрсөлдөөний үед гарч ирэх солбицол, синхрончлол гэсэн хоёр ойлголт хоорондоо ялгаатай ойлголтууд юм. Солбицлын асуудал нь хамтран эзэмшиж буй өгөгдөл рүү зэрэгцээ ажиллаж буй процессууд нэгэн зэрэг хандах үед үүсдэг. Харин синхрончлолын асуудал нь ямар нэг нөхцлөөр процессуудыг ажиллах, түр зогсох үйлдлийг зохицуулах үед үүсдэг. Өөрөөр хэлбэл эдгээр асуудлууд нь процессууд хоорондоо харилцан ажиллаж байхад үүсдэг.

Олон тооны процесс зэрэгцээ ажиллаж байх явцад ямар нэг нөөцийг ашиглах хэд хэдэн хүсэлт нэгэн зэрэг ирж болно. Энэ тохиолдолд хүсэлтүүдийг зохицуулах хэрэгтэй. Гэвч ихэнх үйлдлийн систем жинхэнэ утгаараа зэрэгцээ ажиллагаатай бус харин зүгээр л зэрэгцээ ажиллаж буй сэтгэгдэл төрүүлдэг билээ.
Энэ тохиолдолд нөөцийн төлөөх өрсөлдөөн үүсэхгүй мэт боловч үнэндээ тийм биш юм.

Нэгэн жишээ авч үеье.
Доор бичсэн гараас утга аваад, дэлгэцэнд хэвлэх echo функцийг P1, P2 процессууд хамтран эзэмшиж байгаа гэж үзье. (echo функц нь нөөц мөн үү?)
void echo {
chin=getchar();
chout=chin;
putchar(chout); }

Алгоритм 5.1 echo процедур

Энэ функцийг P1, P2 процессууд дуудсан байг. P1 процесс ажиллахдаа утгыг chin хувьсагчид уншаад түр завсарласан. Харин P2 процесс нь ажиллахдаа echo функцийг бүтнээр ажиллуулсан гэж үзье. Дараа нь P1 процесс өөрийн ээлжинд ажиллаж эхлээд chout хувьсагчид chin хувьсагчийн утгыг оноогоод дараа нь chout хувьсагчийн утгыг гаргана. Гэтэл урьд нь P2 процессын үр дүнд chin утга өөрчлөгдсөн тул хүссэн утгыг гаргахгүй.
P1 процесс ажиллаж байна
chin=getchar(); // chin=100 болсон гэж үзье
Р1 процесс түр завсарлав.
Р2 процесс ажиллаж эхлэв.
chin=getchar(); //chin=120 болсон гэж үзье
chout=chin;
putchar(chout); //120 утгыг хэвлэв
P2 процесс үйл ажиллагаагаа дуусгав
Р1 процесс үргэлжлүүлэн ажиллав
chout=chin
putchar(chout); //120 утгыг гаргав
P1 процесс үйл ажиллагаагаа дуусгав

Алгоритм 5.2 Солбицлын асуудал

Дээрх жишээнд Р1 процесс 120 утга гаргаж байна. гэтэл анх Р1 процесс ажиллахдаа 100 утгыг гаднаас авсан билээ. Энэ асуудлыг шийдэхдээ echo хэмээх нөөцийг ямарваа нэгэн процесс эзэмшиж эхлэхээс өмнө өөр хэн нэгэн эзэмшиж буй эсэхийг шалгадаг байх шаардлага тавьснаар шийдэж болно.
Р1 процесс ажиллаж байна
echo нөөцийг өөр хэн ч эзэмшээгүй тул уг нөөцийг Р1 процесс эзэмшиж байгаа тухай тэмдэглээд үйл ажиллагаагаа үргэлжлүүлье

chin=getchar();

Р1 процесс түр завсарлав
Р2 процесс ажиллаж эхлэв
echo нөөцийг Р1 процесс эзэмшиж байгаа тухай тэмдэглэсэн тул уг нөөцийг эзэмшилгүйгээр үйл ажиллагааг үргэлжлүүлье
Энд ямарваа нэгэн үйлдэл хийхгүй
Р2 процесс түр завсарлав
Р1 процесс үргэлжлүүлэн ажиллав
echo нөөцийг Р1 процесс (өөрөө) эзэмшиж байгаа тухай тэмдэглэсэн тул үйл ажиллагаагаа үргэлжлүүлье

chout=chin;
putchar(chout); //100 утгыг гаргана

echo нөөцийг Р1 эзэмшиж байгаа тухай тэмдэглэлээ арилгалаа
Р1 процесс үйл ажиллагаагаа дуусгав
Р2 процесс үргэлжлүүлэн ажиллав
echo нөөцийг өөр хэн ч эзэмшээгүй тул уг нөөцийг Р2 процесс эзэмшиж байгаа тухай тэмдэглээд үйл ажиллагаагаа үргэлжлүүлье

chin=getchar(); //chin=120 болсон
chout=chin;
putchar(chout); //120 утгыг гаргана

Р2 процесс үйл ажиллагаагаа дуусгав

Алгоритм 5.3 Солбицлын асуудлыг шийдсэн нь

Систем дэх процессууд бусад процессуудын талаар ямар ч мэдээлэлгүй байх ба зөвхөн өөрт шаардлагатай нөөцийн төлөө бусадтай өрсөлдөх хэлбэрээр ажиллана.Өөрөөр хэлбэл процесс бүр өөрийн шаардлагыг хангахын төлөө л ажиллана. Энэ тохиолдолд системд доорхи асуудлууд үүсч болно.
- Солбицол (mutual exclusion,mutex) – Нэг процессын эзэмшиж буй нөөцийг өөр нэгэн процесс эзэмшихийг хүсч болно. Энэ тохиолдолд дээр дурьдсантай адил асуудал үүсч болно. Энэ асуудлыг эгзэгтэй муж (critical section) хэмээх ойлголтыг хэрэглэн шийддэг.
- Түгжрэл (deadlock) – Р1 процесс ажиллахын тулд R1 ба R2 нөөцийг өгсөн дарааллаар эзэмших ёстой. Харин Р2 процесс R2 ба R1 нөөцийг өгсөн дарааллаар эзэмших ёстой байг. Энэ тохиолдолд Р1 процессR1 нөөцийг эзэмшсэний дараа Р2 процесс R2 нөөцийг эзэмшсэн байг. Цааш аль ч процесс ажиллаж чадахгүй. Учир нь Р1 процесс ажиллахын тулд R2 нөөц хэрэгтэй. Харин Р2 процесс ажиллахын тулд R1 нөөц хэрэгтэй. Харин шаардлагатай нөөцүүдийг эзэмших боломжгүй ба R1 нөөц нь Р1 процесс ажиллаж дууссаны дараа чөлөөлөгдөнө. Харин R2 нөөц нь Р12 процесс ажиллаж дууссаны дараа чөлөөлөгдөнө. Гэтэл аль ч процесс шаардлагатай нөөцгүйн улмаас цаашид ажиллаж чадахгүй байгаа билээ.
- Гачигдал (starvation) – Р1, Р2 ба Р3 процессууд R нөөцийг эзэмшихийн төлөө өрсөлдөж байг. Р1ба Р3 процессууд нь ямар нэгэн шалтгаанаа R нөөцийг ээлжлэн эзэмшсээр Р2 процесст уг нөөцийг эзэмших боломж олгохгүй байснаар Р2 цааш хэвийн ажиллахад хүндрэл үүсч гачигдалд орж байна.

Програм хангамжид тулгуурласан шийдэл буюу солбицлын асуудлыг шийдэх алгоритмуудаас хамгийн өргөн тархсан нь
- Деккерийн
- Петерсоны алгоритмууд байдаг.

- Деккерийн алгоритм – Деккерийн алгоримтыг хоёр л процессын хувьд авч үзэх ба ерөнхий тохиолдолд авч үзэх нь хоёр процесстой тохиолдолтой ижил юм.
I хувилбар
Анхны хувилбарт санах ойн нэг мужид нэгэн зэрэг зөвхөн нэг л процесс хандаж болох техник хангамжийн чанарыг үндэслэн ажилладаг байсан. Өөрөөр хэлбэл процесс бүр эгзэгтэй мужид орох (нөөцийг дангаар эзэмших эрхээ олж авах) ээлжээ хүлээдэг. Аль нэг процесс эгзэгтэй муждаа ажиллаж дуусаад дараагийн процесст эгзэгтэй мужид орох эрхийг нь олгодог. Үүнийг алгоритмад turn хувьсагч зааж өгнө.
turn хувьсагчийн утгатай процессын дугаар тохирч байвал л уг процесс эгзэгтэй муждаа ажиллах ба харин тохирохгүй бол завгүй-хүлээлт болно. Процесс эгзэгтэй муждаа ажиллаж дуусаад дараа нь turn хувьсагчийн утгыг өөрчилнө. (Алгоритм 5.12) Жишээ: turn=0 байж байгаад turn=1 болгоно гэсэн үг. Ингэснээр 1 дугаартай процесс эгзэгтэй муждаа орох эрхтэй болно.
Var turn 0..1;
process0 //À ïðîöåññ ãýå

Var turn 0..1;
..........................
process0 //А процесс гэе

While turn!=0 do {nothing};
<Эгзэгтэй муж>
turn=1
end;
..........................
process 1 //Б процесс гэе
….
While turn!=1 do {nothing};
<Эгзэгтэй муж>
turn=0
end;
.............................
Begin
parbegin
process0;
process1;
parend;
End.

Энэ аргын үед үүсэх хүндрэлүүд
• Завгүй хүлээлт
• Процессуудын хурдны зөрөө
• Гачигдал

II алгоритм
• Деккерийн алгоритмын I хувилбарт өөр ямар нэг процесс эгзэгтэй мужид байгаа эсэхээс үл хамааран процесс эгзэгтэй муждаа орох боломжгүй болох тохиолдол байсан.
• Процесс бүр өөрийн төдийгүй, бусад процессын төлвийг мэдэх хэрэгтэй. Үүний тулд процесс бүрийн төлвийн мэдээллийг хадгалах хэрэгтэй.

Var flag:array[0..1] of boolean;
PROCESS 0
...
While flag[1] do {nothing};
flag[0]=true;
<эгзэгтэй муж>;
flag[0]=false;
...



PROCESS 1
...
While flag[0] do {nothing};
flag[1]=true;
<эгзэгтэй муж>;
flag[1]=false;
...


II хувилбарын дутагдлууд
• Процесс эгзэгтэй муждаа орохоос өмнөхөн flag утгаа true болгоод тасарвал бусад процесс эгзэгтэй мужид орж чадахгүй
• Хэд хэдэн процесс эгзэгтэй мужид орох боломжтой.
• Процесс бүр бусдын төлөвийг мэдэж болох боловч өөрчилж болохгүй .
• Процесс эгзэгтэй муждаа орохын тулд бусдыг шалгана.

III алгоритм
II алгоритмын хувилбарт хэд, хэдэн процесс нэгэн зэрэг эгзэгтэй муждаа байх боломжтой байсан. Энэ асуудлыг III хувилбарт шийдсэн.

PROCESS0 PROCESS1
. . . . . .
flag[0]:=true; flag[1]:=true;
while flag[1] do { nothing }; while flag[0] do {nothing};
<Эгзэгтэй муж> <Эгзэгтэй муж>
flag[0]:=false; flag[1] :=false;
. . . . . .

Бусад процессыг шалгахаасаа өмнө эгзэгтэй мужид орох флагаа тогтоож байна.
Флаг тогтоогдсон байхад өөр процесс эгзэгтэй мужид байгаа нь тогтоогдвол тэр процесс эгзэгтэй мужийг чөлөөлтөл процесс түр хүлээнэ.
Түгжрэл үүсэх магадлалтай . Хоёр процесс зэрэг флагаа тогтоогоод эгзэгтэй мужид орвол нэг нэгийгээ эгзэгтэй мужийг чөлөөлөхийг хүлээн түгжигдэнэ.

PROCESS0
flag[0]=true;
PROCESS1
flag[1]=true;
PROCESS0
while flag[1] do {nothing};
PROCESS1
while flag[0] do {nothing};
Эндээ харахад III хувилбар нь түгжрэлд хүргэж болох юм.

IV хувилбар
• Өмнөх хувилбаруудад процесс бүр зөвхөн өөрийгөө л эгзэгтэй мужид байх цорын ганц эрхтэй гэж үзэж байснаас түгжрэл үүсч байсан.
• Иймээс өөрийн флагаа тогтоогоод бусдыг шалгаж, хэрэв өөр нэгэн процесс эгзэгтэй муждаа байвал түүнийг гартал нь хүлээх арга.

PROCESS 0 PROCESS 1
flag[0]=true; flag[1]=true;
while flag[1] do while flag[0] do
begin begin
flag[0]=false; flag[1]=false;
<Түр хүлээх> <Түр хүлээх>
flag[0]=true; flag[0]=true;
end; end;
<Эгзэгтэй муж> <Эгзэгтэй муж>
flag[0]=false; flag[1]=false;

Процесс бүр өөрсдийн флагаа тогтоогоод , дараа нь бие биенийхээ флагийг шалгаад эргээд өөрийн флагийг тэглэх тохиолдол гарч болзошгүй . Энэ нь удаан үргэлжлэхгүй. Өөрөөр хэлбэл энэ нь түгжрэлийн байдал биш, үл ойлголцох байдал юм.

PROCESS0
flag[0]=true
PROCESS1
flag[1]=true
PROCESS0
flag[1]=true эсэхийг шалгах
PROCESS1
flag[0]=true эсэхийг шалгах
PROCESS0
flag[0]=false болгох
PROCESS1
flag[1]=false болгох ………..

Нэгдсэн алгоритм
Деккерийн алгоритмууд нь өмнөх алгоритмуудаа сайжруулан зохиогдож байсан ч үл ойлголцлын асуудлыг үүсгэж байсан. Иймээс илүү сайжруулсан өмнөх дутагдлуудыг шийдсэн алгоритмыг гаргасан бөгөөд үүнийг Нэгдсэн буюу Үндсэн алгоритм гэж нэрлэсэн.
Алгоритмын үндсэн санаа нь:
Аль нэг процесс эгзэгтэй мужид орох флагаа тогтоогоод бусад процессын флагийг шалгахад өөр ямар ч процесс эгзэгтэй муждаа байхгүй бол уг процесс эгзэгтэй муждаа шууд орно.
Эсрэг тохиолдолд “гуравдагч” хүчин зүйл буюу turn хувьсагчид хандана. Хэрэв turn хувьсагч нь өөрөөс нь өөр процесс эгзэгтэй мужид байх ёстойг зааж байвал өөрийн флагын утгыг худал болгоод, завгүй-хүлээлтийн төлөвт орох ба эсрэг тохиолдолд эгзэгтэй муж руугаа шууд орно.
За одоо алгоритмынхаа псевдо кодтой танилцъя
Var flag: array[0..1] of boolean;
turn: 0..1;
procedure P0;
begin
repeat
flag[0]:=true;
while flag[1] do if turn=1 then
begin
flag[0]:=false;
while turn=1 do {nothing};
flag[0]:=true;
end;
<Эгзэгтэй муж>;
turn:=1; flag[0]:=false;
<Бусад үйлдэл>
forever
end;
procedure P1;
. . .
end;

Begin
flag[0]:=false;
flag[1]:=false;
turn:=1;
parbegin
P0; P1;
parend;
end;

Тайлбар:
Та бүхэн <эгзэгтэй муж> гэсэн ойлголтыг өөр өөрсдийнхөө хийсвэрлэж төлөөлүүлж болно.М Жишээ нь: нэг хувьсагч байдаг ч юм уу.....

Tuesday, March 25, 2008

SW306 Лабораторийн ажил 4

Хугацаа: IV/2-3 -ны лабораторийн цагуудаас өмнө
Нөхцөл:
Энэ лабораторийн ажлыг дараах алхамтай гүйцэтгэнэ. Үүнд:
1) Сонгосон асуудлынхаа хүрээ хязгаарыг тодорхойлж, тухайн асуудлын хүрээнд хамаарах объектуудыг хэлэлц.
2) Тэдгээр объектуудын хийсвэрлэл болох классыг тодорхойл. Үүнд: Класс нь
a) Гишүүн өгөгдлийг бодит амьдралын шаардлагатай уялдуулан тодорхойлох
b) Гишүүн функцууд: get..., set... гэсэн ерөнхий зориулалтын стандарт функцуудээс гадна custom тусгай зориулалтын функц тодорхойлох.
c) Байгуулагч функцээр хангагдсан байх.
3) Тодорхойлсон классынхаа хэд хэдэн тохиолдлыг (объектыг) үүсгэж ажиллах.


Лабораторийн ажлыг дүгнэхдээ оюутан хийсвэрлэлийг хэрэгжүүлэхдээ бодит амьдралын шаардлагыг хир уялдуулан хийсвэрлэснийг голлон анхаарна.

Тайлбар:Лабораторийн ажлаа бодит амьдралын шаардлагатай уялдуулан хийсвэрлэнэ гэдэгт товчхон тайлбар хийе. Жишээ нь асуудлыг “Номын сангийн үйл ажиллагаа” –ны хүрээнд тодорхойлбол Ном ба Уншигч гэх мэт объектуудын тухай яригдана. Ийнхүү “Ном”-ыг програмчлалд хийсвэрлэхэд (Ном хэмээх классыг үүсгэхэд) түүнд ямар ямар гишүүн өгөгдлийг яагаад тодорхойлох болсон, тэдгээр гишүүн өгөгдлүүдийг ямар төрөлтэй тодорхойлох болсоныг бодит амьдралын шаардлагатай уялдуулан тайлбарлана. Жишээ нь: зарим номын сангийн програмын хувьд номыг “Хэвлэсэн хэвлэлийн газар”–ийн мэдээлэл чухал шаардлагагүй байж болох юм. Тэгвэл “Ном” классд “номыг хэвлэсэн газар” гэсэн гишүүн өгөгдөл тодорхойлох шаардлагагүй. Харин асуудлын хүрээг арай өргөн хүрээнд шийдвэрлэх үед магадгүй “Хэвлэсэн хэвлэлийн газар” гэсэн гишүүн өгөгдөл тодорхойлох хэрэгтэй болно гэх мэт. Мөн “Номын үнэ” гэсэн гишүүн өгөгдлийг монголын хувьд бүхэл тоон төрлөөр тодорхойлж болно, харин одоо ч задгай мөнгөөр гүйлгээ хийдэг япон орны хувьд бутархай тоон төрлөөр тодорхойлох шаардлагатай гэх мэтчилэн сонгосон асуудлын хүрээнээс шалтгаалан тухайн 1 объектыг өөр өөрөөр хийсвэрлэх боломжтой юм гэдгийг ойлгох нь чухал.

Энд жишээ болгон “Завь түрээслэх, завь байрлуулах үйлчилгээ эрхэлдэг байгууллагын үйл ажиллагаа”-г гаргасан програмыг үзүүлье.
Асуудлын хүрээ: “Завь түрээслэх, завь байрлуулах үйлчилгээ эрхэлдэг байгууллагын үйл ажиллагаа”
“Хөвсгөл жуулчин” ХХК нь Хөвсгөл нуурын эрэг дээр байрлах завь түрээслэх, өөрийн талбайд завь түрээсээр байрлуулах үйлчилгээ эрхэлдэг хувийн компани юм.

Тус компани нь завь байрлуулах түрээсийн төлбөрийг тооцохдоо Зогсоол (slip)-ийн өргөнөөс хамаарч 4 янзын тарифтай байна. Үүнд:

Түрээсийн төлбөрийн хүснэгт
Зогсоол Жилийн түрээсийн төлбөр
10 $800
12 $900
14 $1100
16 $1500

Уг боомт нь өөрийн үйлчлүүлэгчид, завьны түрээс, завьны талбайн түрээсийн бүртгэлийг автоматжуулах зорилгоор шинэ автоматжуулсан системтэй болохоор шийдсэн гэж үзээд тус лабораторийн ажлыг гүйцэтгэе.

1) Үйлчлүүлэгч ба Зогсоол гэсэн объектууд оршиж байна.
2) Эдгээр объектуудыг дээр тодорхойлсон асуудлын хүрээнд хийсвэрлэвэл

Үйлчлүүлэгч класс нь дараах бүтэцтэй

Customer
name
address
phoneNo
-

Тэгвэл Үйлчлүүлэгч (Customer) классын програмын бичлэг нь дараах хэлбэртэй байна.
class Customer
{ // Гишүүн өгөгдлүүд
private String name;
private String address;
private String phone;

// Гишүүн функцууд :
public String getName()
{ return name; }

public String getAddress()
{ return address; }

public String getPhone()
{ return phone; }

public void setName(String newName)
{ name=newName; }

public void setAddress(String newAddress)
{ address=newAddress; }

public void setPhone(String newPhone)
{ phone=newPhone; }

}

Slip гэдэг нь нэгж завь байрлах талбайг хэлэх бөгөөд цаашид зогсоол гэе.

Зогсоол (Slip) класс нь дараах бүтэцтэй гэж үзье.

Slip
slipID
width
slipLenght
-

Зогсоол (Slip) классын програмын бичлэг ба түүнийг шалгах програмыг авч үзье:

class Slip
{ // Гишүүн өгөгдлүүд
private int slipID;
private int width;
private double slipLength;
// Гишүүн функцууд
public Slip(int anID, int aWidth,double aSlipLength) //Байгуулагч функц
{
setSlipID(anID);
setWidth(aWidth);
setSlipLength(aSlipLength);
}
// Mutator functions буюу ерөнхий зориулалтын функуууд
public void setSlipID(int anID) { slipID=anID; }
public void setWidth(int aWidth) { width=aWidth; }
public void setSlipLength(double aSlipLength) {slipLength=aSlipLength;}

public int getSlipId() {return slipID;}
public int getWidth() {return width;}
public double getSlipLength() {return slipLength;}

//Custom functions буюу тусгай зориулалтын функцууд
public String tellAboutSelf() {
String info;
info="Slip ID="+getSlipId()+", Width="+getWidth()+", Length="+getSlipLength();
return info;
}
public double leaseSlip(){
double fee;
switch(width){
case 10: fee=800;
break;
case 12: fee=900;
break;

case 14: fee=1100;
break;

case 16: fee=1500;
break;

default: fee=0;
}
return fee;
}
}
Тайлбар: Энд Зогсоол класс нь getter, setter ерөнхий үүрэг зориулттай функцууд болон байгуулагч функцээр хангагдсан байна. Мөн түүнчлэн классын гишүүдийн утгыг хэвлэх үүрэгтэй tellAboutSelf() хэмээх Custom (хэрэглэгчийн) функцыг тодорхойлсон байна. Мөн дээр тодорхойлсон асуудлын хүрээнд завины түрээсийн төлбөр бодох leaseSlip() гэсэн Custom (хэрэглэгчийн) функц тодорхойлсон.


Тодорхойлсон ӨХТөрлүүдийнхээ хэд хэдэн тохиолдлыг үүсгэж ажиллах.

Дээр тодорхойлсон Зогсоол (Slip) классын 3 объект тодорхойлж тэдгээрийн мэдээлэл болон, түрээсийн төлбөрийн мэдээллийг хэвлэх програм зохиоё:

public class CustomerProgram {
public static void main(String args[]){

Slip slips=new Slip(1,10,20);

System.out.println(slips.tellAboutSelf());
double fee=slips.leaseSlip();

System.out.println("Fee is : "+fee+"for slip"+slips.getSlipId());

}
}
Энд тодорхойлж ашигласан объект бүр өөр өөрийн гэсэн өгөгдлийн мужтай байна.



Тайлбар: Уг нь дээр үзүүлсэн жишээтэй төстэй машин түрээсийн үйлчилгээ явуулдаг байгууллагын үйл ажиллагааг автоматжуулах сэдвээр хийлгэе гэж бодож байлаа. Гэтэл хүн бүрийн үзүүлэх програм ижил болчихож магадгүй тул оюутан бүр амьдрал дээр явагддаг өөр өөр системийг сонгон авах хэрэгтэй.
Ингээд уг системээ шаардлагын дагуу өөр өөрсдийнхөөрөө хөгжүүлж програмчлах хэрэгтэй.

Амжилт хүсье!!!!!!

Sunday, March 23, 2008

SW306 Лабораторийн ажил 3

Бодлого:
Цахилгаанчин дуудлага өгсөн айлын дугаарыг ашиглан тэр айл аль орцны хэдэн давхрын хэд дэх хаалганд байдгийг мэдэх шаардлагатай болсон. Үүнийг шийдэх програм бич.

Цахилгаанчинд дуудлага өгсөн айлын дугаар, байшингийн давхрын тоо, нэг орцны нэг давхар дахь айлын тоо мэдэгдэж байгаа.

Програмд ихэвчлэн хувьсагчын зарлагаа орхигдсон байгаа.

Групп тус бүрд програмыг бага зэргийн өөрчлөлттэйгээр өгсөн байгаа.

Хугацаа: III/26-27 -ны лабораторийн цагууд дээр

Оноо: 2 хүртэл оноо

Friday, March 21, 2008

SW316 Лаб/ажил 2

Лабораторийн ажил 2

Сэдэв: Тасалдал боловсруулах механизм
Зорилго
Энэхүү лабораторийн ажлын зорилго нь ерөнхий зориулалттай үйлдлийн системийн ажиллагаанд тасалдлын эзлэх байр суурийг ойлгож , оюутан ойлгосон загвараа хэрэгжүүлж сурах явдал юм.

Хугацаа: III/20-21

Оноо: 4 хүртэл оноо

Бодлогын нөхцөл:
Товчлуур гараар идэвхжих тасалдал, арифметик үйлдлийн утгын халилтаар идэвхжих тасалдлыг боловсруулах

Бодлогын өгөгдөл:
Програмын явцад ямар нэгэн товч дарахад үйл ажиллагаагаа зогсоож, дэлгэцэнд үг хэвлэнэ. Мөн ямар нэг утгаас ямар нэг хувьсагчийн утга хэтрэхэд алдаа гарч тасалдал үүснэ.
Санамж:
Тасалдлуудыг зөвхөн жишээ болгон авлаа. Хүсвэл өөр тасалдлыг жишээ авч болно. Системд ажиллаж байгаа процессуудыг тасалж байгааг үзүүлэх ба процессууд нь өмнөх лабораторийн ажилд ашигласан процессууд байж болно. Ер нь өмнөх лабораторийн ажлыг ашиглан 2 -р лабораторийн ажлыг гүйцэтгэсэн байх хэрэгтэй.


Дэлгэрэнгүй

Тасалдлууд

Процессор үйл ажиллагаагаа гүйцэтгэж байх явцад түүний хэвийн үйл ажиллагааг тасалдуулах хэрэгцээ гардаг. Үүнийг тасалдал ашиглан хэрэгжүүлдэг. Тасалдлын гол үүрэг нь процессорын хэвийн үйл ажиллагааг тасалдуулан процессорыг үр ашигтайгаар ашиглах боломжийг бүрдүүлэх явдал юм. Өөрөөр хэлбэл процессор ямарваа нэгэн үйл явцыг хүлээн сул зогсох бус хэвийн үйл ажиллагаагаа явуулж байхад үйл явц өрнөх хэрэгтэй болсон тухай процессорт тасалдлаар мэдээлдэг.
Тасалдлыг – техник хангамжийн ба – програм хангамжийн тасалдал гэж ангилж болно.
Програм хангамжийн тасалдал нь утгын хязгаар халих, тоог тэгд хуваах, алдаатай команд биелүүлэх, өөрт олгогдоогүй санах ойд хандах гэх мэт нөхцөл байдалд үүсч болно.
Техник хангамжийн тасалдал нь Хугацаат өдөөгч буюу таймер, Оролт/Гаралт, техник эвдрэл гэх мэт. Команд биелж байх явцад тасалдал үүсч болно.
Команд биелүүлж байх явцад тасалдал үүсэх үед хэрэв тасалдал үүсэхийг хорьсон буюу үл зөвшөөрсөн тохиолдолд процессор хэвийн үйл ажиллагаагаа цаашид үргэлжлүүлэн явуулах бол тасалдал үүсэхийг зөвшөөрсөн үед тасалдлыг шалган, тасалдлыг боловсруулах ажлыг эхэлсэн байна.
Энэ ажлыг тасалдал боловсруулагч хийнэ. Тасалдал боловсруулагч нь үйлдлийн системийн дэд хэсэг болдог ба тасалдал үүссэн үед шалгаж, зохих тасалдлыг биелүүлдэг програм хангамж юм. Процессор нь тасалдал үүссэн үед шалган хэрэв ямарваа нэгэн асуудалгүй бол тасалдал боловсруулагчийг ажиллуулна. Техник хангамжаас тасалдлын сигнал ирэхэд процессор, процессын төлвийг хадгалан тасалдлыг боловсруулаад урьд хадгалсан мэдээллээ сэргээн цаашид хэвийн ажиллана. (Зураг 8)


Энэ процессыг дэлгэрэнгүй тайлбарлая.

1. Төхөөрөмжөөс тасалдлын сигнал үүсэх
Төхөөрөмж ямарваа нэгэн үйл явц өрнүүлэх хэрэгтэй болсныг мэдэгдэн тасалдал үүсгэнэ.

2. Процессор гүйцэтгэж байгаа командаа түр зогсооно.
Тасалдал үүссэн тул процессор хэвийн үйл ажиллагаагаа түр зогсоон тасалдал биелүүлэхэд бэлтгэнэ.

3. Процессор төхөөрөмж рүү сигнал явуулна
Процессор тасалдал боловсруулахад бэлэн болсон тухай мэдээллийг төхөөрөмж рүү явуулна.

4. Процессор ПТҮ ба ПТ –ыг стект хадгална.
Процессор эргэж төлвөө сэргээх боломжтой байхын тулд ПТҮ, ПТ гэх мэт онц чухал шаардлагатай регистрүүдийг стект хадгална.

5. Тасалдлын боловсруулагчийн хаягийг ПТ –д олгох
Тасалдал боловсруулагч програмын санах ойн хаягийг ПТ –д олгосноор тасалдал боловсруулагч биелэх боломжтой болно.

6. Процессын төлвийн бусад мэдээллийг хадгалах
Тухайн мөчид ажиллаж буй процесст хамааралтай мэдээллийг хадгална. Жишээ нь: Өгөгдлийн ба хаягийн регистрийн утгууд гэх мэт

7. Тасалдал боловсруулах
Тасалдлыг боловсруулах буюу тасалдлын эх биеийг ажиллуулан шаардлагатай үйлдлийг гүйцэтгэнэ.

8. Процессын төлвийг буцааж сэргээх
6-р алхамд хадгалсан мэдээллээ эргэж сэргээж урьд нь тасарсан процессыг цааш үргэлжлүүлэн ажиллах боломжтой болгоно.
9. ПТҮ ба ПТ –ын хуучин утгуудыг сэргээн тогтоох
4 –р алхамд хадгалсан мэдээллээ буцааж сэргээн процессор хийж байсан ажлаа үргэлжлүүлэх боломжоор хангана.

Системд нэгэн зэрэг олон тасалдал үүсвэл яах вэ? гэдэг асуудал гарч ирнэ. Энэ тохиолдолд тасалдлыг боловсруулах үндсэн 2 арга байна.

1. Тасалдлыг дараалж боловсруулах
Хамгийн эхэнд үүссэн тасалдал боловсруулагдаж дуустал өөр ямар ч тасалдал боловсруулахгүй. Өөрөөр хэлбэл Эхэнд Ирсэн Эхэнд Гарах буюу FIFO зарчим юм.
2. Тасалдлыг зэрэглэлээр боловсруулах
Зарим тасалдал нь бусдаас илүү өндөр зэрэглэлтэй байж болно. Өөрөөр хэлбэл одоо боловсруулагдаж буй тасалдлаас илүү өндөр зэрэглэлтэй тасалдал үүсвэл одоо боловсруулж буй тасалдлаа таслан шинээр үүссэн тасалдлыг боловсруулна.
Жишээ нь: техникийн эвдрэлийн тасалдал нь хамгийн өндөр зэрэглэлтэй тул ямар ч тасалдлыг боловсруулж байсан техник хангамж эвдэрсэн тохиолдолд тасалдал түүнийг таслан ажиллана гэсэн үг юм.


(а) тохиолдолд Х тасалдлыг боловсруулж байхад У тасалдал өөрийн ээлжээ хүлээж байна. Харин (b) тохиолдолд Х тасалдлыг боловсруулж байхад илүү өндөр зэрэглэлтэй У тасалдал таслан орж байна.
Хэрэв тасалдлын эх бие буюу тасалдлын код байрлаж байгаа хаягийг өөрчлөх эсвэл тасалдлын эх кодыг өөрчлөх боломжтой бол яах вэ? Энэ тохиолдолд дурын програм үйлдлийн системийн тасалдлын тухай мэдээлэлд чөлөөтэй нэвтрэн, өөрчилж өөрт болон бусдад түвэг удна. Иймээс хэрэглэгчийн горимд ажиллаж буй програмуудад хандаж болох санах ойг зааж өгсөн байдаг.
Хэрэглэгчийн горимд байгаа програм ямарваа нэгэн хаяг руу хандах хүсэлт гаргах бүрд дээрх хаягтай харьцуулан шалгаж, хэрэв зөвшөөрөөгүй хаягт хандах гэж буй бол алдаа гарган зогсоодог.
Харин удирдлагын горим дахь програм нь санах ойн ямар ч мужид чөлөөтэй хандах эрхтэй байдаг.

Практик хэрэгжүүлэлт

Энэ лабораторийн ажлыг өмнөх лабораторийн ажлыг өргөтгөх замаар хийнэ. Тасалдлыг хэлбэрээс үл хамааран нэг л хэлбэрийн тасалдал хэлбэрээр зохион байгуулна. Тасалдал боловсруулагчийг дуудахын тулд тасалдал үүссэн эсэхийг заадаг нэг хувьсагч авах хэрэгтэй.
Процессын эх бие дотор тасалдал үүссэн эсэхийг л шалгана. (үнэндээ энэ нь техник хангамжаар хийгддэг) Тасалдлыг ажиллуулах (боловсруулах) ажлыг тасалдал боловсруулагч гүйцэтгэнэ. Мөн тасалдал боловсруулагч нь тасалдал үүсч болох эсэхийг шалгана.
Бүх тасалдлыг хэлбэрээс үл хамааран нэг аргаар дуудах ёстой. Мөн тасалдал дуудахын өмнө системд шаардлагатай мэдээллийг (энэ лабораторийн хувьд зөвхөн регистрүүд гэж үзье) стект хадгалдаг. Харин тасалдал ажиллаж дуусахад мэдээллийг эргэж сэргээдэг. Системийн стекийг массиваар дүрсэлье. Регистрүүдийг бүхэл тоон хувьсагчдаар дүрсэлье.
int ax, bx, cx, dx; // ерөнхий регистрүүд
int stackp=0; // стекийн оройн заагч регистр
int stack[100]; // стек
Шаардлагатай мэдээллийг сануулах үйлдлийг хийдэг функцийг Push, сэргээх үйлдийг функцийг Рop гэж нэрлэе.
void Push(){
stack[stackp++]=ax; stack[stackp++]=bx;
stack[stackp++]=cx; stack[stackp++]=dx;
}
void Pop(){
dx=stack[stackp--]; cx=stack[stackp--];
bx=stack[stackp--]; ax=stack[stackp--];
}

хэлбэрээр хийж болно. Тасалдал боловсруулагч нь тусдаа нэг функц байх хэрэгтэй. Процессын эх бие дотор тасалдал үүсэхэд харгалзах тасалдал үүссэн тухай мэдээллийг процессорт өгөхөөс бус тасалдал боловсруулдаггүй.
Өөрөөр хэлбэл тасалдал үүссэн тухай хувьсагчаар заагаад түүнийг диспитчер шалгаад, шаардлагатай бол тасалдал боловсруулагч дууддаг байдлаар гүйцэтгэвэл зохино.
void IntrProcess(){
……….
Push();
……….
Pop();
}

Өөрдсийн програмдаа энэ загварыг өргөтгөх хэрэгтэй.
Оюутан өөрөө ажлыг сайжруулж хэд хэдэн хэлбэрийн тасалдлыг боловсруулдгаар хийж болно. Тэгвэл ямар хэлбэрийн тасалдал үүссэн бэ? гэдгээс хамааран өөр өөр тасалдал боловсруулагчийг дууддаг байх хэрэгтэй. Ямар хэлбэрийн тасалдал үүсэхэд ямар тасалдал боловсруулагчийг дуудахыг мэдэхийн тулд бид тасалдлын вектор хүснэгтээ өөрсдөө хийнэ.

Гэхдээ үүнийг албан ёсоор шаардахгүй.

Санамж:
Энэ ажлыг хийхдээ оюутан дараах зүйлсийг зайлшгүй тооцож хийх хэрэгтэй.
1. Тухайн тасалдлуулдын хэлбэрээс хамаарахгүйгээр түүнийг боловсруулах үйл ажиллагаа нэг байна. Өөрөөр хэлбэл тасалдлыг боловсруулахдаа тасалдал боловсруулах схемийн дагуу боловсруулна.
2. Тасалдал боловсруулах болсон тухай командыг төв процессор авна. Энэ үеийг тасалдлын захиалга гэнэ.
3. Тухайн тохиолдолд төв процессорыг эзэмшиж байсан процессын бүх төлөвүүд регистрүүдийн утгыг санах ойд зориулалтын газар хадгална.
4. Тасалдлын векторын хүснэгтээс тасалдлын боловсруулагчийн хаягийг уншина.
5. Тасалдлыг боловсруулах
6. Тасалдсан процессын төлөвийг (регистрүүдийн утгыг) сэргээнэ.
7. Тасалдсан процесс үйл ажиллагаагаа үргэлжлүүлнэ.
8. Тасалдал идэвхжих нөхцлөө сайн шалгах

Thursday, March 20, 2008

SW316 Лаб/ажил 1

Лабораторийн ажил 1

Процесс ба процесс удирдах дэд систем
Бодлогын нөхцөл: Доох өгөгдлийг ашиглан
1. Дараалсан
2. Зэрэгцээ буюу паралель
3. Түр зогссон процессын загвар хэрэгжүүл.

Хугацаа: III/7

Оноо: 4 хүртэл оноо

Зорилго
Энэ лабораторийн ажлын зорилго нь хугацааны хуваалттай үйлдлийн системийн ажиллагааг ойлгож, оюутан ойлгосон загвараа хэрэгжүүлж сурах явдал юм.

Бодлогын өгөгдөл
3 процессын хувьд дээр дурьдсан үйлдлүүдийг хэрэгжүүл. Үүнд процесс нь яг ямар үйлдэл хийхийг оюутан өөрөө шийднэ. Үүнд лабораторийн ажлын ажлын жишээнд өгсөн процессыг ашиглахыг хориглоно.

Онолын товчоо
Процесс нь үйлдлийн системд зэрэгцээ буюу паралель ажиллаж болохоос гадна зарим дараалсан горимд ажилладаг. Энэ нь аль нэг процессыг ажиллаж дуустал өөр ямар ч процесс ажиллахгүй буюу нөгөө талас авч үзвэл пролцесс төв процессорыг үйл ажиллагаагаа дуусан дуустал эзэмшинэ гэсэн үг.
Энэ нь хугацааны хуваалт биш юм. Мөн олон бодлогын горимтой үйлдлийн систем гарч ирэхээс өмнөх бүх үйлдлийн систем ийм хэлбэрээр ажиллуулдаг байсан.
Хэрэглэгчийн хүсэлтээр буюу системийн шаардлагаар процесс түр зогсож болно. Энэ тохиолдолд:
- Зэрэгцээ горимд ажиллаж байгаа бол бусад бүх процесс хэвийн үйл ажиллагаагаа үргэлжлүүлнэ.
- Дараалсан горимд ажиллаж байгаа бол түр зогсож байгаа процесс цааш үйл ажиллагааг үргэлжлүүлэн ажиллаж дуустал бүх процесс процессорыг эзэмших эрхгүй байсаар байх болно.
Процесс хооронд удирдлага шилжихдээ төв процессорыг эзэмшихээ больж буй процесс өгөгдлөө сануулдаг бол төв процессорыг эзэмших эрх олж авч буй процесс нь сануулсан өгөгдлөө процессорын өгөгдлийн бүтцүүдэд (регистрүүд гэх мэт) ачаалдаг.

Практик хэрэгжүүлэлт
Энэ ажлыг хийхэд хамгийн гол зохион байгуулах үйл ажиллагаа нь процессуудыг нэгж үйлдлээр ажилладаг болгох явдал юм. Учир бодит үйлдлийн системд процесс хооронд удирдлага шилжүүлэх ажлыг техник хангамж хариуцдаг ба бидний лабораторийн ажлын хүрээнд ямарваа техник хангамжийг дахин програмчлах асуудал тавигдахгүй.

Нэг алхамд хуваах үйлдлийг жишээн дээр авч үзвэл:
Жишээ 1:1 –ээс 10 хүртэл натурал тоог хэвлэж харуулдаг процесс авч үзвэл үүнийг ердийн хэлбэрээр програмчилбал нэг л давталт шаардлагатай.
main()
{
int i;
for(i=1;i<=10;i++) printf("\n%d",i);
}
Тэгвэл үүнийг нэгж алхмаар ажилладаг хэлбэрээр програмчилбал циклээ нэгж үйлдлээр нь задлах хэрэгтэй. Жишээ 2:
main()
{
int i=1;
while(i<=10) {
printf("%d\n",i); i++;
}
printf("End\n%d",i);
}
Дээрх жишээг авч үзвэл тухайн i хувьсагчийн утга програмын турш хадгалагдана. Иймээс процедураас гарсан ч гэсэн i хувьсагчийн утга хадгалагдана. Өөрөөр хэлбэл үйл ажиллагаа үргэлжлэх боломжтой. Ингэж програмын хувьсагчдын утга хадгалагдаж байгаа нь бодит үйлдлийн системийн дараах санааг илэрхийлдэг.

Бодит үйлдлийн систем: Үйлдлийн систем нэг процессын нэг блок үйлдлийг хийгээд, дараагийн процессын нэг блок үйлдлийг хийх гэх мэтээр олон процессыг зэрэг ажиллуулдаг ба процесс болгоны биелэгдэж байгаа төлөв, утгууд, регистрүүдийг хадгалдаг учраас дараа уг процессыг дахин үргэлжлүүлж ажиллуулж болдог. Үүнээс гадна програмууд өөрийн хувьсагчид болон өгөгдлөө өөрийн өгөгдлийн муждаа хадгалдаг учир өөр ямар ч програм түүний өгөгдөлд хандаж өөрчилж чадахгүй.
Бодит үйлдлийн системийн эдгээр санааг тухайн хувьсагчийн утга хадгалагдаж байгаагаар төлөөлүүлж ойлгож болох юм.
Жишээ 2 дээр тухайн процессын үйл ажиллагаа төгсгөлдөө хүрсэн эсэхийг шалгаж байна. Өөрөөр хэлбэл процесс өөрөө өөрийгөө дуусгах, хаах санаачлагыг тавьж байна гэсэ үг. Бодит үйлдлийн системд ч гэсэн процесс өөрөө өөрийгөө хаах буюу дуусгах санаачлагыг тавьдаг.
Хэрэв дуусаагүй бол процессын үйл ажиллагаа нэгж алхмаар ахиж байна. Өөрөөр хэлбэл процесс ажиллаж байна.

Дараалж ажиллах процессын жишээг үзье.
Энэ нь хамгийн хялбар загвар юм. Системд нэг алхмаар ажиллах p1(), p2(), p3() гэсэн процессууд байя гэж үзье. Эдгээр 3 процессыг дараалж ажиллуулах, зэрэг ажиллуулах жишээ авч үзье. Жишээ 3:
main()
{
p1();
p2();
p3();
}
p1(){
int x; scanf("%d",&x); printf("%d",x); }
p2()
{
int i; printf("Utga= "); scanf("%d",&i); printf("%d",i*i); }
p3() { int i; for(i=1;i<=10;i++) printf("%d\n",i); }


Одоо зэрэгцээ ажиллах загварыг авч үзье. Энэ загвар нь тийм ч төвөгтэй бус бөгөөд солбицлын асуудлыг л зөв шийдэх хэрэгтэй.
Жишээ 4:
int k1=0, k1=0, k2=0; //k1, k2, k3 хувьсагчид харгалзах дугаар бүхий процесс ажиллаж дууссан эсэхийг заана.
while(k1=0||k2=0||k3=0) // ядаж нэг процесс нь ажиллаж байна.
{
if(k1==0) k1=p1(); // p1 процесс ажиллаж дуусаагүй бол ажиллуул.
// Хэрэв дууссан бол ажиллуулахгүй.
If(k2=0) k2=p2(); // p2 процесс ажиллаж дуусаагүй бол ажиллуул.
// Хэрэв дууссан бол ажиллуулахгүй.
If(k3=0) k3=p2(); // p3 процесс ажиллаж дуусаагүй бол ажиллуул.
// Хэрэв дууссан бол ажиллуулахгүй.
}

Хэрэв процессыг зэрэгцээ бус дараалсан байдлаар ажиллуулахыг хүсвэл явах вэ?
Үүнийг зэрэгцээ горимтой төстэй байдлаар гүйцэтгэж болно.
Жишээ 5:
int k1=0, k2=0, k3=0; // k1, k2, k3 хувьсагчид нь харгалзах дугаар бүхий процесс ажиллаж дууссан эсэхийг заана.
// 3 процесс нэг нэг алхам ажиллаж байна.
while(k1==0) k1=p1(); // p1 процесс ажиллаж дуусаагүй бол ажиллуул.
// дууссан бол дахиж ажиллахгүй.
while(k2==0) k2=p2(); // p2 процесс ажиллаж дуусаагүй бол ажиллуул.
// дууссан бол дахиж ажиллахгүй.
while(k3==0) k3=p3(); // p3 процесс ажиллаж дуусаагүй бол ажиллуул.
// дууссан бол дахиж ажиллахгүй.

// Бүх процесс амжилттай ажиллаж дууслаа
Жишээ 5 –д процессууд 1, 2, 3 дарааллаар ажиллаж байна. Мөн Жишээ 4 –д бүх процесс зэрэгцээ ажиллаж байна. Гэтэл хэрэглэгч процессыг 2, 1, 3 дарааллаар цуваа ажиллуулах, эсвэл зөвхөн 2, 3 дугаартай процессыг зэрэгцээ ажиллуулахыг хүсч болно. Иймээс эдгээр боломжийг програмдаа тусгаж өгөх хэрэгтэй.

SW306 Лабораторийн ажил 2

Нөхцөл: InputData, PrintData гэсэн хоёр класс үүсгэнэ. InputData класс нь гараас утга хүлээн авна, PrintData класс нь InputData классын гараас өгсөн утгыг хэвлэнэ.

Хугацаа: III/13,14 -ний лабораторийн цагуудаас өмнө

Оноо: 2 хүртэл оноо