Tải bản đầy đủ (.pdf) (19 trang)

báo cáo bài tập nhập môn hệ điều hành lab 5 2

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.52 MB, 19 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN </b>

<b>BÁO CÁO BÀI TẬP NMHĐH</b>

<b>HK2, 2021-2022</b>

<b>Lab 5Thành Viên: Nguyễn Ngô Đăng Khoa (521H0084)</b>

Mục lục

1. Lập lịch CPU:... 2

2. Bài toán ước lượng giá trị số PI...14

3. Ứng dụng sắp xếp bằng tiểu trình A Code chương trình:...15

KẾT LUẬN... 19

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>1. Lập lịch CPU:</b>

<b>u cầu 1.1. Tính thời gian quay vịng trung bình, thời gian chờ trung </b>

bình cho thuật tốn FCFS

bằng cách chỉnh sửa bổ sung hàm schedule() trong tập tin schedule_FCFS.c

<b>Yêu cầu 1.2. Giả sử thời gian đến của mỗi tiến trình khác nhau và khác </b>

0. Hãy tiếp tục chỉnh sửa

hàm schedule() trong tập tin schedule_FCFS.c. Gợi ý: Trong tập tin schedule_FCFS.c một mảng

các Task đã được dùng để chứa thơng tin tiến trình theo thứ tự "First come". Hãy sắp xếp lại mảng

đó với tiêu chí "Arrival Time First", rồi tính tốn và xuất ra theo thứ tự mảng.

<b>u cầu 1.3: hiện thực tập tin schedule_priority.c. Gợi ý: tương tự yêu </b>

<b>Yêu cầu 1.5: hiện thực tập tin schedule_rr.c. Gợi ý: Mảng các Task cần </b>

cập nhật lại Burst của mỗi

tác vụ sau mỗi lần đáp ứng CPU, tác vụ nào có Burst giảm cịn 0 thì xóa khỏi mảng Task.

<b>Yêu cầu 1.6: hiện thực tập tin schedule_priority_rr.c. Gợi ý: Copy lại Yêu</b>

cầu 3 và bổ sung: nếu

có nhiều tác vụ cùng độ ưu tiên thì sao chép chúng và một Mảng khác và chạy RR trên mảng đó

<b>A Code chương trình:</b>

<i>/*** cpu.h*/</i>

<i>// Độ dài định mức thời gian.</i>

#define QUANTUM 10

<i>// Chạy task được chỉ định cho phần thời gian sau.</i>

void run(Task *task, int start, int slice);

<i>/*** task.h</i>

<i>* Đại diện cho 1 task trong hệ thống.*/</i>

#ifndef TASK_H #define TASK_H

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<i>// Struct thể hiện task.</i>

typedef struct task {char *name;int tid;int priority;int burst; int arrival;} Task;#endif

<i>/*** list.h</i>

<i>* Danh sách cấu trúc dữ liệu chứa các task trong hệ thống.*/</i>

#include "task.h"struct node {

Task *task;struct node *next;};

<i>// Hoạt động thêm và xóa.</i>

void insert(struct node **head, Task *task);void delete(struct node **head, Task *task);void traverse(struct node *head);

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<i>/*** schedulers.h*/</i>

#define MIN_PRIORITY 1#define MAX_PRIORITY 10

<i>// Thêm 1 task vào danh sách.</i>

void add(char *name, int priority, int arrival, int burst);

<i>// Invoke schedule.</i>

void schedule();

<i>/*** CPU.c</i>

<i>* CPU “ảo” để theo dõi thời gian hệ thống.*/</i>

#include <stdio.h>#include "task.h"

<i>// Chạy task này vào phần thời gian được chỉ định.</i>

void run(Task *task, int start, int slice) {

printf("Running task = [%s] [%d] [%d] [%d] from %d to %d.\n",>name, >priority, >arrival, task->burst, start, slice+start);

<i>/*** list.c</i>

<i>* Danh sách các hoạt động khác nhau.*/</i>

#include <stdlib.h>#include <stdio.h> #include <string.h>#include "list.h" #include "task.h"

<i>// Thêm 1 task mới vào danh sách các task.</i>

void insert(struct node **head, Task *newTask) {

<i>// Thêm task mới vào danh sách.</i>

struct node *newNode = malloc(sizeof(struct node));newNode->task = newTask;

newNode->next = *head;*head = newNode;}

<i>// Xóa task được chọn khỏi danh sách.</i>

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

void delete(struct node **head, Task *task) { struct node *temp;

struct node *prev; temp = *head;

<i>// Trường hợp đặc biệt - đầu danh sách.</i>

if (strcmp(task->name,temp->task->name) == 0) {*head = (*head)->next;

}else {

<i>// Phần tử cuối của mảng.</i>

prev = *head;temp = temp->next;

while (strcmp(task->name,temp->task->name) != 0) { prev = temp;

temp = temp->next;}

prev->next = temp->next;}

<i>// Bỏ qua danh sách.</i>

void traverse(struct node *head) { struct node *temp;temp = head;while (temp != NULL) {

printf("[%s] [%d] [%d]\n",temp->task->name, temp->task->priority, temp->task->burst); temp = temp->next;

<i>/*** Driver.c</i>

<i>* Lịch trong định dạng.</i>

<i>* [name] [priority] [CPU burst] [arrival time]*/</i>

#include <stdio.h> #include <stdlib.h>#include <string.h>#include "task.h" #include "list.h"

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<i>// Mở file để đọc với tên là chuỗi đối số truyền vào.</i>

in = fopen(argv[1],"r");

<i>// Vịng lặp lấy chuỗi kí tự cho đến hết file.</i>

while (fgets(task,SIZE,in) != NULL) {temp = strdup(task);

name = strsep(&temp,","); priority =

atoi(strsep(&temp,",")); arrival = atoi(strsep(&temp,",")); burst = atoi(strsep(&temp,","));

<i>// Thêm task vào scheduler dánh sách các task.</i>

<i>* schedule_fcfs.c* Lịch trong định dạng.</i>

<i>* [name] [priority] [CPU burst] [arrival time]*/</i>

#include <stdio.h> #include <stdlib.h>#include <string.h>#include "task.h" #include "cpu.h"

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

#include "schedulers.h"

<i>// Kích thước mảng task.</i>

#define SIZE 100static int i=0; Task task[SIZE];

<i>// Thêm 1 task vào danh sách.</i>

void add(char *name, int priority, int arrival, int burst) { task[i].name = name;

task[i].burst = burst; task[i].arrival = arrival; task[i].priority = priority; i++;

<i>// Invoke scheduler FCFS.</i>

void schedule(){int j=0;int time=0;

<i>// Mảng chứa thời gian chờ và thời gian quay vòng.</i>

int wt[SIZE], tt[SIZE]; float awt = 0, att = 0;

<i>// Sắp xếp theo tiêu chí fcfs.</i>

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

{ if(task[j].arrival > task[k].arrival) {

Task temp = task[j]; task[j] = task[k]; task[k] = temp;}

<i>// Chạy task đã được sắp xếp và tình thời gian chờ, thời gian quay vòng.</i>

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

tt[j] = wt[j] + task[j].burst; awt += wt[j];

att += tt[j];

run(&task[j],time,task[j].burst); time += task[j].burst;}

printf("Average waiting time: %f\n", awt / (float) i); printf("Average turnaround time: %f\n", att / (float) i);

<i>* schedule_priority.c* Lịch trong định dạng.</i>

<i>* [name] [priority] [CPU burst] [arrival time]*/</i>

#include <stdio.h> #include <stdlib.h> #include <string.h> #include "task.h" #include "cpu.h" #include "schedulers.h"

<i>// Kích thước mảng task.</i>

#define SIZE 100static int i=0; Task task[SIZE];

<i>// Thêm 1 task vào danh sách.</i>

void add(char *name, int priority, int arrival, int burst) { task[i].name = name;

task[i].burst = burst; task[i].arrival = arrival; task[i].priority = priority; i++;

<i>// invoke the scheduler</i>

void schedule(){ int j=0, k=-1; int time=0;

<i>// Mảng chứa thời gian chờ và thời gian quay vòng.</i>

int wt[SIZE], tt[SIZE];

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

float awt = 0, att = 0;

<i>// Sắp xếp theo priority & tiêu chí fcfs.</i>

for(j=0;j<i;j++) {

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

<i>// Sắp xếp priority cao nhất lên trước.</i>

if(task[j].priority < task[k].priority) { Task temp= task[j]; task[j]=task[k];task[k]=temp;}

for(j=0;j<i;j++) {

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

<i>// Sắp xếp theo fcfs khi priority bằng nhau.</i>

if((task[j].priority==task[k].priority) && (task[j].arrival > task[k].arrival)) { Task temp = task[j];

task[j]=task[k]; task[k]=temp;}

<i>// Sắp xếp task chưa chạy vào thời gian trống.</i>

for(j=0;j<i;j++)

{ if(task[j].arrival > time) {for (k=j+1; k < i; k++) {

if (task[k].arrival <= time) { break;

Task temp=task[j];task[j]=task[k]; task[k]=temp;for(int l=j+1; l<k; l++)

{ Task temp = task[l]; task[l] = task[k]; task[k] = temp;}

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

time += task[j].burst;}

<i>// Chạy task đã được sắp xếp và tình thời gian chờ, thời gian quay vòng.</i>

time = 0;for(j=0 ; j < i ; j++) {

<i>// Thời gian trống khơng có task.</i>

att += tt[j];

run(&task[j],time,task[j].burst); time += task[j].burst;}

printf("Average waiting time: %f\n", awt / (float) i); printf("Average turnaround time: %f\n", att / (float) i);

<i>* schedule_sjf.c* Lịch trong định dạng.</i>

<i>* [name] [priority] [CPU burst] [arrival time]*/</i>

#include <stdio.h> #include <stdlib.h> #include <string.h> #include "task.h" #include "cpu.h" #include "schedulers.h"

<i>// Kích thước mảng task.</i>

#define SIZE 100static int i=0; Task task[SIZE];

<i>// Thêm 1 task vào danh sách.</i>

void add(char *name, int priority, int arrival, int burst) {

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

task[i].name = name; task[i].burst = burst; task[i].arrival = arrival; task[i].priority = priority; i++;

<i>// invoke the scheduler</i>

void schedule(){ int j=0, k=-1; int time=0;

<i>// Mảng chứa thời gian chờ và thời gian quay vòng.</i>

int wt[SIZE], tt[SIZE]; float awt = 0, att = 0;

<i>// Sắp xếp theo priority & tiêu chí fcfs.</i>

for(j=0;j<i;j++) {

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

<i>// Sắp xếp thời gian làm việc thấp nhất lên trước.</i>

if(task[j].burst > task[k].burst) { Task temp= task[j]; task[j]=task[k]; task[k]=temp;}

for(j=0;j<i;j++) {

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

<i>// Sắp xếp theo fcfs khi thời gian làm việc bằng nhau.</i>

if((task[j].burst==task[k].burst) && (task[j].arrival > task[k].arrival)) { Task temp = task[j];

task[j]=task[k]; task[k]=temp;}

<i>// Sắp xếp task chưa chạy vào thời gian trống.</i>

for(j=0;j<i;j++)

{ if(task[j].arrival > time) {for (k=j+1; k < i; k++) {

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

if (task[k].arrival <= time) { break;

}}Task temp=task[j]; task[j]=task[k]; task[k]=temp;for(int l=j+1; l<k; l++)

{ Task temp = task[l]; task[l] = task[k]; task[k] = temp;}}

time += task[j].burst;}

<i>// Chạy task đã được sắp xếp và tình thời gian chờ, thời gian quay vòng.</i>

time = 0;for(j=0 ; j < i ; j++) {

<i>// Thời gian trống khơng có task.</i>

att += tt[j];

run(&task[j],time,task[j].burst); time += task[j].burst;}

printf("Average waiting time: %f\n", awt / (float) i); printf("Average turnaround time: %f\n", att / (float) i);}

<b>B: Kết Quả Demo</b>

*Theo yêu cầu 1.1 và 1.2:

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

- Lập lịch theo tiêu chí FCFS và tính thời gian chờ trung bình và thời gian quay vịng trung bình:

*Theo yêu cầu 1.3:

- Lập lịch theo Priority, tiêu chí FCFS khi Priority bằng nhau và tính thời gian chờ trung bình và thời gian quay vịng trung bình:

*Theo u cầu 1.4:

- Lập lịch theo tiếu chí SJF, tiêu chí FCFS khi thời gian làm cơng việc bằng nhau và tính thời gian chờ trung bình và thời gian quay vịng trung bình:

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

<b>2. Bài tốn ước lượng giá trị số PIA Code chương trình:</b>

#include<stdio.h>#include<pthread.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<string.h>#include<stdlib.h>// S thread t i đa.

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

if(x* + * <=x y y )1

temp++; } in += temp;

counter += MAX_POINT;}

// Chng trình chính.ươ

pthread_t threads[MAX_THREAD]; // T o ra n ti u trình.

for int = ( i 0;i MAX_THREAD ; i<++)

pthread_create(&threads[i], NULL, &count,(void*)

printf("Pi = %f\n double",()in (/ double)counter *4); return ;0

<b>B: Kết Quả Demo</b>

<b>3. Ứng dụng sắp xếp bằng tiểu trình A Code chương trình:A Code chương trình:</b>

// lab3bai3.c (Merge Sort)

// Chng trình áp d ng merge sort s d ng đa lu ng.

#include<stdio.h>

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

#include<time.h>#include<stdlib.h>// S ph n t trong m ng.

ướ// n1 là kích thửủầồc c a ph n bên trái và n2 là kích thước c a ph n bên ph i.

// L u tr d li u vào ph n bên ph i.

for (i ; i n2; i=0<++) right[i] a[i mid =++1]; k low;int =

i j ;= =0

// H p ph n trái và ph i theo th t tăng d n.

while (i n1 <&& < j n2) {

(left[i] if<= right[j]) a[k++ =] left[i++]; else

a[k++ =] right[j++]; }

// Chèn vào d li u còn l i t ph n trái.ữệạừầ

while (i n1) <

a[k++ =] left[i++];

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

// Chèn vào d li u còn l i t ph n ph i.ữệạừầả

while (j n2)<

a[k++ =] right[j++];}

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

18

// Hàm main.

intmain() {

pthread_t threads[THREAD_MAX]; // T o 4 lu ng.ạồ

for int = ( i 0; i THREAD_MAX; i<++)

pthread_create(&threads[i], NULL, thr, (void*)NULL); // Đ i t t c các lu ng.

for int = ( i 0; i ; i<4++) pthread_join(threads[i], NULL); // G p 4 ph n còn l i.

merge(0, (MAX /2-1) , MAX /2/2-1);

merge(MAX , MAX/2/2+ (MAX- -1MAX/2)/2, MAX -1); merge(0, (MAX -1)/2, MAX -1);

// Th i gian merge sort ch y tính b ng giây.

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<b>- Cách viết code lập lịch CPU và các thuật toán lập lịch.</b>

<b>- Áp dụng đa luồng vào chương trình như ước lượng số PI và thuật toán sắp xếp merge sort.</b>

</div>

×