Bài giảng Lập trình hướng đối tượng: Chương 9 - Lập trình song song bằng C# cung cấp cho các bạn những kiến thức về tổng quát lập trình song song, lập trình multi-process bằng class Process, lập trình multi-thread bằng class Thread, demo tính hiệu quả của multi-thread và một số kiến thức khác.
Chương Lập trình song song C# 9.0 Dẫn nhập 9.1 Tổng quát lập trình song song 9.2 Lập trình multi-process class Process 9.3 Lập trình multi-thread class Thread 9.4 Demo tính hiệu multi-thread 9.5 Demo vấn ₫ề tương tranh thread ₫ồng thời 9.6 Demo việc giải tương tranh thread 9.7 Kết chương Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 9.0 Dẫn nhập Chương giới thiệu ₫ối tượng phục vụ ghi/₫ọc liệu ra/vào file tác vụ ghi/₫ọc liệu cổ ₫iển ra/vào file Chương giới thiệu ₫ối tượng phục vụ ghi/₫ọc hệ thống ₫ối tượng ra/vào file tác vụ ghi/₫ọc hệ thống ₫ối tượng có mối quan hệ tham khảo phức tạp ra/vào file Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 9.1 Tổng quát lập trình song song Thường ₫ể giải tốn ₫ó, ta thường dùng giải thuật nhờ tính dễ hiểu, dễ kiểm sốt Chương trình dùng thuật giải chạy trở thành process mono-thread hay process Process hoạt ₫ộng khơng hiệu khơng lợi dụng triệt ₫ể ₫ược CPU xử lý máy tính vật lý Lưu ý máy PC, smartphone hay tablet ₫ều dùng CPU ₫a nhân Thí dụ galaxy S4 thị trường Việt Nam có nhân Để máy giải toán hiệu hơn, ta nên dùng thuật toán song song cách nhận dạng hoạt ₫ộng thực ₫ồng thời nhờ nhiều CPU thực chúng ₫ồng thời Một phương pháp thực thuật toán song song lập trình multi-process multi-thread Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 9.2 Lập trình multi-process class Process Mơi trường Net cung cấp class tên Process ₫ể giúp ta lập trình multi-process dễ dàng Class Process thuộc namespace System.Diagnostics, chứa thuộc tính tác vụ giúp ta quản lý process dễ dàng, thuận lợi Thí dụ thuộc tính StartInfo ₫ối tượng gồm nhiều thuộc tính xác ₫ịnh thơng tin ₫ể kích hoạt ứng dụng xác ₫ịnh : Process myProcess = new Process(); myProcess.StartInfo.UseShellExecute = false; myProcess.StartInfo.FileName = txtPath.Text; myProcess.StartInfo.CreateNoWindow = true; … Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 9.2 Lập trình multi-process class Process Sau thiết lập ₫ầy ₫ủ thông tin ₫ể khởi tạo process, ta gọi tác vụ Start ₫ể kích hoạt chạy : myProcess.Start(); Sau ₫ược kích hoạt, process chạy song hành ₫ộc lập với process kích hoạt cho ₫ến kết thúc theo thuật giải Tuy nhiên, từ bên ngồi ta giết process nhờ tác vụ Kill : myProcess.Kill(); Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 9.2 Lập trình multi-process class Process Ta thử viết ứng dụng quản lý process ₫ơn giản có form giao diện sau : Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 9.3 Lập trình multi-threads class Thread Môi trường Net cung cấp class tên Thread ₫ể giúp ta lập trình multi-thread dễ dàng Class Thread thuộc namespace System.Threading, chứa thuộc tính tác vụ giúp ta quản lý thread dễ dàng, thuận lợi Thường thread chạy ₫oạn code ₫ược miêu tả hàm chức xác ₫ịnh Thí dụ process ₫ược kích hoạt, HĐH tạo tường minh thread ban ₫ấu cho process ₫ó, thread chạy ₫oạn code hàm Main class ứng dụng Để tạo thread mới, ta dùng lệnh : Thread t = new Thread (new ParameterizedThreadStart(tenhamcanchay)); Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 9.3 Lập trình multi-threads class Thread Để kích hoạt chạy thread, ta gọi tác vụ Start : t.Start (new Params(danhsachthamso)); với Params class ₫ối tượng chứa thông số mà ta muốn truyền/nhận cho thread Lưu ý tác vụ mà thread chạy phải ₫ược ₫ặc tả với tham số hình thức kiểu object : void TinhTich (object obj) { //tác vụ mà thread chạy Params p = (Params)obj; //ép kiểu tham số kiểu mong muốn } Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 9.3 Lập trình multi-threads class Thread Để tạm dừng thread, ta gọi tác vụ Suspend : t.Suspend(); Để chạy tiếp thread, ta gọi tác vụ Resume : t.Resume(); Để dừng xóa thread, ta gọi tác vụ Abort : t.Abort(); Để thay ₫ổi quyền ưu tiên thread, ta thực lệnh gán : t.Priority = ThreadPriority.Normal; Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 9.3 Lập trình multi-threads class Thread Trên Windows, process cấp quyền ưu tiên sau ₫ây : IDLE_PRIORITY_CLASS BELOW_NORMAL_PRIORITY_CLASS NORMAL_PRIORITY_CLASS ABOVE_NORMAL_PRIORITY_CLASS HIGH_PRIORITY_CLASS REALTIME_PRIORITY_CLASS Cấp quyền ưu tiên process ₫ịnh thread process ₫ó chạy theo quyền ưu tiên Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 10 9.3 Lập trình multi-threads class Thread Trên Windows, thread process cấp quyền ưu tiên sau ₫ây : THREAD_PRIORITY_IDLE THREAD_PRIORITY_LOWEST THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_TIME_CRITICAL Cấp quyền ưu tiên process ₫ịnh thread với cấp quyền ưu tiên ₫ây ₫ược xử lý Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 11 9.3 Lập trình multi-threads class Thread Process priority class IDLE_PRIORITY_CLASS Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Thread priority level THREAD_PRIORITY_IDLE THREAD_PRIORITY_LOWEST THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_TIME_CRITICAL Base priority 15 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 12 9.3 Lập trình multi-threads class Thread Process priority class BELOW_NORMAL_PRIORITY_CLASS Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Thread priority level THREAD_PRIORITY_IDLE THREAD_PRIORITY_LOWEST THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_TIME_CRITICAL Base priority 15 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 13 9.3 Lập trình multi-threads class Thread Process priority class NORMAL_PRIORITY_CLASS Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Thread priority level THREAD_PRIORITY_IDLE THREAD_PRIORITY_LOWEST THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_TIME_CRITICAL Base priority 10 15 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 14 9.3 Lập trình multi-threads class Thread Process priority class ABOVE_NORMAL_PRIORITY_CLASS Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Thread priority level THREAD_PRIORITY_IDLE THREAD_PRIORITY_LOWEST THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_TIME_CRITICAL Base priority 10 11 12 15 Môn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 15 9.3 Lập trình multi-threads class Thread Process priority class HIGH_PRIORITY_CLASS Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Thread priority level THREAD_PRIORITY_IDLE THREAD_PRIORITY_LOWEST THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_TIME_CRITICAL Base priority 11 12 13 14 15 15 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 16 9.3 Lập trình multi-threads class Thread Process priority class REALTIME_PRIORITY_CLASS Thread priority level THREAD_PRIORITY_IDLE THREAD_PRIORITY_LOWEST THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_TIME_CRITICAL Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Base priority 16 22 23 24 25 26 31 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 17 9.4 Demo tính hiệu multi-thread Để demo tính hiệu lập trình multi-thread máy tính ₫a nhân, ta thử viết ứng dụng tính tích ma trận có kích thước lớn (thí dụ 2000*2000) Ta thiết kế form ứng dụng sau : Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 18 9.4 Demo tính hiệu multi-thread Ứng dụng cho phép người dùng nhập số thread cần dùng (n), chia ma trận tích thành N/n nhóm hàng tạo thread ₫ể tính dùm nhóm hàng Sau tính ma trận tích xong, ứng dụng hiển thị cho người dùng thấy thời gian tính tốn ₫ể người dùng ₫ánh giá ₫ộ hiệu Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 19 9.4 Demo tính hiệu multi-thread void TinhTich (object obj) { DateTime t1 = DateTime.Now; //ghi nhận thời ₫iểm bắt ₫ầu chạy Params p = (Params)obj; //ép kiểu tham số ₫ối tượng cần dùng int h, c, k; for (h = p.sr; h < p.er; h++) //lặp theo hàng for (c = 0; c < N; c++) { //lặp theo cột double s = 0; for (k = 0; k < N; k++) s = s + A[h, k] * B[k, c]; C[h, c] = s; } stateLst[p.id] = 1; //ghi nhận trạng thái hồn thành dateLst[p.id] = DateTime.Now.Subtract(t1);//tính thời gian chạy } Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 20 9.5 Demo vấn ₫ề tương tranh thread Để demo vấn ₫ề tương tranh thread, ta thử viết ứng dụng quản lý thread với giao diện sau : Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 21 9.5 Demo vấn ₫ề tương tranh thread Form ma trận gồm nhiều cell, cell chứa ₫ược icon ảnh cho thread ₫ang chạy Lúc ₫ầu, chưa có thread chạy hết Người dùng ấn phím ₫ể quản lý thread sau : Ấn phím từ A-Z ₫ể kích hoạt chạy thread có tên tương ứng Ấn phím Ctrl-Alt-X ₫ể tạm dừng chạy thread X Ấn phím Alt-X ₫ể chạy tiếp thread X Ấn phím Shift-X ₫ể tăng ₫ộ ưu tiên chạy cho thread X Ấn phím Ctrl-X ₫ể giảm ₫ộ ưu tiên chạy cho thread X Ấn phím Ctrl-Shift-X ₫ể dừng thoát thread X Để cho thấy hành vi hoạt ₫ộng thread, hoạt ₫ộng thread hiển thị icon miêu tả lên form, icon chạy theo phương xác ₫ịnh, ₫ụng thành form dội lại theo nguyên lý vật lý Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 22 9.5 Demo vấn ₫ề tương tranh thread Quan sát quỹ ₫ạo chạy icon miêu tả thread ta thấy có tượng icon thread ₫è icon thread khác Đây tượng lỗi không mong muốn thread ₫ược quyền tự chiếm dụng cell hiển thị form Ta dùng thuật ngữ “tương tranh” thread tài nguyên dùng chung (các cell form) Cần có biện pháp quản lý tương tranh cho thread không ₫ược quyền truy xuất tài nguyên dùng chung ₫ồng thời Hiện ta dùng phương pháp loại trừ tương hỗ ₫ể giải vấn ₫ề Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 23 Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 9.6 Demo việc giải tương tranh thread Mỗi lần muốn vào vùng CS, ta phải gọi hàm In_Control() ₫ể kiếm sốt việc thi hành vùng CS, hồn thành vùng CS, ta phải gọi hàm Out_Control() ₫ể thông báo cho thread khác ₫ang chờ ₫ể chúng kiểm tra lại việc ₫i vào Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 In_Control(); Vùng CS truy xuất tài nguyên dùng chung Out_Control(); Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 24 9.6 Demo việc giải tương tranh thread Phương pháp loại trừ tương hỗ phổ dụng dùng semaphore nhị phân (Mutex) Semaphore ₫ối tượng ₫ơn giản chứa : thuộc tính kiểu nguyên dương (s), ta cịn gọi biến semaphore Tác vụ down(), có nhiệm vụ giảm s ₫ơn vị ln phải hồn thành Do ₫ó trường hợp s = 0, tác vụ down phải ngủ chờ ₫ến s cố gắng thực lại… Ỵ Thời gian thi hành tác vụ down khơng xác ₫ịnh Tác vụ up(), có nhiệm vụ tăng s ₫ơn vị ln phải hồn thành Trong trường hợp s = 0, tác vụ up phải ₫ánh thức thread ₫ang ngủ chờ down s dậy Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 25 9.6 Demo việc giải tương tranh thread Môi trường Net cung cấp class Mutex ₫ể quản lý semaphore nhị phân Ta kết hợp tài nguyên dùng chung mutex m với giá trị ₫ầu = Hàm In_Control() lệnh m.WaitOne(); Thread thực lệnh ₫ầu tiên thành công chạy ₫ược ₫oạn lệnh CS truy xuất tài nguyên tương ứng Các thread khác thực lệnh ₫ể truy xuất tài nguyên dùng chung thất bại bị ngủ thread ₫ầu chưa hoàn thành truy xuất Khi hoàn thành việc truy xuất tài nguyên, thread gọi hàm Out_Control() Trong trường hợp dùng Mutex, hàm Out_Control() lệnh m.ReleaseMutex(); Nó ₫ánh thức thread ₫ang ngủ chờ có Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 26 9.6 Demo việc giải tương tranh thread //xin khóa truy xuất cell bắt ₫ầu (x1,y1) mutList[x1,y1].WaitOne(); while (p.start) { //lặp chưa có yêu cầu kết thúc //hiển thị icon miêu tả lên cell //thực cơng việc thread //xác ₫ịnh vị trí thread (x2,y2) //xin khóa truy xuất cell (x2,y2) while (true) { kq = mutList[y2, x2].WaitOne(new TimeSpan(0,0,2)); if (kq==true || p.start==false) break; } // Xóa vị trí cũ //giải phóng cell (x1,y1) cho thread khác truy xuất mutList[y1, x1].ReleaseMutex(); } Mơn : Lập trình hướng ₫ối tượng Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Chương : Lập trình song song VC# Slide 27 9.7 Kết chương Chương ₫ã giới thiệu ₫ối tượng phục vụ ghi/₫ọc liệu ra/vào file tác vụ ghi/₫ọc liệu cổ ₫iển ra/vào file Chương ₫ã giới thiệu ₫ối tượng phục vụ ghi/₫ọc hệ thống ₫ối tượng ra/vào file tác vụ ghi/₫ọc hệ thống ₫ối tượng có mối quan hệ tham khảo phức tạp ra/vào file Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 28 ... song lập trình multi-process multi-thread Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 9. 2 Lập trình. .. myProcess.StartInfo.CreateNoWindow = true; … Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 9. 2 Lập trình multi-process class Process... myProcess.Kill(); Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Lập trình song song VC# Slide 9. 2 Lập trình multi-process class Process