Đồng bộ hóa các tiểu trình Một số khái niệm cơ bản
Xử lý đồng hành (Concurrent Processing)
Đa nhiệm (Multi-Tasking)
Tiến trình (Process)
Tiểu trình (Thread)
Độ ưu tiên của tiến trình (Process priority class)
Độ ưu tiên của tiểu trình (Thread priority)
Chuyển đổi ngữ cảnh (Context Switch) Xử 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ụ Lợi ích của xử lý đồng hành
Cho phép nhiều ứng dụng hoạt động cùng lúc
Tăng tốc độ xử lý
Tăng hiệu suất sử dụng CPU
Đ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. Đ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 Multi- Tasking (đa nhiệm có độ ưu tiên).
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 Tiế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 Tiến trình Tiểu trình
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. Tiểu trình
Các trạng thái của tiểu trình: Tiể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. Độ ư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 Độ ư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 Độ ưu tiên của tiểu trình trong tiến trình
THREAD_PRIORITY_LOWEST (-2): thấp hơn 2 điểm so với độ ưu tiên NORMAL
THREAD_PRIORITY_BELOW_NORMAL (-1): thấp hơn 1 đ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 Độ ưu tiên của tiểu trình trong tiến trình
Theo mặc định một tiểu trình vừa mới được tạo ra sẽ có độ ưu tiên THREAD_PRIORITY_NORMAL
Ta có thể xác định độ ưu tiên của tiểu trình bằng cách gọi hàm GetThreadPriority
Ứng dụng có thể tăng hay giảm ưu tiên của tiểu trình bằng cách gọi hàm SetThreadPriority