You are on page 1of 15

Bài tập lớn Hệ điều hành

Bài tập lớn số 1

Ghi chú:
• Sinh viên nộp bài  thông qua BKSAKAI.
• File nộp bài đặt tên là assignment1.tar.bz2.
• Hạn chót nộp bài: Xem trên SAKAI.
• Source code mẫu chỉ có tính chất tham khảo.
• Nếu   có   câu   hỏi   về   bài   tập,   xin   đọc  FAQ.   Nếu   FAQ   chưa   đủ   giải   quyết,   hãy   liên   hệ 
c506001@cse.hcmut.edu.vn.

Phần 1: GI Ớ I THI Ệ U CÁC BÀI TOÁN

1 Bài tập 1 ­ Giả lập bộ định thời
1.1 Mục tiêu
Viết một chương trình C+Shell trên Linux để  giả  lập các giải thuật định thời đã được học như: FCFS, SJF,  
SRTF, RR, Multi­level Scheduling, ...

1.2 Kiến thức cần biết
• Lập trình C trên Linux
• Lập trình Shell trên Linux
• Hiểu về Makefile
• Hiểu các giải thuật định thời

1.3 Mô tả chương trình
Đầu vào (Input) của chương trình:
• Đặc tả của các quá trình trong hệ thống, chẳng hạn: thời gian vào hệ thống, thời gian thực thi của quá  
trình. Ngoài ra, tuỳ vào từng cách thức định thời mà xây dựng thêm các đặc tả khác như: mức độ ưu  
tiên, quantum time, ...
• Phương pháp định thời, chẳng hạn: FCFS, SRTF, SJF, RR, ...
Đầu ra (Output) của chương trình: Ghi lại thông tin định thời các quá trình trong hệ thống tại từng thời điểm, 
thời điểm bắt đầu vào hệ thống của quá trình, thời điểm bắt đầu / kết thúc thực thi, giai đoạn chuyển ngữ cảnh, 
... Các thông tin đầu vào và đầu ra có thể tham khảo trong các file mẫu đính kèm (phần sau). 
Vì có nhiều giải thuật định thời nên chương trình cần được thiết kế sao cho việc xây dựng các bộ định thời 
được dễ dàng, việc thêm vào hay bỏ bớt một giải thuật định thời không làm xáo trộn nhiều cấu trúc  chương 
trình. 

1.4 Một số kỹ thuật lập trình 
1.4.1 Xử lý thông số nhập vào từ chương trình
Một chương trình tốt thường cho phép người dùng thiết lập một vào thông số  khi chạy chương trình, chẳng 
hạn khi thực hiện lệnh: 
$ ls ­R
người dùng đã truyền vào thông số ­R để  liệt kê các file và thư  mục không chỉ  trong thư  mục hiện hành mà  
còn cả những thư mục con của thư mục hiện hành nếu có.
Sau đây là đoạn chương trình mẫu:
int opt;
extern char *optarg; // (global variable) command-line options
// parse command line
while ((opt = getopt(argc, argv, "R:")) != EOF) {
switch (opt) {
case 'R':
options->activeSchedId = atoi(optarg);
break;
default:
...
break;
}
}
Trong đoạn chương trình trên, hàm  getopt()  giúp người lập trình xác định các tham số  đầu vào của người 
dùng. Tham khảo thêm trong manpage (dùng lệnh: man 3 getopt ) và file schedsim.c .

1.4.2 Xử lý file cấu hình
File cấu hình thường  ở  dạng text và có cấu trúc (đơn giản). Ta thường sử  dụng các hàm sau để  xử  lý những  
dạng file này:
• fopen: mở một file
• fclose: đóng file đã mở
• fscanf: đọc/lọc thông tin một dòng trong file
• fprintf: ghi thông tin lên file
Tham khảo thêm trong manpage và file tasks/default/task_man.c .
1.4.3 Một số lệnh hữu ích trong shell
Shell là một trong những công cụ  hỗ  trợ  hữu ích nhất trong Linux. Ngoài một số  lệnh thông dụng như: cd, 
mkdir, ls, top, ..., còn rất nhiều lệnh khác với đa dạng chức năng. Tuy nhiên, đối với chương trình giả lập định 
thời này, ta có thể tham khảo cách sử dụng của các lệnh sau:
• sed: xử lý chuỗi
• awk/gawk: ngôn ngữ lập trình AWK, có thể dùng được trong shell
• for ... in ... ; do ... ; done: Cấu trúc lặp

1.5 Biên dịch và sử dụng thư viện tĩnh
Biên dịch thư viện tĩnh, ví dụ:
# gcc --static -c -o sched_man.o sched_man.c
# ar rcs libsched_man.a sched_man.o
Đoạn lệnh ở trên sẽ tạo ra một thư viện liên kết tĩnh có tên là libsched_man.a. Lưu ý cách đặt tên thư viện liên 
kết tĩnh có dạng như  sau: libxxxx.a. Giả  sử chương trình schedsim cần tham khảo một số hàm hoặc biến toàn 
cục trong thư  viện  libsched_man.a, ta thực hiện các lệnh dưới đây dùng để  liên kết  libsched_man.a  vào 
schedsim:
# gcc -o schedsim schedsim.o -L/home/nam/mylib -lsched_man
Tham số  ­L dùng để  chỉ  ra đường dẫn của các thư  viện, tham số  ­l dùng để  chỉ  ra thư  viện cần liên kết với 
chương trình schedsim. Lưu ý cách liên kết thư viện libsched_man.a: nếu dùng “­l libsched_man.a” thì khi liên 
kết sẽ báo lỗi.

1.6 Chương trình sườn
1.6.1 Cấu trúc chương trình sườn 
Gồm có 3 thành phần: core, scheds, tasks. Mỗi thành phần tương ứng với một thư mục:
•  Phần core : Chứa thông tin đặc tả những cấu trúc được dùng chung trong việc hiện thực các bộ định  
thời. Phần core chứa những đoạn code hầu như không bị thay đổi khi thêm hay bớt một bộ định thời.
•  Phần scheds : Phần hiện thực những chức năng chính của bộ định thời. Trong thư  mục scheds, phần 
hiện thực của mỗi bộ định thời khác nhau được đặt trong các thư mục khác nhau.
•  Phần tasks : Phần này cung cấp những chức năng diễn dịch những thông tin đặc tả quá trình trong các 
file cấu hình. Phần tasks cũng có thể  được dùng chung bởi các bộ  định thời trong phần  scheds, tuy 
nhiên mỗi bộ định thời cũng có thể cần một số thông tin đặc tả khác. Vì vậy, nếu cần hiện thực một 
cách đọc file cấu hình khác, ta vẫn có thể  hiện thực riêng và đặt vào trong thư  mục  tasks (các phần 
khác nhau đặt trong các thư mục khác nhau, giống phần scheds).

1.6.2 Các cấu trúc chính trong phần core 

struct Task {
struct Task *next;
struct Task *prev;
int pid;
int state; // sleeping, running, not-starting, finished
int startTime;
int lastTime; // time that start running or sleeping
int duration;
//int prio;
};
Cấu trúc  Task  dùng để  lưu những thông tin của quá trình như: trạng thái (state), thời điểm vào hệ  thống  
(startTime), thời điểm vừa mới chuyển ngữ cảnh (lastTime), độ ưu tiên (prio). Ngoài những thông tin hệ thống 
có thể  xác định khi thực thi (nêu  ở trên), ta có thể  thêm vào những thông tin khác phục vụ cho quá trình giả 
lập, chẳng hạn, lượng thời gian cần CPU của quá trình (duration). Tùy vào yêu cầu hệ thống, của bộ định thời  
mà ta có thể mở rộng cấu trúc Task này thêm.
struct TaskList {
struct Task *list;
int ntasks;
};
Cấu trúc TaskList dùng để quản lý một tập các quá trình dưới dạng danh sách liên kết 2 chiều.
struct Scheduler {
struct Scheduler *next;
struct Scheduler *prev;
int id;
struct TaskList queueingTasks;
struct TaskList outqueueTasks;
//struct Task *runningTask;
int state; // active or inactive
int timer;
int interval; // in second
//char logFileName[32];
int (*run)(struct Scheduler *thisSched);
int (*parseTasksFromFile)(struct Scheduler *thisSched, char *fileName);
};
Cấu trúc Scheduler dùng để quản lý các thông tin cần thiết của một bộ định thời. Vì được xây dựng để có thể 
dùng cho nhiều bộ định thời nên cấu trúc này chỉ  chứa những thành phần cơ bản và dùng chung giữa các bộ 
định thời, chẳng hạn danh sách các quá trình có thể  thực thi trong hệ  thống (queueingTasks), bộ  timer (các 
trường liên quan: timer, interval). Một cách định kỳ, sau một khoảng thời gian interval, bộ định thời sẽ được 
gọi thực thi và thông số timer sẽ được tăng dần sau mỗi interval. Để đơn giản cho phần lập trình, ta có thể giả 
sử thời gian chiếm CPU dùng để xử lý của bộ định thời là khá nhỏ so với giá trị   interval. Ngoài ra, để hỗ trợ 
cho việc quản lý nhiều bộ  định thời, ta có thêm các trường khác như: trạng thái bộ  định thời có đang được  
dùng hay không (state), định danh bộ định thời (id), .... 
Chức năng chính của một bộ định thời sẽ không được hiện thực trong phần core. Nó được tách riêng ra và đặt  
trong phần scheds. Mỗi bộ định thời có chức năng khác nhau, được hiện thực trong những file khác nhau với  
những tên hàm khác nhau, nhưng khi sử dụng, chỉ cần gọi cùng một tên chung. Đó là lý do của việc sử dụng  
con trỏ hàm run. Ví dụ, để chạy bộ định thời S, ta chỉ cần gọi:  S.run(&S);. Ngoài ra, mỗi bộ định thời cần biết 
các thuộc tính của quá trình, và các thuộc tính này có thể giống hoặc không giống nhau giữa các bộ định thời.  
Để   giúp   cho   việc   viết   code   được   dễ   dàng,   tách   biệt   và   có   thể   dùng   lại,   ta   cũng   dùng   con   trỏ   hàm 
parseTasksFromFile để hỗ trợ việc lấy thông tin về các quá trình sẽ được dùng để giả lập. Chức năng của hàm  
này được hiện thực trong phần tasks.
struct SchedList {
struct Scheduler *list;
int nscheds;
};
Cấu trúc SchedList dùng để quản lý danh sách các bộ định thời dưới dạng danh sách liên kết 2 chiều. 

1.6.3 Hiện thực chương trình chính (schedsim)
Chương trình chính hiện thực khá đơn giản như sau:
int main(int argc, char **argv)
{
struct Scheduler *activeSched = NULL;
// parse options (arguments)
parseArguments(argc, argv, &opts);
// initialize scheduler managers
initSchedList(&scheds);
// collect all supported schedulers
collectSupportedSchedulers(&scheds);
// set active scheduler
setActiveSched(&scheds, opts.activeSchedId);
// run scheduling simulator
if (getActiveSched(&scheds, &activeSched) == SUCCESS) {
// get processes (tasks) from file
activeSched->parseTasksFromFile(activeSched, opts.taskFile);
// start simulation
activeSched->run(activeSched);
}
return 0;
}

1.6.4 Sử dụng chương trình sườn
Để  có thể  hiện thực một bộ  định thời khác (vẫn dùng chung phần tasks), ta chỉ  cần thêm, viết lại code vào  
phần scheds, và có thể không cần thay đổi Makefile. Khi thêm mới một bộ định thời, ta cần chỉnh sửa một số 
phần sau đây: 
• Hàm collectSupportedSchedulers trong file schedsim.h.
• Sửa lại các file sched.h và sched.c trong ./scheds/new_sched/   (giả  sử  phần hiện thực bộ  định thời 
mới được đặt trong thư mục ./scheds/new_sched/)
• Chỉnh lại Makefile trong ./scheds/new_sched/ để  xác định bộ  xử  lý quá trình nào được dùng trong 
phần tasks. Trong file Makefile này, cũng chỉ  cần sửa lại thông tin 2 biến  TASK_MAN_PATH và 
TASK_MAN_OBJ.

1.6.5 Một số tính năng mở rộng
Để tăng mức độ hướng đến người dùng, có thể  viết thêm một chương trình SHELL hỗ trợ tự  động chỉnh sửa  
file  schedsim.h. Ngoài ra, chương trình còn hỗ  trợ  việc biên dịch, gọi chạy chương trình  schedsim, ... dưới 
dạng các “mã lệnh”, tức là người dùng không cần biết sử dụng chương trình schedsim.

2 Bài tập 2 ­ Lập trình đa tuyến tính tích 2 ma trận
2.1 Mục tiêu
Viết một chương trình C trên Linux dùng đa tuyến để giải quyết bài toán tính ma trận tích của 2 ma trận.

2.2 Kiến thức cần biết
 Lập trình C trên Linux
 Makefile
 Lập trình đa tuyến

2.3 Mô tả chương trình
 Đầu vào (Input) của chương trình: Hai ma trận  được lưu  ở dạng hai tập tin, mỗi tập tin được định  
dạng như sau
• Dòng 1: số hàng trong vector
• Dòng 2: số cột trong vector
• Dòng 3: các phần tử trong hàng đầu tiên, mỗi phần tử cách nhau một tab (“/t”)
• Dòng 4: các phần tử trong hàng thứ hai, mỗi phần tử cách nhau một tab (“/t”)
• …
 Đầu ra (Output) của chương trình: ma trận kết quả là tích của hai ma trận đầu vào và được lưu trong 
tập tin theo định dạng giống hai tập tin đầu vào.

2.4 Các kỹ thuật cần biết
2.4.1 Sử dụng thư viện thread.h
 Hàm tạo tuyến:
int pthread_create(pthread_t *thread, const
pthread_attr_t *attr,void *(*start_routine)
(void*), void *arg);
• Hàm  pthread_create  tạo ra một tuyến với các thuộc tính đặc tả  bởi   attr  và sẽ  thực thi hàm 
start_routine. Hàm start_routine nhận một thông số là arg. Tuyến mới có thể thực thi trước khi 
hàm pthread_create trả kết quả về. Nếu pthread_create thành công, thông tin về thread sẽ được 
chứa trong thread.
• Hàm start_routine có dạng sau: void *start_routine (void *);
• Giá trị trả về:
■ 0: Thành công
■ Giá trị khác 0: mã lỗi

2.4.2 Xử lý file cấu hình
File cấu hình thường ở dạng text và có cấu trúc (đơn giản). Ta thường sử dụng các hàm sau để xử lý  
những dạng file này:
 fopen: mở một file
 fclose: đóng file đã mở
 fscanf: đọc/lọc thông tin một dòng trong file
 fprintf: ghi thông tin lên file

2.4.3 Biên dịch chương trình
Để sử dụng thư viện <pthread.h>, lệnh biên dịch gcc cần có them tham số ­lpthread.

2.5 Cấu trúc chương trình
2.5.1 Hệ thống tập tin
Chương trình gồm hai bộ tập tin: bộ vector.h và vector.c dùng để đặc tả cấu trúc vector và các hàm xử lý 
vector; bộ mul_vector.h và mul_vector.c dùng để đặc tả cấu trúc thông số tuyến, các hàm xử lý tuyến và hàm 
main().

2.5.2 Các cấu trúc trong chương trình
 Cấu trúc Index:
typedef struct {
int Row;
int Col;
} Index;
Cấu trúc Index biểu diễn chỉ số của ma trận dùng khi cần truy xuất các phần tử trong ma trận. Cấu 
trúc này bao gồm 2 thành phần: Row là chỉ số hàng và Col là chỉ số cột.
Các hàm xử lý Index bao gồm:
• Tạo Index: CreateIndex(int row, int col)
• Hủy Index: DestroyIndex(Index *index)

 Cấu trúc Matrix:
typedef struct {
int Row;
int Col;
int *Value;
} Matrix;
Cấu trúc Matrix  biểu diễn một ma trận, gồm 3 thành phần: Row là số hàng của ma trận, Col là số cột 
của ma trận và Value là mảng các giá trị của ma trận
Các hàm xử lý Ma trận:
 Lấy giá trị của một phần tử trong ma trận: 
GetElt(Matrix *matrix, int row, int col, int
*value)
 Thiết lập giá trị một phần tử trong ma trận: 
SetElt(Matrix *matrix, int row, int col, int
val)
 Ghi ma trận kết quả vào tập tin: 
CreateResultFile(char *fileName, Matrix
*matrix)
 Đọc ma trận từ tập tin: 
CreateFromFile(char *fileName, Matrix
**matrix)
 Hủy ma trận: 
DestroyMatrix(Matrix *matrix)

2.5.3 Cấu trúc chương trình chính
 Hàm thực thi chính: 
main(int argc, char *argv[])
{
// Kiểm tra cú pháp của lệnh gọi thực thi (các
thông số lệnh)
// Đọc 2 ma trận đầu vào từ tập tin
// Kiểm tra điều kiện nhân 2 ma trận
// Khởi tạo ma trận kết quả
// Tạo tuyến
// Thu thập kết quả
// Ghi ma trận kết quả vào tập tin
}
 Hàm thực thi tuyến: 
void *partialMultiply (void *param)
{
// Lấy thông số của tuyến
// Tính toán giá trị của phần tử tương ứng với
tuyến
// Ghi kết quả vào ma trận kết quả
}
3 Bài tập 3 ­ Lập trình multiprocess 
3.1 Bài toán
Tìm các số trong khoảng từ 1 đến n (n>0, n là tham số đầu vào), không chia hết cho 2 và 3.

Hình 1 – Mô hình bài multiprocess

3.2 Mô hình hoạt động
Bài toán được hiện thực theo mô hình multiprocess như hình trên:
 P0 sinh ra các số từ 1 đến n và ghi vào buffer B0. Sau khi ghi xong số n, P0 sẽ ghi số 0 vào buffer  
(giá trị đánh dấu) và kết thúc.
 P1 đọc tuần tự các số trong buffer B0. Nếu giá trị đọc được không chia hết cho 2, P1 sẽ ghi giá trị đó  
vào buffer B1. Nếu giá trị đọc được khác 0 và chia hết cho 2 thì bỏ qua. Nếu giá trị đọc được là 0, P1  
sẽ ghi giá trị 0 vào buffer B1 và kết thúc.
 P2 đọc tuần tự các số trong buffer B1. Nếu giá trị đọc được không chia hết cho 3 thì xuất ra file kết 
quả. Nếu giá trị đọc được chia hết cho 3 thì bỏ qua. Nếu giá trị đọc được là 0 thì kết thúc.

4 Tài liệu tham khảo
[1] GCC Manuals, website http://gcc.gnu.org/onlinedocs/gcc­4.2.3/gcc/
[2] C programming tutorial, http://www.cprogramming.com/tutorial.html
[3] C programming tutorial, http://www.iu.hio.no/~mark/CTutorial/CTutorial.html 
[4] Multi­thread Programming with POSIX Threads, http://users.actcom.co.il/~choo/lupg/tutorials/multi­
thread/multi­thread.html
[5] Tutorial – Make file, http://www.opussoftware.com/tutorial/TutMakefile.htm
[6] GNU Make, website http://www.gnu.org/software/make/manual/make.html .
[7] Man page.
[8] A. Silberschatz, P. B. Galvin, G. Gagne, 2006, Operating System Principles, 7th Edition, John Wiley & 
Sons Inc. 
[9] Chương trình nguồn (đính kèm).
Ph ầ n 2: YÊU C Ầ U Đ Ố I V Ớ I SINH VIÊN

1 Source code
1. Đăng nhập vào hệ thống với account đã được cấp.
2. Download  file  source   code   hoặc  upload  lên   account   của   mình  (bằng  WinSCP)   file   assignment1­
code.tar.bz2. Lệnh dùng để download:
$ wget
http://www.cse.hcmut.edu.vn/~c506001/files/Assignment/assignmen
t1-code.tar.bz2
3. Giải nén file vừa mới download:
$ tar xjf assignment1-code.tar.bz2
4. Sau khi giải nén xong, source code và file hướng dẫn sẽ nằm trong thư mục assignment1.

2 Yêu cầu chung
1. Mã nguồn được cung cấp chỉ chứa mô tả của chương trình và hiện thực một số phần cơ bản. Sinh viên  
cần viết các phần chưa hoàn thiện (Được đánh dấu bằng chú thích TODO).
2. Để biên dịch chương trình, sửa đổi Makefile đã cung cấp các rule còn thiếu (các chú thích TODO). 
3. Tên file đóng gói là  assignment1.tar.bz2. Nếu dùng server của khoa cung cấp thì sau khi đóng gói, 
download về máy của mình (bằng WinSCP) để nộp bài.
4. Sinh viên có thể viết thêm hàm, cấu trúc nếu thấy cần thiết.
5. Lưu ý: Không có khoảng trắng hay ký tự TAB ở  cuối mỗi dòng trong file input và output. Mỗi  
file input hay output đều kết thúc bằng một dòng trống.

3 Yêu cầu bài toán 1 (Giả lập bộ định thời)
Dựa vào chương trình sườn, sinh viên hiện thực thêm 2 giải thuật định thời là định thời ưu tiên (priority 
scheduling), và RR (Round­Robin). Sinh viên có thể chỉnh sửa lại các cấu trúc  trong chương trình sườn 
(thêm hoặc bỏ bớt thuộc tính), hoặc hiện thực thêm các hàm phụ trợ, chẳng hạn hàm tìm kiếm một phần tử 
trong danh sách, ....  Phần hiện thực mỗi bộ định thời được đặt trong thư mục scheds, và trong những thư mục 
riêng biệt.
Chương trình sau khi biên dịch có tên là schedsim, hỗ trợ các thông số sau:
 ­h: Hiển thị thông tin hướng dẫn sử dụng schedsim
 ­s  id: Chọn lựa bộ định thời để giả lập. Mặc định, định thời SRTF có ID là 2, định thời RR có ID 
là 3. Nếu thông số này không được sử dụng thì mặc định chọn bộ định thời SRTF.
 ­i  filename: Chọn file input.  Tên file input mặc định là input.txt.
 ­o  filename: Chọn file output. Tên file output mặc định là output.txt.
 ­L : Liệt kê tất cả những bộ định thời được hỗ trợ bởi chương trình (ít nhất phải có: tên bộ định thời,  
ID của bộ định thời).
Cú pháp chạy chương trình schedsim:
schedsim [­h] [­s id] [­i filename] [­o filename] [­L] 

3.1 Bài toán định thời RR


File input: Mỗi dòng mô tả một quá trình, bao gồm các thông tin: thời điểm đi vào hệ thống (start time), 
lượng thời gian thực thi (duration). Ví dụ:
0 3
1 3

Với file input mẫu ở trên, chương trình sẽ hiểu như sau: có 2 quá trình sẽ được thực thi trong giai đoạn giả lập. 
Quá trình đầu tiên sẽ đi vào hệ thống tại thời điểm 0 và thực thi trong vòng 2 đơn vị thời gian. Quá trình thứ 
hai sẽ đi vào hệ thống tại thời điểm 2, và thời gian cần để thực thi là 7.
“Quantum” của bộ định thời có thể thay đổi được bằng cách chỉnh trong file cấu hình có tên sched.conf, đặt 
trong thư mục của bộ định thời RR, chẳng hạn: ./scheds/round­robin/sched.conf. Dòng đầu tiên trong file 
sched.conf là một số tương ứng với quantum time.
File output: Mỗi dòng cần xuất ra các thông tin tại mỗi thời điểm: thời điểm hiện tại, ID của quá trình đang 
thực thi, duration còn lại của quá trình đó. Ví dụ, với file input như ở trên và với giải thuật định thời RR, 
quantum = 2, file output sẽ như sau:
0 0 3
1 0 2
2 1 3
3 1 2
4 0 1
5 1 1
6

Trong trường hợp hệ thống tạm thời không có quá trình người dùng nào thực thi, chỉ cần ghi vào file output 
thông tin thời điểm (bỏ trống 2 thông tin pid và duration). Chẳng hạn:
0 0 2
1 0 1
2(không có khoảng trắng sau thời điểm này)
3
4 1 1
5
Như vậy, thông số thời điểm tại mỗi dòng trong file output sẽ tăng dần: 0, 1, 2, … chứ không có nhảy 
cách quãng. Lưu ý, với bài toán định thời Round­Robin, KHÔNG xuất ra file output theo từng 
quantum time vì nếu như thế sẽ không phản ánh được trạng thái hệ thống tại mỗi thời điểm chuyển 
ngữ cảnh, ví dụ quantum = 3, P1(duration = 4), P2(duration = 2). 
Trong trường hợp tại thời điểm chuyển ngữ cảnh, có một quá trình khác đi vào thì coi như quá trình đó sẽ 
được đưa vào cuối hàng đợi. Ví dụ:
Input:
0 3
1 2
Output:
0 0 3
1 0 2
2 0 1
3 1 2
4 1 1
5

3.2 Bài toán định thời ưu tiên


­ Định thời ưu tiên theo cơ chế preemptive.
­ Độ ưu tiên có giá trị càng lớn thì mức độ ưu tiên càng thấp. 
File input: Mỗi dòng mô tả một quá trình, bao gồm các thông tin: thời điểm đi vào hệ thống (start time), 
lượng thời gian thực thi (duration) và độ ưu tiên của quá trình đó. Ví dụ:
0 3 2
1 2 1
Như vậy, có 2 quá trình: quá trình 0 có độ ưu tiên là 2, duration là 3; quá trình 1 có độ ưu tiên là 1, 
duration = 2. Quá trình 0 có độ ưu tiên thấp hơn quá trình 1.
File output: Tương tự bài toán định thời Round­Robin. Với file input như ví dụ ở trên thì file output tương 
ứng là:
0 0 3
1 1 2
2 1 1
3 0 2
4 0 1
5
4 Yêu cầu bài toán 2 (Nhân 2 ma trận dùng multi­threaded)
File input: Gồm có 2 file, mỗi file lưu thông tin một ma trận gồm: một dòng cho biết số hàng, một dòng cho  
biết số  cột, và những dòng còn lại cho biết thông tin mỗi hàng trong ma trận (mỗi phần tử  trong hàng cách 
nhau bởi ký tự 'TAB' (\t) ). Ví dụ:
2
2
1 1
3 3

Ví dụ trên mô tả một ma trận (2x2).
File output: Giống định dạng file input nhưng lưu thông tin ma trận kết quả. 
Yêu cầu về  các tuyến: Số  lượng tuyến chính là số  lượng phần tử  trong ma trận kết quả. Mỗi tuyến sẽ  thực  
hiện tính toán giá trị của một phần tử mà nó đại diện trong ma trận kết quả.
Chương trình sau khi biên dịch có tên là mul_matrix, hỗ trợ các thông số sau: 
 ­h: Hiện thông tin hướng dẫn (ngắn gọn) cú pháp sử dụng chương trình.
 ­o filename: Chỉ định file output.
Cú pháp thực thi của chương trình mul_matrix:
mul_matrix [­h]  [­o output] [input_1 input_2]
Tên file output mặc định là output.txt. Tên 2 file input mặc định là input1, input2

5 Yêu cầu bài toán 3 (Multiprocess)
 Sinh viên viết code hiện thực chương trình theo mô tả như trong phần trước, với n và tên file kết quả 
là tham số nhập.
 P0, P1, P2 được hiện thực thành các tiến trình (process) riêng biệt.
 Các buffer B0 và B1 được hiện thực bằng bộ  nhớ  chia sẻ  (shared memory) giữa các tiến trình, với  
kích thước 5 số nguyên (5x4 = 20bytes). Việc truy xuất vào bộ nhớ chia sẻ giữa các tiến trình được  
đồng bộ bằng semaphores (System V semaphore). Các buffer B0 và B1 là độc lập với nhau.
 Chương trình kết quả phải chạy theo mô hình như trên, nếu sinh viên chỉ sử dụng một process và xuất  
ra kết quả không được tính điểm.
 Chương trình kết quả phải nhận 2 thông số:
1. ­h: Hiện thông tin hướng dẫn (ngắn gọn) cú pháp sử dụng chương trình.
2. ­o filename: file kết quả. Tên file output mặc định là output.txt.
3. ­n num: kích thước chuỗi xem xét.
 File kết quả có dạng
n1
n2
n3 

You might also like