1. Trang chủ
  2. » Công Nghệ Thông Tin

Đề tài khoa học - Tìm hiểu cơ chế phân luồng trong các chương trình java - Học viện Kỹ thuật Mật mã

44 473 1

Đ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

Thông tin cơ bản

Định dạng
Số trang 44
Dung lượng 268,28 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Tìm hiểu cơ chế phân luồng trong các chương trình javaTìm hiểu cơ chế phân luồng trong các chương trình javaTìm hiểu cơ chế phân luồng trong các chương trình javaTìm hiểu cơ chế phân luồng trong các chương trình javaTìm hiểu cơ chế phân luồng trong các chương trình javaTìm hiểu cơ chế phân luồng trong các chương trình javaTìm hiểu cơ chế phân luồng trong các chương trình javaTìm hiểu cơ chế phân luồng trong các chương trình java

Trang 1

HỌC VIỆN KĨ THUẬT MẬT MÃ

KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO ĐỀ TÀI

Tìm hiểu cơ chế phân luồng trong các chương trình java

Giáo viên hướng dẫn: Lê Đức Thuận

Lê Thị HàBùi Trọng LongNguyễn Bá CảnhLại Thu Hoài

Trang 3

1.8 Luồng Solaris 2

Phần 3: Luồng trong java

2.1 Khái niệm luồng trong java

2.2 Cách tạo luồng trong java

2.3 Một số thông tin liên quan đến luồng 2.3.1 ThreadID

2.3.2 ThreadName

2.3.3 Độ ưu tiên của luồng (Priority)

2.3.4 Độ lớn ngăn xếp của luồng (StackSize) 2.4 Nhóm luồng

2.5 Các trạng thái của luồng

2.6 Đồng bộ hóa các luồng thi hành

Phần 4 : Ứng dụng

Trang 4

LỜI MỞ ĐẦU

Ngày nay, với sự phát triển với tốc độ chóng mặt của khoa học kỹ thuật, một

kỷ nguyên mới được mở ra, kỷ nguyên của công nghệ thông tin Nhu cầu của loài người ngày càng lớn, đặc biệt là các ngành khoa học kỹ thuật khác đều cần đến sự

hổ trợ của công nghệ thông tin, mặc dù công nghệ phần cứng phát triển rất nhanh, CPU với tốc độ xử lý ngày càng cao, nhưng lại nảy sinh nhiều bài toán trong thực

tế sản xuất đòi hỏi phải xử lí nhanh hơn nữa

Vấn đề xử lý song song đang ngày càng được nghiên cứu nhiều để giải quyếtmột số bài toán mà thực tiễn đang đặt ra, những vấn đề cần có kết quả trong thời gian thực như: bài toán dự báo thời tiết, điều tiết giao thông, điều khiển các con tàu

vũ trụ,các bài toán về mô phỏng…Vì vậy, việc nghiên cứu các giải thuật cho xử lý song song là một yêu cầu và là một thách thức cho các nhà khoa học liên quan đến khoa học máy tính Java ra đời trong sự dự đoán trước những gì sẽ xảy ra trong thế giới của công nghệ máy tính, nó hỗ trợ cho việc xử lý song song với cơ chế đa luồng

Nhưng trong lĩnh vực giáo dục thì lượng tài liệu nói về lập trình đa luồng nóichung và lập trình đa luồng trong Java còn tương đối ít và trình bầy chưa sâu, nhất

Trang 5

là các ví dụ minh họa cho cơ chế lập trình này có thể nói là hiếm Nội dung đề tài này sẽ cố gắng làm rõ một số khái niệm cơ bản của lập trình đa luồng trong Java vàcài đặt chương trình ứng dụng minh họa.

Phần 2 Tổng quan về luồng

1.1 Khái niệm

- Luồng là một cách thông dụng để nâng cao năng lực xử lý của các ứng dụng nhờ vào cơ chế song song

- Một luồng là một đơn vị cơ bản của việc sử dụng CPU

- Nó hình thành gồm: một định danh luồng (thread ID), một bộ đếm chương trình, tập thanh ghi và ngăn xếp

Trang 6

- Nó chia sẻ với các luồng khác thuộc cùng một quá trình một không gian địa chỉ.Nhờ đó các luồng có thể sử dụng các biến toàn cục, chia sẻ các tài nguyên.

- Cách thức các luồng chia sẻ CPU cũng giống như cách thức của các quá trình

- Một luồng cũng có những trạng thái: đang chạy (running), sẵn sàng (ready), nghẽn (blocked) và kết thúc (dead) Một luồng thì được xem như là một quá trình nhẹ

Nhờ vào luồng, người ta thiết kế các server có thể đáp ứng nhiều yêu cầu một cách đồng thời

Các bước tổng quát của một server phục vụ song song

Server phục vụ song song gồm hai phần thực hiện song song nhau:

- Phần 1 ( Dispatcher thread ): Xử lý các yêu cầu kết nối, lặp lại các công việc sau:

+ Lắng nghe yêu cầu kết nối của clients

+ Chấp nhận một yêu cầu kết nối

Tạo kênh giao tiếp ảo mới với clients

Tạo phần 2 để xử lý các thông điệp yêu cầu của clients

- Phần 2 (Worker Thread): Xử lý các thông điệp yêu cầu từ clients, lặp lại các công việc sau:

+ Chờ nhận thông điệp yêu cầu của clients

Trang 7

+ Phân tích và xử lý yêu cầu.

+ Gửi thông điệp trả lời cho clients

Phần 2 sẽ kết thúc khi kênh ảo bị xóa đi

Với mỗi client, trên server sẽ có một Phần 2 để xử lý yêu cầu của clients Như vậy tại thời điểm bất kỳ luôn tồn tại một Phần 1 và 0 hoặc nhiều Phần 2

Do phần 2 thực thi song song với phần 1 cho nên nó được thiết kế là một thread

- Nhìn từ góc độ hệ điều hành, luồng có thể được cài đặt ở một trong hai mức:

• Trong không gian người dùng (user space)

• Trong không gian nhân (kernel mode)

1.2 Luồng ở mức người dùng

Hình 1.1 Kiến trúc luồng cài đặt ở mức người dùng

được hỗ trợ dưới nhân và được cài đặt bởi thư viện luồng tại cấp người dùng Thư viện cung cấp hỗ trợ

Trang 8

cho việc tạo luồng, lập thời biểu, và quản lý mà không có sự hỗtrợ từ nhân Vì nhân không biết các luồng

cấp người dùng, tất cả việc tạo luồng và lập thời biểu được thực hiện trong không gian người dùng mà

không cần sựcan thiệp của nhân Do đó, các luồng cấp người dùng thường tạo và quản lý nhanh, tuy

nhiên chúng cũng có những trởngại Thí dụ, nếu nhân là đơn luồng thì bất cứ luồngcấp người dùng thực

hiện một lời gọi hệ thống nghẽn sẽ làm cho toàn bộ quá trình bị nghẽn, thậm chí nếu các luồng khác sẳn

dùng để chạy trong ứng dụng Các thư viện luồng người dùng gồm các luồng POSIX Pthreads, Mach C-threads và Solaris 2 UIthreads

Không gian người dùng bao gồm một hệ thống runtime mà nó tập hợp những thủ tục quản lý luồng Các

luồng chạy trong không gian nằm bên trên hệ thống runtime thì được quản lý bởi

Trang 9

Tiếp cận này có hai mức định thời biểu (Scheduling): bộ định thời biểu cho các quátrình nặng và bộ định

thời biểu trong hệ thống runtime Bộ lập biểu của hệ thống runtime chia thời gian

sử dụng CPU được cấp

cho một quá trình thành những khoảng nhỏ hơn để cấp cho các luồng trong quá trình đó Như vậy việc

kết thúc một luồng thì vượt ra ngoài tầm kiểm soát của kernel hệ thống

1.3 Luồng ở mức hạt nhân hệ điều hành

Trang 10

xử lý, nhân có thểlập thời biểu luồng trên một bộxửlý khác Hầu hết các hệ điều hành hiện nay như

Windows NT, Windows 2000, Solaris 2, BeOS và Tru64 UNIX (trước Digital UNIX)-hỗtrợ các luồng nhân

Trong tiếp cận này không có hệ thống runtime và các luồng thì được quản lý bởi kernel của hệ điều

hành Vì vậy, bảng thông tin trạng thái của tất cả các luồng thì được lưu trữ bởi kernel Tất cả những lời

gọi mà nó làm nghẽn luồng sẽ được bẫy (TRAP) đến kernel Khi một luồng bị nghẽn, kernel chọn luồng

khác cho thực thi Luồng được chọn có thể cùng một quá trình với luồng bị nghẽn hoặc thuộc một quá

trình khác, vì vậy sự tồn tại của một luồng thì được biết bởi kernel và chỉ có một mức lập biểu trong hệ

Trang 11

1.4.2 Mô hình một-một

Trang 12

Mô hình một-một (hình 1.4) ánh xạ mỗi luồng người dùng tới một luồng nhân Nó cung cấp khả năng

đồng hành tốt hơn mô hình nhiều-một bằng cách cho một uồng khác chạy khi một luồng thực hiện lời

gọi hệ thống nghẽn; nó cũng cho phép nhiều luồng chạy song song trên các bộ xử

này giới hạn số luồng được hỗ trợ bởi hệ thống Windows NT,

Windows 2000 và OS/2 cài đặt mô hình một-một này

Trang 14

Trong khi 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 như họ muốn, thì

đồng hành thật sự là không đạt được vì nhân có thểl ập thời biểu chỉ một luồng tại một thời điểm Mô

hình một-một cho phép đồng hành tốt hơn nhưng người phát triển phải cẩn thận không tạo ra quá

nhiều luồng trong một ứng dụng Mô hình nhiều-nhiều gặp phải một trong hai vấn

Trang 15

Hình 1.5 mô hình nhiều - nhiều

1.5 cấp phát luồng

1.5.1 Lời gọi hệ thống fork và exec

Trong chương trước chúng ta mô tả lời gọi hệ thống fork được dùng để tạo một quá trình bản sao

Riêng như thế nào Trong một chương trình đa luồng, ngữ nghĩa của các lời gọi hệthống fork và

Exec thay đổi Nếu một luồng trong lời gọi chương trình fork thì quá trình mới saochép lại quá trình tất

Trang 16

cả luồng hay là một quá trình đơn luồng mới? Một số hệ thống UNIX chọn hai ấn bản fork, một sao chép

lại tất cảluồng và một sao chép lại chỉluồng được nạp lên lời gọi hệ thống fork Lờigọi hệ thống exec

điển hình thực hiện công việc trong cùng một cách như được mô tảtrong chương trước Nghĩa là, nếu

một luồng nạp lời gọi hệ thống exec, chương trình được xác định trong tham số exec sẽ thay thế toàn

bộ quá trình-chứa tất cảluồng và các quá trình tải nhẹ Việc sử dụng hai ấn bản forkphụthuộc vào ứng

dụng Nếu exec bịhủy tức thì sau khi phân nhánh (forking) thì sựsao chép lại tất cảluồng là không cần

thiết khi chương trình được xác định trong các tham số exec sẽt hay thế quá trình Trong trường hợp

này, việc sao chép lại chỉ gọi luồng hợp lý Tuy nhiên, nếu quá trình riêng biệt nàykhông gọi exec sau khi phân nhánh thì quá trình riêng biệt này nên sao chép lại tất

Trang 17

Một trường hợp khác có thể xảy ra khi người dùng nhấn một nút trên trình duyệt web để dừng trang

web đang được tải Thường một trang web được tải trong một luồng riêng Khi người dùng nhấn nút

stop, luồng đang nạp trang bịhủy bỏ Một luồng bị hủy thường được xem như luồng đích Sự hủy bỏ một

luồng đích có thểxảy ra hai viễn cảnh khác nhau:

• Hủy bất đồng bộ: một luồng lập tức kết thúc luồng đích

• Hủy trì hoãn: luồng đích có thể kiểm tra định kỳ nếu nó sắp kết thúc, cho phép luồng đích một cơ hội

tự kết thúc trong một cách có thứ tự Sựkhó khăn của việc hủy này xảy ra trong những trường hợp khi

tài nguyên được cấp phát tới một luồng bị hủy hay một luồng bị hủy trong khi việc cập nhật dữliệu xảy

ra giữa chừng, nó đang chia sẻ với các luồng khác Điều này trởnên đặc biệt khó khăn với sựhủy bất

đồng bộ Hệ điều hành thường đòi lại tài nguyên hệ thống từ luồng bị hủy nhưng thường nó sẽ không

đòi lại tất cả tài nguyên Do đó, việc hủy một luồng bất đồng bộ có thể không giải phóng hết tài nguyên

hệ thống cần thiết Một chọn lựa khác, sự hủy trì hoãn thực hiện bằng một luồng báo hiệu rằng một

Trang 18

luồng đích bị này cho phép một luồng kiểm tra nếu nó sẽ bị hủy tại điểm nó có thể

an toàn bị hủy

Pthreads gọi những điểm như thế là các điểm hủy (cancellation points) Hầu hết

hệ điều hành cho phép một quá trình hay một luồng bị hủy bất đồng bộ Tuy nhiên,Pthread API cung cấp sự hủy trì hoãn Điều này có nghĩa rằng một hệ điều hành càiđặt Pthread API sẽ cho phép sự hủy có trì hoãn

1.6 Nhóm luồng

Trong phần trước, chúng ta mô tả kịch bản đa luồng của một trình phục vụ web.Trong trường hợp này, bất cứ khi nào trình phục vụ nhận một yêu cầu, nó tạo mộtluồng riêng để phục vụ yêu cầu đó Ngược lại, tạo một luồng riêng thật sự cao hơntạo một quá trình riêng, dù sao một trình phục vụ đa luồng có thể phát sinh vấn đề.Quan tâm đầu tiên là lượng thời gian được yêu cầu để tạo luồng trước khi phục vụyêu cầu, và lượng thời gian xoá luồng khi nó hoàn thành Vấn đề thứ hai là vấn đềkhó giải quyết hơn: nếu chúng ta cho phép tất cả yêu cầu đồng hành được phục vụtrong một luồng mới, chúng ta không thay thế giới hạn trên số lượng luồng hoạtđộng đồng hành trong hệ thống Những luồng không giới hạn có thể làm cạn kiệttài nguyên hệ thống, như thời gian CPU và bộ nhớ Một giải pháp cho vấn đề này

là sử dụng nhóm luồng

Ý tưởng chung nằm sau nhóm luồng là tạo số lượng luồng tại thời điểm khởi động

và đặt chúng vào nhóm, nơi chúng ngồi và chờ công việc Khi một trình phục vụnhận một yêu cầu, chúng đánh thức một luồng từ nhóm- nếu một luồng sẳn dùng –truyền nó yêu cầu dịch vụ Một khi luồng hoàn thành dịch vụ của nó, nó trả vềnhóm đang 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ờ cho tới khi nó rảnh

Trang 19

Nói cụ thể, các lợi ích của nhóm luồng là:

Thường phục vụ yêu cầu nhanh hơn với luồng đã có hơn là chờ để tạo luồng

Một nhóm luồng bị giới hạn số lượng luồng tồn tại bất kỳ thời điểm nào Điều này đặc biệt quan trọng trên những hệ thống không hỗ trợ số lượng lớn các luồng đồng hành

Số lượng luồng trong nhóm có thể được đặt theo kinh nghiệm (heuristics) dựa trêncác yếu tố như số CPU trong hệ thống, lượng bộ nhớ vật lý và số yêu cầu kháchhàng đồng hành Kiến trúc nhóm luồng tinh vi hơn có thể tự điều chỉnh số lượngluồng trong nhóm dựa theo các mẫu sử dụng Những kiến trúc như thế cung cấp lợiđiểm xa hơn của các nhóm luồng nhỏ hơn-do đó tiêu tốn ít bộ nhớ hơn-khi việcnạp trên hệ thống là chậm

1.7 Pthreads

Pthreads tham chiếu tới chuẩn POSIX (IEEE 1003.1c) định nghĩa API cho việc tạo

và đồng bộ luồng Đây là một đặc tả cho hành vi luồng không là một cài đặt.Người thiết kế hệ điều hành có thể cài đặt đặc tả trong cách mà họ muốn Thôngthường, các thư viện cài đặt đặc tả Pthread bị giới hạn đối với các hệ thống dựatrên cơ sở của UNIX như Solaris 2 Hệ điều hành Windows thường không hỗ trợPthreads mặc dù các ấn bản shareware là sẳn dùng trong phạm vi công cộng

Trong phần này chúng ta giới thiệu một số Pthread API như một thí dụ cho thưviện luồng cấp người dùng Chúng ta sẽ xem nó như thư viện cấp người dùng vìkhông có mối quan hệ khác biệt giữa một luồng được tạo dùng Pthread và luồngđược gắn với nhân Chương trình C hiển thị trong hình dưới đây, mô tả mộtPthread API cơ bản để xây dựng một chương trình đa luồng

Trang 20

Chương trình hiển thị trong hình tạo một luồng riêng xác định tính tổng của một sốnguyên không âm Trong chương trình Pthread, các luồng riêng bắt đầu thực thitrong một hàm xác định Trong hình, đây là một hàm runner Khi chương trình nàybắt đầu, một luồng riêng điều khiển bắt đầu trong main Sau khi khởi tạo, main tạo

ra luồng thứ hai bắt đầu điều khiển trong hàm runner

Bây giờ chúng ta sẽ cung cấp tổng quan của chương trình này chi tiết hơn Tất cảchương trình Pthread phải chứa tập tin tiêu đề pthread.h pthread_t tid khai báodanh biểu cho luồng sẽ được tạo Mỗi luồng có một tập các thuộc tính gồm kíchthước ngăn xếp và thông tin định thời Khai báo pthread_attr_t attr hiện diện cácthuộc tính cho luồng Chúng ta sẽ thiết lập các thuộc tính trong gọi hàmpthread_attr_init(&attr) Vì chúng ta không thiết lập rõ thuộc tính, chúng ta sẽdùng thuộc tính mặc định được cung cấp Một luồng riêng được tạo với lời gọihàm pthread_create Ngoài ra, để truyền định danh của luồng và các thuộc tính choluồng, chúng ta cũng truyền tên của hàm, nơi một luồng mới sẽ bắt đầu thực thi,trong trường hợp này là hàm runner Cuối cùng chúng ta sẽ truyền số nguyên đượccung cấp tại 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 trong main và luồng thựchiện việc tính tổng trong hàm runner Sau khi tạo luồng thứ hai, luồng main sẽ chờcho luồng runner hoàn thành bằng cách gọi hàm pthread_join Luồng runner sẽhoàn thành khi nó gọi hàm pthread_exit

#include<pthread>

#include<stdio.h>

int sum: /*Dữ liệu này được chia sẻ bởi thread(s)*/

void *runner(void *param); /*luồng*/

main(int argc, char *argv[])

Trang 21

pthread_t tid; /*định danh của luồng*/

pthread_attr_t attr; /*tập hợp các thuộc tính*/if(argc !=2){

fprintf(stderr, “usage: a.out <integer value>”);exit();

Trang 22

int upper = atoi(param);

Luồng cấp nhân chuẩn thực thi tất cả thao tác trong nhân Mỗi LWP có một luồngcấp nhân, và một số luồng cấp nhân (kernel) chạy trên một phần của nhân vàkhông có LWP kèm theo (thí dụ, một luồng phục vụ yêu cầu đĩa ) Các luồng cấp

Trang 23

nhân chỉ là những đối tượng được định thời trong hệ thống Solaris 2 cài mô hìnhnhiều-nhiều; toàn bộ hệ thống luồng của nó được mô tả trong hình dưới đây:

Hình 1.6-Luồng Solaris 2

Các luồng cấp người dùng có thể giới hạn hay không giới hạn Một luồng cấpngười dùng giới hạn được gán vĩnh viễn tới một LWP Chỉ luồng đó chạy trênLWP và yêu cầu LWP có thể được tận hiến tới một bộ xử lý đơn (xem luồng tráinhất trong hình trên) Liên kết một luồng có ích trong trường hợp yêu cầu thời gianđáp ứng nhanh, như ứng dụng thời thực Một luồng không giới hạn gán vĩnh viễntới bất kỳ LWP nào Tất cả các luồng không giới hạn được đa hợp trong một nhómcac LWP sẳn dùng cho ứng dụng Các luồng không giới hạn là mặc định Solaris 8cũng cung cấp một thư viện luồng thay đổi mà mặc định chúng liên kết tới tất cảcác luồng với một LWP

Xem xét hệ thống trong hoạt động: bất cứ một quá trình nào có thể có nhiều luồngngười dùng Các luồng cấp người dùng này có thể được định thời và chuyển đổigiữa LWPs bởi thư viện luồng không có sự can thiệp của nhân Các luồng cấpngười dùng cực kỳ hiệu quả vì không có sự hỗ trợ nhân được yêu cầu cho việc tạo

Ngày đăng: 15/03/2015, 17:27

HÌNH ẢNH LIÊN QUAN

Hình 1.2 kiến trúc cài đặt ở mức hệ thống - Đề tài khoa học - Tìm hiểu cơ chế phân luồng trong các chương trình java - Học viện Kỹ thuật Mật mã
Hình 1.2 kiến trúc cài đặt ở mức hệ thống (Trang 9)
Hình 1.3 mô hình nhiều – một - Đề tài khoa học - Tìm hiểu cơ chế phân luồng trong các chương trình java - Học viện Kỹ thuật Mật mã
Hình 1.3 mô hình nhiều – một (Trang 11)
Hình 1.4 mô hình một -  một - Đề tài khoa học - Tìm hiểu cơ chế phân luồng trong các chương trình java - Học viện Kỹ thuật Mật mã
Hình 1.4 mô hình một - một (Trang 13)
Hình 1.5 mô hình nhiều - nhiều - Đề tài khoa học - Tìm hiểu cơ chế phân luồng trong các chương trình java - Học viện Kỹ thuật Mật mã
Hình 1.5 mô hình nhiều - nhiều (Trang 15)
Hình 1.6-Luồng Solaris 2 - Đề tài khoa học - Tìm hiểu cơ chế phân luồng trong các chương trình java - Học viện Kỹ thuật Mật mã
Hình 1.6 Luồng Solaris 2 (Trang 23)
Hình 1.7-Quá trình Solaris 2 - Đề tài khoa học - Tìm hiểu cơ chế phân luồng trong các chương trình java - Học viện Kỹ thuật Mật mã
Hình 1.7 Quá trình Solaris 2 (Trang 25)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w