Figure 5.01 - ndtien-practice-c
Download
Report
Transcript Figure 5.01 - ndtien-practice-c
Chương 4: Luồng
Nguyên lý hệ điều hành
Nguyễn Đức Thịnh - ĐHNNHN
Chương 4: Luồng
Tổng quan
Mô hình đa luồng
Các thư viện
Các vấn đề
Ví dụ
Luồng trong Windows XP
Luồng trong Linux
Nguyên lý hệ điều hành
4.2
Nguyễn Đức Thịnh - ĐHNNHN
Mục tiêu
Khái niệm về luồng — đơn vị cơ bản trong sử dụng thời gian CPU, cơ
sở của các hệ thống đa luồng
Các hàm API về luồng trong các thư viện Pthreads, Win32, và Java
Các vấn đề liên quan đến lập trình đa luồng
Nguyên lý hệ điều hành
4.3
Nguyễn Đức Thịnh - ĐHNNHN
Tiến trình đơn và đa luồng
Nguyên lý hệ điều hành
4.4
Nguyễn Đức Thịnh - ĐHNNHN
Lợi ích
Tốc độ hồi đáp (responsiveness)
Chia sẻ tài nguyên
Tiết kiệm
Khả năng mở rộng (scalability)
Nguyên lý hệ điều hành
4.5
Nguyễn Đức Thịnh - ĐHNNHN
Lập trình đa nhân
Các hệ thống đa nhân làm xuất hiện các vấn đề sau cho lập trình viên:
Phân chia công việc
Cân bằng
Phân chia dữ liệu
Phụ thuộc dữ liệu
Kiểm tra và gỡ lỗi
Nguyên lý hệ điều hành
4.6
Nguyễn Đức Thịnh - ĐHNNHN
Kiến trúc server đa luồng
Nguyên lý hệ điều hành
4.7
Nguyễn Đức Thịnh - ĐHNNHN
Thực thi đồng thời trên
hệ thống một nhân
Nguyên lý hệ điều hành
4.8
Nguyễn Đức Thịnh - ĐHNNHN
Thực thi song song trên hệ thống đa nhân
Nguyên lý hệ điều hành
4.9
Nguyễn Đức Thịnh - ĐHNNHN
Luồng của user
Quản lý luồng được thực hiện bởi thư viện luồng cấp người dùng (user-
level)
Có 3 thư viện luồng chính:
POSIX Pthreads
Win32 threads
Java threads
Nguyên lý hệ điều hành
4.10
Nguyễn Đức Thịnh - ĐHNNHN
Luồng trong nhân
Hỗ trợ bởi nhân
Ví dụ
Windows XP/2000
Solaris
Linux
Tru64 UNIX
Mac OS X
Nguyên lý hệ điều hành
4.11
Nguyễn Đức Thịnh - ĐHNNHN
Các mô hình đa luồng
Many-to-One
One-to-One
Many-to-Many
Nguyên lý hệ điều hành
4.12
Nguyễn Đức Thịnh - ĐHNNHN
Many-to-One
Nhiều user-level thread được ánh xạ tới một kernel thread
Ví dụ:
Solaris Green Threads
GNU Portable Threads
Nguyên lý hệ điều hành
4.13
Nguyễn Đức Thịnh - ĐHNNHN
Mô hình Many-to-One
Nguyên lý hệ điều hành
4.14
Nguyễn Đức Thịnh - ĐHNNHN
One-to-One
Mỗi user-level thread ánh xạ tới một kernel thread
Ví dụ:
Windows NT/XP/2000
Linux
Solaris 9 và các phiên bản về sau
Nguyên lý hệ điều hành
4.15
Nguyễn Đức Thịnh - ĐHNNHN
Mô hình One-to-one
Nguyên lý hệ điều hành
4.16
Nguyễn Đức Thịnh - ĐHNNHN
Many-to-Many
Cho phép nhiều user-level thread được ánh xạ tới nhiều kernel thread
OS có thể tạo một số lượng đủ các kernel thread
Solaris trước version 9
Windows NT/2000 với gói ThreadFiber
Nguyên lý hệ điều hành
4.17
Nguyễn Đức Thịnh - ĐHNNHN
Mô hình Many-to-Many
Nguyên lý hệ điều hành
4.18
Nguyễn Đức Thịnh - ĐHNNHN
Mô hình hai tầng
Tương tự như M:M, nhưng cho phép một user thread có thể gắn
(bound) với một kernel thread
Examples
IRIX
HP-UX
Tru64 UNIX
Solaris 8 về trước
Nguyên lý hệ điều hành
4.19
Nguyễn Đức Thịnh - ĐHNNHN
Mô hình hai tầng
Nguyên lý hệ điều hành
4.20
Nguyễn Đức Thịnh - ĐHNNHN
Thư viện về luồng
Thread library cung cấp các API để tạo và quản lý luồng
Hai cách cài đặt chính:
Thư viện được đặt hoàn toàn trong user space
Thư viện ở Kernel-level hỗ trợ bởi OS
Nguyên lý hệ điều hành
4.21
Nguyễn Đức Thịnh - ĐHNNHN
Pthreads
Có thể cài đặt ở user-level hoặc kernel-level
API theo chuẩn POSIX (IEEE 1003.1c) để tạo và đồng bộ hóa luồng
API xác định các hàm trong thread library, cài đặt dựa theo quá trình
phát triển của thư viện
Xuất hiện trong các UNIX OS (Solaris, Linux, Mac OS X)
Nguyên lý hệ điều hành
4.22
Nguyễn Đức Thịnh - ĐHNNHN
Java Threads
Java thread được quản lý bởi JVM
JVM được cài đặt dựa trên mô hình thread được cung cấp bởi
OS chủ
Java thread được tạo bởi:
Extending Thread class
Cài đặt một Runnable interface
Nguyên lý hệ điều hành
4.23
Nguyễn Đức Thịnh - ĐHNNHN
Các vấn đề
Ngữ nghĩa của lời gọi hệ thống fork() và exec()
Kết thúc luồng (Thread cancellation) của một luồng đích (target
thread)
Không đồng bộ (asynchronous) hoặc trì hoãn (deferred)
Thao tác tín hiệu (Signal handling)
Thread pools
Dữ liệu riêng của luồng (Thread-specific Data)
Kích hoạt bộ lập lịch (Scheduler activations)
Nguyên lý hệ điều hành
4.24
Nguyễn Đức Thịnh - ĐHNNHN
Ngữ nghĩa của fork() và exec()
Lời gọi fork() sẽ chỉ sao chép thread đã gọi nó hay tất cả các thread?
Nguyên lý hệ điều hành
4.25
Nguyễn Đức Thịnh - ĐHNNHN
Kết thúc luồng (Thread Cancellation)
Kết thúc một thread trước khi nó hoàn thành việc thực thi
Hai hướng tiếp cận chính:
Asynchronous cancellation kết thúc target thread ngay lập
tức.
Deferred cancellation cho phép target thread định kì kiểm tra
xem khi nào nó có thể kết thúc.
Nguyên lý hệ điều hành
4.26
Nguyễn Đức Thịnh - ĐHNNHN
Thao tác tín hiệu (Signal Handling)
Trong các hệ UNIX, tín hiệu (signal) được dùng để thông báo cho
một tiến trình biết về một sự kiện (event).
Signal handler được sử dụng để xử lý tín hiệu:
1.
Tín hiệu được sinh ra bởi một event nào đó
2.
Tín hiệu được truyền tới một tiến trình
3.
Tín hiệu được xử lý
Các lựa chọn:
Chuyển tín hiệu tới thread thích hợp
Chuyển tín hiệu tới mọi thread trong tiến trình
Chuyển tín hiệu tới một số thread trong tiến trình
Dùng một thread cụ thể để nhận mọi tín hiệu gửi tới tiến trình
Nguyên lý hệ điều hành
4.27
Nguyễn Đức Thịnh - ĐHNNHN
Thread Pools
Tạo trước một số thread trong một pool để chờ đợi công việc
Ưu điểm:
Xử lý một request bằng một thread sẵn có sẽ nhanh hơn tạo mới
Giới hạn số lượng thread trong ứng dụng bởi kích thước của pool
Nguyên lý hệ điều hành
4.28
Nguyễn Đức Thịnh - ĐHNNHN
Dữ liệu riêng (Thread Specific Data)
Mỗi thread có một bản copy của riêng nó đối với một số dữ liệu
Hữu ích khi ta không điều khiển quá trình tạo mới thread (ví dụ: khi sử
dụng một thread pool)
Nguyên lý hệ điều hành
4.29
Nguyễn Đức Thịnh - ĐHNNHN
Kích hoạt bộ lập lịch (Scheduler Activations)
Cả hai mô hình M:M và Two-level yêu cầu truyền thông để duy trì số
lượng kernel thread thích hợp được cấp phát cho ứng dụng
Scheduler activations cung cấp upcalls – cơ chế truyền thông từ
nhân tới thread library
Quá trình truyền thông này cho phép ứng dụng duy trì số lượng hợp
lý các kernel thread
Nguyên lý hệ điều hành
4.30
Nguyễn Đức Thịnh - ĐHNNHN
Các ví dụ
Windows XP Thread
Linux Thread
Nguyên lý hệ điều hành
4.31
Nguyễn Đức Thịnh - ĐHNNHN
Windows XP Thread
Nguyên lý hệ điều hành
4.32
Nguyễn Đức Thịnh - ĐHNNHN
Linux Thread
Nguyên lý hệ điều hành
4.33
Nguyễn Đức Thịnh - ĐHNNHN
Windows XP Thread
Cài đặt mô hình one-to-one tại kernel-level
Mỗi luồng gồm có:
Thread ID
Tập các thanh ghi
Hai ngăn xếp (stack) ở user và kernel level
Vùng lưu trữ dữ liệu riêng (thread-local data)
Tập các thanh ghi, ngăn xếp, và vùng lưu trữ dữ liệu riêng được gọi là
ngữ cảnh (context) của luồng
Cấu trúc dữ liệu chính cho một luồng gồm có:
ETHREAD (executive thread block)
KTHREAD (kernel thread block)
TEB (thread environment block)
Nguyên lý hệ điều hành
4.34
Nguyễn Đức Thịnh - ĐHNNHN
Linux Thread
Linux dùng thuật ngữ tasks thay cho threads
Tạo mới luồng thông qua lời gọi hệ thống clone()
clone() cho phép luồng con chia sẻ không gian địa chỉ với luồng cha
Nguyên lý hệ điều hành
4.35
Nguyễn Đức Thịnh - ĐHNNHN
Hết chương 4
Nguyên lý hệ điều hành
Nguyễn Đức Thịnh - ĐHNNHN