Khóa luận Phương pháp kiểm chứng tính đúng đắn của một chương trình Java đa luồng thông qua sử dụng logic Hoare

MỤC LỤC

TÓM TẮT KHÓA LUẬN.-1 -MỞ ĐẦU .-4 -CHƯƠNG 1. LOGICHOARE .-6 -1.1. Logic vị từ .-6 -1.2. Các tiên đề của Logic Hoare .-9 -1.2.1. Các công thức đúng cú pháp cho chứng minh chương trình .-9 -1.2.2. Tiên đề của phép gán. -10 -1.2.3. Các quy tắc bổ sung. -10 -CHƯƠNG 2. NGÔN NGỮ TUẦN TỰ . -12 -2.1. Cú pháp . -13 -2.2. Ngữ nghĩa . -16 -2.2.1. Trạng thái và các cấu hình . -16 -2.2.2. Các ngữ nghĩa toán tử . -18 -2.3. Ngôn ngữ khẳng định . -20 -2.3.1. Cú pháp . -20 -2.3.2. Ngữ nghĩa. -21 -2.4. Hệ chứng minh . -25 -2.4.1. Phác thảo chứng minh. -26 -2.4.2. Kiểm chứng các điều kiện . -31 -CHƯƠNG 3. NGÔN NGỮ TƯƠNG TRANH . Error! Bookmark not defined.

3.1. Cú pháp . -42 -3.2. Ngữ nghĩa . -42 -3.3. Hệ chứng minh . -43 -3.3.1. Phác thảo chứng minh. -43 -3.3.2. Kiểm chứng các điều kiện . -43 -CHƯƠNG 4. BỘ ĐIỀU PHỐI LẶP LẠI. Error! Bookmark not defined.

4.1. Cú pháp . -47 -4.2. Ngữ nghĩa . -47 -4.3. Hệ chứng minh .-48-4.3.1. Phác thảo chứng minh. -49 -4.3.2. Kiểm chứng các điều kiện . -51 -CHƯƠNG 5. PHÉP TOÁN ĐIỀU KIỆN TRƯỚC YẾU NHẤT . -53 -5.1. Các phép toán thay thế. -54 -5.2. Kiểm chứng các điều kiện .- 54-CHƯƠNG 6. TÍNH ĐÚNG ĐẮN. Error! Bookmark not defined.

6.1. Tính đúng đắn . -59 -KẾT LUẬN .-62-TÀI LIỆU THAM KHẢO .- 63-

pdf64 trang | Chuyên mục: Java | Chia sẻ: dkS00TYs | Lượt xem: 2901 | Lượt tải: 3download
Tóm tắt nội dung Khóa luận Phương pháp kiểm chứng tính đúng đắn của một chương trình Java đa luồng thông qua sử dụng logic Hoare, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
hĩa ở trong 2.4.2. 
 - 59 - 
 CHƯƠNG 6. TÍNH ĐÚNG ĐẮN 
Một chương trình được cho cùng với chú thích của nó, hệ chứng minh quy định một số 
kiểm chứng các điều kiện đối với các kiểu khác nhau của các khẳng định và các cấu 
trúc chương trình. Tính đúng đắn của hệ chứng minh có nghĩa là đối với một phác thảo 
chứng minh thỏa mãn kiểm chứng các điều kiện, tất cả các cấu hình có thể đạt được 
trong các ngữ nghĩa của toán tử thỏa mãn các khẳng định được cho. 
Để thuận tiện, ta giới thiệu các chú thích sau: Một chương trình được cho prog, 
ta viết prog hoặc  cho chú thích của nó, và viết |prog , nếu prog thỏa mãn tất cả 
các yêu cầu được phát biểu trong các khẳng định, và '|' prog , nếu prog’ với chú 
thích ' thỏa mãn kiểm chứng các điều kiện của hệ chứng minh: 
Định nghĩa 6.0.1. Một chương trình được cho prog với chú thích  , thì |prog khi 
và chỉ khi với tất cả các cấu hình có thể đạt được ,T của prog, với tất cả 
  Tstm ,,  , và với tất cả các môi trường logic  chỉ tham chiếu tới các giá trị đang 
tồn tại trong  : 
1.    stmpreL|,,  , và 
2. GIG|, . 
Hơn nữa, với tất cả các lớp c, các đối tượng   cVal , và các trạng thái cục bộ 
' : 
3.   cL I|',,  . 
Đối với các phác thảo chứng minh, ta viết '|' prog khi và chỉ khi prog’ với chú 
thích ' thỏa mãn kiểm chứng các điều kiện của hệ chứng minh. 
6.1. Tính đúng đắn 
Tính đúng đắn có nghĩa là tất cả các cấu hình có thể đạt được thỏa mãn các khẳng định 
của chúng đối với một chương trình được chú thích – được kiểm chứng bằng sử dụng 
chứng minh các điều kiện. Tính đúng đắn của một phương thức được chứng minh 
bằng một quy nạp đơn giản trong số của các bước tính toán. 
 - 60 - 
Trước khi bắt tay vào trình bày tính đúng đắn và chứng minh của nó, ta cần hiểu 
rõ mối quan hệ giữa chương trình gốc và phác thảo chứng minh, có nghĩa là, chương 
trình gốc được mở rộng bằng các biến phụ trợ, và được bao bọc với các khẳng định. 
Để tạo sự rõ ràng trong mối quan hệ giữa chương trình gốc và phác thảo chứng 
minh, ta định nghĩa một toán tử chiếu prog , xóa tất cả các phần thêm vào của sự 
biến đổi. Cho prog’ là một phác thảo chứng minh với prog, và ',' T là một cấu hình 
toàn cục của prog’. Thì prog' được định nghĩa bởi bỏ đi tất cả các biến thể hiện 
phụ trợ từ các miền trạng thái thể hiện. Với tập các cấu hình luồng, progT ' được cho 
bởi hạn chế các miền của các trạng thái cục bộ để không có các biến phụ trợ và bỏ đi 
tất cả các bổ sung. Thêm vào đó, với các cấu hình cục bộ   ',, ! Tstmreturn retgetlock  , 
nếu luồng đang thi hành ở trong tập đợi, nghĩa là, nếu      waitnthread  ',  với 
một số n nào đó, thì lệnh getlockreturn được thay thế bằng getlockreturnsignal;? . Hơn nữa, 
với các cấu hình cục bộ   '';,, ! Tstmreturnstm ret  với stm một phép gán phụ 
trợ trong phương thức notify hoặc trong phương thức notifyAll, phép gán phụ trợ stm 
được thay thế theo thứ tự bằng !signal và !signal_all. Bổ đề sau biểu thị rằng nếu sự 
biến đổi không thay đổi hành vi của các chương trình: 
Bổ đề 6.1.1. Cho prog’ là một phác thảo chứng minh với một chương trình prog. Thì 
,T là một cấu hình có thể đạt được của prog khi và chỉ khi tồn tại một cấu hình có 
thể đạt được ',' T của prog’ với  ,',' TprogprogT  . 
Bổ đề 6.1.2. (Định danh) Cho ,T là một cấu hình có thể đạt được của một phác 
thảo chứng minh. Thì: 
1. với tất cả các ngăn xếp  và ' trong T và với tất cả các cấu hình cục bộ 
   stm,, và   '',','  stm ta có    threadthread '  khi và chỉ khi '  , và 
2. với mỗi ngăn xếp    nnn stmstm ,,...,, 000  trong T và các chỉ số nji  ,0 , 
(a)   0 threadi ; 
(b) i < j và ji   kéo theo       counterconfconf iji   , 
(c) 0 < j kéo theo       threadconfcaller jjjj 111 ,,   , và 
(d)     threadcallerproj 00 3,   , 
 - 61 - 
trong đó  ivproj , là thành phần thứ i của bộ v. 
Bổ đề sau phát biểu rằng luồng sở hữu khóa, và các tập đợi và tập được thông 
báo của các ngữ nghĩa được trình bày bởi các biến lock, wait, và notified. Hơn nữa, bổ 
đề đảm bảo rằng tính phân đoạn của các dãy được lưu trữ trong các biến wait và 
notified; nếu thứ tự của các phần tử không quan trọng, ta sử dụng tập ký hiệu cho các 
giá trị của chúng. 
Bổ đề 6.1.3. (Lock, Wait, Notify) Cho ,T là một cấu hình có thể đạt được của một 
phác thảo chứng minh với chương trình gốc prog,   Val là một định danh đối 
tượng, và cho   Tstm  ',, 000   . Hơn nữa cho n là số của các thi hành phương 
được đồng bộ của  trong  , nghĩa là, n =   |.|,,| synchrstmstm   . Thì: 
1. (a)  ,progTowns  khi và chỉ khi    freelock  
(b)   ,progowns  khi và chỉ khi     nlock ,0  
2. (a)   ,progTwait  khi và chỉ khi     waitn  ,0 
(b)   ,progTnotified  khi và chỉ khi     notifiedn  ,0 
(c)     1,iwaitproj  =     1,jwaitproj  kéo theo i = j 
(d)     1,inotifiedproj  =     1,jnoitifiedproj  kéo theo i = j 
(e) nếu     waitm  ,0 hoặc     notifiedm  ,0 thì m = n 
(f)      notifiedwait    
trong đó  is là thành phần thứ i của dãy s. 
Cuối cùng, biến thể hiện phụ trợ started của một đối tượng lưu trữ nếu luồng của 
đối tượng đã được khởi động hoặc không: 
Bổ đề 6.1.4. (Started) Đối với tất cả các cấu hình có thể đạt được ,T của một phác 
thảo chứng minh cho một chương trình prog, và tất cả các đối tượng   Val , ta có 
 ,progTstarted  khi và chỉ khi   started . 
Cho prog là một chương trình với chú thích  , và prog’ một phác thảo chứng 
minh tương ứng với chú thích ' . Cho GI’ là bất biến toàn cục của ' , 'cI biểu thị các 
 - 62 - 
bất biến lớp của nó, và với một khẳng định p của  cho p’ biểu thị khẳng định của ' 
được kết hợp với cùng điểm điều khiển. Ta viết '|  khi và chỉ khi GIGIG  '| , 
ccL II  '| đối với tất cả các lớp c, và '| ppL  , đối với tất cả các khẳng định p của 
 được kết hợp với các điểm điều khiển nào đó. Để cho các biến phụ trợ ngữ nghĩa, 
các kéo theo ở trên được ước lượng trong ngữ cảnh của các trạng thái của chương trình 
được bổ sung. Định lý sau phát biểu tính đúng đắn của phương pháp chứng minh. 
Định lý 6.1.5. (Tính đúng đắn) Cho prog’ là một phác thảo chứng minh với chú thích 
'prog . 
Nếu '|' progprog  thì '|' progprog  
Chứng minh tính đúng đắn bao gồm một chứng minh quy nạp trong chiều dài của 
tính toán, đồng thời trong tất cả ba phần từ định nghĩa 6.0.1. Đối với bước quy nạp, ta 
giả thiết rằng kiểm chứng các điều kiện được thỏa mãn và giả thiết một cấu hình có thể 
đạt được thỏa mãn chú thích. Ta tạo trường hợp khác biệt trong cú pháp của bước tính 
toán kế tiếp: Nếu bước tính toán thi hành một phép gán, thì ta sử dụng các điều kiện 
tính đúng đắn cục bộ để chứng minh tính quy nạp của sự thi hành các thuộc tính của 
cấu hình cục bộ, và kiểm tra tính không có can thiệp đối với tất cả các cấu hình cục bộ 
khác và các bất biến lớp khác. Đối với giao tiếp, tính bất biến đối với thi hành các đối 
tác và bất biến toàn cục được chứng tỏ bằng sử dụng kiểm tra sự hợp tác đối với giao 
tiếp. Giao tiếp với chính nó không ảnh hưởng trạng thái toàn cục; tính bất biến của các 
thuộc tính còn lại dưới các quan sát tương ứng được chứng tỏ với sự giúp đỡ của của 
kiểm tra tính không có can thiệp. Cuối cùng, đối với tạo đối tượng, tính bất biến đối 
với bất biến toàn cục, tạo cấu hình cục bộ, bất biến lớp của đối tượng được tạo được 
đảm bảo các điều kiện của kiểm tra hợp tác đối với tạo đối tượng; tất cả các thuộc tính 
khác được chứng tỏ là bất biến thông qua sử dụng kiểm tra tính không có can thiệp. 
Định lý 6.1.5 được đưa ra đối với tính có thể đạt được của các chương trình được 
bổ sung. Với sự giúp đỡ của bổ đề 6.1.1, ta có ngay lập tức : 
Hệ quả 6.1.6. Nếu '|' progprog  và progprog   '| , thì progprog | . 
 - 63 - 
KẾT LUẬN 
Với sự phát triển không ngừng của nhu cầu tính toán, xử lý số liệu, khai phá 
thông tin thì lập trình đa luồng ngày càng quan trọng và là một phần không thể thiếu 
trong các hệ thống tính toán, cũng như trong các hệ thống ứng dụng. Sự quan trọng và 
cần thiết của việc kiểm chứng tính đúng của chương trình luôn được quan tâm đúng 
mức do vai trò to lớn của nó. Kiểm chứng tính đúng đắn của chương trình Java đa 
luồng không chỉ mang ý nghĩa về mặt lý thuyết của kiểm chứng mà nó thực sự có vai 
trò không thể thiếu trong thực tế, qua đó giúp ta tránh được những sai lầm, thiếu sót dù 
là rất nhỏ nhưng có thể dẫn tới những hậu quả thật khó lường. Trong các hệ thống đòi 
hỏi tính an toàn cao như các hệ thời gian thực, các hệ mô phỏng, hoặc các hệ thống 
giám sát vệ tinh, máy bay thì kiểm chứng tính đúng đắn của các chương trình mang 
một ý nghĩa vô cùng to lớn. Nó cho phép xác định được tính đúng đắn của chương 
trình từ các giả thiết và các khẳng định ban đầu mà không cần phải chứng thực điều đó 
khi chạy chương trình, mà nếu trong thực tế chương trình chạy sai gây ra hậu quả vô 
cùng nghiêm trọng. 
Phương pháp kiểm chứng trên còn được sử dụng để chứng minh tính không có 
deadlock của một chương trình Java. Phác thảo chứng minh của chương trình nếu thỏa 
mãn các điều kiện của chứng minh tính không có deadlock thì chương trình sẽ không 
có deadlock. 
Để có thể kiểm chứng tính đúng đắn của một chương trình Java đa luồng, ta có 
thể sử dụng phương pháp đã trình bày ở trên. Nó là cơ sở, tiền đề để xây dựng các 
công cụ hỗ trợ việc kiểm chứng tự động. Do thời gian thực hiện đề tài có hạn và phạm 
vi rộng lớn của đề tài, khóa luận chưa đề cập hết được các phương pháp cũng như kỹ 
thuật hiện đại kiểm chứng tính đúng đắn của chương trình, cũng như các công cụ hỗ 
trợ kiểm chứng hiện nay. 
 - 64 - 
TÀI LIỆU THAM KHẢO 
[1] Erika Abraham - An Assertional Proof System for Multitheaded Java – 
Theory and Tool Support 
WEBSITE: 
[2]  
[3]  

File đính kèm:

  • pdfĐề tài Phương pháp kiểm chứng tính đúng đắn của một chương trình Java đa luồng thông qua sử dụng logic Hoare.pdf
Tài liệu liên quan