1. Trang chủ
  2. » Giáo Dục - Đào Tạo

BÀI tập môn học NGUYÊN lý hệ điều HÀNH VIẾT CHƯƠNG TRÌNH BẰNG NGÔN NGỮ c mô tả THUẬT TOÁN lập LỊCH CHO CPU KHÔNG ưu TIÊN THEO THUẬT TOÁN SJF (SHORTER JOB FIRT)

18 18 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 35,85 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Hiểu được vấn đề này, nhóm chúng em học hỏi, tìm tòi để viết báo cáo về thuật toán SJF Shortest Job First - một trong những thuật toán tối ưu hiệu quả dành cho CPU, cũng như mô tả thuật

Trang 1

HỌC VIỆN KỸ THUẬT MẬT MÃ

KHOA CỒNG NGHỆTHÔNG TIN

BÀI TẬP MÔN HỌC NGUYÊN LÝ HỆ ĐIỀU HÀNH

VIẾT CHƯƠNG TRÌNH BẰNG NGÔN NGỮ C MÔ TẢ THUẬT TOÁN LẬP LỊCH CHO CPU KHÔNG ƯU TIÊN THEO THUẬT

TOÁN SJF (SHORTER JOB FIRT)

Sinh viên thực hiện:

Nguyễn Thanh Hải

MSSV: AT160221

Trần Trung Hiếu

MSSV: AT160519

Vũ Minh Hiếu

MSSV: AT160520

Lớp: AT16C405

Người hướng dẫn:

TS Nguyễn Đào Trường

Khoa Công nghệ thông tin - Học viện Kỹ thuật mật mã

Trang 2

Hà Nội, 2021

NHẬN XÉT VÀ CHO ĐIỂM CỦA GIÁO VIÊN

Trang 3

MỤC LỤC

LỜI NÓI ĐẦU 1

Chương 1 KHÁI QUÁT VỀ THUÂT TOÁN SJF( SHORTER JOB FIRT ) .2

1.1 Khái quát về thuật toán Shorter job first 2

1.11 Những điều cần biết trước khi tìm hiểu về thuật toán .2

1.1.2 Khái niêm về thuât toán Shorter job first 2

1.2 Giải thích thuật toán và ví dụ 2

1.2.1 Giải thích thuật toán .2

1.2.2 Ví dụ .3

Chương 2 MÔ TẢ THUÂT TOÁN SJF( SHORTER JOB FIRT ) BẰNG C 4

2.1 Mô tả thuật toán SJF bằng C 4

2.1.1 Giải thích thuật toán .4

2.1.2 Kết quả .8

KẾT LUÂN 9

TÀI LIÊU THAM KHẢO TỪ NGỮ VIẾT TẮT

10

10

Trang 4

LỜI NÓI ĐẦU

Trong thời đại ngày nay, quản lý thời gian chưa bao giờ dễ dàng, rất nhiều lần chúng ta có thể tiêu xài một cách hoang phí Thế nên trong suốt chiều dài lịch

sử chúng ta luôn tìm cách để tối ưu thời gian Máy tính cũng vậy Nó thật sự cần các thuật toán để tránh việc lãng phí tài nguyên cũng như tối ưu thời gian hoạt động nhất có thể Hiểu được vấn đề này, nhóm chúng em học hỏi, tìm tòi để viết báo cáo về thuật toán SJF (Shortest Job First) - một trong những thuật toán tối ưu hiệu quả dành cho CPU, cũng như mô tả thuật toán bằng C Chúng em khi làm bản báo cáo cũng đã gặp không ít khó khăn và thắc mắc, nhưng nhờ thầy TS.Nguyễn Đào Trường mà chúng em đã có thể hoàn thành bản báo cáo này Với bài báo cáo đòi hỏi tính chính xác cao cũng như tập chung cao thì sai sót sẽ có thể xảy ra Rất mong thầy và các bạn có thể đóng góp nhận xét về bản báo cáo để chúng em có thể cải thiện hơn nữa

Trang 5

CHƯƠNG 1: KHÁI QUÁT VỀ THUẬT TOÁN SFJ(SHORTER

JOB FIRT)

Chương này trình bày sẽ trình bày về khái quát thuật toán SFJ(Shortest Job First)

1.1 Khái quát về thuật toán Shorter job first

1.1.1 Những điều cần biết trước khi tìm hiểu về thuật toán.

- Tiến trình là một bộ phận của một chương trình thực đang thực hiện, đơn vị thực hiện tiến trình là processer

- Như mọi người đã biết, tiến trình có hai thứ rất quan trọng khi lập lịch cho CPU, đó là Burst Time(thời gian sử dụng CPU) và Arival Time(thời gian đến CPU)

- Để giải thích đơn giản, Arival Time giống như khoảng thời gian cần

để đến trường vậy VD: có bạn nhà ở hà đông, có bạn nhà ở thanh xuân, Điều này dẫn đến việc có khoảng thời gian mà các bạn đi học sẽ khác nhau

Có bạn mất 8 tiếng, có bạn mất 15 phút Còn Burst Time giống như thời gian lên lớp học ở trường Có người học 1 ca, có người học 5 ca

- Vì thời gian để xử lý tiến trình là khác nhau, nên việc lập lịch cho CPU cũng có nhiều thuật toán được viết ra, điển hình là Shorter job first

1.1.2 Khái niệm về thuật toán Shorter job first

- Thuật toán Shorter job first là thuật toán cho phép hệ điều hành chọn

tiến trình có chiều dài burt time nhỏ nhất để cho CPU xử lý

- Khi lựa chọn các tiến trình, nó có hai dạng: một là ưu tiên, hai là không ưu tiên Nhưng trong khuôn khổ của bản báo cáo, chúng em sẽ chỉ làm về không ưu tiên

-SFJ là tối ưu cho thời gian chờ đợi trung bình của các tiến trình là nhỏ nhất

1.2 Giải thích thuật toán và ví dụ.

1.2.1 Giải thích thuật toán

Trang 6

- B1: Hệ điều hành sẽ chọn tiến trình đã đến đầu tiên.

Trang 7

- B2: Sau khi CPU xử lý xong tiến trình đầu tiên, lúc này nó sẽ lựa

chọn xem tiến trình đã đến và chọn tiến trình có burst time nhỏ nhất để cho CPU xử lý.

- B3: Tiếp tục lặp lại quá trình chọn tiến trình có burst time nhỏ nhất và cho CPU xử lý.

1.2.2 Ví dụ

- Chúng ta có bài toán như thế này:

Biểu đồ Grantt của lịch biểu như sau:

- Thời gian chờ đợi của các tiến trình: P1 = 0, P2 = 11, P3 = 6, P4 = 3

- Thời gian chờ đợi trung bình: (0 +11 + 6 +3) / 4 = 5

Trang 8

CHƯƠNG 2: MÔ TẢ THUÂT TOÁN SJF(SHORTER JOB FIRT)

BẰNG C

Chương này trình bày chi tiết toàn bộ mô tả thuật toán bằng C

2.1 Mô tả thuật toán SJF bằng C.

2.1.1 Giải thích code:

- Đầu tiên thì chúng em khai báo sử dụng các thư viện cũng như tạo struct để định nghĩa dữ liệu quan trọng cho Process: Procces ID, Burst Time, Arrival Time

tinclude <stdío.h>

íĩncLude <stĩinợ.h>

íĩnclude <nsath.h>

nstruct Process {

int pid; // Process ID

ồt H .■ ỉ Suxst TJJD£J ■1ĨIÀ-ĨÌ.C

v.vi-v.Avi.í

- } ỉ

typedeí struct Process

process,-Hình 2.1 Sử dụng thư viện và tạo struct Process

- Hàm ghiFile có tác dụng tạo Ffle, lưu file cũng như ghi những thông số được nhập từ bàn phím cho dữ liệu Process Khi nhập biến count(tức nhập

số tiến trình) thì hàm sẽ tạo bản ghi bằng vòng lặp for để lưu dữ liệu cho Process bằng mảng

^void qhirìle(process a[]/ int count} {

FILE * fp;

íp = fợpèn ("Đ://ĩnput Ệ^", "w") :

fpxintf ỉfp,"so lĨỄP trinh: %d\n", count];

fprintf(fp, "process %3 Burst Time %3 Arrival Time\n rr )

3 for(ỉnt ỉ = 0;i < CĐUEit ;!++){

fprintfffp r "*ãa%JUỈíìUflíỉXn", a[i].pid, a[i].bt, a[i].art);

- }

ĩclose (fp) ;

Trang 9

Hình 2.2 Hàm ghiFile.

- Hàm nhapProc để nhập tất cả dữ liệu của Process từ bàn phím như tên tiến trình, burt time, arrival time Với biến count được từ bàn phím của hàm main,

nó sẽ tạo các biến bằng mảng cho từng dữ liệu của Process

■■ ■■ UầSB ịiXũẬis.

voĩd nhapProc(process proc[J, ínt count)

scanf("%d", íiproc Li] pĩd) ĩ

printí ("\nyMp tax time

scanf("%d** f sproc [ỈJ , bt) ;

printỉ ( "Xnĩíh^p Arrỉval Time

scanfí"%d" f sproc [i], art) ; 1

}

Hình 2.3 Hàm nhapProc

- Hàm sortByArt là hàm dùng để sắp xếp các Arrival Time đã nhập từ bàn phím theo dạng từ bé đến lớn Hàm này để tìm xem đâu là tiến trình đến trước

Trang 10

< : ■iiíũri sa.p iisii LMỈĩtí, XdClÊíì K,w.'& JÃỈwL =•■-1

process tmp;

tmp - mangproc [ ỉ ] ;

mangErocíi] = mangProc [ j ]ĩ

mangProc[j] - tmp;

■ }

- 1

)

■}

Hình 2.4 Hàm sortByArt

- Hàm sortByBt để sắp xếp từ bé đến lớn của tiến trình nào xuất hiện.

VD: P1 chạy xong tiến trình nhưng P3 và P4 đã đến và P2 chưa đến Lúc này hàm tìm xem Bt của P3 hay P4 bé hơn(P2 chưa đến nên không tính) để xử lý Với d là vị trí của i + 1 túc là tt liền sau của tt đang hoạt động và c là à vị trí tính trình đủ điều kiện thoải mãn (điều kiện bé hơn thời gian sau khi tt hiện tại hoàn thành (tức là biến time của hàm run))

Ịvoid sortByBt (process mangproc [ ] , int d, int c) {

process tmp;

fox(int i = d; ĩ < c; i++ì [

.1 if (mangproc [1] ,bt > lĩiangproc [ j ] bt) í

tmp = mangproc [1] ;

tmp, }

Trang 11

Hình 2.5 Hàm sortByBt

- Hàm run dùng để làm những nhiệm vụ sau: thứ nhất là tính khoảng thời gian để một tiến trình chạy, thứ hai lọc ra khi tiến trình trước chạy xong thì có tiến trình nào đã đến, thứ ba truyền dữ liệu biến tìm được ở nhiệm vụ hai về hàm sortByBt

- Ở nhiệm vụ đầu tiên thì sau khi biết chọn tiến trình nào rồi thì lúc đó biến time sẽ tìm xem tiến trình chạy xong ở thời gian nào(VD: P1 xử

lý xong ở giây 60, P2 xử lý xong ở giây 70, )

time = proc.bt + time;// tính thời gian sau khi xử lý 1 tiến trình

- Ở nhiệm vụ thứ hai, hàm run sẽ lấy mảng được sắp xếp từ sortByArt

và so sánh với biến time vừa tính được sau mỗi lần xử lý tiến trình(VD: P1 chạy thứ 60 thì P2 với P3 đến chưa)

int index;//bien index de tinh so tien trinh can phai xet

for(int i = k + 1; i < count; i++){

if(mangProc[i].art < time){// loc ra cac tien trinh nao can phai xet index = i;

}else{

break;

}

}

- Ở nhiệm vụ thứ ba là có được dữ liệu từ nhiệm vui thứ hai th ì lúc này hàm run truyền lại cho hàm sortByBt

sortByBt(mangProc, k+1, index);// lấy giá trị đã tính ở hàm run để tính tiếp ở hàm sortByBt

Trang 12

//ham run da staí 1 XẲSM x&iaìl

Ẹ]int runíprocess proc, int k, int count, process mangProc[], int time) {

time = proc.bt - time,-// _ time ãg _ aag 1

/ í X MỈM U ỮỈÌílỉuăẪÌ ■ £XÉẳ ) '

int index;/ index ã® 30 can —

for(int i=k+l;i< count; i++){

if (mangProc [i] art < time) {// sas _ _ can _

index = i;

} else{

break ;

- }

- }

sortByBt (mangProc, k+1, index);// sap _ sac can thẹo giả itó fct

return tỉme;

L)

Hình 2.6 Hàm run

- Hàm runProgram được chạy xong đã tính thời gian chờ của các tiến trình lúc này sẽ tính thời gian chờ trung bình của tiến trình

int runProgram(process manọPiQC(] ,int count)(

int SLMfiWaiteTÌme = ũ;

int time = ũ;

for(int í = c ; < count Ỉ++) (

tũne = run (mangProc [i] , i, count, manqProc, time};

printf("J^a UUnh *d "tmangProc [i; pid} ;

printí 0 Xn")

}tìlsa {

int vairTime = time - manqProc [1]- art - mangProc í ] -bt ;

pEĨntíí" %d \n", waitTìme>;

sumWaiteTimfi += vait Time; //tong

} }

return sumHaiteTime;

Hình 2.7 Hàm runProgram

Trang 13

- Hàm main dùng chạy chương trình Nhập giá trị cho biên count sau

đó truyền cho dữ liệu cho process, nhapProc, ghiFile, sortByArt và đợi hàm runProgram tính toán xong và in kêt quả

]int main() {

int count;

printí ("Hbap so t.ien XxiW);

scanf("%d", scount) ;

process mangProc[count] , queue[count] ;

nhapProc(mangProc, count);// input

ghirile(mangProc,count) ; //atù yạọ íile

sortByArt (mangProc, count);// sap process XbSíi tbiú, oXâa xaa

printt ("Kat qua: \n“);

int sumMaiteTime = runProgramlmangProc, count) ; /iúuá ÌkiÀ SÚAU ÉÁCÌ 'ung iíiut

printíCXn => tbai SÁÃU sha tÃMUg binh SMâ sac tien txinb: %0-2í" (float) sumWaiteTime/count) ;

return j;

Hình 2.8 Hàm main

2.1.2 Kết quả

Trang 14

Nhap ten tien trinh 1 :1

Nhap burt time :7

Nhap Arrỉval Time :0

Nhap ten tien trinh 2 :2

Nhap burt tỉme :4

Nhap Arrỉval Time :2

Nhap ten tien trinh 3 :3

Nhap burt tỉme :1

Nhap Arrival Time :4

Nhap ten tien trinh 4 :4

Nhap burt tỉme :4

Nhap Arrival Time :5

Ket qua:

tien trinh 1 0

tien trinh 3 3

tỉen trinh 2 6

tien trinh 4 7

=> thoi gian cho trung binh cua cac tien trinh: 4.00

Process returned 0 (0X0) executỉon time : 32.354 s Press any key to continue.

KẾT LUẬN

- Sau đây là toàn bộ mã nguồn của chương trình code bằng C.

#include <stdio.h>

#include <string.h>

#include <math.h>

//tao struct

struct Process {

Trang 15

int pid; // Process ID

int bt; // Burst Time, thoi gian hoan thanh cua cac tien trinh int art; // Arrival Time, thoi gian vao cua cac tien trinh

};

typedef struct Process process;

// tao file

void ghiFile(process a[], int count) {

FILE * fp;

fp = fopen ("D://Input.txt","w");

fprintf(fp,"so tien trinh: %d\n", count);

fprintf(fp,"process %3 Burst Time %3 Arrival Time\n"); for(int i = 0;i < count ;i++){

fprintf(fp, "%5d%10d%10d\n", a[i].pid, a[i].bt, a[i].art); }

fclose (fp);

}

//hàm nhap

void nhapProc(process proc[], int count){

int name = 0;

for(int i = 0; i < count; i++){

printf("Nhap ten tien trinh %d :", ++name);

scanf("%d", &proc[i].pid);

printf("\nNhap burt time :");

scanf("%d", &proc[i].bt);

printf("\nNhap Arrival Time :");

scanf("%d", &proc[i].art);

}

}

//hàm sap xep mang theo gia tri art

void sortByArt(process mangProc[], int count){

process tmp;

for(int i = 0; i < count-1; i++){

for(int j = i+1; j < count; j++){

if(mangProc[i].art > mangProc[j].art){

tmp = mangProc[i];

mangProc[i] = mangProc[j];

mangProc[j] = tmp;

} }

Trang 16

}

//hàm sap xep mang theo gia tri bt trong khoang [d,c]

//vi dung de loc ra cac tien trinh nao se duoc xet de chay tiep

void sortByBt(process mangProc[], int d, int c){

process tmp;

for(int i = d; i < c; i++) {

for(int j = i+1; j <= c; j++){

if(mangProc[i].bt > mangProc[j].bt){

tmp = mangProc[i];

mangProc[i] = mangProc[j];

mangProc[j] = tmp;

}

} }

}

//ham run de chay 1 tien trinh

int run(process proc, int k, int count,process mangProc[], int time){

time = proc.bt + time;// bien time de tinh thoi gian sau khi chay xong 1 tien trinh

// printf("tien trinh %d ", proc.pid);

int index;//bien index de tinh so tien trinh can phai xet

for(int i = k + 1; i < count; i++){

if(mangProc[i].art < time){// loc ra cac tien trinh nao can phai xet

index = i;

}else{

break;

} }

sortByBt(mangProc, k+1, index);// sap xep cac tien trinh can phai xet theo gia tri bt

return time;

}

//muc dich: tinh ra thoi gian cho cua tung tien trinh

int runProgram(process mangProc[],int count){

int sumWaiteTime = 0;

int time = 0;

for(int i = 0 ; i < count ; i++){

Trang 17

time = run(mangProc[i], i, count, mangProc, time);

//thoi gian sau khi chay tien trinh thu i printf("tien trinh %d ", mangProc[i].pid);

if(i == 0){

printf(" 0 \n");

}else{

int waitTime = time - mangProc[i].art - mangProc[i].bt;

//tinh thoi gian thoi gian cho cua tung tien trinh printf(" %d \n", waitTime);

sumWaiteTime += waitTime;//tong thoi gian cho }

}

return sumWaiteTime;

}

int main(){

int count;

printf("Nhap so tien trinh:");

scanf("%d", &count);

process mangProc[count], queue[count];

nhapProc(mangProc, count);// input

ghiFile(mangProc,count);//ghi vao file

sortByArt(mangProc, count);// sap xep process theo thoi gian vao

printf("Ket qua: \n");

int sumWaiteTime = runProgram(mangProc, count);//tinh ra thoi gian trung binh cua tung tien trinh

printf("\n => thoi gian cho trung binh cua cac tien trinh: %0.2f",

(float)sumWaiteTime/count);

return 0;

}

A Những kết quả đạt được của bài tập môn học

- Hiểu biết hơn về kiến thức môn nguyên lý hệ điều hành, cũng như các hoạt động của HĐH và CPU khi mà phải lập lịch cho các tiến trình

- Tăng khả năng làm việc nhóm

- Học thêm được những góc nhìn khác qua việc lập trình

- Xây dựng được chương trình để giải bài toán

Trang 18

B Hướng phát triển tiếp theo và đề xuất

Bài tập mang tính thực tế cao khi phải giải quyết nhu cầu hiểu rõ hơn vấn đề về HĐH cũng như CPU Nhóm em có thể được có nhiều những ví dụ sinh động, dễ hiểu, cũng kiến thức sát hơn so với thực tế

Nhóm 4 chúng em xin chân thành cảm ơn thầy và các bạn!

TÀI LIỆU THAM KHẢO

[1] TSNguyễn Đào Trường, Tài liệu giảng dạy môn nguyên lý hệ điều hành

NHỮNG TỪ NGỮ VIẾT TẮT

• CPU: Central Processing Unit

• HĐH: Hệ điều hành

• tt : tiến trình

Ngày đăng: 17/03/2022, 08:47

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w