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">
<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);}
18