Ví dụ minh họa cho thuật toán

Một phần của tài liệu 28011_1712202001859520HuynhLeDaiNgoc.compressed (Trang 42)

CH NGă2 .ăTOỄNăH CăT ăH P

3.3. Bài toán liệt kê hoán vị

3.3.4. Ví dụ minh họa cho thuật toán

3.3.4.1. Ví dụ 1: tìm tất cả các hoán vị của dãy scó 3 phần tử

Với n=3, ta chỉcó thể chọn p=2 lúc đó có 1 bộ xử lý chính và 2 bộ xử lý phụ.

g2=(0 … 0 1 p…n-1)

Ta có s=(0 0 0) g=(0 1 2), s’=(0) g’=(1) ta sinh dãy bị chặn là c1=(0) c2=(1).

- Bộ xử lý 1 nhận c1=(0) sinh s1=(000) và g1=(002)

- Bộ xử lý 2 nhận c1=(0) sinh s2=(010) và g2=(012)

Từ các dãy min, max con các bộ xử lý thực hiện bước 8 theo thuật toán 1 để tìm ra tất c các dãy bị chặn c a mình.

Bảng 3.3. Bộ xử lý phụ sinh dãy bị chặn với dãy s có 3 phần tử

Bộ xử lý 1 Dãy bị chặn Bộ xử lý 2 Dãy bị chặn 0 0 0 0 1 0 0 0 1 0 1 1 0 0 2 0 1 2

Từ các dãy bị chặn ấy thực hiện bước 7.5 theo thuật toán 7 sẽ sinh ra hoán vị tương ng.

3.3.4.2. Ví dụ 2: tìm tất cả các hoán vị của dãy s có 4 phần tử

Với n=4 chọn p = 3 lúc đó có 1 bộ xử lý chính vào 6 bộ xử lý phụ

S=(0 0 0 0) g=(0 1 2 3), s’=(0 0) g’=(1 2) sinh các dãy bị chặn theo bước 6.3 ta

có c1=(0 0), c2=(0 1), c3=(0 2), c4=(1 0), c5=(1 1), c6=(1 2). - Bộ xử lý 1 nhận c1=(0 0) sinh s1=(0000) và g1=(0003) - Bộ xử lý 2 nhận c1=(0 1) sinh s2=(0010) và g2=(0013) - Bộ xử lý 3 nhận c1=(0 2) sinh s1=(0020) và g1=(0023) - Bộ xử lý 4 nhận c1=(1 0) sinh s2=(0100) và g2=(0103) - Bộ xử lý 5 nhận c1=(1 1) sinh s1=(0110) và g1=(0113) - Bộ xử lý 6 nhận c1=(1 2) sinh s2=(0120) và g2=(0123)

Bảng 3.4. Bộ xử lý phụ sinh dãy bị chặn với dãy s có 3 phần tử

Bộ xử lý 1 Dãy bị chặn Bộ xử lý 2 Dãy bị chặn Bộ xử lý 3 Dãy bị chặn Bộ xử lý 4 Dãy bị chặn Bộ xử lý 5 Dãy bị chặn Bộ xử lý 6 Dãy bị chặn 0000 0010 0020 0100 0110 0120 0001 0011 0021 0101 0111 0121 0002 0012 0022 0102 0112 0122 0003 0013 0023 0103 0113 0123

Từ các dãy bị chặn ấy thực hiện bước 7.5 theo thuật toán 7 sẽ sinh ra hoán vị tương ng.

3.3.5. Chứng minhthuật toán song songlà đúng

Ta cần lập luận để ch ng minh tính đúng đắn c a Thuật toán 8 song song liệt kê hoán vị.

(1) ti∈ Z ⋀ si≤ ti≤ gi∀i ∈ (1 … n), có nghĩa là sj và gjnằm trong dãy bị chặn với dãy biên nhỏ nhất là s[i]:=0, i = 1, … , n và dãy biên lớn nhất g[i+1]:=i, i = 0, 1, … , n ứ 1.

Thật vậy, sj, gjtính được nh bước 7.2, 7.3 trong thuật toán song song bằng cách chèn thêm các phần tử 0 vào trước và p, p+1, n-1 vào bên ph i cj nên gj[i] ≤ g[i],

i=1,…,n. Còn sj+1 có được dựa vào cj+1 nên ta luôn có s[i] ≤ sj[i], i=1,..,n. Như vậy, sj

và gjthỏa công th c (1) với 2 dãy biên s[i] và g[i], i=1,…,n.

Tiếp theo, ta ch ng minh t ng số dãy bị chặn trên k-1 bộ xử lý phụ là n!

Khi chọn p (p∈ {2, 3, … , n ứ 1}) thì số bộ xử lý phụ tham gia tìm các dãy bị chặn là k’=k-1=p! (các bộ xử tìm các dãy nghịchthế là đều nhau).

Dãy biên nhỏ nhất c a p1 là s1=(0….0) (n số 0) và dãy biên lớn nhất là g1 theo

công th c (5) . Theo cách tính định lý 1 số lượng dãy bị

chặn là C=∏ thì số lượng các dãy bị chặn c a đo n 1 mà bộ xử lý p1

tính là ∏

Mỗi bộ xử lý phụ còn l i cũng sẽ tìm số lượng các dãy bị chặn

bằng với bộ xử lý p1, nghĩa là bằng: ∏

Hơn nữa, theo cách tính sj và gjlà 2 dãy biên trên bộ xử lýphụ pj thì: sj[i] = gj[i], i = 1, … , p

sj[i] = 0, i = p + 1, … , n gj[i] = i ,i = p , … , n ứ 1

Áp dụng công th c (2) c a định lý 1 cho 2 dãy biên sj và gj ta có số lượng các dãy bị chặn tương ng với mỗi bộ xử lý phụ là:

=(p+1)*(p+2)*….* n.

Mặt khác, ta l i có số bộ xử lý phụ k’=k-1=p! nên ta có số lượng các dãy bị chặn

tên k-1 bộ xử lý phụ là:

(k-1) !*(p+1)*(p+2)*….* n = p!*(p+1)*(p+2)*….* n = n!

Như vậy, ta có số lượng các dãy bị chặn trên k-1 bộ xử lý phụ là n! tương đương với n! hoánvị. Suy ra thuật toán song song đúng với hoán vị n phần tử là n!.

Độ ph c t p c a thuật toán 7 là O(n). Như vậy, độ ph c t p c a thuật toán 6

(thuật toán tìm hoán vị bằng dãy bị chặn) bằng O(n.an

) với a =max{(g1-s1+1),(g2- s2+1),…,(gn-sn+1)}. Theo cách ch ng minh thuật toán song song là đúng thì khi chia cho k-1 bộ xử lý phụ thì độ ph c t p tính toán c a thuật toán song song là (n*bn)/ (k-1)

với b=∏

. Vậy độ ph c t p c a thuật toán song song là (n*bn)/ (k-1) +T, với

b= ∏

và T là th i gian truyển thông giữa các bộ xử lý. T phụ thuộc vào từng

hệ thống vật lý thựctế.

s2=(0 … 0 1 0…0)

CH NGă4

TH ăNGHI MăV IăTH ăVI NăTHREAD 4.1. Thread

4.1.1. Giới thiệu chung

Thư viện Thread là một thư viện được tích hợp trong môi trư ng lập trình Java. Nó được sử dụng để phát triển những ng dụng xử lý đa lu ng trên các bộ xử lý đa

nhân hoặc các hệ thống có nhiều máy tính một các đ ng th i t i một th i điểm. Sử

dụng thư viện Thread cho những thuật toán song song giúp tăng hiệu suất xử lý, gi m th i gian tính toán cho bài toán.

Để sử dụngviện Thread trong môi trư ng Javata cần chú ý cáckhái niệm sau:

- Lu ngă(thread): là thành phần cơ b n nhất, nhỏ nhất trong chương trình để

có thể thực hiện một công việc nào đó. Mỗi một lu ng có bốn thành phần chính là định d ng, bộ đếm chương trình, tập dữ liệu, ngăn xếp.Các lu ng trong một tiến trình mất ít th i gian để chuyển đ i thông tin qua l i. Chúng cùng chia sẻ một bộ nhớ chung, không cần phân b các bộ nhớ riêng để thực hiện, giúp tiết kiệm về tài nguyên. Thread

bao g m các thao tác: t o, kết thúc, đ ng bộ, qu n lý dữ liệu, tương tác tiến trình.

- Ti nătrình (process): là một ho t động c a một ng dụng, trong tiến trình có

thể có nhiều lu ng xử lý. Mỗi tiến trình tính toán trên một phần bộ nhớ khác nhau riêng biệt. Sự giao tiếp giữa các tiến trình có chi phí cao. Việc chuyển đ i từ tiến trình này sang tiến trình khác cần nhiều th i gian để đăng ký, lưu t i, sắp xếp bộ nhớ, cập nhât…

- Đaă lu ngă (multithreading): là một tiến trình thực hiện nhiều lu ng đ ng th i. Có các ưu điểm như là: thực hiện nhiều công việc cùng lúc, tiết kiệm th i gian, các lu ng xử lý độc lập nên ngo i lệ trên một lu n không nh hư ng đến các lu ng

khác.

- Đaănhi mă(multitasking): là một quá trình thực hiện cùng lúc nhiều nhiệm

vụ, có thể dựa trên đa lu ng hoặc đa tiến trìnhđể tiến hành.

4.1.2. Các hàm trong thư viện Thread

Thư viện Thread trong Java cung cấp cho chúng ta các hàm kh i t o và phương th c để thực hiện các ho t động tính toán trên môi trư ng. Thông thư ng một thread được sinh ra, bắt đầu, ch y tính toán và h y. Tr ng thái c a một thread diễn ra như

Hình 4.1. Trạng thái của một thread

- New: là tr ng thái thread được t o ra như chưa được kích ho t để ho t độngthực hiện các lệnh bên trong.

- Runnable: thread đã được kích ho t để ho t động thực hiện các lệnh bên trong.

- Wait: đôi lúc thread đi vào tr ng thái đợi. Có thể là đợi các thread khác

thực hiện xong r i mới thực hiệnhoặc đợi trong một kho n th i gian hoặc đợi một sự kiện nào đó thì mới bắt đầu thực hiện. Lúc này hệ thống sẽ không cung cấp

- Terminated: thread kết thúc quá trình xử lý và chấm d t. Các hàm kh i t o thread:

1. Thread(): Kh i t o thông thư ng

2. Thread(String name): Kh i t o với tên thread

3. Thread(Runnable r): Kh i t o cung cấp lớp triển khai

4. Thread(Runnable r, String name): Kh i t o cung cấp lớp triển khai cùng

với tên thread

đây chúng ta cần chú ý đến Runnable là một đối tượng lớp triển khai định nghĩa một phương th c đơn run() để có thể kích ho t cho thread vào tr ng thái ho t động.

Ngoài ra còn có th tự ưu tiên Priority, với mỗi Thread trong Java đều có một quyền ưu tiên để giúp cho hệ điều hành xác định được th tự thực hiện c a các Thread được thực thi. Th tự ưu tiên được quy định nằm trong kho n MIN_PRIORITY(có giá trị 1) và MAX_PRIORITY(có giá trị 10). Những thread có quyền ưu tiên cao hơn sẽ được ưu tiên xử lý. Nếu không quy định Java mặt định thread có quyền ưu tiên ngang

nhau.

Runnable

Wait Terminated

Danh sách dưới đây là các phương th c quan trọng trong việc lập trình với

thread, được gọi trên một đối tượng Thread cụ thể:

1. public void run(): Được sử dụng để thực hiện hành động cho một thread..

2. public void start(): Bắt đầu thực hiện thread. JVM gọi phương th c run()

trên thread.

3. public String getName(): Tr về tên c a thread.

4. public void setName(String name): Thay đ i tên c a thread.

5. public int getPriority(): Tr về m c độ ưu tiên c a thread.

6. public int setPriority(int priority): Thay đ i m c độ ưu tiên c a thread.

7. public void join(): Đợi cho một thread chết.

8. public void join(long miliseconds): Đợi cho một thread chết với các mili

giây quy định.

9. public int getId(): Tr về id c a thread.

10. public Thread.State getState(): Tr về tr ng thái c a thread.

11. public boolean isAlive(): Kiểm tra nếu thread còn sống.

12. public void suspend(): Được sử dụng để hoãn l i các thread (không dùng nữa).

13. public void resume(): Được sử dụng để tiếp tục các thread đang bị hoãn (không dùng nữa).

14. public void stop(): Được sử dụng để dừng thread (không dùng nữa).

15. public boolean isDaemon(): Kiểm tra nếu thread là một lu ng hiểm.

16. public void setDaemon(boolean b): Đánh dấu thread là lu ng hiểm hoặc lu ng ngư i dùng.

17. public void interrupt(): Ngắt thread.

18. public boolean isInterrupted(): Kiểm tra nếu thread đã bị ngắt.

19. public static boolean interrupted(): Kiểm tra nếu thread hiện t i đã bị ngắt.

Ngoài ra còn có các phương th c tĩnh được gọi trên một thread đang ch y hiện t i, liệt kê dưới đây:

1. public void yield(): Làm cho các đối tượng thread đang thực thi để t m th i t m dừng và cho phép các thread khác để thực thi.

2. public void sleep(long miliseconds): Làm cho thread hiện t i t m ngừng thực thi cho số mili giây quy định.

3. public static boolean holdsLock(Object x): Tr về true nếu thread giữ lock trên Object đã cho

4. public Thread currentThread(): Tr về tham chiếu c a thread đang được thi hành.

5. public static void dumpStack(): In ra stack trace cho thread đang ch y hiện t i. Nó rất hữu ích khi debugging một ng dụng đa lu ng

4.2. C ăch ăSocket

Thông thư ng các hệ thống máy tính kết nối với nhau theo kiểu server-client và

một trong những gi i pháp để thực hiện mô hình kết nối đó là Socket. Socket là công

cụ giúp ta có thể truyền nhận thông điệp giữa các bộ xử lý cũng như các máy tính sử

dụng TCPqua một port chung.

Trong Java, ngư i ta đã xây dựng lớp java.net.Socket cung cấp đầy đ các phương th c để chúng ta có thể kh i t o hệ thống máy ch , máy tr m và thiết lập các kết nối cũng như việc truyền nhận thông tin giữa các thành phần máy tính.

Để thực hiện thiết lập kết nối giữa hai máy tính sử dụng Socket, cần các bước

sau:

B că1: Máy ch kh i t o đối tượng server socket với các thông số địa chỉ máy

ch và c ng(port) kết nối.

B că2:Máy ch m các đư ng kết nối và ch đợi cho đến máy tr mkết nối đến

máy ch trên c ng đã xác định.

B că3: Trong khi máy ch đang ch đợi, máy tr m kh i t o đối tượng socket,

xác định địa chỉ máy ch (thông thư ng là dùng IP) và c ng để kết nối. Máy tr m tìm cách kết nối theo địa chỉ đã có. Nếu thiết lập thông số sai hoặc phát sinh ngo i lệ thì máy tr m không thể kết nối được đến máy ch . Nếu kết nối được thiết lập, máy tr m bây gi có một đối tượng socket có kh năng giao tiếp với máy ch .

B că4: phía máy ch , phương th c accept() tr về một tham chiếu đến một

socket mới trên máy ch được kết nối với socket c a máy tr m.

Sau khi kết nối hoàn thành, máy ch và máy tr m có thể trao đ i thông tin qua các dòng dữ liệu InputStream và OutputStream.

Dưới đây trình bày danh sách các hàm kh i t o để có thể sử dụng được Socket

trong Java:

CácăhƠmăkh iăt oăđ iăv iămáyăch ServerSocket

1. public ServerSocket (int port) throws IOException

2. public ServerSocket(int port, int backlog) throws IOException

3. public ServerSocket(int port, int backlog, InetAddress address) throws IOException

4. public ServerSocket() throws IOException

Tùy vào từng giá trịkhai báo ban đầu về địa chỉ (address), c ng kết nối (port), số máy tr m có thể kết nối (backlog) chúng ta có thể kh i t o ServerSocket với các thông số ban đầu theo ý muốn.Nếu như việc kh i t o gặp sự cố không thể t o mới được thì Java sẽ đưa ra các ngo i lệ.

CácăhƠmăkh iăt oăđ iăv iămáyătr măSocket

1. public Socket(String host, int port) throws UnknownHostException, IOException

2. public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.

3. public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.

4. public Socket()

Tương tự như các hàm kh i t o trên, ng với mỗi hàm kh i t o có các tham số địa chỉ kết nối đến ServerSocket (host), c ng kết nối (localPort), địa chỉ cục bộ

(localAddress). Nếu như việc kh i t o gặp sự cố không thể t o mới được thì Java sẽ đưa ra các ngo i lệ còn không nó sẽ kh i t o một máy tr m Socket để có thể sử dụng.

Java có hỗ trợ các phương th c để có thể sử dụng socket. Dưới đây trình bày

danh sách một số các phương th c chính thư ng hay sử dụng:

Ph ngăth cătrênămáyăch ăServerSocket

1. public int getLocalPort(): Tr về c ng mà socket c a máy ch đang sử dụng.

2. public Socket accept() throws IOException: Ch cho một máy khách

kết nốiđến. Phương th c này không bị chặn cho đến khi một máy tr m kết nối đến máy ch trên c ng được chỉ định hoặc quá gi kết nối, ta có

thể thay đ i giá trị th i gian ch theo phương th c bên dưới.

3. public void setSoTimeout(int timeout): Thiết lập giá trị th i gian ch máy khách kết nối c a máy ch .

4. public void bind(SocketAddress host, int backlog): Liên kết socket tới máy ch và c ng được chỉ định trong đối tượng SocketAddress. Sử dụng phương th c này nếu b n đã t o ra các ServerSocket bằng cách sử dụng nhà xây dựng không có đối số.

Ph ngăth cătrênămáyătr măSocket

1. public void connect(SocketAddress host, int timeout) throws IOException: Phương th c này kết nối socket với máy ch được chỉ định. Phương th c này là cần thiết chỉ khi kh i t o Socket bằng cách sử dụng hàm kh i t o không có các giá trị đi kèm.

2. public InetAddress getInetAddress(): Phương th c này tr về địa chỉ c a máy tính khách mà socket này được kết nối.

3. public int getPort(): Tr về c ng c a máy remote mà socket đang kết nối đến.

4. public int getLocalPort(): Tr về c ng mà socket bị ràng buộc trên

máy nội bộ.

5. public SocketAddress getRemoteSocketAddress(): Tr về địa chỉ c a

ServerSocket.

6. public InputStream getInputStream() throws IOException: Tr về giá trị đầu vào input stream c a sockettrên máy tr m từ dữ liệu đầu ra

output stream c a ServerSocket.

7. public OutputStream getOutputStream() throws IOException: Tr về dữ liệu đầu ra ouput stream c a socket và chuyển ServerSocket đã kết nối để t o thành dữ liệu đầu vào input stream cho ServerSocket. 8. public void close() throws IOException: Đóng socket, làm cho đối

tượng Socket này không còn có kh năng kết nối về với bất kỳ máy ch

nào.

Ngoài ra t i các máy tr m còn có những phương th c cần chú ý c a giá trị địa chỉ

InetAdress:

1. static InetAddress getByAddress(byte[] addr): Tr về đối tượng InetAddress với địa chỉ IP.

2. static InetAddress getByAddress(String host, byte[] addr): T o một InetAddress dựa trên tên máy ch lưu trữ và địa chỉ IP.

3. static InetAddress getByName(String host): Xác định địa chỉ IP c a

Một phần của tài liệu 28011_1712202001859520HuynhLeDaiNgoc.compressed (Trang 42)