Báo cáo tiểu luận Đề tài: Thread

24 275 1
Báo cáo tiểu luận  Đề tài: Thread

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Báo cáo tiểu luận Đề tài: Thread Giảng viên: Lương Ngọc Khánh Sinh viên tham gia: Lê Quang Khải Nguyễn Văn Định Phạm Đình Thanh Quang 11/11/2010 Mục lục I Overview – Tổng quan Motivation – sử dụng multithread Benefits – Các lợi ích sử dụng multithread II Multithreading Model – Các mơ hình ứng dụng multithread Mơ hình Many-to-one Mơ hình One-to-one Mơ hình Many-to-many III Thread Library – thư viện lập trình thread Pthreads Win32 Threads 11 Java Threads 12 IV Thread issues – Các vấn đề liên quan đến sử dụng multithread 15 The fork() and exec() system call – Lời gọi hệ thống 15 Cancellation – Hủy thread 16 Signal Handling – Xử lí tín hiệu 16 Thread Pools 18 Thread-specific Data – Thông tin xác định Thread 20 Scheduler Activation – Kích hoạt định thời 20 Phụ lục 23 Thread I Overview – Tổng quan Thread đơn vị sử dụng tài nguyên CPU để thực thi công việc Một thread bao gồm thread ID, program counter, tập ghi stack Các thread process dùng chung tài nguyên hệ điều hành, thuộc process nên tất nhiên chia phần code section data section process Trước đây, process truyền thống (hay gọi heavyweight process) điều khiển thread Nếu process điều khiển nhiều thread, làm nhiều công việc thời điểm Hình ảnh mơ tả khác heavyweight process sử dụng thread so với multithreaded process với nhiều luồng xử lí lúc Tác dụng multithread: đáp ứng nhanh người dùng, chia sẻ tài nguyên trình, tính kinh tế, khả thuận lợi kiến trúc đa xử lý Motivation – nên sử dụng multithread Đa số phần mềm chạy hệ máy tính đại ngày thiết kế theo hướng multithread Thông thường, ứng dụng có process lại điều khiển nhiều thread lúc Ví dụ: - Một trình duyệt Web sử dụng thread để thực việc hiển thị hình ảnh nội dung hình, thread khác thực việc nhận thông tin gởi xuống từ server thông qua mạng internet - Một trình soạn thảo văn có thread dùng để hiển thị giao diện hình, thread khác nhận phím người dùng nhập vào từ bàn phím, thread dùng để kiểm tra lỗi ngữ pháp… từ background Trong số tình định, ứng dụng yêu cầu phải giải nhiều công việc giống thời điểm Ví dụ, web server cần phải đáp ứng yêu cầu từ phía máy khách (clients) để hiển thị nội dung trang web (hình ảnh, video, sound, text…) Xét trường hợp có đến hàng nghìn request từ clients gởi đến server lúc, server sử dụng single-thread process, phục vụ cho request thời điểm mà thôi, thời gian mà client phải đợi để đáp ứng lớn Một giải pháp đưa – server sử dụng process riêng biệt để đáp ứng yêu cầu từ máy khách, process tạo phục vụ cho client Thực tế, trước multithreaded process trở nên thơng dụng giải pháp sử dụng nhiều Tuy nhiên, biết, việc tạo process thường tiêu tốn nhiều thời gian tài nguyên, process tạo thực thi công việc tương tự process tạo từ trước lãng phí trở nên lớn Một giải pháp hiệu đưa sử dụng nhiều thread process Với giải pháp này, web server lắng nghe yêu cầu từ phía người dùng thread riêng biệt, request đáp ứng, tạo thread khác để thực yêu cầu thay tạo process khác Thread đóng vai trị quan trọng hệ thống sử dung lời gọi thủ tục xa RPCs (Remote Procedure Call system) 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 Thông thường, RPC server hỗ trợ multithread Khi server nhận thông điệp (message), đáp ứng yêu cầu message thread riêng biệt Nhờ đó, server đáp ứng nhiều yêu cầu gởi đến vào lúc Hiện nay, hầu hết hệ điều hành hỗ trợ multithread, số thread hoạt động nhân, thread thể cơng việc riêng biệt, cơng việc quản lí thiết bị xử lí interrupt Ví dụ, Solaris tạo tập hợp thread nhân dùng cho việc xử lí interrupt, cịn Linux lại dùng kernel thread để quản lí lượng nhớ trống hệ thống Benefits – Các lợi ích sử dụng multithread Các lợi ích việc lập trình ứng dụng multithread đề cấp đến vấn đề chính: - Khả đáp ứng: việc xây dựng ứng dụng tương tác sử dụng nhiều luồng xử lí cho phép chương trình tiếp tục chạy phần công việc bị block chương trình thực thao tác cần nhiều thời gian xử lí, nhờ tăng khả đáp ứng (responsiveness) cho người dùng Thí dụ, multithreaded web browser cho phép người dùng tương tác với thread, thực việc load hình ảnh từ server thread khác - Chia sẻ tài nguyên: Mặc định, thread chia sẻ nhớ tài nguyên process tạo chúng Thuận lợi việc dùng chung code data cho phép ứng dụng tạo nhiều thread thực công việc khác địa ô nhớ - Kinh tế: Việc cấp phát nhớ tài nguyên cho việc khởi tạo process thường tốn nhiều chi phí Bởi thread dùng chung tài ngun process tạo nó, tiết kiệm việc khởi tạo chuyển đổi trạng thái (context-switch) process Thực tế mà nói việc so sánh khác chi phí việc sử dụng process hay thread thường khó khăn, thơng thường việc tạo quản lí process tốn thời gian so với việc tạo thread Một ví dụ điển hình Solaris, việc tạo process chậm 30 lần so với tạo thread, thời gian để thực việc chuyển đổi trạng thái chậm khoảng lần Tận dụng kiến trúc đa nhân (multiprocessor architectures): lợi ích multithread tăng lên nhiều kiến trúc multiprocessor, thread thực thi song song processor khác Trong process sử dụng single thread chạy CPU, khơng quan tâm đến việc hệ thống có CPU, khơng tận dụng mạng hệ thống có nhiều chip xử lí trở nên phổ biến II Multithreading Model – Các mô hình ứng dụng multithread Ở phần một, tìm hiểu cách khái quát thread Tuy nhiên, hệ thống, thread chia thành loại tùy theo mức độ sử dụng Đó user thread – thread cung cấp mức độ người dùng – user level, kernel threads – cung cấp kernel User thread đứng kernel không chịu quản lí kernel, cịn kernel threads quản lí hỗ trợ trực tiếp hệ điều hành Hầu tất hệ điều hành nay, bao gồm Windows XP, Windows Vista, Linux, MAC OS X, Solaris, Tru64 UNIX (trước Digital UNIX) hỗ trợ kernel-thread Tất nhiên, user threads kernel threads phải tồn mối liên hệ định Có mơ hình phổ biến để thể mối quan hệ này, nội dung phần tìm hiểu cách thiết lập mối quan hệ loại mơ hình Mơ hình Many-to-one Mơ hình Many-to-One kết nối nhiều thread cấp độ người dùng (user level) vào kernel thread Việc quản lí thread thực cách hiệu thread library khu vực người dùng (user space) Tuy nhiên, nhược điểm mơ hình tồn q trình chạy bị block thread thuộc cấp độ người dùng thực lời gọi hệ thống block (system call dùng để tạm dừng hoạt động) Ngồi ra, có thread truy cập vào kernel vào thời điểm, khơng thể chạy song song nhiều thread hệ thống đa nhân - multiprocessors Ví dụ điển hình thư viện thread sử dụng model Green threads dùng Solaris GNU Portable Threads Mơ hình Many-to-One Mơ hình One-to-one Mơ hình One-to-One liên kết user-thread với kernel-thread Mơ hình cung cấp giải pháp để giải hạn chế mơ hình Many-to-One cách cho phép user-thread khác tiếp tục thực thi có thread thực blocking system call Hơn nữa, mơ hình cho phép nhiều threads phép thực thi song song hệ thống multiprocessor Điều hạn chế mơ hình để tạo userthread yêu cầu phải tạo kernel-thread tương đương Bởi chi phí dành cho việc tạo kernel-thread cản trở hiệu suất làm việc ứng dụng nên hầu hết thư viện, hệ thống sử dụng mơ hình giới hạn số lượng threads định Linux, với dòng hệ điều hành Windows - bao gồm Windows 95, Windows 98, NT, 2000 Windows XP sử dụng mơ hình one-to-one Mơ hình One-to-One Mơ hình Many-to-many Mơ hình Many-to-Many tạo mối liên kết nhiều user-level threads với số kernel threads, số lượng kernel threads khơng vượt q user threads (xem hình) Số lượng kernel-thread xác định tùy theo loại ứng dụng loại máy (Ứng dụng chạy hệ thống đa nhân cấp phát nhiều kernel-threads so với hệ thống đơn nhân) Trong mơ hình many-to-one cho phép developer tạo user threads tùy thích, việc thực thi đồng thời thread khơng thể, kernel xếp (schedule) cho thread thời điểm mà thơi Cịn one-to-one model, thread thực thi song song, nhiên người phát triển cần phải lưu ý đến việc không phép tạo nhiều threads ứng dụng (và số trường hợp số lượng thread phép tạo bị giới hạn) Mô hình many-to-many khắc phục nhược điểm mơ hình trên: developers tạo số lượng user threads cần thiết vừa đủ, kernel thread tương ứng thực thi song song hệ thống multiprocessor Ngoài ra, thread thực blocking system call, kernel schedule cho thread khác bắt đầu thực thi Mơ hình Many-to-Many Một biến thể thơng dụng mơ hình Many-to-Many - bên cạnh chế thiết lập mối liên hệ kernel threads user threads giống mơ hình many-to-many, biến thể cho phép user thread nối với kernel thread – gọi mơ hình two-level Mơ hình hỗ trợ hệ điều hành IRIX, HP-UX Tru64 UNIX Hệ điều hành Solaris hỗ hỗ trợ model phiên đời trước Solaris 9, từ phiên thứ trở đi, Solaris chuyển sang sử dụng hô hình one-to-one Mơ hình Two-Level III Thread Library – thư viện lập trình thread Một thread library cung cấp cho lập trình viên giao diện API, hỗ trợ việc khởi tạo quản lí thread Có cách để cài đặt thread library - - Cách 1: Cung cấp thư viện hoàn chỉnh khu vực người dùng, không hỗ trợ kernel threads Tất code data structures dùng cho library nằm user space Điều nghĩa việc gọi hàm từ library cho kết local function call user space system call Cách 2: cài đặt thư viện cung cấp API để thao tác với thread kernel-level hỗ trợ trực tiếp hệ điều hành Trong trường hợp này, code data structures dùng library tồn kernel space Gọi hàm API thực system call đến kernel Hiện nay, loại thread library chủ yếu sử dụng gồm có: (1) POSIX Pthreads, (2) Win32, (3) Java Pthreads – POSIX thread cung cấp user kernel-level library Win32 thread library thư viện cung cấp kernel-level thread dùng hệ thống sử dụng Windows Java thread API cho phép khởi tạo thread quản lí trực tiếp chương trình Java Thông thường, hệ thống sử dụng Windows, Java threads sử dụng Win32 API, Pthreads hệ thống UNIX Linux Trong phần lại section trình bày cách tạo thread sử dụng thư viện kể Và để dễ hiểu, làm ví dụ chương trình multithread tính tổng số ngun khơng âm Pthreads Pthreads phần POSIX standard (IEEE 1003.1c) định nghĩa giao diện lập trình ứng dụng (API) cho việc tạo đồng threads Đây thư viện cung cấp mô tả chi tiết (specification) hoạt động thread theo ý muốn người dùng, thư viện cung cấp cho người dùng giao diện cài đặt (implementation) Những người phát triển hệ điều hành sử dụng mơ tả theo cách họ muốn Nhiều hệ thống sử dụng Pthreads bao gồm Solaris, Linux, Mac OS X Tru64 UNIX Đoạn chương trình sử dụng ngơn ngữ C trình bày cách tạo chương trình multithread sử dụng Pthreads API với chức tính tổng số ngun khơng âm thread riêng biệt Trong chương trình sử dụng Pthreads, threads riêng biệt bắt đầu việc thực thi hàm xác định, ví dụ hàm runner() Khi chương trình khởi chạy, thread điều khiển tạo hàm main() Sau đó, thread thứ tạo hàm runner() Cả thread dùng chung biến toàn cục sum #include #include int sum; /* this data is shared by the thread(s) */ void *runner(void *param); /*the thread*/ int main(int argc, char *argv[]) { pthread_t tid; /* the thread identifier */ pthread_attr_t attr; /* set of thread attributes */ if (argc != 2) { fprintf (stderr, "usage: a.out \n"); return -1; } if (atoi(argv[1] < 0) { fprintf (stderr, "%d must be >= 0\n", atoi(argv[1])); return -1; } /* get the default attributes */ pthread_attr_init (&attr); /* create the thread */ pthread_create (&tid, &attr, runner, argv[1]); /* wait for the thread to exit */ pthread_join(tid, NULL); printf ("sum = %d\n", sum); } /* The thread will begin control in this function */ void *runner(void *param) { int i, upper = atoi(param); sum = 0; for (i = 1; i

Ngày đăng: 21/05/2019, 14:51

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan