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