Đặc tả Event-B cho bài toán cung cấp tiêu thụ

Một phần của tài liệu các kỹ thuật đặc tả và kiểm chứng cho các bài toán tương tranh (Trang 34)

3.1. Đặc tả và kiểm chứng bài toán tƣơng tranh sử dụng Event-B

3.1.2. Đặc tả Event-B cho bài toán cung cấp tiêu thụ

Mơ hình khởi tạo của vấn đề cung cấp-tiêu thụ đƣợc biểu diễn nhƣ trong (Hình 3.2), trong đó các điều kiện G1 ∩ G2 ≠ để bảo đảm các sự kiện của tiến trình producer và consumer có thể đƣợc thực hiện song song. Tại thời điểm ban đầu, sự kiện khởi tạo init sẽ đƣợc thực hiện để đồng thời kích hoạt các sự kiện producer và consumer, khi hàng đợi đã đầy sự kiện producer sẽ kích hoạt sự kiện close theo giao thức = [init, producer||consumer,close]

Do bộ đệm dữ liệu đƣợc giả thiết là hữu hạn và có kích thƣớc cố định. Học viên sử dụng cơ chế đồng bộ hóa với biến semaphore là Count đƣợc khởi

machine ProducerConsumer init Producer consumer when when grd1 : G1 grd1 : G2 then then

act1 : produce the database act1 : consume the database

end end close

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

tạo bằng không để biểu diễn số phần tử của bộ đệm. Biến Count sẽ tăng lên một khi một phần tử dữ liệu mới đƣợc bổ sung vào bộ đệm và giảm khi một phần tử dữ liệu đƣợc loại bỏ từ bộ đệm. Biến Buffer_Size biểu diễn kích thƣớc (số phần tử tối đa) của bộ đệm, bộ đệm sẽ đầy khi biến semaphore Count bằng kích thƣớc của nó và ngƣợc lại rỗng khi Count bằng khơng. Khi bộ đệm đã đầy sự kiện Producer sẽ kích hoạt sự kiện close thông qua biến semaphore isClose để chuyển sang trạng thái CLOSED. Mơ hình làm mịn đƣợc đặc tả nhƣ trong (Hình 3.3).

Mơ hình làm mịn trong (Hình 3.3) chỉ thực hiện tốt khi chúng ta có một tiến trình cung cấp và một tiến trình tiêu thụ. Trong trƣờng hợp có nhiều tiến trình cung cấp đồng thời đẩy các phần tử dữ liệu, hoặc nhiều tiến trình cùng tiêu thụ dữ liệu thì sẽ gây ra trƣờng hợp cạnh tranh dữ liệu (data race) do các tiến trình cùng nhau đọc/ghi dữ liệu tại một ô nhớ của bộ đệm ở cùng một thời điểm.

Để giải quyết vấn đề này chúng ta cần một cơ chế loại trừ, sao cho tại cùng một thời điểm chỉ cho phép một tiến trình producer và một tiến trình consumer đƣợc thực hiện song song nhau. Chi tiết đặc tả và kết quả chứng minh tự động đƣợc trình bày trong phụ lục B.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 3.1.3. Đặc tả Event-B cho bài toán đọc ghi

Để đặc tả bài tốn này, học viên giả thiết mỗi tiến trình đƣợc biểu diễn bằng một sự kiện của mơ hình khởi tạo (Hình 3.4). Tƣơng tự nhƣ mơ hình khởi tạo của bài tốn cung cấp-tiêu thụ, các điều kiện đƣợc giả thiết là thỏa mãn: G1 ∩ G2 = để các sự kiện kiện của nó đƣợc thực hiện tƣơng tranh với nhau.

Machine ReaderWriter Init reader writer when when grd1 : G1 grd : G2 then then

act1 : read the database act1 : write the database

end end

Hình 3.4. Mơ hình khởi tạo cho vấn đề đọc ghi.

refines ProducerConsumer invariant

inv1 : Buffer_size INAT inv2 : Count ()..Buffer_size …

Init

act1 : Count :=0 …

producer consumer

refiness producer refiness consumer

when when

grd1 : G1 grd1 : G2

grd2 : Count <Buffer_size grd2 : Count > 0

then then

act1 : create d act1 : consumer d act2 : Count := Count + 1 act2 : Count := Count – 1 act3 : if Count = Buffer_size then end

isCount = True end close when grd1 : isCount = True then act1 : G1 := False act2 : G2 := False end

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Học viên đặc tả các tiến trình tƣơng tranh reader-writer nhƣ trong Hình 3.5.Trong đặc tả này biến readers biểu diễn số tiến trình reader đƣợc đọc song

song nhau từ cơ sở dữ liệu sau khi thực hiện thành công sự kiện StartRead và trƣớc khi thực hiện sự kiệnEndRead. Tƣơng tự, biến writers biểu diễn số tiến trình writer đƣợc ghi song song vào cơ sở dữ liệu sau khi thực hiện xong sự kiện StartWrite và trƣớc khi thực hiện sự kiện EndWrite.

Biến điều kiện OKtoRead đƣợc sử dụng để khóa các tiến trình đọc reader cho đến khi điều kiện của nó đƣợc thỏa mãn cho phép đọc. Tƣơng tự với biến điều kiện OKtoWrite đƣợc sử dụng để khóa các tiến trình writer cho đến khi điều kiện của nó đƣợc thỏa mãn cho phép ghi write.

Các biến readers và writers đƣợc tăng dần trong sự kiện startRead và giảm dần trong sự kiện endRead. Tại thời điểm ban đầu, sự kiện startRead sẽ kiểm tra biểu thức điều kiện xem liệu một tiến trình sẽ bị khóa hay khơng, tại thời điểm kết thúc sự kiện endRead sẽ mở khóa một tiến trình nếu biểu thức điều kiện của nó đƣợc thỏa mãn.

Một tiến trình reader sẽ bị khóa nếu một vài tiến trình khác đang ghi write (writers ≠ 0) hoặc đang chờ để ghi write. Một tiến trình ghi write sẽ bị khóa khi và chỉ khi ở tại cùng thời điểm tồn tại một vài tiến trình khác đang đọc (readers ≠ 0) hoặc ghi (writers ≠ 0)(Hình 3.5). Chi tiết đặc tả và kết quả chứng minh tự động đƣợc trình bày trong phụ lục B.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ refines ReaderWriter variables readers writers OKtoRead OKtoWrite ... invariant

inv1 : readers 2 NAT inv2 : writers 2 NAT inv3 : OKtoRead 2 BOOL inv4 : OKtoWrite 2 BOOL ...

init

act1 : readers := 0 act2 : writers := 0 act3 : OKtoRead := true act4 : OKtoWrite := false ...

startRead startWrite

when when

grd1 : G1 grd1 : G2

grd2 : writers ≠ 0 grd2 : writers ≠ 0 readers ≠ 0 grd3 : OKtoWrite = false grd3 : OKtoWrite = true grd4 : OKtoRead = true grd4 : OKtoRead = false

then then

act1 : readers := readers+1 act1 : writers := writers+1 act2 : isRead := true act2 : isWrite := true

end end

endRead endWrite

when when

grd1 : endOfRead = true grd1 : endOfWrite = true

then then

act1 : readers := readers−1 act1 : writers := writers−1 act2 :if readers = 0 act2 : if OKtoRead = false

then OKtoWrite := true then OKtoWrite := true

endif else OKtoRead := true endif

end end

reader writer

when when

grd1 : isRead = true grd1 : isWrite = true

then then

act1 : read the database act1 : write to the database act2 : endOfRead := true act2 : endOfWrite := true act3 : OktoRead := false

end end

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 3.1.4. Kết quả chứng minh tự động

Học viên đã thử nghiệm cài đặt và đặc tả các vấn đề cung cấp-tiêu thụ và đọc- ghi bằng cơng cụ RODIN của Event-B, chi tiết của chƣơng trình thực nghiệm đƣợc trình bày trong phần Phụ lục. Bảng 3.1 thống kê kết quả của việc sinh và chứng minh tự động các mệnh đề cần chứng minh bằng bộ chứng minh của RODIN. Trong đó, số mệnh đề cần chứng minh đƣợc sinh ra tự động để bảo đảm tính đúng đắn của đặc tả, một số mệnh đề đã đƣợc chứng minh tự động. Bảng 3.1. Kết quả chứng minh Bài toán Số sự kiện Số mệnh đề cần chứng minh Số mệnh đề đã đƣợc chứng minh tự động Số mệnh đề còn lại Cung cấp tiêu thụ 10 18 7 11 Đọc ghi 9 12 4 8

Các mệnh đề còn lại chƣa đƣợc chứng minh có thể đƣợc chứng minh tự động bằng cách làm mịn lại đặc tả hoặc chứng minh thủ công.

3.2. Kỹ thuật đặc tả và kiểm chứng sử dụng FSP

3.2.1. Đặc tả FSP cho bài toán đọc ghi

Bài tốn đọc-ghi (readers-writers problem) đƣợc mơ tả bằng hai tiến trình hoạt động nhƣ sau:

Tiến trình đọc (reader): tại mỗi thời điểm có thể có một hoặc nhiều tiến trình đọc, nhƣng khơng có tiến trình nào đƣợc ghi.

Tiến trình ghi (writer): tiến trình ghi chỉ đƣợc thực hiện khi khơng có tiến trình khác nào đang đọc hoặc đang ghi.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Khi truy cập cơ sở dữ liệu từ bộ nhớ chia sẻ nhƣ khi ghi hoặc sửa đổi thì cần phải bảo đảm sự nhất quán của dữ liệu. Trong trƣờng hợp này các tiến trình đọc/ghi cần phải loại trừ lẫn nhau để bảo đảm tính nhất quán. Đặc tả bài tốn này đƣợc thực hiện thơng qua cơ chế semaphore nhƣ sau: (Bảng 3.2).

Bảng 3.2. Đặc tả FSP cho bài toán đọc ghi

const Nread = 2 // Số tiến trình đọctối đa cho phép range R = 1..Nread

const Nwrite=2 // Số tiền trình ghi tối đacho phép range W = 1..Nwrite

range ReadR = 0..Nread range WriteW = 0..Nwrite

READWRITELOCK = RW[0][False], RW[readers:ReadR][writing:Bool] = ( when (!writing)

reader[R].acquire -> RW[readers+1][writing] | reader[R].release -> RW[readers-1][writing] | when (readers==0 && !writing)

writer[W].acquire -> RW[readers][True] | writer[W].release -> RW[readers][False]). USER = (acquire -> release -> USER). ||READERS_WRITERS =

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Trong đó:

Nread và Nwrite lần lƣợt là số các tiến trình đọc và ghi, khơng mất tính tổng quát, học viên giả thiết tối đa có hai tiến trình;

Các tiến trình reader chỉ đƣợc thực hiện khi tiến trình writer trong trạng thái khóa và ngƣợc lại.

Khi khơng có tiến trình nào thực hiện ghi (when (!writing)) thì biến semaphore chuyển trạng sang trạng thái true để cho tiến trình đọc đƣợc thực hiện.

Khi khơng có tiến trình nào thực hiện đọc và ghi (when (readers==0 && !writing)) thì biến semaphore chuyển trạng sang trạng thái true để cho tiến trình đọc đƣợc thực hiện.

Chi tiết đặc tả và chứng minh tự động bằng công cụ LTSA đƣợc trình bày trong phụ lục C.

3.2.2 Đặc tả FSP cho bài cung cấp tiêu thụ

Bài tốn cung cấp-tiêu thụ (producer-consumer problem) là một ví dụ điển hình về sự đồng bộ hóa giữa các tiến trình tƣơng tranh. Trong đó:

Producer: tạo các phần tử dữ liệu và đẩy vào bộ đệm Q bằng phƣơng thức push(Q), bộ đệm đƣợc biểu diễn bằng một hàng đợi với kích thƣớc hữu hạn và cố định,

Consumer: lấy các phần tử dữ liệu từ hàng đợi qua phƣơng thức pop(Q).

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Bảng 3.3. Đặc tả FSP cho bài toán cung cấp tiêu thụ

BUFFER(N=3) = COUNT[0],

COUNT[i:0..N] = (when (i<N) put -> COUNT[i+1] |when (i>0) get -> COUNT[i-1] ).

PRODUCER = (put -> PRODUCER). CONSUMER = (get -> CONSUMER).

|| BOUNDEDBUFFER = (PRODUCER || BUFFER(3) || CONSUMER) Đặc tả bài toán cung cấp tiêu thụ bằng FSP trong (Bảng 3.3). Trong đó:

Giả thiết bộ đệm có kích thƣớc tối đa bằng 3, các tiến trình cung cấp chỉ đƣợc đẩy dữ liệu vào bộ đệm khi kích thƣớc bộ đệm nhỏ hơn 3.

Các tiến trình tiêu thụ chỉ đƣợc lấy dữ liệu từ bộ đệm khi kích bộ đệm lớn hơn 0.

Đặc tả gồm ba tiến trình PRODUCER, BUFFERvà

CONSUMERbiểu diễn sự tƣơng tranh.

Chi tiết đặc tả và chứng minh tự động bằng công cụ LTSA đƣợc trình bày trong phụ lục D.

3.3. Kết luận

Trong chƣơng này, luận văn đã giới thiệu một số bài toán tƣơng tranh trong các hệ thống an toàn và bảo mật. Một số kỹ thuật đặc tả và kiểm chứng tự động cho các bài toán này ở mức thiết kế.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

CHƢƠNG 4

CÀI ĐẶT THỰC NGHIỆM

Trong chƣơng này, luận văn trình bày mơ hình Đọc và Ghi đơn giản, mơ hình Đọc và Đọc-ghi. Ngồi ra học viên cịn trình bày một số thuật tốn kiểm tra tính khả tuần tự của một lịch biểu.Áp dụng những thuật toán này để cài đặt hồn thiện chƣơng trình kiểm tra tính khả tuần tự của một lịch.

4.1. Mơ hình Đọc và Ghi đơn giản

Trong mơ hình này, mỗi tiến trình đƣợc xem nhƣ là một chuỗi các câu lệnh khóa chốt (lock) và mở khóa (unlock). Mỗi mục đƣợc khóa phải đƣợc mở khóa sau đó. Giữa một bƣớc LOCK A và bƣớc UNLOCKA kế tiếp, một

tiến trình sẽ đƣợc coi là đang giữ một khóa trên A. Giả sử rằng, một tiến trình sẽ khơng đƣợc u cầu khóa một mục nếu hiện tại nó đang giữ khóa của mục đó, hoặc mở một mục mà nó khơng giữ khóa trên mục đó.

Ví dụ, tại một tiến trình Ti nào đấy khơng thể có dịng lệnh nhƣ sau:

LOCK A LOCK A

LOCK B UNLOCK A

Ngồi ra, khi một tiến trình khóa chốt mục A, nó sẽ có quyền đọc và ghi trên A. Nghĩa là mỗi bƣớc LOCK sẽ kéo theo thao tác đọc và mỗi bƣớc UNLOCK sẽ kéo theo thao tác ghi.

Về hình thức, gán một hàm f riêng biệt cho mỗi cặp LOCK A và

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

bởi tiến trình trƣớc khi mở khóa cho A. Một tiến trình có thể có nhiều hàm

nhƣ thế đối với một mục A, ta có thể khóa và mở khóa một mục nhiều lần.

Gọi A0 là giá trị ban đầu của A trƣớc khi các tiến trình bắt đầu thực hiện.

Thí dụ 4.1: Trong Hình 4.1 ta có ba tiến trình và những hàm có liên quan

với mỗi cặp LOCK-UNLOCK, là những hàm xuất hiện trên cùng một dòng với UNLOCK.

f1đi kèm với A trong T1, nhận A và B là đối số, bởi vì đây là những mục

đƣợc T1 đọc. Hàm f3chỉ nhậnBvà C làm đối số vì T2 đang đọc B, C . LOCK A LOCK B UNLOCK A f1(A,B) UNLOCK B f2(A,B) LOCK B LOCK C UNLOCK B f3(B,C) LOCK A UNLOCK C f4(A,B,C) UNLOCK A f5(A,B,C) LOCK A LOCK C UNLOCK A f6(A,C) UNLOCK C f7(A,C) T1 T2 T3 Hình 4.1. Ba tiến trình

4.2. Thuật tốn kiểm tra tính khả tuần tự

Đầu vào: Một lịch biểu S, cho một tập các tiến trình T1,…, Tk

Đầu ra: Khẳng định S có khả tuần tự hay khơng. Nếu có thì đƣa ra một

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Phƣơng Pháp: Tạo ra một đồ thị có hƣớng G (đƣợc gọi là đồ thị tuần tự

hóa), có các nút tƣơng ứng với các tiến trình. Để xác định cung của đồ thị G,

gọi S là

a1, a2,…,an

trong đó mỗi ai là một hành động thuộc dạng

Tj: LOCK Am hoặc Tj: UNLOCK Am

Tj biểu thị cho tiến trình thực hiện hành động trên. Nếu ai là

Tj: UNLOCK Am

Hãy tìm hành động ap kế tiếp có dạng Ts: LOCK Am. Nếu có một hành

động nhƣ thế và s≠j, chúng ta sẽ vẽ một cung từ Tj đến Ts. Cung này có ý

nghĩa là trong một lịch biểu tuần tự tƣơng đƣơng S, Tj phải đi trƣớc Ts.

Nếu G có một chu trình thì S bất khả tuần tự. Nếu G khơng có chu trình

thì tìm một thứ tự tuyến tính cho các tiến trình sao cho Ti đi trƣớc Tj khi có

một cungTi → Tj. Có thể tìm ra một thứ tự nhƣ thế bằng một quá trình gọi là sắp xếp Topo đƣợc định nghĩa nhƣ sau:

Phải có một nút Ti nào đó khơng có cung đến, nếu khơng có thể chứng

minh G có chu trình. Liệt kê Ti rồi loại Ti khỏi G. Lập lại quá trình này trên đồ thì cịn lại cho đến khi khơng cịn nút nào nữa. Thứ tự các nút đƣợc liệt kê trong danh sách là một thứ tự tuần tự của tiến trình.

Hình 4.2. Đồ thị thứ tự trƣớc sau của các tiến trình

T1

T2

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Thí dụ 4.2: Xét lịch biểu của Hình 4.3.Đồ thị G đƣợc trình bày trong

Hình 4.2, có các nút T1, T2 và T3. Để tìm các cung, xét mỗi bƣớc UNLOCK trong Hình 4.3 Bƣớc Thực hiện (1) T1: LOCK A (2) T2: LOCK B (3) T2: LOCK C (4) T2: UNLOCK B (5) T1: LOCK B (6) T1: UNLOCK A (7) T2: LOCK A (8) T2: UNLOCK C (9) T2: UNLOCK A (10) T3: LOCK A (11) T3: LOCK C (12) T1: UNLOCK B (13) T3: UNLOCK C (14) T3: UNLOCK A Hình 4.3. Một lịch biểu bƣớc (4) T2: UNLOCK B

đi theo sau là T1: LOCK B. Trong trƣờng hợp này, thao tác khóa xảy ra

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

tƣơng tự, bƣớc (6) và (7) vẽ một cung từ T1 → T2.

bƣớc (8) T2: UNLOCK C

theo sau là T3: LOCK C tại bƣớc (11), và khơng có bƣớc LOCK C nào nằm ở giữa hai bƣớc này. Vì vậy vẽ một cung từ T2 → T3.

Lịch biểu Hình 4.3 là khơng khả tuần tự vì G có một chu trình.

4.3. Nghi thức khóa chốt hai pha

Nghi thức đƣợc gọi là hai pha (two phase protocol) khi mọi tiến trình phải thực hiện tất cả các khóa chốt (lock) trƣớc tất cả mọi thao tác mở khóa (unlock). Các tiến trình tuân theo nghi thức này đƣợc gọi là các tiến trình hai

Một phần của tài liệu các kỹ thuật đặc tả và kiểm chứng cho các bài toán tương tranh (Trang 34)

Tải bản đầy đủ (PDF)

(61 trang)