Đa tiểu trình một số khái niệm cơ bản
Trang 1Đa tiểu trình
Trang 2Nội dung chương
Một số khái niệm cơ bản
Xây dựng một ứng dụng đa tiểu trình
Đồng bộ hóa các tiểu trình
Trang 3Một số khái niệm cơ bản
Độ ưu tiên của tiểu trình (Thread priority)
Chuyển đổi ngữ cảnh (Context Switch)
Trang 4Xử lý đồng hành
Xử lý đồng hành ?
Bài toán: kq = a*b + c*d
Một hệ thống xử lý đồng hành thường có nhiều tiến trình thực thi cùng lúc
Các tiến trình có thể hoạt động độc lập hay kết hợp với nhau để thực hiện nhiều tác vụ
Trang 6Đa nhiệm
Hệ điều hành đa nhiệm phân chia thời gian xử lý của CPU thành nhiều “lát thời gian” (time slice) để các tiến trình/tiểu trình thực hiện luân phiên
Tiến trình/tiểu trình đang thực thi sẽ tạm dừng khi time slice của nó hết và tiến trình/tiểu trình khác sẽ chạy
Khi hệ thống chuyển đổi từ thread này sang thread khác, nó sẽ lưu lại ngữ cảnh của thread bị mất quyền
và phục hồi ngữ cảnh của thread sắp được chạy
Trang 7Đa nhiệm
Độ dài time slice phụ thuộc từng hệ điều hành và bộ
vi xử lý Bởi vì time slice khá nhỏ (khoảng 20ms) nên
ta có cảm giác thực hiện đồng thời
Hệ điều hành Windows hỗ trợ pre-emptive Tasking (đa nhiệm có độ ưu tiên)
Multi- Những vấn đề khó khăn khi xử lý đa nhiệm:
Không gian bộ nhớ để lưu trữ thông tin ngữ cảnh của tiến trình và tiểu trình
Thời gian để theo vết, quản lý các tiểu trình
Sự tranh chấp tài nguyên dùng chung
Trang 8Tiến trình
Là một chương trình đang thực thi
Có một con trỏ lệnh, vùng không gian địa chỉ
ảo riêng, mã lệnh, dữ liệu, object handles,
các biến môi trường, độ ưu tiên…
Các thuộc tính này tác động lên mọi tiểu trình trực thuộc tiến trình
Một tiến trình có thể có nhiều tiểu trình
Trang 9Tiến trình
Trang 10 Là đơn vị nhỏ nhất thực thi được trên hệ điều hành Windows 32 bits
Là đơn vị xử lý mà hệ điều hành Windows phân chia time slice
Mỗi tiểu trình bao gồm các stack, trạng thái các thanh ghi CPU,…và một entry trên danh sách các tiểu trình của hệ thống điều phối
Các tiểu trình của cùng một tiến trình chia sẻ nguồn tài nguyên chung của toàn bộ tiến trình
Trang 11Tiểu trình
Các trạng thái của tiểu trình:
Trang 12Tiểu trình
Khi kết thúc time slice của mình, một tiểu trình sẽ dừng lại và nhường tài nguyên cho các tiểu trình khác Quá trình này được gọi là chuyển đổi ngữ cảnh (context switch)
Độ ưu tiên là thuộc tính giúp hệ điều hành xác định tiểu trình nào sẽ được thực hiện tiếp theo, đồng thời phân chia thời gian xử lý của CPU
Khi thời điểm context switch đến, đơn vị điều phối (dispatcher) sẽ khảo sát tập các tiểu trình ở trạng thái sẵn sàng và chọn tiểu trình đầu tiên có độ ưu tiên cao nhất trên hàng đợi để thực hiện
Trang 13Độ ưu tiên của tiến trình
IDLE_PRIORITY_CLASS: chỉ được thực hiện khi không còn tiến
trình nào sử dụng CPU
NORMAL_PRIORITY_CLASS: được quyền sử dụng CPU theo
thời gian phân chia Đây là độ ưu tiên mặc định cho tiến trình khi mới tạo lập
HIGH_PRIORITY_CLASS: Tiến trình được dành quyền sử dụng
CPU từ các tiến trình thuộc lớp Normal ngay khi cần
REALTIME_PRIORITY_CLASS: Có độ ưu tiên cao nhất, được
sử dụng CPU bất kỳ lúc nào
ABOVE_NORMAL_PRIORITY_CLASS (chỉ có trong Windows
2000 trở lên): cao hơn NORMAL nhưng thấp hơn HIGH priority
BELOW_NORMAL_PRIORITY_CLASS (chỉ có trong Windows
2000 trở lên): cao hơn IDLE nhưng thấp hơn NORMAL priority
Trang 14Độ ưu tiên của tiểu trình
Mỗi tiểu trình có 1 độ ưu tiên được xác lập từ
0 (thấp nhất) đến 31 (cao nhất), giá trị này
gọi là Base Priority
Base Priority là giá trị độ ưu tiên của tiểu
trình tính trên toàn hệ thống
Base Priority được xác định bởi:
Độ ưu tiên của tiến trình chứa nó
Mức độ ưu tiên của tiểu trình bên trong tiến trình
Trang 15Độ ưu tiên của tiểu trình trong
điểm so với độ ưu tiên NORMAL
THREAD_PRIORITY_NORMAL: độ ưu tiên ngang
với độ ưu tiên của tiến trình
THREAD_PRIORITY_ABOVE_NORMAL (+1): cao
hơn 1 điểm so với độ ưu tiên NORMAL
THREAD_PRIORITY_HIGHEST (+2): cao hơn 2
điểm so với độ ưu tiên NORMAL
Trang 16Độ ưu tiên của tiểu trình trong
Trang 17Bảng 32 mức ưu tiên
Trang 18Bảng 32 mức ưu tiên tt …
Trang 19Chuyển đổi ngữ cảnh
Để chuyển đổi xử lý từ tiểu trình này sang tiểu trình khác trong hàng đợi, hệ thống phải thực hiện việc chuyển đổi ngữ cảnh:
Sao lưu ngữ cảnh của tiểu trình tạm ngưng xử lý.
Đưa tiểu trình này vào hàng đợi hệ thống có độ ưu tiên tương ứng với độ ưu tiên xử lý của tiểu trình.
Xác định tiểu trình sẵn sàng trong hàng đợi có độ ưu tiên
xử lý cao nhất.
Nạp thông tin ngữ cảnh của tiểu trình được chọn vào hệ thống, xoá bỏ tiểu trình này trong hàng đợi hệ thống và thực thi tiểu trình này.
Trang 20Chuyển đổi ngữ cảnh
Việc chuyển đổi ngữ cảnh chỉ được thực hiện trong ba tình huống:
Khi thời gian xử lý của một tiểu trình đã hết
Khi tiểu trình đang xử lý phải chuyển sang trạng thái chờ, nó phải từ bỏ thời gian xử lý còn lại
Một tiểu trình có độ ưu tiên xử lý cao hơn vừa từ trạng thái chờ (block, suspend) chuyển sang trạng thái sẵn sàng
Trang 21Xây dựng ứng dụng đa tiểu trình
Tạo lập tiểu trình
Thay đổi trạng thái của tiểu trình
Kết thúc tiểu trình
Đồng bộ hóa các tiểu trình
Trang 22Xây dựng ứng dụng đa tiểu trình
Thread th = new Thread(mythread);
mythread – 1 instance của lớp ThreadStart hoặc lớp ParameterizedThreadStart;
public delegate void ThreadStart () ;
public delegate void ParameterizedThreadStart (Object obj);
Trang 23Xây dựng ứng dụng đa tiểu trình
Ta có thể dùng các hàm GetThreadPriority và SetThreadPriority để thay đổi độ ưu tiên của tiểu trình
th.Priority = ThreadPriority.Highest;
Trang 24Xây dựng ứng dụng đa tiểu trình Tạo lập tiểu trình với ThreadStart
Trang 25Xây dựng ứng dụng đa tiểu trình Tạo lập tiểu trình với ThreadStart
Trang 26Xây dựng ứng dụng đa tiểu trình
Tạo tiểu trình với ParametrizedThreadStart
Trang 27Xây dựng ứng dụng đa tiểu trình
Tạo tiểu trình với ParametrizedThreadStart
Trang 28Xây dựng ứng dụng đa tiểu trình Truyền dữ liệu - đóng gói vào lớp.
Trang 29Xây dựng ứng dụng đa tiểu trình
Truyền dữ liệu - đóng gói vào lớp (tt).
Trang 30Xây dựng ứng dụng đa tiểu trình
Trả dữ liệu – dùng hàm gọi ngược.
Xây dựng lớp chứa tiểu trình:
Nhận dữ liệu vào và delegate tới hàm gọi ngược
Trong phần code của tiểu trình sẽ gọi hàm ngược này
Trang 31Xây dựng ứng dụng đa tiểu trình Trả dữ liệu – dùng hàm gọi ngược.
Xây dựng lớp chứa tiểu trình:
Trang 32Xây dựng ứng dụng đa tiểu trình
Trả dữ liệu – dùng hàm gọi ngược.
Triển khai hàm gọi ngược ứng với delegate: /* Delegate that defines the signature for the callback method */
public delegate void ExampleCallback(int
lineCount);
Trang 33Xây dựng ứng dụng đa tiểu trình
Trả dữ liệu – dùng hàm gọi ngược.
Tạo tiểu trình, truyền dữ liệu và thực thi:
Trang 34Xây dựng ứng dụng đa tiểu trình
Tạm dừng/tiếp tục tiểu trình
Ta có thể tạm ngưng thực thi một tiểu trình bằng cách gọi hàm Suspend và khôi phục lại hoạt động bằng hàm Resume
th.Suspend();
th.Resume();
Nếu tiểu trình đang gọi các hàm hệ thống, thao tác suspend
sẽ thất bại.
Ứng dụng có thể phải gọi SuspendThread nhiều lần cho
đến khi suspend thành công.
Kiểm tra trạng thái của một tiểu trình thông qua thuộc tính:
th.ThreadState == ThreadState.Suspended
Trang 35Xây dựng ứng dụng đa tiểu trình
Trang 36Xây dựng ứng dụng đa tiểu trình
Đồng bộ hóa các tiểu trình
Có nhiều cơ chế đồng bộ hóa các tiểu trình:
Dùng từ khóa lock:
Trang 37Xây dựng ứng dụng đa tiểu trình
Đồng bộ hóa các tiểu trình
Dùng từ khóa lock:
Các cấu trúc thường gặp là: lock (this), lock (typeof (MyType)), và lock ("myLock") thì vi phạm các nguyên tắc sau:
lock(this): gây xung đột nếu lớp là public.
lock (typeof (MyType)): gây xung đột nếu MyType là lớp public.
lock(“myLock”): gây xung đột nếu chuỗi này cũng được dùng ở nơi nào khác
Tốt hơn hết là khai báo private hay private shared cho các object của lock
Trang 38Xây dựng ứng dụng đa tiểu trình Đồng bộ hóa các tiểu trình
Trang 39Xây dựng ứng dụng đa tiểu trình Đồng bộ hóa các tiểu trình
Dùng monitor:
Trang 40Xây dựng ứng dụng đa tiểu trình Đồng bộ hóa các tiểu trình
Trang 41Xây dựng ứng dụng đa tiểu trình Đồng bộ hóa các tiểu trình
Trang 42Xây dựng ứng dụng đa tiểu trình
Đồng bộ hóa các tiểu trình - Monitor