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 дугаартай процессыг зэрэгцээ ажиллуулахыг хүсч болно. Иймээс эдгээр боломжийг програмдаа тусгаж өгөх хэрэгтэй.

No comments: