Tiểu trìnhTiểu trình: stack + registers bao gồm PC Nôm na: vị trí chuỗi lệnh hiện tại của chương trình và chuỗi các phương thức đang thực hiện tạo ra chuỗi lệnh này Ví dụ: A gọi B, B gọi
Trang 1Tiểu trình
TH 106: Hệ Điều Hành, 03-2011
Khoa CNTT
ĐH KHTN
Trang 2Tiểu trình
Tiểu trình: stack + registers (bao gồm PC)
Nôm na: vị trí chuỗi lệnh hiện tại của chương trình và chuỗi các phương thức đang thực hiện tạo ra chuỗi lệnh này
Ví dụ: A gọi B, B gọi C, C gọi B, B gọi C
Lúc này PC trỏ tới vị trí nào đó trong C
Stack phải chứa 5 activation records: A/B/C/B/C
Trang 3Đa tiểu trình
Tại sao cần tiểu trình?
Một web server phải trả lời rất nhiều yêu cầu từ nhiều trình duyệt
Nếu chỉ có một tiểu trình, thì chỉ xử lý được một yêu cầu tại một thời điểm
Mô hình đa tiểu trình
Mỗi tiến trình có thể có nhiều tiểu trình
Mỗi tiểu trình có stack riêng
Thanh ghi cũng dùng riêng
Tất cả tiểu trình cùng một tiến trình chia sẻ mã và heap
Các đối tượng được chia sẻ giữa các tiểu trình sẽ được cấp
Trang 4Xem lại không gian địa chỉ tiến trình
HĐH
MãVùng toàn cục
Stack
Heap
HĐH
MãVùng toàn cục
Stack
HeapStack
Trang 5Đa tiểu trình (tt)
Cài đặt
Mỗi tiểu trình được mô tả trong một thread-control block (TCB)
Một TCB thông thường chứa
ID của tiểu trình Không gian để lưu các thanh ghi Con trỏ tới vị trí xác định trong stack
Nhận xét
Mặc dù mỗi tiểu trình có stack riêng, các tiểu trình thật ra chia sẻ không gian địa chỉ tiến trình
Không có sự bảo vệ các vùng nhớ riêng!
Tiểu trình có thể ghi vào stack của tiểu trình khác
Trang 6Tạo tiểu trình
thread_create()
Mã hàm thread_create()
PCBs TCBs
stacks new_thread_starts_here
PC
SP
Trang 7Context Switching
Giả sử một tiến trình có nhiều tiểu trình …nhưng … giả sử máy tính chỉ có 1 CPU… thì làm sao?
Trong thực tế, ngay khi chỉ có 1 tiểu trình trong 1 tiến trình, chúng ta
cũng phải giải quyết bài toán nhiều tiến trình …
Chúng ta phải lập lịch nhiều tiểu trình với 1 CPU
Tại một thời điểm bất kì, chỉ một tiểu trình được thực thi
Có những thời điểm nào đó, HĐH có thể dừng tiểu trình này và cho phép tiểu trình khác thực thi
Việc chuyển thực thi từ một tiểu trình này sang tiểu trình khác gọi là context switching
Trang 8Sơ đồ các trạng thái tiểu trình
Trang 9Context Switching (tt)
Làm sao để thực hiện một context switch?
Lưu trạng thái của tiểu trình hiện thời đang thực thi
Chép các thanh ghi đang dùng vào thread control block
Với các máy chỉ dùng thanh ghi, cần ít nhất 1 thanh ghi tạm
Trỏ tới vùng nhớ trong thread control block nơi các thanh ghi được lưu vào
Nạp trạng thái của tiểu trình sẽ thực thi kế tiếp
Chép giá trị các thanh ghi đang dùng lúc trước trong thread control block vào các thanh ghi
Khi nào thì phải dùng context switching?
Trang 10Context Switching (tt)
Khi nào xảy ra context switching?
Khi HĐH quyết định rằng một tiểu trình đã thực thi “đủ lâu” và tiểu trình khác nên được cấp CPU
Nhớ lại làm sao HĐH lấy lại điều khiển CPU khi nó đang thực thi trong user mode?
Khi tiểu trình thực hiện tác vụ I/O và cần dừng lại chờ xong tác vụ này Đợi tiểu trình khác hoàn thành
Đồng bộ tiểu trình: chúng ta sẽ thảo luận về vấn đề này trong vài bài giảng tới
Trang 11Mã switching được gọi như thế nào?
Tiểu trình người dùng interrupt đồng hồ phần cứng thay đổi giá trị PC trỏ tới mã xử lý interrupt lưu lại trạng thái tiểu trình
xử lý interrupt đồng hồ được gọi vô hiệu hóa kiểm tra
interrupt kiểm tra liệu tiểu trình hiện thời chạy “đủ chưa” nếu đủ, tạo asynchronous software trap (AST) cho phép kiểm tra interrupt thoát khỏi xử lý interrupt thực hiện phần mã nguồn “return-to-user ” kiểm tra có AST không nếu không, nạp lại trạng thái tiểu trình người dùng và trở lại thực thi tiểu
trình này; nếu có AST, gọi mã context switch
Trang 12Mã switching được gọi như thế nào? (tt)
Tiểu trình người dùng system call cho việc I/O trạng thái tiểu trình được lưu Gọi mã HĐH thực thi cho system call bắt đầu tác vụ I/O (gọi I/O driver) đặt trạng thái tiểu trình
waiting chuyển TCB từ “hàng đợi thực thi” tới “hàng đợi chờ I/O” gọi mã context switching
Trang 13Context Switching (tt)
Khi tiểu trình bị chuyển ra ngoài, điều gì xảy ra với nó?
Làm sao chúng ta tìm ra nó để nạp lại sau đó?
Đây là công việc của TCB Hệ thông thường sẽ có:
Một hàng đợi thực thi trỏ tới TCB của các tiểu trình sẳn sàng thực thi
Mỗi thiết bị có một hàng đợi riêng, nó lưu TCB của các tiểu trình đang chờ tác vụ I/O cho đến khi xong
Khi một tiểu trình bị chuyển ra ngoài vì interrupt, nó vẫn ở trạng thái sẳn sàng thực thi, nên TCB của nó vẫn ở trên hàng đợi thực thi
Khi một tiểu trình bị chuyển ra ngoài vì chờ tác vụ I/O, TCB của nó được chuyển qua hàng đợi của thiết bị đó.
Trang 14Ready Queue và các hàng đợi của thiết bị I/O
Trang 15Chuyển đổi giữa các tiểu trình khác tiến trình
Làm sao để chuyển đổi tiểu trình thuộc các tiến trình khác nhau?Caches, TLB, bảng trang, v.v.?
Caches
Địa chỉ vật lý: không có rắc rối gì ! Địa chỉ ảo: cache phải biết nhãn process hoặc là xóa sạch cache mỗi lần context switch
TLB (Translation Lookaside Buffer )
Mỗi entry phải có nhãn process hoặc phải dọn sạch TLB mỗi khi có context switch
Bảng trang
Dùng một bảng con trỏ các trang (thanh ghi) phải được nạp lại khi context switch
Trang 16Tiểu trình và truyền tín hiệu
Phải làm gì nếu kernel muốn gửi tín hiệu đến một tiến trình khi
mà các tiểu trình của nó đều bị block?
Khi có nhiều tiểu trình, kernel nên gửi tín hiệu đến tiểu trình
Trang 17Tổ chức tiểu trình
Tiểu trình hệ thống (tiến trình nhỏ)
Kernel hiểu như nhiều chương trình đang thực thi
Kernel quản lý các tiểu trình
Tiểu trình người dùng
Là thư viện chứa mã nguồn để tạo tiểu trình, kết thúc, lập lịch
và chuyển đổi giữa các tiểu trình
Kernel thấy chỉ 1 chương trình đang thực thi và không nhận biết đó là hành động của một tiểu trình
Có thể bị chèn vào
Trang 18Tiểu trình hệ thống vs tiểu trình người dùng
Thuận lợi tiểu trình ở mức user:
Thực thi: ít tốn kém (không yêu cầu bảo vệ giữa các vùng)Linh động: có thể lập lịch cho từng ứng dụng cụ thể
Giao tiếp: thư viện ở mức user giúp tiểu trình dễ dàng giao tiếp với các thành phần khác
Bất thuận lợi của tiểu trình ở mức user:
Nếu 1 tiểu trình ở mức user bị block ở kernel, thì toàn bộ tiến trình (tất cả tiểu trình của tiến trình đó) bị blocked
Không thể lợi dụng đặc tính đa tiến trình (kernel chỉ cấp 1
Trang 19Tiểu trình hệ thống vs tiểu trình người dùng
kernel user
processor
tiểu trình
Tiểu trình
Điều phối tiến trình
Trang 20Tiểu trình hệ thống vs tiểu trình người dùng
Điều phối tiểu trình
Điều phối tiểu trình
kernel user
Điều phối tiến trình
Trang 21Tiểu trình vs Tiến trình
Tại sao cần nhiều tiểu trình?
Tại sao chúng ta không thể dùng nhiều tiến trình để thay thế cho việc dùng nhiều tiểu trình?
Bởi vì chúng ta cần có khả năng chia sẻ vùng nhớ (và các tài nguyên khác) giữa các tiến trình …
Nhưng việc chia sẻ này đã có sẳn – bài giảng sau
Các tác vụ điều hành tiểu trình (tạo, kết thúc, lập lịch, v.v )
dể dàng thực hiện hơn so với tiến trình
Là bởi vì tiểu trình không cần các thao tác liên quan đến tài nguyên phân phát cho tiến trình
Liên lạc giữa các tiểu trình thông qua chia sẻ bộ nhớ, không cần sự can thiệp của kernel
Trang 22Thời gian thực thi tiểu trình/tiến trình
mức user (s)
Tiểu trình mức kernel (s)
Tiến trình (s)
Trang 23Tuần tới
Điều phối
Đọc Silberschatz (CPU Scheduling)