Guarded Suspension

Một phần của tài liệu nghiên cứu mẫu thiết kế kiến trúc phần mềm trong java (Trang 58 - 74)

Mụ tả:

Nhỡn chung, mỗi phương thức trong một đối tượng được thiết kế để thực hiện một nhiệm vụ cụ thể. Đụi khi, khi một phương thức được gọi lờn một đối tượng, đối tượng đú cú thể cần trong một trạng thỏi nhất định, mà theo đú phương thức cần để thực hiện hành động mà nú đó được thiết kế. Trong trường hợp như vậy, mẫu Guarded Suspension đưa ra việc hoón thực thi đến khi điều kiện ban đầu thỏa món. Núi cỏch khỏc, yờu cầu một đối tượng ở một trạng thỏi nhất định trở thành điều kiện ban đầu cho phương thức thực thi để thực hiện nhiệm vụ được đưa ra.

Mỗi lớp trong Java kế thưa phương thức wait, notify và notifyAll từ lớp cơ sở java.lang.Object. Khi một tiến trỡnh gọi phương thức wait của một đối tượng:

 Nú làm cho tiến trỡnh giải phúng khúa đồng bộ mà nú giữ trờn đối tượng

 Tiến trỡnh duy trỡ trạng thỏi đợi đến khi nú được thụng bỏo trả về qua phương thức notify hay notifyAll.

Sử dụng phương thức dựng sẵn wait, notify và ntifyAll, mẫu Guarded Suspension cú thể được ứng dụng trong Java.

Cấu trỳc chung của lớp trong Java khi mẫu Guarded Suspension được ứng dụng dựng phương thức dựng sẵn wait, notify và notifyAll được trỡnh bày trong vớ dụ.

Lớp SomeClass gồm hai phương thức đồng bộ guardedMethod và alterObjectStateMethod. GuardedMethod biểu thị một phương thức mà nú đũi hỏi một điều kiện ban đầu nào đú phải thoả món trước khi tiến hành thực thi phương thức này. Vỡ vậy, nú sẽ kiểm tra xem điều kiện ban đầu cú đỳng khụng và chừng nào điều kiện đú khụng đỳng, thỡ nú sẽ đợi sử dụng phương thức wait.

Phương thức alterObjectSateMethod cho phộp cỏc đối tượng khỏch (cỏc tiến trỡnh) khỏc nhau thay đổi trạng thỏi của thể hiện lớp SomeClass. Đổi lại, điều này cú thể làm cho điều kiện ban đầu bắt buộc thoả món. Khi trạng thỏi của đối tượng bị

Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn

thay đổi, phương thức này sẽ bỏo cho tất cả một tiến trỡnh đang đợi phải đợi bờn trong phương thức guardedMethod sử dụng phương thức notify. Nếu sự thay đổi trong trạng thỏi đối tượng làm cho điều kiện ban đầu thoả món, thỡ tiến trỡnh đang đợi lại tiến hành thực thi phương thức guardedMethod. Ngược lại, nú sẽ tiếp tục đợi đến khi điều kiện ban đầu được thoả món.

Cả hai phương thức guardedMethod và alterObjectStateMethod được thiết kế như cỏc phương thức đồng bộ để trỏnh cỏc race condition trong mụi trường đa tiến trỡnh.

public class SomeClass {

synchronized void guardedMethod() { while (!preCondition()) { try { //Continue to wait wait(); //… } catch (InterruptedException e) { //…} }

//Actual task implementation }

synchronized void alterObjectStateMethod() { //Change the object state

//…..

//Inform waiting threads notify();

}

private boolean preCondition() { //… return false; } } 2.4.4 Read-Write Lock Mụ tả:

Trong khi tỡm hiểu về mẫu Monitor và Critical Section trước đú, ta nhận thấy rằng khi đa tiến trỡnh trong một ứng dụng đồng thời truy cập vào một tài nguyờn, nú cú thể gõy ra hành vi khụng đoỏn trước. Vỡ vậy, tài nguyờn phải được bảo vệ để tại một thời điểm chỉ một tiến trỡnh được phộp truy cập. Mặc dự điều này trong hầu hết cỏc trường hợp là bắt buộc, nú cú thể dẫn đến sự hoạt động quỏ mức của CPU khi

Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn

một số tiến trỡnh truy cập vào tài nguyờn chỉ quan tõm đến việc đọc giỏ trị hay trạng thỏi tài nguyờn mà khụng thay đổi nú. Trong những trường hợp như vậy, sẽ khụng cú hiệu quả để ngăn một tiến trỡnh khụng cho truy cập vào tài nguyờn chỉ để đọc giỏ trị trong khi một tiến trỡnh khỏc vẫn đang đọc giỏ trị tài nguyờn đú. Bởi vỡ một quỏ trỡnh đọc khụng thay đổi giỏ trị của tài nguyờn, đa tiến trỡnh cú thể được phộp truy cập vào tài nguyờn một cỏch an toàn tại cựng một thời điểm nếu tất cả cỏc tiến trỡnh này đều chỉ quan tõm đến việc đọc giỏ trị tài nguyờn. Loại thiết kế này cải thiện tớnh tương tỏc của toàn ứng dụng mà sự hoạt động quỏ mức của CPU được giảm. Cú nghĩa là, khi một tiến trỡnh nhận được khoỏ để đơn giản đọc giỏ trị của tài nguyờn, nú khụng nờn chặn cỏc tiến trỡnh khỏc khụng được truy cập vào tài nguyờn để đọc giỏ trị của tài nguyờn đú. Núi cỏch khỏc, một khoỏ đọc cần được chia sẻ. Nếu một tiến trỡnh được phộp đọc dữ liệu của một tài nguyờn trong khi một tiến trỡnh khỏc đang cập nhật tài nguyờn đú, tiến trỡnh đang đọc dữ liệu cú thể nhận được phản ỏnh trỏi ngược nhau. Việc cho phộp hơn một tiến trỡnh cập nhật giỏ trị tài nguyờn cú thể cũng sẽ dẫn đến kết quả khụng đoỏn trước được.

Khi một số tiến trỡnh chỉ đọc giỏ trị tài nguyờn, một số tiến trỡnh khỏc cú thể truy cập vào tài nguyờn để đọc và cập nhật giỏ trị. Để loại bỏ vấn đề xảy ra cựng nhau này, khi một tiến trỡnh như vậy cần truy cập vào tài nguyờn để đọc và cập nhật giỏ trị, nú phải nhận được khoỏ ghi lờn đối tượng đại diện cho tài nguyờn đú. Một khoỏ ghi là một khoỏ riờng lờn đối tượng và trỏnh khụng cho tất cả cỏc tiến trỡnh khỏc truy cập vào tài nguyờn lỳc đú. Hơn nữa, nếu khoỏ đọc và ghi được yờu cầu lờn đối tượng cựng một lỳc, thỡ khoỏ ghi sẽ được ưu tiờn trước. Khoỏ ghi được đưa ra chỉ khi khụng cũn tiến trỡnh nào giữ khoỏ đọc lờn cựng đối tượng đú.

Bảng đưa ra cỏc tiờu chớ để đưa ra khoỏ đọc – ghi.

Khoỏ Nguyờn tắc

Khúa đọc Một khúa đọc được cấp nếu khụng cú khúa ghi nào hiện thời đó được cấp và khụng cũn tiến trỡnh nào đợi khoỏ ghi

Khúa ghi Một khoỏ ghi được đưa ra nếu khụng cũn tiến trỡnh nào hiện thời được cấp một khoỏ (đọc hoặc ghi) lờn đối tượng

Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn

Trong Java, khụng cú sẵn tớnh năng thực thi khoỏ đọc - ghi. Nhưng một lớp cú thể được tạo ra với khả năng cấp khoỏ đọc - ghi lờn đối tượng đến một tiến trỡnh khỏc trong ứng dụng.

Thiết kế nổi bật lớp ReadWriteLock (adsbygoogle = window.adsbygoogle || []).push({});

Lock Statistics (Thống kờ khúa)

ReadWriteLock duy trỡ những dữ kiện khoỏ trong cỏc biến lớp sau:

 totalReadLocksGiven – để lưu số khoỏ đọc đó được cấp trờn cỏc đối tượng

 writeLockIssued – để chỉ ra xem một khoỏ ghi đó được đưa ra chưa.  threatsWaitingForWriteLock – để theo dừi số tiến trỡnh hiện thời đang

đợi khoỏ ghi

Giỏ trị này đến lượt nú được sử dụng bởi phương thức đưa ra khoỏ – getReadLock và getWriteLock.

Lock Methods (Phương thức khoỏ )

ReadWriteLock cung cấp hai phương thức getReadLock và getWriteLock mà cú thể được sử dụng bởi đối tượng khỏch để nhận khoỏ đọc và ghi lờn đối tượng một cỏch tuần tự. Như một phần của việc thực thi hai phương thức này, phương thức ReadWriteLock đưa ra khoỏ đọc-ghi theo như quy tắc liệt kờ trong bảng.

Lock Release (Nhả khoỏ)

Một đối tượng khỏch hiện thời đang giữ khoỏ cú thể nhả khoỏ bằng việc gọi phương thức done. Phương thức done cập nhật cỏc dữ kiện khoỏ thớch hợp và cho phộp khoỏ được đưa ra cho bất kỳ một tiến trỡnh đợi nào theo quy tắc đó nờu trong bảng.

Lớp ReadWriteLock là một thực thi chung cho việc đưa ra khoỏ đọc - ghi và cú thể sẵn sàng được sử dụng trong bất kỳ một ứng dụng nào.

Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn

Chƣơng III. PHÁT TRIỂN CHƢƠNG TRèNH THỬ NGHIỆM 3.1 Cơ sở lý thuyết

3.1.1 Giao dịch phõn tỏn

- Định nghĩa giao dịch

Định nghĩa giao dịch

Giao dịch (transaction) là một đơn vị nguyờn tố của sự truy xuất cơ sở dữ liệu bao gồm một dóy cỏc thao tỏc đọc ghi và cỏc bước tớnh toỏn trờn cơ sở dữ liệu. Kết thỳc một giao dịch, cỏc thao tỏc của nú cú thể được thực hiện đầy đủ hoặc khụng được thực hiện gỡ cả.

Tỡnh huống kết thỳc giao dịch

Một giao dịch luụn phải kết thỳc ngay cả khi cú xảy ra sự cố. Nếu giao dịch cú thể hoàn tất thành cụng tỏc vụ của nú, ta núi rằng giao dịch cú uỷ thỏc (commit). Ngược lại nếu một giao dịch phải ngừng lại khi chưa hoàn tất cụng việc, ta núi rằng nú bị huỷ bỏ (abort). Khi một giao dịch bị huỷ bỏ, quỏ trỡnh thực thi sẽ ngừng và tất cả mọi hành động đó được thực hiện đều phải được phục hồi lại, đưa cơ sở dữ liệu về trạng thỏi trước khi thực hiện giao dịch.

- Cỏc tớnh chất của giao dịch

Tớnh nguyờn tử

Tớnh nguyờn tử (automicity) liờn quan đến sự kiện là một giao dịch được xử lý như một đơn vị hoạt tỏc. Chớnh vỡ thế mà cỏc hành động của giao dịch, hoặc tất cả đều hoàn tất hoặc khụng một hành động nào hoàn tất. Tớnh nguyờn tử đũi hỏi rằng nếu việc thực thi giao dịch bị cắt ngang bởi một loại sự cố nào đú thỡ hệ quản trị cơ sở dữ liệu sẽ chịu trỏch nhiệm xỏc định cụng việc cần thực hiện đối với mỗi giao dịch để khụi phục lại sau sự cố. Cú hai chiều hướng hành động: hoặc nú sẽ được kết thỳc bằng cỏch hoàn tất cỏc hành động cũn lại, hoặc cú thể được kết thỳc bằng cỏch hồi phục lại tất cả cỏc hành động đó thực hiện.

Tớnh nhất quỏn

Tớnh nhất quỏn (consistency) của một giao dịch chỉ đơn giản phản ỏnh tớnh đỳng đắn của nú. Núi cỏch khỏc, một giao dịch là một chương trỡnh đỳng đắn ỏnh

Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn

xạ CSDL từ trạng thỏi nhất quỏn này sang một trạng thỏi nhất quỏn khỏc.  Tớnh biệt lập

Biệt lập (isolation) là tớnh chất của cỏc giao dịch, đũi hỏi mỗi giao dịch phải luụn nhỡn thấy cơ sở dữ liệu nhất quỏn. Núi cỏch khỏc, một giao dịch đang thực thi khụng thể làm lộ ra cỏc kết quả của nú cho cỏc giao dịch khỏc đang cựng hoạt động trước khi nú uỷ thỏc.

Tớnh bền vững

Tớnh bền vững (durability) muốn núi đến tớnh chất của giao dịch, bảo đảm rằng một khi giao dịch uỷ thỏc, kết quả nú được duy trỡ cố định và khụng bị xoỏ ra khỏi cơ sở dữ liệu. Vỡ thế hệ quản trị cơ sở dữ liệu bảo đảm rằng kết quả của giao dịch sẽ vẫn tồn tại dự cú xảy ra sự cố hệ thống.

3.1.2 Cỏc vấn đề về xung đột dữ liệu và một số giải thuật điều khiển (adsbygoogle = window.adsbygoogle || []).push({});

- Lý thuyết khả tuần tự

Hai giao tỏc Oij và Okl (i và k khụng nhất thiết phải phõn biệt) cựng truy cập đến một thực thể CSDL x được gọi là cú tương tranh nếu ớt nhất một trong chỳng là

thao tỏc ghi (write). Cú hai vấn đề mà chỳng ta cần lưu ý là, trước tiờn hai giao tỏc đọc khụng tương tranh với nhau. Vỡ thế chỳng ta cú thể núi về hai loại tương tranh:

đọc - ghi (read - write) và ghi - ghi (write - write). Thứ hai, hai giao tỏc này cú thể thuộc về cựng một giao dịch hoặc thuộc về hai giao dịch khỏc nhau. Trong trường hợp sau, hai giao dịch được gọi là cú tương tranh. Về trực quan, sự tồn tại của một tương tranh giữa hai giao tỏc cho thấy rằng thứ tự thực hiện của chỳng là quan trọng. Việc sắp thứ tự cho hai giao tỏc đọc là khụng cần thiết.

- Phõn loại cỏc cơ chế điều khiển đồng thời

Chỳng ta sẽ xếp cỏc cơ chế điều khiển đồng thời làm hai nhúm lớn: cỏc phương phỏp điều khiển đồng thời lạc quan và cỏc phương phỏp điều khiển đồng thời bi quan. Cỏc thuật toỏn bi quan đồng bộ hoỏ việc thực hiện đồng thời của cỏc giao dịch trước khi thực thi chỳng, trong khi đú cỏc thuật toỏn lạc quan để việc đồng bộ hoỏ cỏc giao dịch đến khi chỳng kết thỳc. Nhúm lạc quan gồm cú cỏc thuật toỏn dựa theo khúa chốt (locking-based algorithm), cỏc thuật toỏn dựa theo thứ tự cỏc

Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn

giao dịch và cỏc thuật toỏn lai (hybrid algorithm). Tương tự, nhúm lạc quan cũng cú thể được phõn loại thành cỏc thuật toỏn dựa trờn khoỏ chốt và cỏc thuật toỏn theo thứ tự thời gian.

Trong cỏch tiếp cận dựng khoỏ chốt, việc đồng bộ hoỏ giao dịch cú được bằng cỏch sử dụng khoỏ chốt vật lý hoặc logic trờn một phần cơ sở dữ liệu. Lớp cơ chế này được chia nhỏ hơn nữa tuỳ theo vị trớ thực hiện cỏc hoạt động quản lý khoỏ: 1. Trong lối khoỏ tập quyền, một trong cỏc vị trớ của mạng được chỉ định làm vị trớ

chớnh, ở đú lưu trữ cỏc bảng khoỏ cho toàn bộ cơ sở dữ liệu và chịu trỏch nhiệm trao khúa cho giao dịch.

2. Theo lối khoỏ bản chớnh thỡ ngược lại một trong cỏc bản sao (nếu cú nhiều bản) của mỗi đơn vị khoỏ được chỉ định làm bản chớnh (primary copy) và đú chớnh là bản sẽ bị khoỏ khi giao dịch truy xuất đến đơn vị đú. Nếu cơ sở dữ liệu khụng được nhõn bản (nghĩa là mỗi đơn vị khoỏ chỉ cú một bản duy nhất), cỏc cơ chế khoỏ bản chớnh sẽ phõn phối trỏch nhiệm quản lý khoỏ cho một số vị trớ.

3. Theo lối khoỏ phi tập trung, nhiệm vụ quản lý khoỏ là của tất cả cỏc vị trớ trong mạng. Trong trường hợp này, thực hiện một giao dịch cú sự tham gia và điều phối của bộ xếp lịch tại nhiều vị trớ. Mỗi bộ xếp lịch cục bộ chịu trỏch nhiệm về cỏc đơn vị khoỏ nằm cục bộ tại vị trớ đú.

Lớp cơ chế theo thứ tự thời dấu (timestamp ordering, TO) phải tổ chức thứ tự thực hiện cỏc giao dịch nhằm duy trỡ được tớnh nhất quỏn lẫn tương hỗ giữa cỏc vị trớ (liờn nhất quỏn). Việc xếp thứ tự này được duy trỡ bằng cỏch gỏn thời dấu cho cả giao dịch lẫn mục dữ liệu được lưu trong cơ sở dữ liệu. Những thuật toỏn này cú thể thuộc loại cơ bản (basic TO), đa bản (multiversion TO), hoặc bảo toàn (conservative TO).

- Cỏc thuật toỏn điều khiển đồng thời bằng khúa chốt

í tưởng chớnh của việc điều khiển đồng thời bằng khoỏ chốt là đảm bảo dữ liệu dựng chung cho cỏc thao tỏc tương tranh chỉ được truy xuất mỗi lần một giao dịch. Điều này được thực hiện bằng cỏch liờn kết một khoỏ chốt (lock) với mỗi đơn vị khoỏ. Khoỏ này được giao dịch đặt ra trước khi nú truy xuất và được điều chỉnh

Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn

lại vào lỳc nú hết sử dụng. Một đơn vị khoỏ khụng thể truy xuất được nếu đó bị khoỏ bởi một giao dịch khỏc. Vỡ vậy, yờu cầu khoỏ của một giao dịch chỉ được trao nếu khoỏ đi kốm hiện khụng bị một giao dịch nào giữ.

Cú hai loại khoỏ chốt (thường được gọi là thể thức khoỏ, lock mode) được đi kốm với mỗi đơn vị khoỏ: khoỏ đọc (read lock) và khoỏ ghi (write lock). Một giao dịch Ti đang muốn đọc một mục dữ liệu chứa trong đơn vị khoỏ x sẽ nhận được một

khoỏ đọc trờn x [ký hiệu là rli(x)] và cũng tương tự như thế đối với cỏc thao tỏc ghi. Hai thể thức khoỏ là tương thớch (compatibility) nếu hai giao dịch truy xuất đến cựng một mục dữ liệu cú thể nhận được khoỏ trờn mục dữ liệu đú cựng một lỳc.

Cỏc khoỏ đọc là tương thớch với nhau cũn cỏc khoỏ đọc - ghi, ghi - ghi thỡ khụng. Vỡ vậy, hai giao dịch vẫn cú thể đồng thời đọc cựng một mục dữ liệu.

- Cỏc thuật toỏn điều khiển đồng thời bằng thời dấu

Khụng giống như cỏc thuật toỏn dựa vào khoỏ, cỏc thuật toỏn điều khiển đồng thời bằng thời đấu khụng cố gắng duy trỡ tớnh khả tuần tự bằng phương phỏp độc quyền truy xuất. Thay vào đú, chỳng chọn trước một thứ tự tuần tự hoỏ và thực hiện cỏc giao dịch theo thứ tự đú. Để làm được điều này, bộ quản lý giao dịch gỏn cho mỗi giao dịch Ti một thời dấu (timestamp) duy nhất ts(Ti) vào lỳc khởi sự. Thời dấu là một định danh đơn giản dựng để nhận ra mỗi giao dịch một cỏch duy nhất và xếp thứ tự chỳng. Thời dấu là một bộ hai ngụi cú dạng (giỏ trị đếm cục bộ, định

Một phần của tài liệu nghiên cứu mẫu thiết kế kiến trúc phần mềm trong java (Trang 58 - 74)