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

Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 9: Ngôn ngữ lập trình song song

52 11 0

Đ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 52
Dung lượng 253,68 KB

Nội dung

Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 9: Ngôn ngữ lập trình song song bao gồm những nội dung về Sub Proprogam-level, Semaphores, chương trình giám sát (monitor, truyền thông điệp (massage passing), luồng (Java thread).

Trang 1

Ch ươ ng 9: Ngôn ng ữ l ậ p

trình song song

Giảng viên: Ph.D Nguyễn Văn Hòa Khoa KT-CN-MT – ðH An Giang

Trang 2

N ộ i dung

 Giới thiệu

 SubProprogam-level

 Chương trình giám sát (monitor)

 Truyền thông ñiệp (massage passing)

 Luồng (Java thread)

Trang 4

Gi ớ i thi ệ u (tt)

thứ tự các ñiểm cần ñến của CT

 Phân loại sự tương tranh:

1 Tương tranh vật lý (physical concurrency) – Multiple processors ñộc lập (ñiều khiển với multiple threads)

2 Trương tranh logic (logical concurrency) – Sự tương tranh này xuất hiện khi có sự chia sẽ trên cùng một

processor (Một phần mền có thể ñược thiết kết với

Trang 5

Gi ớ i thi ệ u (tt)

 Tại sao phải học sự tương tranh trong NN LT

1 Rất hữu dụng cho việc thiết kế chương trình hỗ trợ

tính toán song song

2 Máy tính hỗ trợ tương tranh vật lý (multi-core

processors) rất phổ biến

Trang 7

T ươ ng tranh ở m ứ c ch ươ ng trình con

 ðN: Một công việc (task) hoặc tiến trình (process) là một

ñơn vị chương trình ñược thực hiện ñồng thời với những

chương trình khác

 Task khác với chương trình con như thế nào?

 Task có thể ñược bắt ñầu ở thời ñiểm tường minh

 Khi một chương trình bắt ñầu thực thi một task, thông thường thì không bị ñình hoãn

 Khi việc thực thi một task kết thúc thì không nhất thiết phải trả quyền ñiều khiển cho caller

 Các công việc (tasks) có thể trao ñổi qua lại

Trang 8

T ươ ng tranh ở m ứ c CT con (tt)

 Thông thường có 2 loại tasks

 Heavyweight tasks thực thi với không gian ñịa chỉ và run-time stack của chính nó

 Lightweight tasks luôn luôn thực thi với cùng không gian ñịa chỉ và cùng run-time stack

Trang 9

T ươ ng tranh ở m ứ c CT con (tt)

 ðN: một task riêng biệt ( disjoint ) nếu như nó

không giao tiếp hoặc ảnh hường ñến sự thực thi của một task nào ñó trong một chương trình bất kỳ

 Một task giao tiếp với một task khác thì cần

thiết phải có sự ñồng bộ hóa ( synchronization )

Trang 10

T ươ ng tranh ở m ứ c CT con (tt)

 Các kiểu ñồng bộ hóa :

1 Hợp tác ( Cooperation )

 Task A phải ñợi cho ñến khi task B hoàn thành một vài

tác vụ nhất ñịnh nào ñó trước khi task A có thể thực hiện tiếp tục → mô hình producer-consumer

Trang 11

S ự c ầ n thi ế t c ủ a ñ ông b ộ hóa

trong c ạ nh tranh

Trang 12

T ươ ng tranh ở m ứ c CT con (tt)

 Việc ñồng bộ hóa ñòi hỏi một cơ chế của sự trị

hoãn việc thực thi các task

 Sự ñiều khiển việc thực thi ñược ñiều hành bởi

một chương trình, gọi là scheduler , có nhiệu vụ sắp ñặt việc thực thi task vào những processors sẵn có

Trang 13

T ươ ng tranh ở m ứ c CT con (tt)

 Các Task có thể ở một trong vài trạng thái sau

ñây:

1 New – mới khởi tạo nhưng chưa ñược thực hiện

2 Runnable hoặc ready – sẵn sàng ñể chạy nhưng chưa chạy (vì không có processor sẵn có)

3 Running

4 Blocked – ñã chạy, nhưng không thể tiếp tục vì ñang

ñợi vài sự kiện nào ñó xảy ra)

5 Dead

Trang 14

T ươ ng tranh ở m ứ c CT con (tt)

 Liveness là ñặc ñiểm mà một chương trình có thể

Trang 15

T ươ ng tranh ở m ứ c CT con (tt)

 Các NN LT hỗ trợ tương tranh ñều có 2 cơ chế: ñồng bộ hóa cạnh tranh và ñồng bộ hóa hợp tác

 Các yếu tố khi thiết kế tương tranh:

1 Sự ñồng bộ hóa hợp tác ñược cung cấp như thế nào?

2 Sự ñồng bộ hóa tương tranh ñược cung cấp như thế nào?

3 Cách gì và khi nào một task bắt ñầu và kết thúc thực thi?

4 Các task có ñược sinh ra một cách tĩnh hay ñộng?

Trang 16

T ươ ng tranh ở m ứ c CT con (tt)

 Các phương thức ñồng bộ hóa:

1 Semaphores

2 Chương trình giám sát (Monitors)

3 Truyền thông ñiệp (Message Passing)

Trang 17

Semaphores

 Dijkstra - 1965

 Một semaphore là một cấu trúc dữ liệu chứa một counter và một hàng ñợi ( queue ) nhằm lưu trữ các

mô tả của task

 Các semaphores ñược dùng ñể cài ñặt các bảo vệ trong code có sự truy nhập các cấu trúc dữ liệu

chia sẽ

 Các semaphores chỉ có 2 thao tác vụ, wait và

release (hay ñược gọi P và V bởi Dijkstra)

Trang 18

 Example: Một buffer chia sẽ

 Buffer ñược cài ñặt với hai tác vụ DEPOSIT

FETCH như là hai cách thức ñể truy nhập buffer

 Sử dụng hai semaphores cho sự hợp tác:

emptyspotsfullspots

 Counter của hai semaphore dùng ñể lưu trữ số emptyspots và full spots trong buffer

Trang 19

 Trước tiên DEPOSIT phải kiểm tra

emptyspots xem có còn khoảng trống trong

 Khi kết thúc DEPOSIT , giá trị của counter của

fullspots ñược tăng lên một

Trang 20

 Trước tiên FETCH phải kiểm tra fullspots

xem có còn giá trị nào trong buffer không

 Nếu còn thì một giá trị ñược lấy ra và counter của

fullspots bị giảm ñi một

 Nếu không còn giá trị nào thì tiến trình của FETCH

ñược ñặt trong hàng ñợi cho ñến khi có một giá trị xuất

hiện

 Khi kết thúc FETCH, tăng counter của emptyspots

lên một

 Hai thao tác FETCHDEPOSIT trên các

semaphore thành công thông qua hai thao tác wait

Trang 21

wait( aSemaphore )

if aSemaphore ’s counter > 0 then

Decrement aSemaphore ’s counter

else

Put the caller in aSemaphore ’s queue

Attempt to transfer control to some

ready task (If the task ready queue is empty, deadlock occurs)

end

Trang 22

aSemaphore ’s queue end

Trang 23

Producer Consumer Code

semaphore fullspots, emptyspots;

fullspots.count = 0;

emptyspots.count = BUFLEN;

task producer;

loop produce VALUE –- wait (emptyspots); {wait for space} DEPOSIT(VALUE);

release(fullspots); {increase filled}

end loop;

end producer;

Trang 24

Producer Consumer Code

Trang 25

 Semaphore thứ ba, có tên là access, dùng ñể kiểm soát truy cập (ñồng bộ hóa cạnh tranh)

 Counter của access sẽ chỉ có hai giá trị 0 và 1

 Tương ñương như là một semaphore nhị phân ( binary semaphore )

 Giá trị khởi tạo của access phải là 1, ñồng nghĩa là tài nguyên ñang ở trạng thái sẵn sàng 0 nghĩa là bận

Trang 26

wait(access); {wait for access) DEPOSIT(VALUE);

release(access); {relinquish access}

release(fullspots); {increase filled space}

end loop;

end producer;

Trang 27

Code c ủ a Producer-Consumer

task consumer;

loop

wait(fullspots); {make sure it is not empty}

wait(access); {wait for access}

FETCH(VALUE);

release(access); {relinquish access}

release(emptyspots); {increase empty space}

consume VALUE

–-end loop;

end consumer;

Trang 28

Semaphores : nh ậ n xét

 Môi trường lập trình không an toàn (Unsafe)

 Sử dụng sai các semaphores có thể là nguyên nhân thất bại trong ñồng bộ hóa hợp tác, e.g., buffer sẽ bị tràn

(overflow) nếu không có dòng code

buffer sẽ bị underflow nếu không có dòng code

Trang 29

Ch ươ ng trình giám sát (Monitors)

 NNLT : concurrent Pascal, Modula, Mesa, tiếp theo là C#, Ada and Java

 Ý tưởng: bao ñống dữ liệu chia sẽ và giới hạn các thao tác truy nhập

 CT giám sát là một trù tường hóa dữ liệu cho

những dữ liệu chia sẽ

Trang 30

Monitor Buffer Operation

Trang 31

ðồ ng b ộ hóa c ạ nh tranh

 Dữ liệu chia sẽ ñược ñặt bên trong CT giám sát

(tốt hơn là ñặt trong các client)

 Tất cả các truy nhập ñều diễn ra ở trong CT giám sát

 Việc cài ñặt CT giám sát phải bảo ñảm các truy cập

ñược ñồng bộ bằng cách chỉ có một truy cập tại một

thời ñiểm nhất ñịnh

 Nếu CT giám sát bận vào thời ñiểm gọi, thì các lời gọi

sẽ ñược ñặt vào trong hàng ñợi

Trang 32

ðồ ng b ộ hóa h ợ p tác

 Sự hợp tác giữa các tiến trình ( processes ) vẫn là một tác vụ trong lập trình

 Lập trình viên phải bảo ñảm là không xảy ra underflow

và overflow trong một buffer chia sẽ

Trang 33

Ch ươ ng Trình giám sát: nh ậ n xét

 Hỗ trợ tốt cho sự ñồng bộ hóa cạnh tranh

 ðối với ñồng bộ hóa hợp tác thì tương tự như

semaphore nên → sẽ gặp các vấn ñề như

semaphore

Trang 34

Truy ề n thông ñ i ệ p

 ðược ñưa ra bởi Hansen & Hoare vào 1978

 Vấn ñề: làm thế nào giải quyết vấn ñề khi có nhiều yêu cầu giao tiếp từ nhiều task với một task cho trước

 Vài dạng của cơ chế không quyết ñịnh cho sự công bằng

 Guarded commands của Dijkstra: kiểm soát truyền thông

ñiệp

 Ý tưởng chính: giao tiếp giữa các task giống như ñến phòng mạch

 Phần lớn thời gian BS ñợi bệnh nhân

Hoặc bệnh nhân ñợi BS, BS sẽ khám bệnh cho bệnh nhân

Trang 35

Truy ề n thông ñ i ệ p (tt)

 Truyền thông ñiệp là mô hình tương tranh

 Có thể là mô hình của cả semaphore và CT giám sát

 Không chỉ cho ñồng bộ hóa cạnh tranh

 Truyền thông ñiệp ñồng bộ, khi bận các task không

muốn bị gián ñoạn

Trang 36

một task nào ñó, thì sự truyền message ñược gọi

là rendezvous

Trang 37

VD v ề Rendezvous

Trang 38

T ươ ng tranh trong Java: Java thread

 Khi chương trình Java thực thi hàm main() tức là tạo ra một luồng chính (main thread)

 Trong luồng main

 Có thể tạo các luồng con

 Khi luồng main ngừng thực thi, chương trình sẽ kết

thúc

 Luồng có thể ñược tạo ra bằng 2 cách:

 Tạo lớp dẫn xuất từ lớp Thread

Trang 39

T ươ ng tranh trong Java (tt)

 VD

public class Mythread extends Thread {

private String data

public Mythread( String data){

this data = data;

}

public void run(){

System.out.println (‘‘I am a thread!’’);

System.out.println (‘‘The data is:’’,data); }

Trang 40

T ươ ng tranh trong Java (tt)

 Tạo ra một thể hiện của lớp Thread (hoặc dẫn xuất của nó)

và gọi phương thức start()

Trang 41

T ươ ng tranh trong Java: Runnable

 Giao tiếp Runnable

 Ngoài tạo luồng bằng cách thừa kế từ lớp Thread, cũng

có một cách khác ñể tạo luồng trong Java

 Luồng có thể tạo bằng cách tạo lớp mới hiện thực giao tiếp Runnable và ñịnh nghĩa phương thức:

public abstract void run()

 ðiều này ñặc biệt hữu ích nếu muốn ñể tạo ra một ñối

tượng Thread nhưng muốn sử dụng một lớp cơ sở khác Thread

Trang 42

T ươ ng tranh trong Java: Runnable

Trang 43

T ươ ng tranh trong Java: Runnable

 ðể tạo ra một luồng mới từ một ñối tượng hiện thực giao

tiếp Runnable, cần phải khởi tạo một ñối tượng Thread

mới với ñối tượng Runnable như ñích của nó

 Khi gọi start() trên ñối tượng luồng sẽ tạo ra một luồng

Trang 44

T ươ ng tranh trong Java: ñ i ề u khi ể n

Trang 45

T ươ ng tranh trong Java: ñ i ề u khi ể n

 Khi một luồng giành quyền sử dụng CPU, nó sẽ thực hiện cho ñến khi một sự kiện sau xuất hiện:

 Phương thức run() kết thúc

 Một luồng quyền ưu tiên cao hơn

 Nó gọi phương thức sleep() hay yield() – nhượng bộ

 Khi gọi yield(), luồng ñưa cho các luồng khác với cùng quyền ưu tiên cơ hội sử dụng CPU Nếu không có luồng nào khác cùng quyền ưu tiên tồn tại, luồng tiếp tục thực hiện

 Khi gọi sleep(), luồng ngủ trong một số mili-giây xác

ñịnh, trong thời gian ñó bất kỳ luồng nào khác có thể sử

Trang 46

T ươ ng tranh trong Java: ñ i ề u khi ể n

 Phương thức join()

 Khi một luồng (A) gọi phương thức join() của một

luồng nào ñó (B), luồng hiện hành (A) sẽ bị khóa chờ (blocked) cho ñến khi luồng ñó kết thúc (B)

Trang 47

ðồ ng b ộ hóa c ạ nh tranh v ớ i java

 Dùng từ khóa synchronized trước tên các hàm khi ñịnh nghĩa ñể cấm các lớp khác thực thi các hàm này khi nó ñang thực thi

Trang 48

ðồ ng b ộ hóa h ợ p tác v ớ i java

 Các phương thức wait(), notify() và notifyAll()

ñược sử dụng ñể thóa khóa trên một ñối tượng và thông báo các luồng ñang ñợi chúng có thể có lại ñiều khiển

 wait() ñược gọi trong vòng lập

 notify() thông báo cho thread ñang chờ ñợi là sự kiện ñang ñợi ñã xãy ra

 notifyall() ñánh thức các thread ñang ñợi là có thể

Trang 49

ðồ ng b ộ hóa h ợ p tác v ớ i java: VD

Trang 50

ðồ ng b ộ hóa h ợ p tác v ớ i java: VD

Trang 51

public void run() {

for (int i = 0; i < 10; i++) {

Ngày đăng: 08/05/2021, 19:41

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w