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 qt, 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 toá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 yê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 tn theo nghi thức này đƣợc gọi là các tiến trình hai pha, pha đầu là khóa chốt (lock) và pha thứ hai là mở khóa (unlock).
Nghi thức hai pha có đặc điểm là mọi tập tiến trình tuân theo nghi thức này khơng thể có một lịch biểu bất khả tuần tự mà lại hợp lệ đƣợc. Nghĩa là bộ xếp lịch chỉ cần trao khóa đƣợc yêu cầu nếu khóa đang có sẵn, và buộc tiến trình phải chờ hoặc bãi bỏ tiến trình nếu khóa hiện khơng có sẵn.
4.4. Mơ hình Đọc và Đọc-ghi
Khóa đọc (read-lock): Một tiến trình T chỉ muốn đọc mục A sẽ thực hiện lệnh RLOCK A và ngăn khơng cho bất kỳ tiến trình khác nào ghi giá trị mới của A trong khi T đã khóa A. Tuy nhiên các tiến trình khác vẫn có thể giữ một khóa đọc trên A cùng lúc với T.
Khóa đọc-ghi (write-lock): Một tiến trình muốn thay đổi giá trị của mục
A,trƣớc tiên lấy khóa đọc-ghi bằng cách thực hiện lệnh WLOCK A. Khi một
tiến trình giữ khóa đọc-ghi trên một mục thì những tiến trình khác khơng thể lấy đƣợc khóa đọc hay khóa đọc-ghi trên mục đó.
Cả hai khóa đọc và đọc-ghi đều đƣợc loại bỏ bằng lệnh UNLOCK. Cũng giống nhƣ ở mơ hình Đọc-Ghi, một tiến trình sẽ khơng đƣợc yê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ó
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
khơng giữ khóa trên mục đó. Nhƣng trong một số tình huống, tiến trình có thể xin một khóa đọc-ghi cho một mục mà nó đã giữ khóa đọc.
4.5. Thuật tốn kiểm tra tính khả tuần tự của các lịch biểu với các khóa đọc và đọc-ghi.
Đầ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 sẽ đƣa ra một lịch biểu tuần tự tƣơng đƣơng với S.
Phƣơng pháp: Xây dựng một đồ thị tuần tự hóa G. Các nút tƣơng ứng với các tiến trình, các cung xác định bằng các qui tắc sau:
Giả sử trong S, tiến trình Ti nhận khóa đọc hoặc khóa đọc-ghi mục A, Tj là tiến trình kế tiếp nhận khóa đọc-ghi A, và j≠i thì vẽ một cung từ Ti đến Tj.
Giả sử trong S, tiến trình Ti nhận khóa đọc-ghi mục A. Gọi Tm với m≠ilà
một tiến trình nhận khóa đọc A sau khi Ti mở khóa A nhƣng trƣớc tất cả các
tiến trình khác khóa đọc-ghi A. Thì vẽ một cung từ Ti đến Tm.
Nếu G có chu trình thì S bất khả tuần tự. Nếu G khơng có chu trình thì
một sắp xếp Topo của G là thứ tự tuần tự cho các tiến trình này.
Thí dụ 4.3: Trong Hình 4.4, một lịch biểu gồm bốn tiến trình; Hình 4.5
là một đồ thị tuần tự hóa của lịch biểu này.
Lệnh UNLOCK đầu tiên là bƣớc (3), ở đó T3 mở khóa đọc-ghi cho A. Sau bƣớc (3) là các khóa đọc A của T1 và T2 (bƣớc (4), (7)) và một khóa đọc-ghi do T4 tại bƣớc (12). Nhƣ vậy T1, T2 và T4 phải theo T3. Vẽ một cung từ T3 đến các nút này.
T1 và T2 sau bƣớc (7), tuy nhiên T4 khơng thể nhận khóa đọc-ghi cho đến
khi T1 và T2 giải phóng các khóa đọc của chúng.
Tƣơng tự nhƣ vậy, T4 giải phóng khóa đọc trên B ở bƣớc (5) và khóa đọc- ghi kế tiếp trên B là do T3, vì thế vẽ một cung từ T4 đến T3.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Đến đây xuất hiện một chu trình, vì vậy lịch biểu trong Hình 4.4 là bất