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 1HỌ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 2Hà Nội, 2021
NHẬN XÉT VÀ CHO ĐIỂM CỦA GIÁO VIÊN
Trang 3
Trang 4
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 10
TỪ NGỮ VIẾT TẮT 10
Trang 5LỜ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 6CHƯƠ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
- 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 8CHƯƠ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
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
Trang 9Hì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
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 10Hì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))
Trang 11Hì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 12Hì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
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ả
Hình 2.8 Hàm main
2.1.2 Kết quả
Trang 14KẾ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 15int 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 17time = 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 18B 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