Báo cáo deadlock và vi phạm của chương trình guinhan

Một phần của tài liệu (LUẬN văn THẠC sĩ) ứng dụng của spin để kiểm chứng sự tuân thủ thể thức tương tác của chương trình (Trang 52 - 56)

Theo mặc định, một số tiến trình không dừng ở lệnh cuối cùng, chúng sẽ được cho là deadlock.

Trong SPIN thì deadlock sẽ xảy ra khi chương trình hay một tiến trình nào đó chấm dứt không ở trạng thái kết thúc, nó sẽ bị dừng do không có lệnh nào có thể được tiến hành. Trạng thái deadlock là chương trình dừng ở thời điểm không thích hợp. Từ đặc điểm này của SPIN chúng ta có thể áp dụng để giải quyết một số bài toán, trong đó có bài toán kiểm chứng sự tuân thủ hoặc không tuân thủ thể thức của chương trình. Cụ thể, khi mô tả dịch vụ s của một thành phần là tên của một thông báo trên kênh khớp nối đồng bộ K giữa thành phần và môi trường, việc gọi dịch vụ s bởi lệnh K?s của môi trường, việc cung cấp dịch vụ s của thành phần bởi lệnh K!s. Nếu môi trường không tuân thủ giao thức của thành phần thì sẽ có trường hợp môi trường tiến hành lệnh K!s nhưng thành phần không tiến hành lệnh K?s nên môi trường phải chờ ở lệnh này và thành phần cũng không tiến hành được lệnh thông tin nào từ môi trường. Do đó deadlock xảy ra.

3.5. Kết luận

Bộ công cụ kiểm chứng mô hình SPIN với ngôn ngữ mô hình hóa Promela là

công cụ kiểm chứng mô hình đơn giản, ngôn ngữ trực quan. Hệ thống kiểm chứng sẽ quyết định khi nào nào mô hình thỏa mãn yêu cầu đặt ra bằng cách thăm qua (traversal) các trạng thái của automata đó.

Dựa vào các thể thức tương tác của chương trình, của thành phần được đặt ra trong đặc tả giao diện của chương trình và thành phần và quan trọng là mô hình hóa các thể thức này trong công cụ kiểm chứng SPIN chúng ta có thể kiểm chứng được sự tuân thủ hoặc không tuân thủ thể thức của chương trình một cách chính xác.

CHƯƠNG 4. KIỂM CHỨNG SỰ TUÂN THỦ THỂ THỨC TƯƠNG TÁC CỦA CHƯƠNG TRÌNH BẰNG SPIN

4.1. Phương pháp

Đặc tả giao diện của chương trình và thành phần có thể cung cấp các dịch vụ như read, write, close đối với tệp v.v. Các dịch vụ mà một thành phần yêu cầu phải là các dịch vụ mà chương trình cung cấp. Thể thức tương tác của chương trình và các thành phần đó là việc thực hiện các lời gọi hàm, thủ tục v.v. theo một thứ tự đã định sẵn được đặc tả bằng ngôn ngữ automata hoặc biểu thức chính qui, hoặc các thể thức này có thể là các ràng buộc như đã nêu (trong phần 2.6). Ở đây kiểm chứng là kiểm tra xem thứ tự các lời gọi dịch vụ của thành phần từ chương trình có tuân thủ thứ tự lời gọi dịch vụ được qui định bởi thành phần hay không.

Nhận xét: Vì thành phần cung cấp dịch vụ và chương trình gọi cùng các loại dịch vụ đó nên ta có thể kiểm chứng sự tuân thủ hoặc không tuân thủ bằng cách mô hình hóa thể thức của thành phần thành và hành vi gọi dịch vụ của chương trình bằng hai tiến trình sử dụng một kênh dữ liệu chung, hai tiến trình sử dụng kênh dữ liệu chung này là kênh gặp (rendezvous). Tiến trình thể hiện sự ung cấp dịch vụ của thành phần thực hiện việc truyền dữ liệu trên kênh. Tiến trình thể hiện yêu cầu dịch vụ của chương trình thực hiện việc nhận dữ liệu trên kênh.

Hai tiến trình trên chạy song song và thực hiện việc gửi và nhận dữ liệu trên kênh một cách đồng bộ (thực hiện gửi và nhận được coi là một atomic), do đó, nếu tiến trình gửi một thông điệp mà tiến trình còn lại không nhận được thông điệp thì nó sẽ dẫn tới tình trạng deadlock. Điều này thể hiện là thể thức tương tác của chương trình không tuân thủ thể thức tương tác của thành phần. Nếu như không xảy ra tình trạng deadlock thì thể thức của thành phần tuân thủ thể thức của chương trình.

Các bước thực hiện:

Bước 1. Như đã nêu (chương 3), ta mô tả kiểu thông báo là kiểu mtype = {u, v, s, … } trong đó u, v, s, … là tên của các dịch vụ cung cấp bởi thành phần.

Khai báo một kênh truyền thông điệp dạng kênh gặp (rendezvous) để thực hiện

việc truyền, nhận thông điệp kiểu mtype ở trên: chan k = [0] of mtype. Sau đó

dịch giao thức tương tác của thành phần (automat, biểu thức chính qui v.v.) thành

một tiến trình P trong SPIN bằng ngôn ngữ mô hình hóa Promela.

Bước 2. Trừu tượng hóa chương trình (chương trình người dùng) thành một

được làm tự động. Tư tưởng chủ đạo là trừu tượng hóa các tính toán địa phương thành các lệnh rỗng (lệnh skip), lệnh lặp thành do .. od, lệnh rẽ nhánh thành if .. fi.

Chú ý: Nếu giao diện là biểu thức chính qui mô tả giao thức, thì phép (*)

tương đương với (do – od -> break), phép (+) tương đương với (if – fi hoặc do – od), phép tuần tự tương đương với (;). Việc gọi dịch vụ s của chương trình người dùng dịch thành lệnh k?s, việc cung cấp dịch vụ s của thành phần được dịch thành lệnh k!s.

Sau khi kiểm tra lỗi cú pháp thực hiện bước 3.

Bước 3. Chạy song song hai tiến trình P và U trong SPIN (thực hiện xác minh verification).

Kết qủa sau khi xác minh, nếu chương trình không báo lỗi deadlock

(Invaled End State) trong cửa sổ pan.out nghĩa là thể thức của chương trình người dùng tuân thủ thể thức của thành phần. Ngược lại, nếu báo lỗi deadlock (Invalid End State) thì không tuân thủ.

4.2. Áp dụng

Chương trình quản lý cơ sở dữ liệu (CSDL) được xây dựng phát triển theo hướng thành phần, nó cung cấp các dịch vụ là open (mở), read (đọc), write (ghi),

close (đóng) và terminal (kết thúc). Giao diện của chương trình như sau: @CallSpecifications(

regexp = {"FileUsage ::= (open(); read()*; write()*; close())*; terminal()"}

)

public interface LogFile {

public void open(); public void close(); public String read(); public void write(); public void terminal(); }

Trong giao diện này mô tả các dịch vụ được cung cấp bởi thành phần

CSDL đó là open, read, write và close, terminal.

Với đặc tả giao diện của thành phần này cung cấp thì tương tác của thành phần quản lý CSDL này với thành phần môi trường dựa vào các dịch vụ. Thành phần môi trường có thể thực hiện truy cập CSDL bằng thủ tục open(), đọc read() CSDL, ghi dữ liệu mới vào CSDL theo thủ tục write() và đóng CSDL rồi thoát.

Đặc tả của giao diện thành phần quản lý CSDL cũng cung cấp cách thức để sử dụng được cơ sở dữ liệu thành phần, đó là biểu thức chính quy:

regexp = { "FileUsage ::= (open(); read()*; write()*; close())*; terminal()"}

Biểu thức chính quy này nêu rõ thứ tự thực hiện bắt đầu phải là open(), đây là thủ tục mở cơ sở dữ liệu. Sau khi mở cơ sở dữ liệu thì chương trình mới có thể thực hiện việc đọc cơ sở dữ liệu này bởi thủ tục read(). Thủ tục read() có thể được thực hiện nhiều lần. Hoạt động tiếp theo sau khi read() phải là ghi dữ liệu vào cơ sở dữ liệu, việc ghi vào cơ sở dữ liệu cũng có thể được lặp lại nhiều lần. Tiếp theo sau khi thực hiện ghi thì có thể gọi close() để đóng cơ sở dữ liệu.

Khi chương trình ở trạng thái đóng (close), nếu chương trình gọi lại dịch vụ open() của thành phần thì các thao tác lần lượt là mở, đọc, ghi đóng này được lặp lại. Trường hợp khi chương trình ở trạng thái close, nếu gọi terminal thì sẽ thoát ra khỏi cơ sở dữ liệu này.

Để tương tác với thành phần quản lý cơ sở dữ liệu và nhận được các dịch vụ từ thành phần này thì chương trình người dùng hay thành phần môi trường yêu cầu các dịch vụ cần phải có thứ tự yêu cầu tuân theo đúng biểu thức chính quy đã đặt ra trong giao diện của thành phần quản lý cơ sở dữ liệu.

Biểu thức regexp được rút gọn lại là (or*w*c)*t với o – open(); r – read (); w – write(); c – close(); t – terminal().

Có các thành phần môi trường (chương trình người dùng) được xây dựng để truy cập vào cơ sở dữ liệu trên và thực hiện khai thác và lưu trữ dữ liệu theo nhiệm vụ. Các thành phần môi trường này được thiết kế có các thể thức truy cập được đặc tả theo biểu thức chính quy (thu gọn) là or*w*ct và or*w*rct.

Bài toán đặt ra ở đây là thể thức của từng thành phần môi trường (chương trình người dùng) có tuân thủ thể thức của thành phần quản lý cơ sở dữ liệu không để có thể tương tác với thành phần quản lý cơ sở dữ liệu để nhận được các dịch vụ đã mô tả trong giao diện của thành phần quản lý cơ sở dữ liệu.

Đồ thị mô tả thể thức của thành phần quản lý và các thành phần môi trường được mô tả bằng automat như sau:

Một phần của tài liệu (LUẬN văn THẠC sĩ) ứng dụng của spin để kiểm chứng sự tuân thủ thể thức tương tác của chương trình (Trang 52 - 56)

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

(69 trang)