You are on page 1of 18

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ã
Hà Nội, 2021

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

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................

.....................................................................................................................................
.....................................................................................................................................

.....................................................................................................................................

.............................................................................................................................
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
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.
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
- B1: Hệ điều hành sẽ chọn tiến trình đã đến đầu tiên.
- 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:
Process Arrival Time Bust time
P1 0 6
P2 1 8
P3 2 4
P4 3 2

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


P1 P4 P3 P2
6 8 12 20
- 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
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.

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.
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.

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.
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)) .
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.
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.

Hình 2.7 Hàm runProgram


- 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ả
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 {
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;
}

}
}
}
//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++){
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
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

You might also like