Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 28 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
28
Dung lượng
532,5 KB
Nội dung
BÀI GIẢNG NGUYÊN LÝ HỆ ĐIỀU HÀNH Chư ng 4: Luồng (Threads) Bộ mơn Khoa học máy tính Khoa Công nghệ thông tin Nội dung chươ ng ■ Giới thiệu chung ■ Các mơ hình đa luồng ■ Các vấn đề luồng ■ Một số loại luồng 4.2 4.1 Giới thiệu chung ■ Luồng đơn vị sử dụng CPU ■ Là dịng điều khiển tiến trình Nếu tiến trình có nhiều luồng, thực nhiều tác vụ thời điểm ■ Luồng bao gồm: ● Mã luồng (thread ID) ● Bộ đếm chương trình (PC) ● Tập ghi (register set) ● stack ■ Các luồng tiến trình chia sẻ với đoạn mã (code), đoạn liệu (data) tài nguyên hệ thống khác tệp mở, tín hiệu 4.3 Các tiến trình n luồng đa luồng 4.4 Sự thúc đẩ y ■ Tạo tiến trình công việc "nặng nhọc" ■ Nhiều phần mềm chạy PC đa luồng (multithreaded) Một ứng dụng thường thực tiến trình riêng với vài luồng điều khiển ■ Vd1: Trình soạn thảo văn ● luồng hiển thị ảnh, chữ ● luồng đọc phím nhấn người sử dụng ● luồng thực việc kiểm tra tả ngữ pháp ■ Vd2: web-server tạo luồng nghe yêu cầu từ client Khi có yêu cầu, thay tạo tiến trình khác, tạo luồng khác để phục vụ yêu cầu 4.5 Lợi ích tiến trình đa luồng ■ Đáp ứng nhanh: cho phép chương trình tiếp tục thực chí phận bị khóa thực hoạt động dài ■ Chia sẻ tài nguyên: lợi ích chia sẻ code cho phép ứng dụng có số luồng khác hoạt động không gian địa ■ Kinh tế: tạo chuyển ngữ cảnh luồng kinh tế so với tiến trình Trong HĐH Solaris 2, tạo tiến trình chậm 30 lần, chuyển ngữ cảnh tiến trình chậm lần với luồng ■ Thực kiến trúc multiprocessor: lợi ích đa luồng tăng lên kiến trúc multiprocessor, luồng chạy song song processor 4.6 User Threads ■ Được hỗ trợ kernel thực thư viện luồng mức người sử dụng (user level) ■ Tất tạo luồng lập lịch thực không gian người sử dụng Do đó, user-level thread nói chung nhanh để tạo quản lý ■ Tuy nhiên, chúng có hạn chế: kernel đơn luồng, có user-level thread thực system call khóa, gây cho tồn tiến trình bị khóa, tiến trình khác chạy ứng dụng ■ Vd: POSIX Pthreads, Win32 threads, Java threads 4.7 Kernel Threads ■ Được hỗ trợ trực tiếp HĐH ■ Kernel thực tạo luồng, lập lịch quản lý khơng gian kernel Do đó, tạo quản lý kernel thread nói chung chậm user thread ■ Nếu luồng thực system call khóa, kernel lập lịch luồng khác để thực Trong mơi trường multiprocessor, kernel lập lịch luồng processor khác ■ Vd: Các HĐH nay: Windows NT/2000/XP, Solaris, Tru64 UNIX, LINUX, Mac OS X 4.8 4.2 Các mơ hình đa luồng ■ Để chạy CPU, user thread cuối phải ánh xạ vào kernel thread ■ Nhiều HĐH hỗ trợ user thread kernel thread, thể mơ hình đa luồng phổ biến: ● Many-to-One ● One-to-One ● Many-to-Many ● 2-level 4.9 Mơ hình Many-to-One ■ Nhiều user-level thread ánh xạ vào kernel thread ■ Quản lý luồng thực không gian người s dụng → nhanh tiến trình dễ bị khóa ■ Các luồng khơng thể chạy song song h ệ th ống multiprocessor ■ Vd: Solaris Green Theads, GNU Portable Threads 4.10 4.3 Các vấn đề luồng ■ Các system call fork() exec() ■ Hủy luồng ■ Xử lý tín hiệu ■ Thread pools ■ Dữ liệu riêng cho luồng ■ Giao tiếp kernel thư viện luồng 4.14 4.3.1 Các system call fork exec (trong UNIX) ■ Nếu luồng chương trình gọi fork(), số HĐH UNIX có phiên fork ● Một lại tất thread ● Một lại thread gọi fork ■ Nếu luồng gọi exec, chương trình xác định tham số exec thay tồn tiến trình (gồm tất luồng) 4.15 4.3.2 Hủy bỏ luồng ■ Là tác vụ thực hủy bỏ thread trước kết thúc ■ Vd: nhiều luồng tìm kiếm CSDL, luồng tìm thấy, luồng cịn lại nên dừng lại ■ Sự hủy luồng diễn theo cách: ● Hủy không đồng bộ: ngừng luồng ● Hủy trì hỗn: luồng bị hủy kiểm tra tiên đốn xem có nên bị hủy khơng, cho phép có hội tự h ủy theo cách có trật tự 4.16 4.3.3 Xử lý tín hiệu ■ Các tín hiệu sử dụng HĐH UNIX để báo cho tiến trình biết có kiện đặc biệt xuất (vd: có lỗi) ■ Các tín hiệu xử lý trình xử lý theo bước: Tín hiệu sinh kiện đặc biệt Tín hiệu đưa đến tiến trình Sau đó, tín hiệu xử lý ■ Các lựa chọn: ● Đưa tín hiệu tới luồng tương ứng dành cho tín hiệu ● Đưa tín hiệu tới tất luồng tiến trình ● Đưa tín hiệu tới số luồng tiến trình ● Ấn định luồng chun nhận tất tín hiệu cho tiến trình 4.17 4.3.4 Thread Pools ■ Tư tưởng chung đằng sau thread pool tạo nhiều luồng lúc bắt đầu tiến trình đặt chúng vào pool - nơi chúng "ngồi" đợi việc ■ Khi server nhận yêu cầu, "đánh thức" luồng pool - sẵn sàng - truyền cho yêu cầu để phục vụ Khi hoàn thành, luồng lại trở pool chờ cơng việc khác ■ Lợi ích: ● Dùng luồng tồn phục vụ nhanh so với chờ đợi để tạo luồng ● thread pool giới hạn số luồng tồn thời điểm Điều đặc biệt quan trọng hệ thống h ỗ trợ số lượng lớn luồng lúc 4.18 4.3.5 Dữ liệu riêng luồng ■ Các luồng thuộc tiến trình chia sẻ tài nguyên tiến trình ■ Nhưng số trường hợp: luồng cần liệu riêng ■ Ví dụ: hệ thống xử lý giao dịch, ta nên phục vụ giao dịch luồng riêng Hơn giao dịch gán id ⇒ sử dụng liệu riêng cho luồng ■ Lợi ích: ● Cho phép luồng có copy liệu riêng ● Hữu ích bạn khơng có kiểm sốt tiến trình t ạo lu ồng (nghĩa sử dụng thread pool) 4.19 4.3.6 Giao tiếp kernel - thư viện luồng ■ Cả mô hình many-to-many mơ hình 2-mức u cầu giao tiếp để trì số lượng thích hợp kernel thread phân phối cho ứng dụng ■ upcall –cơ chế giao tiếp kernel thư viện luồng: ● Kernel cung cấp ứng dụng gồm tập BXL ảo ● ứng dụng lập lịch user thread vào BXL ảo khả dụng ● Kernel phải thông báo cho ứng dụng kiện ■ Sự giao tiếp cho phép ứng dụng trì số lượng kernel thread đắn 4.20 4.4 Một số loại luồng 4.4.1 Pthreads ■ Là chuẩn POSIX (IEEE 1003.1c), định API cho việc tạo đồng hóa luồng ■ API xác định hành vi (behavior) thư viện luồng, thực thi (implementation) phụ thuộc vào phát triển thư viện ■ Phổ biến HĐH dạng UNIX (Solaris, Linux, Mac OS X, True64 UNIX) 4.21 4.4.2 Luồng Windows XP ■ Áp dụng cho "họ" Windows: 95/98/2000/XP/NT (Win32 API) ■ Một ứng dụng Windows chạy tiến trình riêng, tiến trình chứa nhiều luồng ■ Sử dụng mơ hình ánh xạ one-to-one ■ Cũng hỗ trợ thư viện fiber, cung cấp chức mơ hình many-to-many ■ Bằng cách sử dụng thư viện luồng, luồng tiến trình truy nhập khơng gian địa tiến trình ■ Các thành phần luồng: ● thread ID ● tập ghi biểu diễn trạng thái processor ● user stack kernel stack ● vùng lưu trữ riêng 4.22 context luồng 4.4.3 Luồng LINUX ■ Ngoài fork(), Linux cung cấp system call tương tự clone() để tạo luồng, thay tạo copy tiến trình gọi, tạo tiến trình (tiến trình con) ■ Tiến trình trỏ vào cấu trúc liệu tiến trình cha, cho phép tiến trình chia sẻ nhớ tài nguyên khác cha ■ Điều thú vị Linux khơng phân biệt tiến trình luồng Thực tế, Linux thường dùng thuật ngữ task để dịng điều khiển chương trình 4.23 4.4.4 Luồng Java ■ Java số NNLT có cung cấp hỗ trợ tạo quản lý luồng mức ngơn ngữ: có lệnh tạo thao tác với luồng điều khiển chương trình ■ Các luồng quản lý JVM (Java Virtual Machine), thư viện luồng hay kernel ■ Tất chương trình Java chứa luồng điều khiển đơn (khi chương trình có phương thức main) 4.24 Các kỹ thuật tạo luồng CT Java Tạo lớp dẫn xuất lớp Thread chồng phương thức run() ● Một đối tượng lớp dẫn xuất chạy luồng ều khiển riêng JVM Phương thức start thực tạo luồng Định nghĩa lớp thực interface: public interface Runnable{ public abstract void run(); } 4.25 thi Runnable ... fork ● Một lại tất thread ● Một lại thread gọi fork ■ Nếu luồng gọi exec, chương trình xác định tham số exec thay toàn tiến trình (gồm tất luồng) 4.15 4.3.2 Hủy bỏ luồng ■ Là tác vụ thực hủy bỏ