Bài tập lớn Hệ điều hành Bài tập lớn số 1 Ghi chú



tải về 100.47 Kb.
Chuyển đổi dữ liệu30.08.2016
Kích100.47 Kb.
#29599
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 hoặc tại trang web: www.cse.hcmut.edu.vn/~c506001/

  • File nộp bài đặt tên là assignment1.tar.bz2

  • Hạn chót nộp bài: 12:00 PM, thứ bảy, 01/11/2008

  • Hạn chót nộp bài có thể thay đổi. Mọi thay đổi sẽ được thông báo trên website.

  • Nếu có câu hỏi về bài tập, xin đọc FAQ trước rồi. 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. 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. 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. 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. Một số kỹ thuật lập trình

      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. 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. 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. 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. Chương trình sườn

      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. 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. 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. 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.hsched.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_PATHTASK_MAN_OBJ.
      1. 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.
  1. Bài tập 2 - Lập trình đa tuyến tính tích 2 ma trận

    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.
    1. Kiến thức cần biết


  • Lập trình C trên Linux

  • Makefile

  • Lập trình đa tuyến
    1. 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.
    1. Các kỹ thuật cần biết

      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
      1. 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
      1. Biên dịch chương trình


Để sử dụng thư viện
, lệnh biên dịch gcc cần có them tham số -lpthread.
    1. Cấu trúc chương trình

      1. Hệ thống tập tin


Chương trình gồm hai bộ tập tin: bộ vector.hvector.c dùng để đặc tả cấu trúc vector và các hàm xử lý vector; bộ mul_vector.hmul_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().
      1. 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)
      1. 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ả

    }

  1. Bài tập 3 - Lập trình multiprocess

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

1Source 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/assignment1-code.tar.bz2

  1. Giải nén file vừa mới download:

    $ tar xjf assignment1-code.tar.bz2

  1. Sau khi giải nén xong, source code và file hướng dẫn sẽ nằm trong thư mục assignment1.

2Yê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.

3Yê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à SRTF (Shortest Remaining Time First), 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.

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 2


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



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, thông tin quá trình đang thực thi (PID, duration). Ví dụ, với file input như ở trên và với giải thuật SRTF, file output sẽ như sau:

0 0 2


1 0 1

2 1 3


3 1 2

4 1 1


5

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

Đối với giải thuật định thời RR: “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.

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ổ sung giả thiết cho bài toán định thời SRJF

- Ưu tiên chọn quá trình có thời gian còn lại nhỏ nhất.

- Nếu có nhiều quá trình có cùng thời gian còn lại nhỏ nhất thì chọn quá trình có PID nhỏ nhất.

4Yê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

5Yê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





tải về 100.47 Kb.

Chia sẻ với bạn bè của bạn:




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương