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

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 chế multi thread để giải toán nhân hai ma trận lớn Sinh viên : Vũ Đức Nội Lớp : 11T3 Cán hướng dẫn : Phạm Minh Tuấn Đà Nẵng 12/2014 Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn LỜI NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN SVTH: Vũ Đức Nội Page: Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn MỤC LỤC CHƯƠNG LỜI NÓI ĐẦU TỔNG QUAN VỀ ĐỀ TÀI .5 CHƯƠNG CƠ SỞ LÝ THUYẾT 2.1 GIỚI THIỆU 2.2 CÁC KHÁI NIỆM CƠ BẢN VỀ THREAD .6 2.2.1 Định nghĩa thread multi thread 2.2.2 Chia nhớ pthreads 2.2.3 Tính an toàn Threads .9 2.2.4 Ưu khuyết điểm 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 lập trình multi thread 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 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 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 SVTH: Vũ Đức Nội Page: Đồ án: Nguyên Lý Hệ Điều Hành Chương GVHD: Phạm Minh Tuấn LỜI NÓI ĐẦU Những kiến thức nâng cao hệ điều hành, nắm bắt nguyên tắc hoạt động Nguyên lý hệ điều hành học phần quan trọng bắt buộc tất 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 hệ điều hành máy tính Hệ điều hành xem thành phần trung gian cầu nối cho giao tiếp người sử dụng máy tính Thông qua hệ điều hành người sử dụng dễ dàng làm việc khai thác hiệu 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 cần thao tác lệnh, kiện chờ tiến trình hệ điều hành thực Với Hệ điều hành có tiềm thế, phải có nghiên cứu, hiểu biết nó, để nắm bắt tốt khái niệm chuyên ngành Hệ điều hành Em xin cảm ơn hướng dẫn tận tình thầy Phạm Minh Tuấn giúp em hoàn thành đề tài Sinh viên thực Vũ Đức Nội SVTH: Vũ Đức Nội Page: Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn TỔNG QUAN VỀ ĐỀ TÀI Tên đề tài Ứng dụng chế multi thread hệ điều hành đề giải toán nhân hai ma trận lớn hệ điều hành Ubuntu Phương pháp triển khai đề tài - Tìm hiểu phương pháp lập trình C Ubuntu - Tìm hiểu cách tạo thread - Thiết kế xây dựng chương trình nhân ma trận multi thread Kết cấu đồ án Đồ án gồm phần: - Cơ sở lý thuyết lập trình đa luồng Ubuntu - Thiết kế xây dựng chương trình nhân hai ma trận multi thread - Kết thực SVTH: Vũ Đức Nội Page: Đồ án: Nguyên Lý Hệ Điều Hành Chương GVHD: Phạm Minh Tuấn CƠ SỞ LÝ THUYẾT 2.1 Giới thiệu Trong khoa học máy tính, chuỗi tính toán kết từ fork chương trình máy tính chia thành hai nhiều nhiệm vụ chạy đồng thời Sự thể thread tiến trình (process) khác hệ điều hành, hầu hết trường hợp, thread nằm bên tiến trình Nhiều thread tồn tiến trình chia sẻ tài nguyên nhớ, tiến trình khác không chia sẻ tài nguyên Trên xử lý đơn, multi thread thường xảy phân chia thời gian ghép (như multitasking): xử lý chuyển thread khác Ngữ cảnh chuyển thường xảy cách thường xuyên đủ để người dùng nhận thấy nhiều thread nhiệm vụ chạy thời điểm Trên đa xử lý hệ thống nhiều nhân, thread nhiệm vụ chạy lúc, với xử lý nhân chạy thread nhiệm vụ riêng Nhiều hệ điều hành đại hỗ trợ trực tiếp phân chia thời gian đa thread với lập lịch tiến trình Nhân hệ điều hành cho phép người lập trình tính toán thread giao diện lời gọi hệ thống Một vài thể gọi thread nhân, tiến trình nhẹ (lightweight process) kiểu xác định thread nhân để chia sẻ trạng thái thông tin Chương trình có thread không gian người dùng lập trình thread với thời gian, tín hiệu phương thức khác để làm gián đoạn thực riêng họ để thực xếp ad-hoc chia thời gian 2.2 Các khái niệm thread 2.2.1 Định nghĩa thread multi thread - Thread luồng chạy process Nó dòng điều khiển process Nó sử dụng để thực công việc cho process - Threads tương tự processes, phân chia thời gian kernel Với hệ thống có vi xử lý kernel sử dụng cách phân SVTH: Vũ Đức Nội Page: Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn chia thời gian để “làm cho” threads chạy đồng thời theo cách thức kernel thực với processes Và với hệ thống đa nhân threads thực chay đồng thời giống nhiều processes - Thế multithread lại ưa chuộng nhiều process độc lập task có mối quan hệ với nhau? Đó threads sử dụng chung không gian nhớ Mỗi thread độc lập truy nhập vào biến toàn cục nhớ Trong fork() cho phép tạo nhiều process khó khăn việc trao đổi thông tin process với process có không gian vùng nhớ riêng Không có câu trả lời đơn giản cho việc trao đổi process (IPC) Do mà multiprocess programming phải chịu trở ngại lớn: - Perforamance thấp tạo process đòi hỏi kernel thực thi nhiều phép tính toán để cấp phát nhớ - Trong hầu hết trường hợp IPC làm chương trình trở nên phức tạp nhiều - Hơn nữa, tải phức tạp thứ tốt Nếu bạn phải làm thay đổi lớn cho chương trình bạn mà support IPC, tốt sử dụng cách tiếp cận chia sẻ vùng nhớ đơn giản threads Pthreads không cần phải lời gọi expensive phực tạp threads “sống nhà” Bạn đẩy liệu thông qua file vùng nhớ Chính lý mà bạn nên cân nhặc mô hình process/nhiều threads nhiều process/một thread - Như nói trên, tạo thread nhanh nhiều (từ 10 100 lần) so với tạo process Kernel không cần phải tạo copy độc lập không gian nhớ thời, bảng mô tả file (file descriptors) Điều tiết kiệm nhiều thời gian CPU SVTH: Vũ Đức Nội Page: Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn - Multi thread process tách thành nhiều luồng khác để thực nhiệm vụ khác lúc VD: Khi ta nghe nhạc youtube trình ứng dụng phân thành nhiều luồng Một luồng thực thi công việc load nhạc internet, luồng thực thi công việc phát nhạc - Giống process thread có nhiều trạng thái như: running, blocked, ready terminated - Mỗi thread có stack riêng Mỗi stack chứa frame cho thủ tục gọi tới Các frame chứa biến cục thủ tục trả địa để sử dụng thủ tục gọi hoàn tất SVTH: Vũ Đức Nội Page: Đồ án: Nguyên Lý Hệ Điều Hành 2.2.2 GVHD: Phạm Minh Tuấn Chia nhớ pthreads Tất thread truy cập vào vùng nhớ chung chia Mỗi thread có liệu riêng Công việc lập trình viên đồng hóa quyền truy cập vào vùng nhớ dùng chung chia Shared memory model 2.2.3 Tính an toàn Threads  Đề cập khả ứng dụng để thực nhiều Thread lúc mà không cần chia sẻ liệu tạo điều kiện để thực thi  Ví dụ: o ứng dụng tạo vài Thread, số thường xuyên gọi đến thư viện: o Thư viện thường xuyên truy cập / sửa đổi cấu trúc chung vị trí nhớ o Mỗi thread gọi thường xuyên cố gắng sửa đổi vị trí cấu trúc / nhớ chung lúc SVTH: Vũ Đức Nội Page: Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn o Nếu thường không sử dụng đồng xây dựng để ngăn chặn tham nhũng liệu, thread an toàn Thread unsafe 2.2.4 Ưu khuyết điểm chế multi thread - Ưu điểm: + Thời gian xử lý nhanh giải toán lớn + Rất cần thiết số trình ứng dụng - Khuyết điểm: + Khó viết khó kiểm soát lỗi + Các luồng trình bị chồng chéo liệu + Việc tránh xung đột liệu khó khăn + Khả đổ vỡ cao Vì threads không gian nhớ nên thread đổ vỡ (crash) kéo theo toàn process thread khác bị terminate SVTH: Vũ Đức Nội Page: 10 Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn 2.3 Lập trình multi thread hệ điều hành Ubuntu 2.3.1 Các thủ tục lập trình multi thread Ubuntu Để sử dụng thủ tục ta cần phải khai báo thư viện #include Các thủ tục bao gồm: int pthread_create(pthread_t *thread, const *(*start_routine)(void*), void *arg); pthread_attr_t *attr, void int pthread_join(pthread_t th,void **thread_return); Ngoài ta có số 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 thread đơn mặc định Tất thread khác phải tạo từ lập trình viên Hàm pthread_create tạo thread làm chúng thực thi Thủ tục gọi số lần tùy ý từ đâu code bạn Các tham số thủ tục pthread_create: Thread: định danh cho thread trả thủ tục Attr: đối tượng thuộc tính sử dụng để thiết lập thuộc tính cho thread Bạn xác định đối tượng thuộc tính thread, để NULL với giá trị mặc định Start_routine: thủ tục C để thread thực thi lần tạo Arg: tham số đơn để truyền cho start_routine Nó phải truyền tham chiếu trỏ kiểu void Mỗi lần tao ra, thread tạo thread khác Không có hệ thống cập bậc phụ thuộc thread Nếu tạo thread thành công hàm pthread_create trả giá trị Nếu không giá trị lỗi trả để thông báo thread không tạo thành công Sau tạo ra, thread loại với nhau, tạo thread khác Không có phân cấp hay phụ thuộc thread SVTH: Vũ Đức Nội Page: 11 Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn 2.3.3 Hủy Thread Có vài cách mà Pthread bị hủy: -Những thread mà trả từ thủ tục bắt đầu ( thủ tục với thread ban đầu) -Những thread thực lời gọi tới hàm pthread_exit -Những thread bị hủy từ thủ tục khác hàm pthread_cancel -Tiến trình cuối bị ngắt thực lời gọi tới hàm khác thoát khỏi thủ tục Hàm pthread_exit sử dụng để thoát khỏi thread Thông thường, thủ tục pthread_exit() gọi sau thread hoàn thành công việc không yêu cầu Nếu hàm main() kết thúc trước thread tạo thoát với hàm pthread_exit(), thread khác tiếp tục thực Ngoài ra, chúng tự động bị ngắt hàm main() kết thúc Người lập trình tùy chọn định trạng thái (status) ngắt, lưu trỏ kiểu void cho thread để tham gia vào lời gọi thread Tóm lại: thủ tục pthead_exit() để đóng file, file mở bên thread, fil 2.3.4 Truyền tham số cho thread Thủ tục pthread_create() cho phép người lập trình truyền đối số cho thủ tục khởi tạo thread Tất tham số phải truyền tham chiếu kiểu (void *) Ví dụ 1: truyền tham số: SVTH: Vũ Đức Nội Page: 12 Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn int t = 5; pthread_create(&thread, NULL, PrintHello,(void *) t); Vấn đề đặt ta muốn truyền tham số cho thread phải làm nào? Trong trường hợp có nhiều tham số cần truyền ta cần tạo cấu trúc struct bao gồm tất tham số, sau truyền tham số trỏ struct vào thủ tục pthread_create() Ví dụ 2: Truyền nhiều tham số sử dụng struct struct thread_data { int data1; int data2; … int data; }data; pthread_create(&thread, NULL, PrintHello,(void *) &data); 2.3.5 Nối thread Nối (joining) cách để thực việc đồng hóa thread Ví dụ: Hàm sử dụng thread chạy chờ thread để lấy kết Vd: Trong hàm main, thread main chạy Khi sử dụng pthread_join(tên thread cần chờ,giá trị trả thread chờ) hàm main dừng lại thread cần chờ kết thúc Các tham số hàm pthread_join(): - Tham số pthread_join() thread_id, mythread - Tham số thứ hai trỏ trỏ vào trỏ void Nếu trỏ void SVTH: Vũ Đức Nội Page: 13 Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn NULL, pthread_join đặt giá trị trả thread_function (là trỏ void*) vào tham số thứ Có phương pháp đồng khác mutexes and condition variables SVTH: Vũ Đức Nội Page: 14 Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn Chương THIẾT KẾ VÀ XÂY DỰNG CHƯƠNG TRÌNH 3.1 Phân tích yêu cầu Bài toán đặt nhân hai ma trận lớn multi thread Thuật toán nhân hai ma trận: Phép nhân hai ma trận thực số cột ma trận bên trái số dòng ma trận bên phải Nếu ma trân A có kích thước m x n ma trận B có kích thước n x p, 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 phép nhân hai ma trận multi thread ta tiến hành tạo n thread thread có nhiệm vụ nhân giá trị thuộc hàng thứ i đến hàng thứ j 3.2 Tổ chức CSDL - Mỗi ma trận có dạng struct: struct matrix { char link[50]; // đường link chứa file int n; // số hàng int m; // số cột int **A; }; - Ngoài có biến kiểu pthread_t dùng để tạo thread SVTH: Vũ Đức Nội Page: 15 Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn 3.3 Xây dựng chức - Tạo hai chương trình con: + void *readFile(void *arg); // Để thực việc đọc file Tiến hành mở file hàm fopen() đọc file hàm fscanf() để đọc liệu vào ma trận Code: void *readFile(void *arg) { struct matrix *temp = (struct matrix*) arg; FILE *file; file = fopen(temp->link,"r"); if (file == NULL) { 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]); } SVTH: Vũ Đức Nội Page: 16 Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn } + void *multi(void *arg);// Để nhân ma trận Tiến hành nhân ma trận từ hàng from đến to ma trận A Với: from = (i *fileA.n) / num_thrd to = ((i + 1) * fileA.n) / num_thrd i số thread num_thrd số thread dùng phép nhân Code: void *multi(void *arg) { int s = (int)arg; int from = (s * fileA.n)/num_thrd; int to = ((s+1) * fileA.n)/num_thrd; int i,j,k; int temp = 0; for (i = from; i < to; i++) { for (j = 0; j < fileB.m; j++) { fileC.A[i][j] = 0; for ( k = 0; k < fileA.m; k++) fileC.A[i][j] += fileA.A[i][k] * fileB.A[k][j]; } } pthread_exit(NULL); } SVTH: Vũ Đức Nội Page: 17 Đồ án: Nguyên Lý Hệ Điều Hành Chương QUẢ GVHD: Phạm Minh Tuấn TRIỂN KHAI VÀ ĐÁNH GIÁ KẾT 4.1 Môi trường triển khai Chương trình triển khai hệ điều hành Ubuntu Chương trình viết IDE Code Block viết ngôn ngữ C 4.2 Code chương trình #include #include #include #include struct matrix { char link[50]; int n; // so hang int m; // so cot int **A; }; int num_thrd = 20; struct matrix fileA; struct matrix fileB; struct matrix fileC; void *readFile(void *arg); void *multi(void *arg); int main() { int i,j; pthread_t readFileA,readFileB; strcpy(fileA.link,"/home/DucNoi/Desktop/Doan/matranA txt"); strcpy(fileB.link,"/home/DucNoi/Desktop/Doan/matranB txt "); // thread thu doc ma tran A pthread_create(&readFileA, NULL,readFile,(void *)&fileA); // thread thu doc ma tran B pthread_create(&readFileB, NULL,readFile,(void *)&fileB); // Doi den thread doc xong file pthread_join(readFileA,NULL); pthread_join(readFileB,NULL); SVTH: Vũ Đức Nội Page: 18 Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn // Kiem tra xem ma tran A co the nhan voi ma tran B khong if (fileA.m != fileB.n) { // Ma tran A khong the nhan voi ma tran B printf("Hai ma tran khong the nhan voi nhau!\n"); return(0); } // Ma tran A co the nhan voi ma tran B; fileC.n = fileA.n; fileC.m = fileB.m; fileC.A = (int**)malloc((fileC.n + 100)* sizeof(int*)); for (i = 0;i < fileC.n;i++) fileC.A[i] = (int*)malloc(fileC.m * sizeof(int)); pthread_t *thread; thread = (pthread_t*) malloc(num_thrd * sizeof(pthread_t)); for(i = 0;i < num_thrd;i++) { if (pthread_create (&thread[i], NULL, multi, (void*)i) != 0) { perror("Can't create thread"); free(thread); exit(-1); } } 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 link,"r"); if (file == NULL) { 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]); } } void *multi(void *arg) { int s = (int)arg; int from = (s * fileA.n)/num_thrd; int to = ((s+1) * fileA.n)/num_thrd; int i,j,k; int temp = 0; for (i = from; i < to; i++) { for (j = 0; j < fileB.m; j++) { fileC.A[i][j] = 0; for ( k = 0; k < fileA.m; k++) fileC.A[i][j] += fileA.A[i][k] * fileB.A[k][j]; } } pthread_exit(NULL); } SVTH: Vũ Đức Nội Page: 20 Đồ án: Nguyên Lý Hệ Điều Hành Chương TRIỂN GVHD: Phạm Minh Tuấn KẾT LUẬN VÀ HƯỚNG PHÁT 5.1 Những kết đạt Sau thời gian nghiên cứu tìm hiểu tài liệu, đề tài thành công việc nhân hai ma trận với kích thước lớn 5.2 Những vấn đề tồn - Chưa có giao diện - Chưa xây dựng chức để người sử dụng dẫn nguồn đến file ma trận cần thực phép nhân 5.3 Hướng phát triển Từ thiếu sót trên, có điều kiện phát triển nghiên cứu thêm để chương trình hoàn chỉnh đẹp mắt Trên phần trình bày em đề tài: “Ứng dụng multi thread hệ điều hành Ubuntu để nhân hai ma trận lớn” Trong trình thực đề tài, dù cố gắng, trình độ kiến thức nhiều hạn chế, nên không tránh khỏi thiếu sót làm Em mong nhận đóng góp ý kiến thầy, cô để đề tài hoàn thiện SVTH: Vũ Đức Nội Page: 21 Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn TÀI LIỆU THAM KHẢO [1] Jacque Arsac Nhập môn lập trình Nguyê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 - SVTH: Vũ Đức Nội Page: 22 [...]... XÂY DỰNG 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]... }data; pthread_create( &thread, NULL, PrintHello,(void *) &data); 2.3.5 Nối thread Nối (joining) là 1 cách để thực hiện việc đồng bộ hóa giữa các thread Ví dụ: Hàm này được sử dụng khi 1 thread đang chạy và chờ 1 thread nào đó để lấy kết quả Vd: Trong hàm main, thread main đang chạy Khi sử dụng pthread_join(tên thread cần chờ,giá trị trả về của thread đang chờ) thì hàm main sẽ dừng lại cho đến khi thread. .. 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 3.2 Tổ chức CSDL - Mỗi ma trận đều có dạng struct: struct matrix { char link[50]; // đường link chứa file int n; // số hàng int m; // số cột int **A; }; - Ngoài ra còn có biến kiểu pthread_t dùng để tạo các thread SVTH: Vũ Đức Nội... Phạm Minh Tuấn 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 Các thủ tục bao gồm: int pthread_create(pthread_t *thread, const *(*start_routine)(void*), void *arg); pthread_attr_t *attr, void int pthread_join(pthread_t th,void * *thread_ return); Ngoài ra ta còn... (int**)malloc((fileC.n + 100)* sizeof(int*)); for (i = 0;i < fileC.n;i++) fileC.A[i] = (int*)malloc(fileC.m * sizeof(int)); pthread_t *thread; thread = (pthread_t*) malloc(num_thrd * sizeof(pthread_t)); for(i = 0;i < num_thrd;i++) { if (pthread_create ( &thread[ i], NULL, multi, (void*)i) != 0) { perror("Can't create thread" ); free (thread) ; exit(-1); } } for (i = 0; i < num_thrd; i++) pthread_join (thread[ i],... 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ệ... matrix fileB; struct matrix fileC; void *readFile(void *arg); void *multi( void *arg); int main() { int i,j; pthread_t readFileA,readFileB; strcpy(fileA.link,"/home/DucNoi/Desktop/Doan/matranA txt"); strcpy(fileB.link,"/home/DucNoi/Desktop/Doan/matranB txt "); // thread thu 1 doc ma tran A pthread_create(&readFileA, NULL,readFile,(void *)&fileA); // thread thu 2 doc ma tran B pthread_create(&readFileB,... 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. .. 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]); } SVTH: Vũ Đức Nội Page: 16 Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn } + 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:... den khi 2 thread doc xong file pthread_join(readFileA,NULL); pthread_join(readFileB,NULL); SVTH: Vũ Đức Nội Page: 18 Đồ án: Nguyên Lý Hệ Điều Hành GVHD: Phạm Minh Tuấn // Kiem tra xem ma tran A co the nhan voi ma tran B khong if (fileA.m != fileB.n) { // Ma tran A khong the nhan voi ma tran B printf( "Hai ma tran nay khong the nhan voi nhau!\n"); return(0); } // Ma tran A co the nhan voi ma tran B; ... cầu Bài toán đặt nhân hai ma trận lớn multi thread Thuật toán nhân hai ma trận: Phép nhân hai ma trận thực số cột ma trận bên trái số dòng ma trận bên phải Nếu ma trân A có kích thước m x n ma trận. .. tài Ứng dụng chế multi thread hệ điều hành đề giải toán nhân hai ma trận lớn hệ điều hành Ubuntu Phương pháp triển khai đề tài - Tìm hiểu phương pháp lập trình C Ubuntu - Tìm hiểu cách tạo thread. .. 2.3.5 Nối thread Nối (joining) cách để thực việc đồng hóa thread Ví dụ: Hàm sử dụng thread chạy chờ thread để lấy kết Vd: Trong hàm main, thread main chạy Khi sử dụng pthread_join(tên thread cần

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