Tham khảo tài liệu ''giáo trình nguyên lý hệ điều hành_chương 4a'', công nghệ thông tin, hệ điều hành phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Hệ Điều Hành – V1.0 CHƯƠNG IV - LUỒNG IV.1 Mục đích Sau học xong chương này, người học nắm kiến thức sau: • Các khái niệm gán với hệ điều hành đa luồng • Các vấn đề liên quan với lập trình đa luồng • Các ảnh hưởng luồng tới việc thiết kế hệ điều hành • Cách thức hệ điều hành đại hỗ trợ luồng IV.2 Giới thiệu Mô hình thực thi chương giả sử trình chương trình thực thi với luồng điều khiển Nhiều hệ điều hành đại cung cấp đặc điểm cho trình chứa nhiều luồng (thread) điều khiển Trong chương giới thiệu khái niệm liên quan với hệ thống máy tính đa luồng, gồm thảo luận Pthread API luồng Java Chúng ta xem xét nhiều vấn đề có liên quan tới lập trình đa luồng ảnh hưởng đến thiết kế hệ điều hành Cuối cùng, khám phá nhiều hệ điều hành đại hỗ trợ luồng cấp độ nhân IV.3 Tổng quan Một luồng thường gọi trình nhẹ (lightweight proces-LWP), đơn vị việc sử dụng CPU; hình thành gồm: định danh luồng (thread ID), đếm chương trình, tập ghi ngăn xếp Nó chia sẻ với luồng khác thuộc trình phần mã, phần liệu, tài nguyên hệ điều hành tập tin mở tín hiệu Một q trình truyền thống (hay q trình nặng) có luồng điều khiển đơn Nếu q trình có nhiều luồng điều khiển, thực nhiều tác vụ thời điểm Hình VI.1 hiển thị khác trình đơn luồng trình đa luồng IV.3.1 Sự động Nhiều gói phần mềm chạy máy để bàn PC đa luồng Điển hình, ứng dụng cài đặt trình riêng rẻ với nhiều luồng điều khiển Một trình duyệt Web có luồng hiển thị hình ảnh, văn luồng khác lấy liệu từ mạng Một trình soạn thảo văn có luồng hiển thị đồ họa, luồng thứ hai đọc bấm phím bàn phím từ người dùng, luồng thứ ba thực việc kiểm tra tả từ vựng chạy chế độ Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 80 Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Hệ Điều Hành – V1.0 Hình 0-1 Quá trình đơn đa luồng Trong trường hợp cụ thể ứng dụng đơn yêu cầu thực nhiều tác vụ đơn Thí dụ, trình phục vụ web chấp nhận yêu cầu khách hàng trang web, hình ảnh, âm thanh, Một trình phục vụ web có nhiều (hàng trăm) khách hàng truy xuất đồng thời Nếu trình phục vụ web chạy q trình đơn luồng truyền thống phục vụ khách hàng thời điểm Lượng thời gian mà khách hàng phải chờ yêu cầu phục vụ lớn Một giải pháp có trình phục vụ chạy trình đơn chấp nhận yêu cầu Khi trình phục vụ nhận u cầu, tạo trình riêng để phục vụ yêu cầu Thật vậy, phương pháp tạo q trình cách sử dụng thông thường trước luồng trở nên phổ biến Tạo q trình có ảnh hưởng lớn trình bày chương trước Nếu trình thực tác vụ q trình có lại gánh chịu tất chi phí đó? Thường hiệu cho trình chứa nhiều luồng phục vụ mục đích Tiếp cận đa luồng trình trình phục vụ web Trình phục vụ tạo luồng riêng lắng nghe yêu cầu người dùng; u cầu thực khơng tạo trình khác mà tạo luồng khác phục vụ u cầu Luồng đóng vai trị quan trọng hệ thống lời gọi thủ tục xa (remote process call-RPC) Như trình bày chương trước, RPCs cho phép giao tiếp liên trình cách cung cấp chế giao tiếp tương tự lời gọi hàm hay thủ tục thơng thường Điển hình, trình phục vụ RPCs đa luồng Khi trình phục vụ nhận thơng điệp, phục vụ thông điệp dùng luồng riêng Điều cho phép phục vụ nhiều yêu cầu đồng hành IV.3.2 Thuận lợi Những thuận lợi lập trình đa luồng chia làm bốn loại: • • Sự đáp ứng: đa luồng ứng dụng giao tiếp cho phép chương trình tiếp tục chạy chí phần bị khóa hay thực thao tác dài, gia tăng đáp ứng người dùng Thí dụ, trình duyệt web đáp ứng người dùng luồng ảnh nạp luồng khác Chia sẻ tài nguyên: Mặc định, luồng chia sẻ nhớ tài nguyên trình mà chúng thuộc Thuận lợi việc chia mã cho phép Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 81 Đại Học Cần Thơ - Khoa Cơng Nghệ Thơng Tin - Giáo Trình Hệ Điều Hành – V1.0 • • ứng dụng có nhiều hoạt động luồng khác nằm không gian địa Kinh tế: cấp phát nhớ tài nguyên cho việc tạo trình đắt Vì luồng chia sẻ tài nguyên q trình mà chúng thuộc nên kinh tế để tạo chuyển ngữ cảnh luồng Khó để đánh giá theo kinh nghiệm khác biệt chi phí cho việc tạo trì q trình luồng, thường nhiều thời gian để tạo quản lý trình luồng Trong Solaris 2, tạo trình chậm khoảng 30 lần tạo luồng chuyển đổi ngữ cảnh chậm lần Sử dụng kiến trúc đa xử lý: lợi điểm đa luồng phát huy kiến trúc đa xử lý, luồng thực thi song song xử lý khác Một trình đơn luồng chạy CPU Đa luồng máy nhiều CPU gia tăng tính đồng hành Trong kiến trúc đơn xử lý, CPU thường chuyển đổi qua lại luồng nhanh để tạo hình ảnh song song thực tế luồng chạy thời điểm IV.3.3 Luồng người dùng luồng nhân Chúng ta vừa thảo luận xem xét luồng chiều hướng chung Tuy nhiên, hỗ trợ luồng cung cấp cấp người dùng, cho luồng người dùng cấp nhân, cho luồng nhân • • Luồng người dùng: hỗ trợ nhân cài đặt thư viện luồng cấp người dùng Thư viện cung cấp hỗ trợ cho việc tạo luồng, lập thời biểu, quản lý mà khơng có hỗ trợ từ nhân Vì nhân khơng biết luồng cấp người dùng, tất việc tạo luồng lập thời biểu thực không gian người dùng mà khơng cần can thiệp nhân Do đó, luồng cấp người dùng thường tạo quản lý nhanh, nhiên chúng có trở ngại Thí dụ, nhân đơn luồng luồng cấp người dùng thực lời gọi hệ thống nghẽn làm cho tồn q trình bị nghẽn, chí luồng khác sẳn dùng để chạy ứng dụng Các thư viện luồng người dùng gồm luồng POSIX Pthreads, Mach C-threads Solaris UIthreads Luồng nhân: hỗ trợ trực tiếp hệ điều hành Nhân thực việc tạo luồng, lập thời biểu, quản lý khơng gian nhân Vì quản lý luồng thực hệ điều hành, luồng nhân thường tạo quản lý chậm luồng người dùng Tuy nhiên, nhân quản lý luồng luồng thực lời gọi hệ thống nghẽn, nhân lập thời biểu luồng khác ứng dụng thực thi Trong mơi trường đa xử lý, nhân lập thời biểu luồng xử lý khác Hầu hết hệ điều hành Windows NT, Windows 2000, Solaris 2, BeOS Tru64 UNIX (trước Digital UNIX)-hỗ trợ luồng nhân IV.4 Mơ hình đa luồng Nhiều hệ thống cung cấp hỗ trợ hai luồng nhân luồng người dùng nên tạo nhiều mơ hình đa luồng khác Chúng ta xem xét ba loại cài đặt luồng thông thường Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 82 Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Hệ Điều Hành – V1.0 IV.4.1 Mơ hình nhiều-một Mơ hình nhiều-một (như hình IV.2) ánh xạ nhiều luồng cấp người dùng tới luồng cấp nhân Quản lý luồng thực không gian người dùng hiệu tồn q trình bị khóa luồng thực lời gọi hệ thống khóa Vì luồng truy xuất nhân thời điểm nên nhiều luồng chạy song song nhiều xử lý Green threads-một thư viện luồng cài đặt hệ điều hành khơng hỗ trợ luồng nhân dùng mơ hình nhiều-một Hình 0-2-Mơ hình nhiều-một IV.4.2 Mơ hình một-một Mơ hình một-một (hình IV.3) ánh xạ luồng người dùng tới luồng nhân Nó cung cấp khả đồng hành tốt mơ hình nhiều-một cách cho luồng khác chạy luồng thực lời gọi hệ thống nghẽn; cho phép nhiều luồng chạy song song xử lý khác Chỉ có trở ngại mơ hình tạo luồng người dùng yêu cầu tạo luồng nhân tương ứng Vì chi phí cho việc tạo luồng nhân đè nặng lên lực thực ứng dụng, cài đặt cho mơ hình giới hạn số luồng hỗ trợ hệ thống Windows NT, Windows 2000 OS/2 cài đặt mơ hình một-một Hình 0-3-Mơ hình một-một Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 83 Đại Học Cần Thơ - Khoa Cơng Nghệ Thơng Tin - Giáo Trình Hệ Điều Hành – V1.0 IV.4.3 Mơ hình nhiều-nhiều Mơ hình nhiều-nhiều (như hình VI.4) đa hợp nhiều luồng cấp người dùng tới số lượng nhỏ hay luồng nhân Số lượng luồng nhân xác định ứng dụng cụ thể hay máy cụ thể (một ứng dụng cấp nhiều luồng nhân đa xử lý đơn xử lý) Trong mơ hình nhiều-một cho phép người phát triển tạo nhiều luồng người dùng họ muốn, đồng hành thật khơng đạt nhân lập thời biểu luồng thời điểm Mơ hình một-một cho phép đồng hành tốt người phát triển phải cẩn thận không tạo nhiều luồng ứng dụng Mơ hình nhiều-nhiều gặp phải hai vấn đề khiếm khuyết: người phát triển tạo nhiều luồng người dùng cần thiết luồng nhân tương ứng chạy song song đa xử lý Khi luồng thực lời gọi hệ thống khóa, nhân lập thời biểu luồng khác thực thi Solaris 2, IRIX, HP-UX, Tru64 UNIX hỗ trợ mơ hình Hình 0-4-Mơ hình nhiều-nhiều IV.5 Cấp phát luồng Trong phần thảo luận cấp phát xem xét với chương trình đa luồng IV.5.1 Lời gọi hệ thống fork exec Trong chương trước mô tả lời gọi hệ thống fork dùng để tạo trình riêng Trong chương trình đa luồng, ngữ nghĩa lời gọi hệ thống fork exec thay đổi Nếu luồng lời gọi chương trình fork trình chép lại trình tất luồng trình đơn luồng mới? Một số hệ thống UNIX chọn hai ấn fork, chép lại tất luồng chép lại luồng nạp lên lời gọi hệ thống fork Lời gọi hệ thống exec điển hình thực cơng việc cách mô tả chương trước Nghĩa là, luồng nạp lời gọi hệ thống exec, chương trình xác định tham số exec thay tồn q trình-chứa tất luồng q trình tải nhẹ Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 84 Đại Học Cần Thơ - Khoa Công Nghệ Thơng Tin - Giáo Trình Hệ Điều Hành – V1.0 Việc sử dụng hai ấn fork phụ thuộc vào ứng dụng Nếu exec bị hủy tức sau phân nhánh (forking) chép lại tất luồng khơng cần thiết chương trình xác định tham số exec thay trình Trong trường hợp này, việc chép lại gọi luồng hợp lý Tuy nhiên, trình riêng biệt không gọi exec sau phân nhánh trình riêng biệt nên chép lại tất luồng IV.5.2 Sự hủy bỏ luồng Hủy luồng tác vụ kết thúc luồng trước hồn thành.Thí dụ, nhiều luồng tìm kiếm đồng thời thông qua sở liệu luồng trả kết quả, luồng lại bị hủy Một trường hợp khác xảy người dùng nhấn nút trình duyệt web để dừng trang web tải Thường trang web tải luồng riêng Khi người dùng nhấn nút stop, luồng nạp trang bị hủy bỏ Một luồng bị hủy thường xem luồng đích Sự hủy bỏ luồng đích xảy hai viễn cảnh khác nhau: • Hủy bất đồng bộ: luồng kết thúc luồng đích • Hủy trì hỗn: luồng đích kiểm tra định kỳ kết thúc, cho phép luồng đích hội tự kết thúc cách có thứ tự Sự khó khăn việc hủy xảy trường hợp tài nguyên cấp phát tới luồng bị hủy hay luồng bị hủy việc cập nhật liệu xảy chừng, chia sẻ với luồng khác Điều trở nên đặc biệt khó khăn với hủy bất đồng Hệ điều hành thường đòi lại tài nguyên hệ thống từ luồng bị hủy thường khơng địi lại tất tài nguyên Do đó, việc hủy luồng bất đồng khơng giải phóng hết tài ngun hệ thống cần thiết Một chọn lựa khác, hủy trì hỗn thực luồng báo hiệu luồng đích bị hủy Tuy nhiên, hủy xảy luồng đích kiểm tra để xác định hủy hay khơng Điều cho phép luồng kiểm tra bị hủy điểm an tồn bị hủy Pthreads gọi điểm điểm hủy (cancellation points) Hầu hết hệ điều hành cho phép trình hay luồng bị hủy bất đồng Tuy nhiên, Pthread API cung cấp hủy trì hỗn Điều có nghĩa hệ điều hành cài đặt Pthread API cho phép hủy có trì hỗn IV.5.3 Tín hiệu quản lý Một tín hiệu (signal) dùng hệ điều hành UNIX thông báo kiện xác định xảy Một tín hiệu nhận đồng bất đồng phụ thuộc mã lý cho kiện báo hiệu Một tín hiệu đồng bất đồng theo sau mẫu: • Tín hiệu phát sinh xảy kiện xác định • Tín hiệu phát sinh phân phát tới q trình • Khi phân phát xong, tín hiệu phải quản lý Một thí dụ tín hiệu đồng gồm truy xuất nhớ không hợp lệ hay chia cho Trong trường hợp này, chương trình chạy thực hoạt động này, tín hiệu phát sinh Các tín hiệu đồng phân phát tới trình thực thao tác gây tín hiệu (do lý chúng xem đồng bộ) Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 85 Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Hệ Điều Hành – V1.0 Khi tín hiệu phát sinh kiện bên ngồi tới q trình chạy, q trình nhận tín hiệu bất đồng Thí dụ, tín hiệu kết thúc q trình với phím xác định (như ) hay thời gian hết hạn Điển hình, tín hiệu bất đồng gởi tới trình khác Mỗi tín hiệu quản lý hai quản lý: • • Bộ quản lý tín hiệu mặc định Bộ quản lý tín hiệu định nghĩa người dùng Mỗi tín hiệu có quản lý tín hiệu mặc định thực thi nhân quản lý tín hiệu Hoạt động mặc định ghi đè hàm quản lý tín hiệu định nghĩa người dùng Trong trường hợp này, hàm định nghĩa người dùng gọi để quản lý tín hiệu hoạt động mặc định Cả hai tín hiệu đồng bất đồng quản lý cách khác Một số tín hiệu bỏ qua (như thay đổi kích thước cửa sổ); tín hiệu khác quản lý cách kết thúc chương trình (như truy xuất nhớ khơng hợp lệ) Quản lý tín hiệu chương trình đơn luồng khơng phức tạp; tín hiệu ln phân phát tới trình Tuy nhiên, phân phát tín hiệu phức tạp chương trình đa luồng, q trình có nhiều luồng Một tín hiệu nên phân phát đâu? Thơng thường, tuỳ chọn sau tồn tại: • • • • Phân phát tín hiệu tới luồng mà tín hiệu áp dụng Phân phát tín hiệu tới luồng q trình Phân phát tín hiệu tới luồng cụ thể trình Gán luồng xác định để nhận tất tín hiệu cho q trình Phương pháp cho việc phân phát tín hiệu phụ thuộc vào loại tín hiệu phát sinh Thí dụ, tín hiệu đồng cần phân phát tới luồng phát sinh tín hiệu khơng phân phát tới luồng khác trình Tuy nhiên, trường hợp với tín hiệu bất đồng khơng rõ ràng Một số tín hiệu bất đồng - tín hiệu kết thúc q trình (thí dụ:)- nên gởi tới tất luồng Một số ấn đa luồng UNIX cho phép luồng xác định tín hiệu chấp nhận tín hiệu bị khố Do đó, vài tín hiệu bất đồng phân phát tới luồng khơng khố tín hiệu Tuy nhiên, tín hiệu cần quản lý lần, điển hình tín hiệu phân phát luồng tìm thấy luồng mà khơng nghẽn tín hiệu Solaris cài đặt bốn tuỳ chọn; tạo luồng xác định q trình cho quản lý tín hiệu Khi tín hiệu bất đồng gởi tới q trình, gởi tới luồng xác định, sau phân phát tín hiệu tới luồng khơng khố tín hiệu Mặc dù Windows 2000 khơng cung cấp rõ hỗ trợ tín hiệu, chúng mơ sử dụng lời gọi thủ tục bất đồng (asynchronous produce callsAPC) Tiện ích APC cho phép luồng người dùng xác định hàm gọi luồng người dùng nhận thông báo kiện xác định Như hiển thị tên nó, APC giống tín hiệu bất đồng UNIX Tuy nhiên, UNIX phải đấu tranh với cách giải tín hiệu mơi trường đa luồng, phương tiện APC phức tạp APC phân phát tới luồng xác định trình Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 86 Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Hệ Điều Hành – V1.0 IV.5.4 Nhóm luồng Trong phần VI.3, mô tả kịch đa luồng trình phục vụ web Trong trường hợp này, trình phục vụ nhận yêu cầu, tạo luồng riêng để phục vụ yêu cầu Ngược lại, tạo luồng riêng thật cao tạo trình riêng, dù trình phục vụ đa luồng phát sinh vấn đề Quan tâm lượng thời gian yêu cầu để tạo luồng trước phục vụ u cầu, lượng thời gian xố luồng hồn thành Vấn đề thứ hai vấn đề khó giải hơn: cho phép tất yêu cầu đồng hành phục vụ luồng mới, không thay giới hạn số lượng luồng hoạt động đồng hành hệ thống Những luồng khơng giới hạn làm cạn kiệt tài nguyên hệ thống, thời gian CPU nhớ Một giải pháp cho vấn đề sử dụng nhóm luồng Ý tưởng chung nằm sau nhóm luồng tạo số lượng luồng thời điểm khởi động đặt chúng vào nhóm, nơi chúng ngồi chờ cơng việc Khi trình phục vụ nhận yêu cầu, chúng đánh thức luồng từ nhóm- luồng sẳn dùng – truyền yêu cầu dịch vụ Một luồng hồn thành dịch vụ nó, trả nhóm chờ cơng việc kế Nếu nhóm khơng chứa luồng sẳn dùng, trình phục vụ chờ rảnh Nói cụ thể, lợi ích nhóm luồng là: 1) Thường phục vụ yêu cầu nhanh với luồng có chờ để tạo luồng 2) Một nhóm luồng bị giới hạn số lượng luồng tồn thời điểm Điều đặc biệt quan trọng hệ thống không hỗ trợ số lượng lớn luồng đồng hành Số lượng luồng nhóm đặt theo kinh nghiệm (heuristics) dựa yếu tố số CPU hệ thống, lượng nhớ vật lý số yêu cầu khách hàng đồng hành Kiến trúc nhóm luồng tinh vi tự điều chỉnh số lượng luồng nhóm dựa theo mẫu sử dụng Những kiến trúc cung cấp lợi điểm xa nhóm luồng nhỏ hơn-do tiêu tốn nhớ hơn-khi việc nạp hệ thống chậm IV.5.5 Dữ liệu đặc tả luồng Các luồng thuộc trình chia sẻ liệu trình Thật vậy, chia sẻ liệu cung cấp lợi điểm lập trình đa luồng Tuy nhiên, luồng cần liệu xác định vài trường hợp Chúng ta gọi liệu liệu đặc tả luồng Thí dụ, hệ thống xử lý giao dịch, phục vụ giao dịch luồng Ngồi ra, giao dịch gán danh biểu Để gán luồng với định danh dùng liệu đặc tả liệu Hầu hết thư viện luồng gồm Win32 Pthread – cung cấp số biểu mẫu hỗ trợ cho liệu đặc tả luồng Java cung cấp hỗ trợ IV.6 Pthreads Pthreads tham chiếu tới chuẩn POSIX (IEEE 1003.1c) định nghĩa API cho việc tạo đồng luồng Đây đặc tả cho hành vi luồng không cài đặt Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 87 Đại Học Cần Thơ - Khoa Cơng Nghệ Thơng Tin - Giáo Trình Hệ Điều Hành – V1.0 Người thiết kế hệ điều hành cài đặt đặc tả cách mà họ muốn Thông thường, thư viện cài đặt đặc tả Pthread bị giới hạn hệ thống dựa sở UNIX Solaris Hệ điều hành Windows thường không hỗ trợ Pthreads ấn shareware sẳn dùng phạm vi công cộng Trong phần giới thiệu số Pthread API thí dụ cho thư viện luồng cấp người dùng Chúng ta xem thư viện cấp người dùng khơng có mối quan hệ khác biệt luồng tạo dùng Pthread luồng gắn với nhân Chương trình C hiển thị hình đây, mơ tả Pthread API để xây dựng chương trình đa luồng Chương trình hiển thị hình tạo luồng riêng xác định tính tổng số ngun khơng âm Trong chương trình Pthread, luồng riêng bắt đầu thực thi hàm xác định Trong hình, hàm runner Khi chương trình bắt đầu, luồng riêng điều khiển bắt đầu main Sau khởi tạo, main tạo luồng thứ hai bắt đầu điều khiển hàm runner Bây cung cấp tổng quan chương trình chi tiết Tất chương trình Pthread phải chứa tập tin tiêu đề pthread.h pthread_t tid khai báo danh biểu cho luồng tạo Mỗi luồng có tập thuộc tính gồm kích thước ngăn xếp thơng tin định thời Khai báo pthread_attr_t attr diện thuộc tính cho luồng Chúng ta thiết lập thuộc tính gọi hàm pthread_attr_init(&attr) Vì khơng thiết lập rõ thuộc tính, dùng thuộc tính mặc định cung cấp Một luồng riêng tạo với lời gọi hàm pthread_create Ngoài ra, để truyền định danh luồng thuộc tính cho luồng, truyền tên hàm, nơi luồng bắt đầu thực thi, trường hợp hàm runner Cuối truyền số nguyên cung cấp dòng lệnh, argv[1] Tại điểm này, chương trình có hai luồng: luồng khởi tạo main luồng thực việc tính tổng hàm runner Sau tạo luồng thứ hai, luồng main chờ cho luồng runner hoàn thành cách gọi hàm pthread_join Luồng runner hồn thành gọi hàm pthread_exit #include #include int sum: /*Dữ liệu chia sẻ thread(s)*/ void *runner(void *param); /*luồng*/ main(int argc, char *argv[]) { pthread_t tid; /*định danh luồng*/ pthread_attr_t attr; /*tập hợp thuộc tính*/ if(argc !=2){ fprintf(stderr, “usage: a.out ”); exit(); } if (atoi(argv[1] < 0)){ fprintf(stderr,”%d must be >= \n”, atoi(argv[1])); exit(); } /*lấy thuộc tính mặc định*/ pthread_attr_init(&attr); /*tạo luồng*/ pthread_create(&tid,&attr,runner, argv[1]); Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 88 Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Hệ Điều Hành – V1.0 /*bây chờ luồng kết thúc*/ pthread_join(tid,NULL); printf(“sum = %d\n”,sum); /*Luồng bắt đầu điều khiển hàm này*/ void *runner(void *param) { int upper = atoi(param); int i; sum = 0; if (upper > 0){ sum+= i; } pthread_exit(0); } } Hình 0-5-Chương trình C đa luồng dùng Pthread API IV.7 Luồng Solaris Solaris ấn UNIX với hỗ trợ luồng cấp độ nhân cấp độ người dùng, đa xử lý đối xứng (SMP) định thời thời thực Solaris cài đặt Pthread API hỗ trợ luồng cấp người dùng với thư viện chứa APIs cho việc tạo quản lý luồng (được gọi luồng UI) Sự khác hai thư viện lớn, hầu hết người phát triển chọn thư viện Pthread Solaris định nghĩa cấp độ luồng trung gian Giữa luồng cấp nhân cấp người dùng trình nhẹ (lightweight process- LWPs) Mỗi q trình chứa LWP Thư viện luồng đa hợp luồng người dùng nhóm LWP cho trình luồng cấp người dùng nối kết tới LWP hồn thành cơng việc Các luồng cịn lại bị khố chờ cho LWP mà chúng thực thi Luồng cấp nhân chuẩn thực thi tất thao tác nhân Mỗi LWP có luồng cấp nhân, số luồng cấp nhân (kernel) chạy phần nhân khơng có LWP kèm theo (thí dụ, luồng phục vụ yêu cầu đĩa ) Các luồng cấp nhân đối tượng định thời hệ thống Solaris cài mơ hình nhiều-nhiều; tồn hệ thống luồng mơ tả hình đây: Hình 0-6-Luồng Solaris Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 89 Đại Học Cần Thơ - Khoa Cơng Nghệ Thơng Tin - Giáo Trình Hệ Điều Hành – V1.0 Các luồng cấp người dùng giới hạn hay không giới hạn Một luồng cấp người dùng giới hạn gán vĩnh viễn tới LWP Chỉ luồng chạy LWP yêu cầu LWP tận hiến tới xử lý đơn (xem luồng trái hình trên) Liên kết luồng có ích trường hợp u cầu thời gian đáp ứng nhanh, ứng dụng thời thực Một luồng không giới hạn gán vĩnh viễn tới LWP Tất luồng không giới hạn đa hợp nhóm cac LWP sẳn dùng cho ứng dụng Các luồng không giới hạn mặc định Solaris cung cấp thư viện luồng thay đổi mà mặc định chúng liên kết tới tất luồng với LWP Xem xét hệ thống hoạt động: q trình có nhiều luồng người dùng Các luồng cấp người dùng định thời chuyển đổi LWPs thư viện luồng khơng có can thiệp nhân Các luồng cấp người dùng hiệu khơng có hỗ trợ nhân yêu cầu cho việc tạo hay huỷ, hay thư viện luồng chuyển ngữ cảnh từ luồng người dùng sang luồng khác Mỗi LWP nối kết tới xác luồng cấp nhân, ngược lại luồng cấp người dùng độc lập với nhân Nhiều LWPs trình, chúng yêu cầu luồng cần giao tiếp với nhân Thí dụ, LWP yêu cầu luồng khoá đồng hành lời gọi hệ thống Xem xét năm tập tin khác nhau-đọc yêu cầu xảy lúc Sau đó, năm LWPs yêu cầu chúng chờ hồn thành nhập/xuất nhân Nếu tác vụ có bốn LWPs u cầu thứ năm chờ LWPs để trả từ nhân Bổ sung LWP thứ sáu khơng đạt có đủ công việc cho năm Các luồng nhân định thời lập thời biểu nhân thực thi hay nhiều CPU hệ thống Nếu luồng nhân khoá (trong chờ thao tác nhập/xuất hồn thành), xử lý rảnh để thực thi luồng nhân khác Nếu luồng bị khoá chạy phần LWP LWP khố Ở vòng, luồng cấp người dùng gán tới LWP bị khố Nếu q trình có nhiều LWP nhân định thời LWP khác Thư viện luồng tự động thay đổi số lượng LWPs nhóm để đảm bảo lực thực tốt cho ứng dụng Thí dụ, tất LWPs q trình bị khố luồng chạy thư viện tự tạo LWP khác gán tới luồng chờ Do đó, chương trình ngăn chặn từ chương trình khác nghèo nàn LWPs khơng bị khoá LWPs tài nguyên nhân đắt để trì chúng khơng dùng Thư viện luồng “ages” LWPs xố chúng chúng khơng dùng cho khoảng thời gian dài, điển hình khoảng phút Các nhà phát triển dùng cấu trúc liệu cài đặt luồng Solaris 2: • • • Luồng cấp người dùng chứa luồng ID; tập ghi (gồm đếm chương trình trỏ ngăn xếp); ngăn xếp; độ ưu tiên (được dùng thư viện cho mục đích định thời) Khơng có cấu trúc liệu tài nguyên nhân; tất chúng tồn không gian người dùng Một LWP có tập ghi cho luồng cấp nhân chạy nhớ thơng tin tính toán Một LWP cấu trúc liệu nhân nằm khơng gian nhân Một luồng nhân có cấu trúc liệu nhân ngăn xếp Cấu trúc liệu gồm ghi nhân, trỏ tới LWP mà gán, độ ưu tiên thông tin định thời Mỗi trình Solaris gồm nhiều thơng tin mơ tả khối điều khiển trình (Process Control Block-PCB ) Trong thực tế, trình Solaris Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 90 Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Hệ Điều Hành – V1.0 chứa định danh trình (Process ID-PID); đồ nhớ; danh sách tập tin mở, độ ưu tiên; trỏ luồng nhân vơi trình (Hình ) Hình 0-7-Quá trình Solaris IV.8 Luồng Windows 2000 Windows 2000 cài đặt Win32 API Win32 API API chủ yếu cho họ hệ điều hành Windows (Windows 95/98/NT Windows 2000) Thực vậy, đề cập phần phần áp dụng tới họ hệ điều hành Ứng dụng Windows chạy trình riêng rẻ nơi q trình chứa hay nhiều luồng Windows 2000 dùng ánh xạ một-một nơi mà luồng cấp người dùng ánh xạ tới luồng nhân liên kết tới.Tuy nhiên, Windows cung cấp hỗ trợ cho thư viện có cấu trúc (fiber library) cung cấp chức mơ hình nhiều-nhiều Mỗi luồng thuộc q trình truy xuất không gian địa ảo trình Những thành phần thơng thường luồng gồm: • • • • ID luồng định danh luồng Tập ghi biểu diễn trạng thái xử lý Ngăn xếp người dùng luồng chạy chế độ người dùng Tương tự, luồng có ngăn xếp nhân dùng luồng chạy chế độ nhân Một vùng lưu trữ riêng dùng nhiều thư viện thời gian thực thự viện liên kết động (DLLs) Tập ghi, ngăn xếp vùng lưu trữ riêng xem ngữ cảnh luồng đặc tả kiến trúc tới phần cứng mà hệ điều hành chạy Cấu trúc liệu chủ yếu luồng gồm: • RTHREAD (executive thread block-khối luồng thực thi) • KTHREAD (kernel thread-khối luồng nhân) • TEB (thread environment block-khối mơi trường luồng) Các thành phần chủ yếu RTHREAD gồm trỏ tới trình luồng thuộc địa thủ tục mà luồng bắt đầu điều khiển ETHREAD chứa trỏ tới KTHREAD tương ứng Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 91 Đại Học Cần Thơ - Khoa Cơng Nghệ Thơng Tin - Giáo Trình Hệ Điều Hành – V1.0 KTHREAD gồm thông tin định thời đồng hóa cho luồng Ngồi ra, KTHREAD chứa ngăn xếp nhân (được dùng luồng chạy chế độ nhân) trỏ tới TEB ETHREAD KTHREAD tồn hồn tồn khơng gian nhân; điều có nghĩa nhân truy xuất chúng TEB cấu trúc liệu không gian người dùng truy xuất luồng chạy chế độ người dùng Giữa trường khác nhau, TEB chứa ngăn xếp người dùng mảng cho liệu đặc tả luồng (mà Windows gọi lưu trữ cục luồng) IV.9 Luồng Linux Nhân Linux giới thiệu ấn 2.2 Linux cung cấp lời gọi hệ thống fork với chức truyền thống tạo trình Linux cung cấp lời gọi hệ thống clone mà tương tự tạo luồng clone có hành vi giống fork, ngoại trừ thay tạo trình gọi, tạo q trình riêng chia sẻ khơng gian địa q trình gọi Nó chấm dứt việc chia sẻ không gian địa trình cha mà tác vụ nhân đối xử giống nhiều luồng riêng rẻ Chia sẻ khơng gian địa cho phép việc biểu diễn trình nhân Linux Một cấu trúc liệu nhân tồn cho trình hệ thống Một cấu trúc liệu nhân tồn cho trình hệ thống Tuy nhiên, tốt lưu trữ liệu cho trình cấu trúc liệu chứa trỏ tới cấu trúc liệu khác nơi liệu được lưu Thí dụ, cấu trúc liệu q trình chứa trỏ tới cấu trúc liệu khác diện danh sách tập tin mở, thông tin quản lý tín hiệu, nhớ ảo Khi fork gọi, trình tạo với tất cấu trúc liệu trình cha liên kết tới Khi lời gọi hệ thống clone thực hiện, trình tới cấu trúc liệu trình cha, cho phép q trình chia sẻ nhớ tài nguyên trình cha Một tập hợp cờ truyền tham số tới lời gọi hệ thống clone Tập hợp cờ dùng để hiển thị trình cha chia sẻ với q trình Nếu khơng có cờ đặt, khơng có chia sẻ xảy clone hoạt động giống fork Nếu tất năm cờ đặt, trình chia sẻ thứ với trình cha Sự kết hợp khác cờ cho phép cấp độ chia sẻ khác hai mức độ cao Điều thú vị Linux khơng phân biệt q trình luồng Thật vậy, Linux thường sử dụng thuật ngữ tác vụ-hơn q trình hay luồng-khi tham chiếu tới dịng điều khiển chương trình Ngồi q trình nhân bản, Linux không hỗ trợ đa luồng, cấu trúc liệu riêng hay thủ tục nhân Tuy nhiên, cài đặt Pthreads sẳn dùng cho đa luồng cấp người dùng IV.10 Luồng Java Như thấy, hỗ trợ cho luồng cung cấp cấp người dùng với thư viện Pthread Hơn nữa, hầu hết hệ điều hành cung cấp hỗ trợ cho luồng cấp nhân Java số nhỏ ngôn ngữ cung cấp hỗ trợ cấp ngôn ngữ cho việc tạo quản lý luồng Tuy nhiên, luồng quản lý máy ảo Java, không thư viện cấp người dùng hay nhân, khó để phân cấp luồng Java cấp độ người dùng hay cấp độ nhân Trong phần trình bày luồng Java thay đổi mơ hình người dùng nghiêm ngặt hay mơ hình Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 92 Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Hệ Điều Hành – V1.0 cấp nhân Phần sau thảo luận luồng Java ánh xạ tới luồng nhân bên Tất chương trình tạo luồng điều khiển đơn Thậm chí chương trình Java chứa phương thức main chạy luồng đơn máy ảo Java Ngoài ra, Java cung cấp lệnh cho phép người phát triển tạo thao tác luồng điều khiển bổ sung chương trình IV.10.1 Tạo luồng Một cách để tạo luồng rõ ràng tạo lớp phát sinh từ lớp Thread viết đè phương thức run lớp Thread Tiếp cận hiển thị hình sau, ấn Java chương trình đa luồng xác định tổng số nguyên không âm Một đối tượng lớp phát sinh chạy luồng điều khiển đơn máy ảo Java Tuy nhiên, tạo đối tượng phát sinh từ lớp Thread không tạo luồng mới, trái lại phương thức start thật tạo luồng Gọi phương thức start cho đối tượng thực hai thứ: 1) Nó cấp phát nhớ khởi tạo luồng máy ảo Java 2) Nó gọi phương thức run, thực luồng thích hợp để chạy máy ảo Java (Chú ý, gọi phương thức run trực tiếp, gọi phương thức start gọi phương thức run) Class Summation extends Thread { public Summation (int n){ upper = n; } public void run(){ int sum = 0; if (upper>0){ for(int i = 1; i0){ if(Integer.parseInt(args[0])= 0.”); else{ Summation thrd = new Summation (Integer.parseInt(args[0])); Thrd.start(); } Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 93 Đại Học Cần Thơ - Khoa Công Nghệ Thơng Tin - Giáo Trình Hệ Điều Hành – V1.0 } Else System.out.println(“Usage: summation < integer value”); } } Hình 0-8- Chương trình Java để tính tổng số ngun khơng âm Khi chương trình tính tổng thực thi, hai luồng tạo JVM Luồng luồng nối kết với ứng dụng-luồng bắt đầu thực thi phương thức main Luồng thứ hai luồng Summation tạo rõ ràng với phương thức start Luồng Summation bắt đầu thực thi phương thức run Luồng kết thúc khỏi phương thức run IV.10.2 JVM hệ điều hành chủ Cài đặt điển hình JVM đỉnh hệ điều hành chủ (host operating system) Thiết lập cho phép JVM che giấu chi tiết cài đặt hệ điều hành bên cung cấp môi trường không đổi, trừu tượng cho phép chương trình Java hoạt động phần cứng hỗ trợ JVM Đặc tả cho JVM không hiển thị luồng Java ánh xạ tới hệ điều hành bên để thay việc quên việc định cài đặt cụ thể JVM Windows 95/98/NT Windows 2000 dùng mơ hình một-một; đó, luồng Java cho JVM chạy hệ điều hành ánh xạ tới luồng nhân Solaris khởi đầu cài đặt JVM dùng mơ hình nhiều-một Tuy nhiên, ấn 1.1 JVM với Solaris 2.6 cài đặt dùng mơ hình nhiều-nhiều IV.11 Tóm tắt Luồng dịng điều khiển phạm vi q trình Q trình đa luồng gồm nhiều dịng điều khiển khác không gian địa Những lợi điểm đa luồng gồm đáp ứng nhanh người dùng, chia sẻ tài ngun q trình, tính kinh tế, khả thuận lợi kiến trúc đa xử lý Luồng cấp người dùng luồng nhìn thấy người lập trình khơng biết nhân Thư viện luồng không gian người dùng điển hình quản lý luồng cấp người dùng Nhân hệ điều hành hỗ trợ quản lý luồng cấp nhân Thông thường, luồng cấp người dùng nhanh luồng cấp nhân việc tạo quản lý Có ba loại mơ hình khác liên quan đến luồng cấp người dùng luồng cấp nhân Mơ hình nhiều-một ánh xạ nhiều luồng người dùng tới luồng nhân Mô hình một-một ánh xạ luồng người dùng tới luồng nhân tương ứng Mơ hình nhiều-nhiều đa hợp nhiều luồng người dùng tới số lượng nhỏ hay luồng nhân Những chương trình đa luồng giới thiệu nhiều thử thách cho việc lập trình, gồm ngữ nghĩa lời gọi hệ thống fork exec Những vấn đề khác gồm huỷ bỏ luồng, quản lý tín hiệu, liệu đặc tả luồng Nhiều hệ điều hành đại cung cấp nhân hỗ trợ luồng Windows NT, Windows 2000, Solaris Linux Pthread API cung cấp tập hợp hàm để tạo quản lý luồng cấp người dùng Java cung cấp API tương tự cho việc hỗ trợ luồng Tuy nhiên, luồng Java quản lý JVM thư viện luồng cấp người dùng hay nhân, chúng không rơi vào loại luồng người dùng hay nhân Biên Soạn: Th.s Nguyễn Phú Trường - 09/2005 Trang 94 ... Cơng Nghệ Thơng Tin - Giáo Trình Hệ Điều Hành – V1.0 • • ứng dụng có nhiều hoạt động luồng khác nằm không gian địa Kinh tế: cấp phát nhớ tài nguyên cho việc tạo trình đắt Vì luồng chia sẻ tài nguyên. .. tiếp hệ điều hành Nhân thực việc tạo luồng, lập thời biểu, quản lý khơng gian nhân Vì quản lý luồng thực hệ điều hành, luồng nhân thường tạo quản lý chậm luồng người dùng Tuy nhiên, nhân quản lý. .. Thơ - Khoa Công Nghệ Thơng Tin - Giáo Trình Hệ Điều Hành – V1.0 Khi tín hiệu phát sinh kiện bên ngồi tới q trình chạy, q trình nhận tín hiệu bất đồng Thí dụ, tín hiệu kết thúc q trình với phím xác