1. Trang chủ
  2. » Luận Văn - Báo Cáo

Ứng dụng cơ chế multi thread để giải quyết bài toán nhân hai ma trận lớn

22 2,1K 10

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 22
Dung lượng 0,96 MB

Nội dung

Ứng dụng cơ chế multi thread để giải quyết bài toán nhân hai ma trận lớn

Trang 1

TRƯỜNG ĐẠI HỌC BÁCH KHOA

KHOA CÔNG NGHỆ THÔNG TIN

BỘ MÔN MẠNG VÀ TRUYỀN THÔNG

ĐỒ ÁN HỆ ĐIỀU HÀNH

Đề tài:

Ứng dụng cơ chế multi thread để giải quyết bài toán nhân hai ma trận lớn

Sinh viên : Vũ Đức Nội

Cán bộ hướng dẫn : Phạm Minh Tuấn

Đà Nẵng 12/2014

Trang 2

SVTH: Vũ Đức Nội Page: 2

LỜI NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN

Trang 3

SVTH: Vũ Đức Nội Page: 3

MỤC LỤC

CHƯƠNG 1. LỜI NÓI ĐẦU 4

TỔNG QUAN VỀ ĐỀ TÀI 5

CHƯƠNG 2. CƠ SỞ LÝ THUYẾT 6

2.1 GIỚI THIỆU 6

2.2 CÁC KHÁI NIỆM CƠ BẢN VỀ THREAD 6

2.2.1 Định nghĩa thread và multi thread 6

2.2.2 Chia sẽ bộ nhớ trong pthreads 9

2.2.3 Tính an toàn của Threads 9

2.2.4 Ưu và khuyết điểm của cơ chế multi thread 10

2.3 LẬP TRÌNH MULTI THREAD TRONG HỆ ĐIỀU HÀNH UBUNTU 11

2.3.1 Các thủ tục chính lập trình multi thread trong Ubuntu 11

2.3.2 Tạo thread 11

2.3.3 Hủy Thread 12

2.3.4 Truyền tham số cho thread 12

2.3.5 Nối thread 13

CHƯƠNG 3. THIẾT KẾ VÀ XÂY DỰNG CHƯƠNG TRÌNH 15

3.1 PHÂN TÍCH YÊU CẦU 15

3.2 TỔ CHỨC CSDL 15

3.3 XÂY DỰNG CÁC CHỨC NĂNG 16

CHƯƠNG 4. TRIỂN KHAI VÀ ĐÁNH GIÁ KẾT QUẢ 18

4.1 MÔI TRƯỜNG TRIỂN KHAI 18

4.2 CODE CHƯƠNG TRÌNH 18

KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 21

4.3 NHỮNG KẾT QUẢ ĐẠT ĐƯỢC 21

4.4 NHỮNG VẤN ĐỀ TỒN TẠI 21

4.5 HƯỚNG PHÁT TRIỂN 21

TÀI LIỆU THAM KHẢO 22

Trang 4

SVTH: Vũ Đức Nội Page: 4

Những kiến thức cơ bản cũng như nâng cao về hệ điều hành, nắm bắt được

nguyên tắc hoạt động Nguyên lý hệ điều hành là học phần rất quan trọng và bắt buộc đối với tất cả sinh viên chuyên ngành công nghệ thông tin Nguyên lý hệ điều hành cung cấp cho sinh viên động cơ bản của hệ điều hành trên máy tính

Hệ điều hành được xem là thành phần trung gian hay là cầu nối cho sự giao tiếp của người sử dụng và máy tính Thông qua hệ điều hành người sử dụng dễ dàng làm việc và khai thác hiệu quả thiết bị phần cứng máy tính, quản lý phần mềm ứng dụng Người sử dụng chỉ cần thao tác các lệnh, các sự kiện và chờ các tiến trình của hệ điều hành thực hiện

Với một Hệ điều hành có tiềm năng như thế, chúng ta phải có sự nghiên cứu, hiểu biết về nó, để có thể nắm bắt tốt về các khái niệm chuyên ngành về Hệ điều hành

Em xin cảm ơn sự hướng dẫn tận tình của thầy Phạm Minh Tuấn đã giúp em

hoàn thành đề tài này

Sinh viên thực hiện

Vũ Đức Nội

Trang 5

2 Phương pháp triển khai đề tài

- Tìm hiểu về phương pháp lập trình C trên Ubuntu

- Tìm hiểu về cách tạo thread

- Thiết kế xây dựng chương trình nhân 2 ma trận bằng multi thread

3 Kết cấu của đồ án

Đồ án gồm các phần:

- Cơ sở lý thuyết về lập trình đa luồng trong Ubuntu

- Thiết kế và xây dựng chương trình nhân hai ma trận bằng multi thread

- Kết quả thực hiện

Trang 6

Trên một bộ xử lý đơn, multi thread thường xảy ra bởi sự phân chia thời gian ghép (như trong multitasking): bộ xử lý chuyển giữa những thread khác nhau Ngữ cảnh chuyển thường xảy ra một cách thường xuyên đủ để người dùng nhận thấy được nhiều thread hoặc nhiệm vụ đang chạy tại cùng một thời điểm Trên một bộ đa

xử lý hoặc hệ thống nhiều nhân, những thread hoặc nhiệm vụ sẽ chạy cùng lúc, với mỗi một bộ xử lý hoặc nhân chạy một thread hoặc nhiệm vụ riêng

Nhiều hệ điều hành hiện đại hỗ trợ trực tiếp sự phân chia thời gian hoặc đa thread với một bộ lập lịch tiến trình Nhân của hệ điều hành cho phép người lập trình tính toán thread bằng các giao diện lời gọi hệ thống Một vài thể hiện được gọi

là thread nhân, trong khi một tiến trình nhẹ (lightweight process) là một kiểu xác định của thread nhân để chia sẻ trạng thái và thông tin

Chương trình có thể có thread không gian người dùng khi lập trình thread với thời gian, tín hiệu hoặc những phương thức khác để làm gián đoạn thực hiện riêng của họ để thực hiện một sắp xếp ad-hoc hoặc chia thời gian

2.2 Các khái niệm cơ bản về thread

2.2.1 Định nghĩa thread và multi thread

- Thread là luồng chạy trong một process Nó là dòng các điều khiển trong một process Nó được sử dụng để thực hiện các công việc cho process

- Threads cũng tương tự như processes, đều được phân chia thời gian bởi kernel Với hệ thống chỉ có một bộ vi xử lý thì kernel sử dụng cách phân

Trang 7

SVTH: Vũ Đức Nội Page: 7

chia thời gian để “làm cho” các threads như là chạy đồng thời theo cùng cách thức kernel thực hiện với processes Và với các hệ thống đa nhân thì các threads thực sự có thể chay đồng thời giống như là nhiều processes

- Thế thì tại sao multithread lại được ưa chuộng hơn là nhiều process độc lập đối với các task có mối quan hệ với nhau? Đó là bởi vì các threads sử dụng chung cùng một không gian bộ nhớ Mỗi thread độc lập đều có thể truy nhập vào cùng một biến toàn cục trong bộ nhớ Trong khi fork() cho phép tạo ra nhiều process nhưng rất khó khăn trong việc trao đổi thông tin giữa process với nhau vì mỗi process có một không gian vùng nhớ riêng Không

có một câu trả lời đơn giản cho việc trao đổi giữa các process (IPC) Do vậy mà multiprocess programming sẽ phải chịu 2 trở ngại lớn:

- Perforamance thấp vì khi tạo một process mới đòi hỏi kernel thực thi nhiều phép tính toán để cấp phát bộ nhớ

- Trong hầu hết các trường hợp thì IPC làm chương trình trở nên phức tạp hơn rất nhiều

- Hơn thế nữa, quá tải và sự phức tạp không phải là những thứ tốt Nếu bạn đã từng phải làm những thay đổi lớn cho một chương trình của bạn mà support IPC, sẽ rất tốt nếu sử dụng cách tiếp cận chia sẻ vùng nhớ đơn giản của threads Pthreads không cần phải những lời gọi expensive và phực tạp bởi

vì threads “sống cùng một ngôi nhà” Bạn không phải đẩy dữ liệu thông qua một file hoặc một vùng nhớ nào đó Chính vì lý do này mà bạn nên cân nhặc mô hình một process/nhiều threads hơn là nhiều process/một thread

- Như đã nói ở trên, tạo một thread nhanh hơn rất nhiều (từ 10 cho đến 100 lần) so với tạo một process Kernel không cần phải tạo một bản copy độc lập của không gian bộ nhớ hiện thời, bảng các mô tả file (file descriptors) Điều đó tiết kiệm rất nhiều thời gian của CPU

Trang 9

SVTH: Vũ Đức Nội Page: 9

2.2.2 Chia sẽ bộ nhớ trong pthreads

Tất cả thread đều có thể truy cập vào vùng nhớ chung đã được chia sẽ

Mỗi thread sẽ có dữ liệu riêng của nó

Công việc của các lập trình viên là đồng bộ hóa quyền truy cập vào các vùng nhớ dùng chung đã chia sẽ

Shared memory model

2.2.3 Tính an toàn của Threads

 Đề cập khả năng của một ứng dụng để thực hiện nhiều Thread cùng một lúc

mà không cần chia sẻ dữ liệu hoặc tạo ra các điều kiện để thực thi

Trang 10

SVTH: Vũ Đức Nội Page: 10

o Nếu thường không sử dụng đồng bộ xây dựng để ngăn chặn tham nhũng dữ

liệu, thì đó không phải là thread an toàn

+ Khó viết và khó kiểm soát lỗi

+ Các luồng trong một quá trình có thể bị chồng chéo dữ liệu

+ Việc tránh xung đột dữ liệu khá khó khăn

+ Khả năng đổ vỡ cao Vì các threads ở trong cùng một không gian bộ nhớ

nên nếu một thread đổ vỡ (crash) sẽ kéo theo toàn bộ process và các thread

khác bị terminate

Trang 11

SVTH: Vũ Đức Nội Page: 11

2.3 Lập trình multi thread trong hệ điều hành Ubuntu

2.3.1 Các thủ tục chính lập trình multi thread trong Ubuntu

Để sử dụng các thủ tục này ta cần phải khai báo thư viện #include <pthread.h> Các thủ tục bao gồm:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void

*(*start_routine)(void*), void *arg);

int pthread_join(pthread_t th,void **thread_return);

Ngoài ra ta còn có 1 số các thủ tục khác như:

void pthread_exit(void *retval);

int pthread_attr_init(pthread_attr_t *attr);

int pthread_attr_destroy(pthread_attr_t *attr);

2.3.2 Tạo thread

Ban đầu, chương trình main() bao gồm một thread đơn mặc định Tất cả những thread khác phải được tạo ra từ lập trình viên Hàm pthread_create tạo ra 1 thread mới và làm chúng được thực thi Thủ tục này được gọi số lần tùy ý và từ bất kỳ đâu trong code của bạn Các tham số trong thủ tục pthread_create:

Thread: một định danh duy nhất cho một thread mới và được trả về bởi thủ tục con

Attr: một đối tượng thuộc tính có thể được sử dụng để thiết lập các thuộc tính cho thread Bạn có thể xác định một đối tượng thuộc tính thread, hoặc để NULL với giá trị mặc định

Start_routine: thủ tục C để thread sẽ thực thi một lần khi nó được tạo ra

Arg: một tham số đơn để có thể được truyền cho start_routine Nó phải được truyền bởi tham chiếu như là con trỏ kiểu void

Mỗi một lần được tao ra, thread có thể tạo ra các thread khác Không có hệ thống cập bậc hoặc phụ thuộc giữa các thread

Nếu tạo 1 thread thành công thì hàm pthread_create sẽ trả về giá trị 0 Nếu không 1 giá trị lỗi sẽ được trả về để thông báo thread không được tạo thành công Sau khi tạo ra, các thread là cùng loại với nhau, và có thể tạo ra các thread khác Không có sự phân cấp hay phụ thuộc giữa các thread

Trang 12

SVTH: Vũ Đức Nội Page: 12

2.3.3 Hủy Thread

Có một vài cách mà trong đó Pthread bị hủy:

-Những thread mà trả về từ thủ tục bắt đầu của nó ( thủ tục chính với thread ban đầu)

-Những thread thực hiện lời gọi tới hàm pthread_exit

-Những thread bị hủy từ những thủ tục khác bằng hàm pthread_cancel

-Tiến trình cuối bị ngắt trong khi thực hiện lời gọi tới hàm khác hoặc thoát khỏi thủ tục con

Hàm pthread_exit được sử dụng để thoát khỏi một thread Thông thường, thủ tục pthread_exit() được gọi sau khi 1 thread đã hoàn thành công việc của nó và không còn yêu cầu nào Nếu hàm main() kết thúc trước khi những thread được tạo ra và thoát với hàm pthread_exit(), những thread khác vẫn tiếp tục được thực hiện Ngoài ra, chúng cũng sẽ tự động bị ngắt khi hàm main() kết thúc Người lập trình có thể tùy chọn chỉ định một trạng thái (status) ngắt, được lưu như một con trỏ kiểu void cho bất kỳ thread nào để có thể tham gia vào lời gọi thread Tóm lại: thủ tục pthead_exit() không phải để đóng file, bất kỳ file nào được mở bên trong thread, các fil

2.3.4 Truyền tham số cho thread

Thủ tục pthread_create() cho phép người lập trình có thể truyền một đối số cho thủ tục khởi tạo thread Tất cả các tham số đều phải được truyền bằng tham chiếu và kiểu (void *)

Ví dụ 1: truyền 1 tham số:

Trang 13

SVTH: Vũ Đức Nội Page: 13

int t = 5;

pthread_create(&thread, NULL, PrintHello,(void *) t);

Vấn đề đặt ra là nếu như ta muốn truyền 2 tham số cho thread thì phải làm như thế nào? Trong trường hợp có nhiều tham số cần truyền ta cần tạo ra 1 cấu trúc struct bao gồm tất cả các tham số, sau đó truyền 1 tham số con trỏ của struct này vào thủ tục pthread_create()

Ví dụ 2: Truyền nhiều tham số sử dụng struct

Các tham số của hàm pthread_join():

- Tham số đầu tiên của pthread_join() là thread_id, mythread

- Tham số thứ hai là một con trỏ trỏ vào một con trỏ void Nếu con trỏ void

Trang 14

SVTH: Vũ Đức Nội Page: 14

không phải là NULL, thì pthread_join sẽ đặt giá trị trả về của

thread_function (là một con trỏ void*) vào tham số thứ 2

Có 2 phương pháp đồng bộ khác là mutexes and condition variables

Trang 15

SVTH: Vũ Đức Nội Page: 15

CHƯƠNG TRÌNH

3.1 Phân tích yêu cầu

Bài toán đặt ra là nhân hai ma trận lớn bằng multi thread

Thuật toán nhân hai ma trận:

Phép nhân hai ma trận chỉ thực hiện được khi số cột của ma trận bên trái

bằng số dòng của ma trận bên phải Nếu ma trân A có kích thước m x n và ma trận

B có kích thước n x p, thì ma trận tích AB có kích thước m x p có phần tử đứng ở

hàng i, cột thứ j xác định bởi:

C[i][j] = A[i][1] * B[1][j] + A[i][2] * B[2][j] + … + A[i][n] * B[n][j]

VD:

Để thực hiện phép nhân hai ma trận bằng multi thread ta tiến hành tạo n thread mỗi

thread có nhiệm vụ nhân các giá trị thuộc hàng thứ i đến hàng thứ j

};

- Ngoài ra còn có biến kiểu pthread_t dùng để tạo các thread

Trang 16

SVTH: Vũ Đức Nội Page: 16

3.3 Xây dựng các chức năng

- Tạo hai chương trình con:

+ void *readFile(void *arg); // Để thực hiện việc đọc file

Tiến hành mở file bằng hàm fopen() và đọc file bằng hàm fscanf() để đọc dữ liệu vào ma trận

printf("Khong the doc file! Vui long kiem tra lai duong dan\n");

} else { int i,j;

fscanf(file,"%d",&temp->n);

fscanf(file,"%d",&temp->m);

temp->A = (int**)malloc(temp->n * sizeof(int*));

for (i = 0;i < temp->n;i++) temp->A[i] = (int*)malloc(temp->m * sizeof(int));

for (i = 0;i < temp->n;i++) for (j = 0;j < temp->m;j++) fscanf(file,"%d",&temp-

>A[i][j]);

}

Trang 17

SVTH: Vũ Đức Nội Page: 17

}

+ void *multi(void *arg);// Để nhân 2 ma trận

Tiến hành nhân 2 ma trận từ hàng from đến to của ma trận A

Với:

from = (i *fileA.n) / num_thrd

to = ((i + 1) * fileA.n) / num_thrd

Trang 18

SVTH: Vũ Đức Nội Page: 18

QUẢ

4.1 Môi trường triển khai

Chương trình được triển khai trên hệ điều hành Ubuntu Chương trình được viết trên IDE Code Block và được viết bằng ngôn ngữ C

struct matrix fileA;

struct matrix fileB;

struct matrix fileC;

void *readFile(void *arg);

void *multi(void *arg);

strcpy(fileB.link,"/home/DucNoi/Desktop/Doan/matranB.txt ");

// thread thu 1 doc ma tran A

Trang 19

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

pthread_join (thread[i], NULL);

// Ghi ket qua vao file ketqua.txt

FILE *file;

file =

fopen("/home/Ducnoi/Desktop/Doan/ketqua.txt","w"); fprintf(file,"%d %d\n",fileC.n,fileC.m);

for (i = 0;i <fileC.n;i++)

Trang 20

}

}

pthread_exit(NULL);

}

Trang 21

SVTH: Vũ Đức Nội Page: 21

TRIỂN

5.1 Những kết quả đạt được

Sau một thời gian nghiên cứu và tìm hiểu tài liệu, đề tài đã thành công trong

việc nhân hai ma trận với kích thước lớn

5.2 Những vấn đề tồn tại

- Chưa có giao diện

- Chưa xây dựng chức năng để người sử dụng dẫn nguồn đến file ma trận cần

thực hiện phép nhân

5.3 Hướng phát triển

Từ những thiếu sót trên, nếu có điều kiện phát triển sẽ nghiên cứu thêm để

chương trình được hoàn chỉnh và đẹp mắt

Trên đây là phần trình bày của em về đề tài: “Ứng dụng multi thread trong hệ điều hành Ubuntu để nhân hai ma trận lớn” Trong quá trình thực hiện đề tài, dù đã rất cố gắng, nhưng do trình độ kiến thức còn nhiều hạn chế, nên không tránh khỏi những thiếu sót trong bài làm Em mong nhận được những đóng góp ý kiến của thầy, cô để đề tài được hoàn thiện hơn

Trang 22

SVTH: Vũ Đức Nội Page: 22

TÀI LIỆU THAM KHẢO

[1] Jacque Arsac Nhập môn lập trình Nguyên bản : Premières lecons de

programmation Trung tâm hệ thống Thông tin ISC, Hà nội 1991, 241 t

[2] Doug Cooper Standard Pascal User Reference Manual W.W.Norton &

Company, 1983, 476 t

[3] Neil Matthew and Richard Stones Beginning Linux Programming

-END -

Ngày đăng: 01/02/2016, 10:15

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w