Đề 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 471 1
Đề 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ã

Đ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

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

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 chế phân luồng chương trình java Giáo viên hướng dẫn: Lê Đức Thuận Sinh Viên: Nguyễn Văn Ba Lê Thị Hà Bùi Trọng Long Nguyễn Bá Cảnh Lại Thu Hoài MỤC LỤC Phần 1: Lời mở đầu Phần 2: Tổng quan luồng 1.1 Khái niệm 1.2 Luồng mức người dùng 1.3 Luồng mức hạt nhân hệ điều hành 1.4 Các loại cài đặt luồng 1.5 Cấp phát luồng 1.6 Nhóm luồng 1.7 Pthreads 1.8 Luồng Solaris Phần 3: Luồng java 2.1 Khái niệm luồng java 2.2 Cách tạo luồng 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 luồng (Priority) 2.3.4 Độ lớn ngăn xếp luồng (StackSize) 2.4 Nhóm luồng 2.5 Các trạng thái luồng 2.6 Đồng hóa luồng thi hành Phần : Ứng dụng LỜI MỞ ĐẦU Ngày nay, với phát triển với tốc độ chóng mặt khoa học kỹ thuật, kỷ nguyên mở ra, kỷ nguyên công nghệ thông tin Nhu cầu loài người ngày lớn, đặc biệt ngành khoa học kỹ thuật khác cần đến hổ trợ công nghệ thông tin, công nghệ phần cứng phát triển nhanh, CPU với tốc độ xử lý ngày cao, lại nảy sinh nhiều toán thực tế sản xuất địi hỏi phải xử lí nhanh Vấn đề xử lý song song ngày nghiên cứu nhiều để giải số toán mà thực tiễn đặt ra, vấn đề cần có kết thời gian thực như: toán dự báo thời tiết, điều tiết giao thông, điều khiển tàu vũ trụ,các tốn mơ phỏng…Vì vậy, việc nghiên cứu giải thuật cho xử lý song song yêu cầu thách thức cho nhà khoa học liên quan đến khoa học máy tính Java đời dự đốn trước xảy giới cơng nghệ máy tính, hỗ trợ cho việc xử lý song song với chế đa luồng Nhưng lĩnh vực giáo dục lượng tài liệu nói lập trình đa luồng nói chung lập trình đa luồng Java cịn tương đối trình bầy chưa sâu, ví dụ minh họa cho chế lập trình nói Nội dung đề tài cố gắng làm rõ số khái niệm lập trình đa luồng Java cài đặt chương trình ứng dụng minh họa Phần Tổng quan luồng 1.1 Khái niệm - Luồng cách thông dụng để nâng cao lực xử lý ứng dụng nhờ vào chế song song - Một luồng đơn vị việc sử dụng CPU - Nó 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 q trình khơng gian địa Nhờ luồng sử dụng biến tồn cục, chia sẻ tài nguyên - Cách thức luồng chia sẻ CPU giống cách thức trình - Một luồng có trạng thái: chạy (running), sẵn sàng (ready), nghẽn (blocked) kết thúc (dead) Một luồng xem trình nhẹ Nhờ vào luồng, người ta thiết kế server đáp ứng nhiều yêu cầu cách đồng thời Các bước tổng quát server phục vụ song song Server phục vụ song song gồm hai phần thực song song nhau: - Phần ( Dispatcher thread ): Xử lý yêu cầu kết nối, lặp lại công việc sau: + Lắng nghe yêu cầu kết nối clients + Chấp nhận yêu cầu kết nối Tạo kênh giao tiếp ảo với clients Tạo phần để xử lý thông điệp yêu cầu clients - Phần (Worker Thread): Xử lý thông điệp yêu cầu từ clients, lặp lại công việc sau: + Chờ nhận thông điệp yêu cầu clients + Phân tích xử lý yêu cầu + Gửi thông điệp trả lời cho clients Phần kết thúc kênh ảo bị xóa Với client, server có Phần để xử lý yêu cầu clients Như thời điểm tồn Phần nhiều Phần Do phần thực thi song song với phần thiết kế thread - Nhìn từ góc độ hệ điều hành, luồng cài đặt 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 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 sự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 Không gian người dùng bao gồm hệ thống runtime mà tập hợp thủ tục quản lý luồng Các luồng chạy không gian nằm bên hệ thống runtime quản lý hệ thống Hệ thống runtime lưu giữ bảng tin trạng thái để theo dõi trạng thái hành luồng Tương ứng với luồng có mục từ bảng, bao gồm thông tin trạng thái, giá trị ghi, độ ưu tiên thơng tin khác luồng Tiếp cận có hai mức định thời biểu (Scheduling): định thời biểu cho trình nặng định thời biểu hệ thống runtime Bộ lập biểu hệ thống runtime chia thời gian sử dụng CPU cấp cho trình thành khoảng nhỏ để cấp cho luồng q trình Như việc kết thúc luồng vượt ngồi tầm kiểm soát kernel hệ thống 1.3 Luồng mức hạt nhân hệ điều hành Hình 1.2 kiến trúc cài đặt mức hệ thống 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 có thể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 có thểlập thời biểu luồng bộ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 Trong tiếp cận khơng có hệ thống runtime luồng quản lý kernel hệ điều hành Vì vậy, bảng thơng tin trạng thái tất luồng lưu trữ kernel Tất lời gọi mà làm nghẽn luồng bẫy (TRAP) đến kernel Khi luồng bị nghẽn, kernel chọn luồng khác cho thực thi Luồng chọn trình với luồng bị nghẽn thuộc trình khác, tồn luồng biết kernel có mức lập biểu hệ thống 1.4 Các loại cài đặt luồng 1.4.1 Mơ hình nhiều-một Mơ hình nhiều-một (nhưhình 1.3) ánh xạ nhiều luồng cấp người dùng tới Hình 1.3 mơ hình nhiều – một luồng cấp nhân Quản lý luồng thực khơng gian người dùng hiệu tồn bộ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ý Greenthreads-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 t1.start(); t2.start(); t3.start(); } } 2.3 Một số thông tin liên quan đến luồng (ThreadID,ThreadName,Piority,StackSize) Luồng thành lập định danh (ThreadID), Bộ đếm chương trình (Counter), Tập Thanh Ghi (Register) Ngăn xếp (Stack) Các luồng có độ ưu tiên (Priority) định Trong phần đề cập chi tiết đến thông tin bao gồm: + ThreadID + ThreadName + Priority + StackSize 2.3.1 ThreadID ThreadID định danh luồng, dùng để phân biệt với luồng khác tiến trình tập luồng Đây thơng số mà máy ảo java tự tạo ta tạo luồng nên ta sửa đổi áp đặt thơng số tạo luồng Nhưng ta lấy thơng qua phương thức getId() lớp Thread VD (Sử dụng lại lớp ThreadX khai báo ): PHP Code: public class Main { public static void main(String[] args) { ThreadX t1=new ThreadX("Luồng thứ 1:"); ThreadX t2=new ThreadX("Luồng thứ 2:"); ThreadX t3=new ThreadX("Luồng thứ 3:"); System.out.println("ID luồng 1:"+t1.getId()); System.out.println("ID luồng 2:"+t2.getId()); System.out.println("ID luồng 3:"+t3.getId()); t1.start(); t2.start(); t3.start(); } } 2.3.2 ThreadName ThreadName tên luồng, thuộc tính mà ta đặt không đặt cho luồng Nếu ta không đặt cho luồng máy ảo java tự đặt với quy tắc sau: “Thread-” + Thứ tự luồng tạo ra, VD: PHP Code: package MultiThread; public class Main { public static void main(String[] args) { ThreadX t1=new ThreadX("Luồng thứ 1:"); ThreadX t2=new ThreadX("Luồng thứ 2:"); ThreadX t3=new ThreadX("Luồng thứ 3:"); System.out.println("Tên luồng 1:"+t1.getName()); System.out.println("Tên luồng 2:"+t2.getName()); System.out.println("Tên luồng 3:"+t3.getName()); } } 2.3.3 Độ ưu tiên luồng (Priority) Như nói phần trước, luồng có độ ưu tiên định Đây thông số định mức ưu tiên cấp phát CPU cho luồng Trong java, đế đặt độ ưu tiên cho luồng ta dùng phương thức void setPriority(int newPriority) int newPriority : Là giá trị từ đến 10 Java có định nghĩa sẵn mức ưu tiên chuẩn sau: Thread.MAX_PRIORITY (giá trị 10) Thread.NORM_PRIORITY (giá trị 05) Thread.MIN_PRIORITY (giá trị 01) Để lấy độ ưu tiên luồng, ta dùng phương thức int getPriority() 2.3.4 Độ lớn ngăn xếp luồng (StackSize) StackSize độ lớn ngăn xếp (tính byte) mà luồng dùng q trình thực thi Nếu ta không quy định giá trị đặt giá trị phụ thuộc vào giá trị mặc định mà JMV quy định JMV tự điều chỉnh cho hợp lý Ta tùy chỉnh thông số mặc định phần mềm ArcGIS Java Configuration Tool (Hình dưới) Cịn ta có quy định, thread cho phép dùng Stack tới mức tối đa mà giá trị quy định 2.4 Nhóm luồng - Nhóm luồng tập hợp gồm nhiều luồng, ta tác động đến nhóm luồng (chẳng hạn tạm ngưng, …) tất luồng nhóm nhận tác động đó, điều tiện lợi ta muốn quản lý nhiều luồng thực tác vụ tương tự - Ðể tạo nhóm luồng ta cần: + Tạo nhóm luồng cách sử dụng phương thức tạo dựng lớp ThreadGroup() ThreadGroup g = new ThreadGroup(“ThreadGroupName”); ThreadGroup g = new ThreadGroup(ParentThreadGroup,“ThreadGroupName”); Dòng lệnh tạo nhóm luồng g có tên “ThreadGroupName”, tên luồng chuỗi không trùng với tên nhóm khác + Đưa luồng vào nhóm luồng dùng phương thức tạo dựng lớp Thread(): Thread =new Thread (g, new ThreadClass(),”ThisThread”); 2.5 Các trạng thái luồng New Thread: Đây trạng thái luồng vừa khởi tạo phương thức khởi tạo lớp Thread chưa start() Ở trạng thái này, luồng tạo chưa cấp phát tài nguyên chưa chạy Nếu luồng trạng thái mà ta gọi phương thức ép buộc stop,resume,suspend … nguyên nhân sảy ngoại lệ IllegalThreadStateException VD: PHP Code: Thread test=new Thread(); Lúc thread test trạng thái New Thread chưa cấp phát tài nguyên Runnable: Xét đoạn mã sau: PHP Code: Thread test=new Thread(); test.start(); Sau gọi phương thức start() luồng test cấp phát tài nguyên lịch điều phối CPU cho luồng test bắt đầu có hiệu lực Ở đây, dùng trạng thái Runnable khơng phải Running, nói phần đầu (Các mơ hình đa luồng) luồng khơng thực chạy mà tùy vào hệ thống mà có điều phối CPU khác Ví dụ: Trong HĐH đa nhiệm có xử lý (CPU) khơng phải tất tiến trình, luồng chạy song song mà chúng luân phiên chạy định kỳ thời gian định, sau phải tạm ngưng trả CPU cho HĐH, HĐH lại cấp CPU cho luồng khác chạy khoảng định … Như vậy: Tuy luồng trạng thái Runnable luồng chạy nên gọi Running Tuy nhiên để đơn giản vấn đề, tạm coi trạng thái luồng “chạy” điều khơng xác 100% Luồng trạng thái Runnable từ luồng gọi phương thức start() trước luồng kết thúc công việc phương thức run() trước sảy ngoại lệ run() khiến run() bị kết thúc Một dố trường hợp ta tự ý stop() destroy() luồng khiến luồng rời khỏi trạng thái runnable Not Runnable: Một luồng bị rơi vào trạng thái “Not Runable” bốn nguyên nhân sau: + Luồng bị tạm ngưng khoảng định bị gọi phương thức sleep(long milisecond) + Luồng bị tạm ngưng cấp CPU bị gọi phương thức suspend() + Luồng bị gọi phương thức wait() để tạm ngưng để chờ điều kiện thay đổi khác với VD: chờ tài nguyên (Xem tiếp phần Đồng hóa) + Luồng bị Block phải chờ I/O Ví dụ: lúc chờ người dùng nhập liệu vào bàn phím, luồng bị Block Ví dụ: PHP Code: try { Thread.sleep(10000); } catch (InterruptedException e){ } Trong ví dụ trên, luồng tạm ngưng làm việc suốt 10000 mili giây (10 giây) Tuy nhiên, cần lưu ý điều là: khác với suspend(), sleep() luồng cấp CPU, luồng không làm cả, cịn suspend() luồng bị ngưng cấp CPU Ngồi ra, có điều lưu ý khác : Luồng bị “Not Runnable” nguyên nhân phải cho luồng chạy lại tác động thích hợp với nguyên nhân Cụ thể sau: + Nếu luồng bị Sleep, phải đợi hết thời gian định sleep luồng tự chạy lại + Nếu luồng bị suspend() ta phải gọi phương thức resume() để tiếp tục lại + Nếu luồng wait() , tức chờ đợi điều kiện luồng sở hữu điều kiện phải gọi phương thức notify() notifyall() để thông báo cho luồng chạy lại + Nếu luồng bị Block I/O q trình I/O phải hồn tất Như vậy, luồng bị sleep 10 giây, mà trải qua giây, dù ta có gọi phương thức resume() luồng khơng thể chạy lại mà xảy ngoại lệ (Sẽ đề cập ngoại lệ sâu phần sau) Dead: Một thread bị rơi vào trạng thái Dead cách: Chết tự nhiên bị ép dừng lại Ví dụ dưới, phương thức run() bao gồm vòng lặp hữu hạn, Nó lặp lặp lại 100 lần PHP Code: public void run() { int i = 0; while (i < 100) { i++; System.out.println("i = " + i); } } Một thread chết cách tự nhiên hồn thành lệnh phương thức run() Bạn kết thúc luồng lúc cách gọi phương thức stop() Đoạn mã sau đặt luồng vào trạng thái sleep 10s, sau luồng “thức dậy” bị stop() PHP Code: Thread myThread = new MyThreadClass(); myThread.start(); try { Thread.sleep(10000); } catch (InterruptedException e){ } myThread.stop(); Phương thức stop() ném ngoại lệ ThreadDeath để “giết” luồng Vì vậy, luồng “chết” không đồng Các luồng “chết” nhận ngoại lệ ThreadDeath Phương thức stop() làm phương thức run() kết thúc đột ngột, cách hay để kết thúc luồng bị SUN xem nguy hiểm (Mình đề cập kỹ phần Đồng hóa tới) Mình đề xuất phương pháp kết thúc luồng tốt phần sau 2.5.2 Các trạng thái luồng java định nghĩa Ở phần trên, đề cập chi tiết đến trạng thái chung luồng nguyên nhận đưa luồng vào trạng thái cách đưa luồng khỏi trạng thái Ở phần đề cập đến cụ thể trạng thái luồng theo cách định nghĩa java trường hợp cụ thể nguyên nhận cụ Java định nghĩa trạng thái luồng thuộc tính static Thread.State Thread.State.NEW Thread trạng thái "New Thread" đề cập phần Thread.State.RUNNABLE Thread trạng thái "Runnable" đề cập phần Thread.State.BLOCKED Đây dạng trạng thái “Not Runnable” Thread chờ đối tượng bị lock jmv Monitor (jmv Monitor để cập sâu chương "Đồng hóa luồng"), Thread.State.WAITING Đây dạng trạng thái “Not Runnable” Thread chờ notify() từ thread khác Thread rơi vào trạng thái phương thức wait() join() Thread.State.TIMED_WAITING Đây dạng trạng thái “Not Runnable” Thread chờ notify() từ thread khác thời gian định, Thread rơi vào trạng thái phương thức wait(long timeout) join(long timeout) Thread.State.TERMINATED Thread hồn thành cơng việc run() bị stop() 2.6 đồng hóa luồng thi hành - Tất luồng trình thực thi song song độc lập lại chia sẻ khơng gian địa q trình Chính dẫn đến khả đụng độ việc cập nhật liệu dùng chung chương trình (biến, tập tin mở) VD: luồng cố gắng đọc liệu, luồng khác cố gắng thay đổi liệu liệu bị sai - Trong trường hợp này, bạn cần cho phép luồng hoàn thành trọn vẹn tác vụ nó, cho phép luồng thực thi Khi hai nhiều luồng cần thâm nhập đến tài nguyên chia sẻ, bạn cần chắn tài nguyên sử dụng luồng thời điểm - Đồng hoá luồng (thread synchronization) giúp cho thời điểm có luồng truy nhập vào đối tượng, luồng khác phải đợi - Các Thread đồng hố Java sử dụng thơng qua giám sát (monitor) Hãy nghĩ rằng, monitor đối tượng cho phép Thread truy cập vào tài nguyên, có Thread sử dụng monitor thời điểm bất kỳ; lập trình viên thường nói rằng: Thread sở hữu monitor vào thời gian - Một Thread sở hữu monitor khơng có Thread sở hữu monitor Khi monitor trạng thái sẵn sàng Thread sở hữu monitor truy cập thẳng đến tài nguyên tập hợp với monitor Ngược lại, Thread bị tạm treo monitor trở lại trạng thái sẵn sàng Các lập trình viên nói Thread chờ monitor - Bạn thấy thao tác với monitor phức tạp khơng? đừng ngại tất thao tác việc yêu cầu monitor Java tự động giải cho bạn suốt với người dùng - Có hai cách để đồng hố luồng: sử dụng method đồng hóa sử dụng phát biểu đồng hóa Sử dụng method đồng hóa: Tất đối tượng Java có monitor Một Thread có monitor method bổ sung từ khóa synchronized đầu method gọi Khi luồng gọi phương thức synchronized, đối tượng bị khoá Khi luồng thực xong phương thức, đối tượng mở khoá Trong thực thi phương thức synchronized, luồng gọi wait() để chuyển sang trạng thái chờ điều kiện xảy Khi luồng chờ, đối tượng khơng bị khố Khi thực xong cơng việc đối tượng, luồng thơng báo (notify) cho luồng khác chờ để truy nhập đối tượng Sử dụng phát biểu đồng hóa: Việc đồng hoá phương thức cách tốt để hạn chế việc sử dụng phương thức thời điểm Tuy nhiên có trường hợp mà bạn khơng thể đồng hố phương thức, chẳng hạn bạn sử dụng class cung cấp bên thứ ba Trong trường hợp thế, bạn không phép truy nhập vào định nghĩa lớp, ngăn bạn sử dụng từ khoá synchronized Một cách khác để sử dụng từ khóa synchronized sử dụng phát biểu đồng hóa Một phát biểu đồng hóa chứa block đồng hóa, mà bên đặt đối tượng phương thức đồng hóa Gọi method chứa block đồng hóa xảy Thread có monitor đối tượng Phần : Ứng dụng Ý tưởng : Xây dựng trình duyệt web Java - Sử dụng đa luồng để thực nhiều công việc lúc Thực : - Tạo giao diện người dùng với frame Trong frame chình có menu item, nút chức : new tab, - save, bookmark… Sử dụng Webengine, WebView Java Xây dựng giao diện với gói Java Swing Giao diện chương trình : Hoạt động : Chúng em demo buổi thuyết trình -Hết - ... ưu tiên; trỏ luồng nhân vơi trình (Hình ) Hình 1.7-Quá trình Solaris Phần 3: Luồng java 2.1 Khái niệm luồng java Trong Java, luồng đối tượng thuộc lớp java. lang.Thread.Là đơn vị nhỏ java thực công... lượng tài liệu nói lập trình đa luồng nói chung lập trình đa luồng Java cịn tương đối trình bầy chưa sâu, ví dụ minh họa cho chế lập trình nói Nội dung đề tài cố gắng làm rõ số khái niệm lập trình. .. exec điển hình thực cơng việc cách mô t? ?trong 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 c? ?luồng trình tải nhẹ Việc sử

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

Từ khóa liên quan

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

Tài liệu liên quan