Lôgic thời gian tuyến tính là một ngôn ngữ lôgic hình thức phù hợp với đặc tả các thuộc tính thời gian tuyến tính. Trong phần này luận văn sẽ trình bày cơ bản về cú pháp và ngữ nghĩa của lôgic thời gian tuyến tính.
1.4.2.1. Lôgic thời gian tuyến tính
Lôgic thời gian (temporal logic) mở rộng từ lôgic mệnh đề hoặc lôgic tân từ bằng cách thêm các toán tử về thời gian. Loại lôgic này phù hợp để biểu diễn các thuộc tính về quan hệ giữa các nhãn trạng thái trong quá trình thực thi. Sử dụng lôgic thời gian và các phương thức lôgic liên quan để kiểm tra các hệ thống phức tạp được đưa ra bởi Pnueli trong cuối những năm 70.
Trong luận văn, chỉ tập trung vào lôgic thời gian mệnh đề (propositional tem- poral logic), tức là mở rộng của lôgic mệnh đề bằng các toán tử thời gian. Các toán tử thời gian cơ bản và xuất hiện trong hầu hết các loại lôgic thời gian bao gồm:
♢ "eventually" (thực sự tồn tại một điểm thỏa mãn trong tương lai)
"always" (luôn luôn thỏa mãn)
Tính chất cơ bản về thời gian trong lôgic thời gian có thể được chia làm hai loại: Tuyến tính (linear) và Nhánh (branching). Trong cách nhìn tuyến tính, ở mỗi thời điểm chỉ có duy nhất một thời điểm tiếp theo, trong khi với cách nhìn nhánh thì giống như cấu trúc cây, ở đó thời gian có thể được chia thành các nhánh khác nhau. Luận văn sẽ chỉ tập trung vào lôgic thời gian tuyến tính do sự phù hợp để đặc tả các thuộc tính thời gian tuyến tính như định nghĩa 1.4.6. Hầu hết các công cụ kiểm chứng mô hình hiện nay đều hỗ trợ sử dụng lôgic thời gian tuyến tính làm ngôn ngữ đặc tả thuộc tính.
Về tính từ thời gian trong lôgic thời gian tuyến tính, thuật ngữ thời gian chỉ mang ý nghĩa trừu tượng. Một ngôn ngữ lôgic thời gian cho phép đặc tả quan hệ thứ tự giữa các sự kiện. Ví dụ "thông điệp được nhận sau khi nó được gửi". Lôgic thời gian tuyến tính không hỗ trợ bất kì ngữ nghĩa nào liên quan đến thời gian chính xác của các sự kiện. Tức là dạng "thông điệp được nhận sau 3 giây sau khi nó được gửi" không thể đặc tả bằng lôgic thời gian tuyến tính. Xét riêng đối với
hệ dịch chuyển, khoảng thời gian dịch chuyển hay thời gian lưu lại của hệ thống tại một trạng thái không đặc tả được bằng lôgic thời gian tuyến tính. Thay vào đó, lôgic thời gian tuyến tính cho phép đặc tả thứ tự các trạng thái xảy ra trong suốt quá trình thực thi.
1.4.2.1.1. Cú pháp Phần này mô tả các luật cú pháp để xây dựng công thức lôgic thời gian tuyến tính. Thành phần cơ bản của công thức lôgic thời gian tuyến tính là các mệnh đề nguyên tử (các nhãna ∈ AP), các kết nối dạng Boolean như phép hội
∧và phủ định¬và hai phương thức thời gian cơ bản⃝(tiếp theo) và∪
(tận khi). Các mệnh đề nguyên tử a ∈ AP tượng trưng cho các nhãn trạng thái α trong hệ dịch chuyển. Thông thường, các mệnh đề nguyên tử khẳng định về giá trị của các biến điều khiển hoặc các biến chương trình giống như x > 5 hoặc x 6 y. Phương thức⃝ là một toán tử tiền tố đơn nguyên, nhận vào duy nhất một công thức lôgic thời gian tuyến tính dưới dạng tham số. Công thức⃝φthỏa mãn ở thời điểm hiện tại nếu φ thỏa mãn trong bước tiếp theo. Phương thức ∪
là một toán tử trung tố nhị nguyên, nhận vào hai công thức lôgic thời gian tuyến tính dưới dạng tham số. Công thứcφ1∪φ
2 thỏa mãn ở thời điểm hiện tại, nếu có một vài thời điểm trong tương laiφ2 thỏa mãn vàφ1 thỏa mãn ở tất cả các thời điểm cho đến tận thời điểm tương lai đó.
Định nghĩa 1.4.8. Cú pháp lôgic thời gian tuyến tính[3]
Công thức lôgic thời gian tuyến tính trên tập AP các mệnh đề nguyên tử được tạo thành theo cú pháp:
φ ::= true| a |φ1 ∧φ2 | ¬φ| ⃝φ|φ1 ∪φ2
trong đóa ∈ AP
Thứ tự ưu tiên các toán tử như sau. Toán tử đơn nguyên liên kết mạnh hơn toán tử nhị nguyên.¬và⃝liên kết mạnh ngang nhau. Toán tử thời gian∪
được ưu tiên hơn∧,∨và−→. Dấu ngoặc đơn được bỏ qua khi thích hợp. Ví dụ viết¬φ1
∪ ⃝φ2 thay vì(¬φ1)∪ (⃝φ2). Toán tử∪ có tính chất kết hợp bên phải, ví dụφ1∪φ 2∪φ 3
là cách viết tương đương củaφ1∪
(φ2∪φ
3).
Sử dụng các kết nối dạng Boolean ∧ và ¬ để kết hợp đủ ngữ nghĩa của lôgic mệnh đề. Các dạng kết nối Boolean khác như phép tuyển ∨, phép kéo theo −→, phép tương đương↔, và toán tử nhị nguyên⊕có thể chuyển đổi như sau:
φ1 ∨φ2 = ¬(¬φ1 ∧ ¬φ2) φ1 −→ φ2 = ¬φ1 ∨φ2
φ1 ↔ φ2 = (φ1 −→φ2)∧(φ2 −→φ1) φ1 ⊕φ2 = (φ1 ∧ ¬φ2)∨(φ2 ∧ ¬φ1) Toán tửtận khi∪
được chuyển đổi tới các phương thức thời gian♢(thực sự) và
♢φ= true∪φ
φ= ¬♢¬φ
Với các phép chuyển đổi trên, có thể thấy được ý nghĩa trực quan của ♢ và .
♢φđảm bảo rằngφ sẽ thực sự đúng trong tương lai.φđược thỏa mãn nếu và chỉ nếu không tồn tại trường hợp nào¬φthỏa mãn. Điều này tương đương vớiφđược thỏa mãn ở hiện tại và mãi mãi.
Bằng việc kết hợp các phương thức thời gian♢và, các phương thức thời gian mới có thể được tạo ra. Ví dụ,♢a(luôn luôn thực sự tồn tạia trong tương lai) mô tả một thuộc tính chỉ ra rằng ở mọi thời điểm jbất kì luôn có một thời điểm i> j
mà ở đó trạng tháia được thỏa mãn. ♢a biểu diễn rằng chắc chắn tồn tại những thời điểm jmà từ đó trạng tháia luôn được thỏa mãn.
1.4.2.1.2. Ngữ nghĩa Công thức lôgic thời gian tuyến tính biểu diễn các thuộc tính của các đường dẫn (hoặc các vết của chúng). Điều này nghĩa là một đường dẫn có thể thỏa mãn một công thức lôgic thời gian tuyến tính hoặc không. Để đánh giá một cách chính xác khi một đường dẫn thỏa mãn một công thức lôgic thời gian tuyến tính tiến hành như sau. Đầu tiên, ngữ nghĩa của công thức lôgic thời gian tuyến tính φ được định nghĩa dưới dạng một ngôn ngữ Words(φ) bao gồm tất cả các từ vô hạn thỏa mãn φ trên bảng chữ cái 2AP. Do đó, đối với mỗi công thức lôgic thời gian tuyến tính, một thuộc tính thời gian tuyến tính duy nhất được kết hợp. Sau đó, các ngữ nghĩa được mở rộng tới một diễn giải trên các đường dẫn và các trạng thái của hệ dịch chuyển.
Định nghĩa 1.4.9. Ngữ nghĩa của lôgic thời gian tuyến tính (diễn giải trên các từ (Words))[3]
Choφlà một công thức lôgic thời gian tuyến tính trên tập AP. Thuộc tính thời gian tuyến tính từφ là
Words(φ) = {σ ∈ (2AP)ω |σ |= φ}
trong đó quan hệ thỏa mãn |=⊆ (2AP)ω × LT L là quan hệ nhỏ nhất với các thuộc tính như sau. σ |= true σ |= a nếu và chỉ nếua ∈ A0 (tức là A0 |= a) σ |= φ1∧φ2 nếu và chỉ nếuσ |= φ1 và σ |= φ2 σ |= ¬φnếu và chỉ nếuσ 2 φ σ |= ⃝φnếu và chỉ nếuσ[1· · ·] = A1A2A3· · · |= φ σ |= φ1∪φ
2 nếu và chỉ nếu∃j > 0. σ[j· · ·] |= φ2 vàσ[i· · ·]|= φ1, đối với tất cả0 6 i < j
Ở đây, đối với σ = A0A1A2· · · ∈ (2AP)ω, σ[j· · ·] = AjAj+1Aj+2· · · là hậu tố củaσbắt đầu từ ký hiệu thứ (j+1) là Aj
σ |= ♢φnếu và chỉ nếu∃j > 0. σ[j· · ·] |= φ σ |= φnếu và chỉ nếu∀j> 0. σ[j· · ·] |= φ
Bước tiếp theo là xác định ngữ nghĩa của công thức lôgic thời gian tuyến tính với khía cạnh một hệ dịch chuyển. Theo định nghĩa về quan hệ thỏa mãn các thuộc tính thời gian tuyến tính 1.4.7, công thức lôgic thời gian tuyến tínhφthỏa mãn tại trạng thái snếu tất cả các đường dẫn bắt đầu từ s thỏa mãnφ. Hệ dịch chuyển TS thỏa mãnφnếu TS thỏa mãn thuộc tính thời gian tuyến tínhWords(φ), tức là, nếu tất cả các đường dẫn khởi tạo của TS thỏa mãnφ.
Giả định rằng các hệ dịch chuyển không có trạng thái kết thúc, tức là tất cả đường dẫn cũng như vết là vô hạn. Giả định này chỉ nhằm mục tiêu đơn giản, hoàn toàn có thể định nghĩa ngữ nghĩa của lôgic thời gian tuyến tính đối với các đường dẫn hữu hạn. Ngữ nghĩa không bị ảnh hưởng bởi tính hữu hạn hay vô hạn của hệ dịch chuyển TS. Tính hữu hạn hay vô hạn chỉ ảnh hưởng tới các thuật toán kiểm chứng mô hình nói chung.
Đối với một thuộc tính thời gian tuyến tính, khi định nghĩa T S |= φ đối với hệ dịch chuyển TS trên tập AP′ thì ngầm định rằngφ là một công thức lôgic thời gian tuyến tính với các mệnh đề nguyên tử trong tậpAP = AP′. (có thể cho phép
AP ⊆ AP′)
Định nghĩa 1.4.10. Ngữ nghĩa của lôgic thời gian tuyến tính trên các đường dẫn và trạng thái[3]
Cho hệ dịch chuyển T S = (S,Act,−→,I,AP,L) không có trạng thái kết thúc và choφ là một công thức LTL trên tập AP.
• Đối với phân đoạn đường dẫn vô hạnπcủa TS, quan hệ thỏa mãn được định nghĩa như sau
π |= φnếu và chỉ nếutrace(π) |= φ
• Đối với trạng thái s ∈ S, quan hệ thỏa mãn được định nghĩa là
s |= φnếu và chỉ nếu (∀π ∈ Paths(s). π |= φ)
Chương 2
Hệ thống tương tranh
Điều kiện đầu tiên để thực hiện kiểm chứng mô hình là tạo được mô hình của hệ thống dưới phạm trù cần kiểm tra. Nội dung luận văn sẽ tập trung xem xét các hệ thống phần mềm dưới một phạm trù đặc biệt là xử lý tương tranh, nói cách khác, các hệ thống được xem xét là các hệ thống tương tranh (concurrent system). Chương này sẽ giới thiệu các điểm chính về hệ thống tương tranh cũng như cách mô hình hóa hệ tương tranh sử dụng hệ dịch chuyển để phục vụ cho kiểm chứng mô hình. Mỗi cơ chế thực thi, tương tác trong hệ tương tranh được mô hình hóa theo các cách khác nhau, từ trường hợp đơn giản khi các tiến trình chạy hoàn toàn độc lập đến các trường hợp phức tạp khi có sự giao tiếp giữa các tiến trình.
2.1. Tổng quan về hệ tương tranh
Trong khoa học máy tính, hệ tương tranh là hệ thống bao gồm nhiều tiến trình độc lập, được thực thi đồng thời và có thể tương tác với nhau [1]. Các tiến trình có thể được thực thi trên cùng một bộ xử lý bởi các bước xử lý đan xen theo phân khe thời gian, hoặc xử lý trên các bộ xử lý riêng biệt. Khái niệm tiến trình ở đây mang tính tổng quan, không phải là định nghĩa tiến trình như trong Linux.
Định nghĩa hệ tương tranh như trên dường như khá tương đồng với hệ song song, tuy nhiên đây là hai khái niệm khác biệt.
• Tương tranh: Đối phó với nhiều thứ cùng lúc.
• Song song: Làm nhiều thứ cùng lúc. Do đó
• Điều kiện cần của song song là có nhiều bộ xử lý, các yêu cầu được xử lý cùng lúc và riêng biệt trên các bộ xử lý khác nhau.
• Điều kiện cần của tương tranh là có nhiều tiến trình, các tiến trình có thể được xử lý dạng đan xen theo phân khe thời gian trên cùng một bộ xử lý, hoặc có thể được xử lý trên các bộ xử lý khác nhau.
Giữa tương tranh và song song cũng có sự liên quan
• Tương tranh là về cấu trúc, song song là về thực thi.
• Tương tranh cung cấp một cấu trúc để giải quyết vấn đề, mà vấn đề đó có thể giải quyết (nhưng không nhất thiết) bằng xử lý song song.
Thử thách chính trong thiết kế các hệ thống tương tranh là đảm bảo được tính đúng đắn về thứ tự thực hiện, giao tiếp giữa các thành phần tham gia và điều khiển truy cập tài nguyên chia sẻ. Bởi vì các tiến trình trong hệ tương tranh có thể tương tác với nhau trong khi chúng được thực thi nên số lượng các đường dẫn thực thi có thể rất lớn và kết quả có thể không xác định. Xử lý tương tranh sử dụng chia sẻ tài nguyên có thể dẫn tới vấn đề bế tắc hoặc có thành phần không bao giờ được thực hiện. Thiết kế hệ tương tranh thường đòi hỏi việc tìm ra các kỹ thuật để điều phối xử lý, trao đổi dữ liệu, cấp phát bộ nhớ và lập lịch để tối thiểu thời gian đáp ứng cũng như tối đa hiệu năng [3].
Các mục tiêu cơ bản hệ tương tranh cần phải đạt được là tính đúng đắn, hiệu năng và tính bền vững. Một số hệ tương tranh như hệ điều hành và hệ quản trị cơ sở dữ liệu được thiết kế để hoạt động không dừng có thể yêu cầu thêm một số khả năng như tự động phục hồi khi xảy ra lỗi và không bị dừng đột xuất [1].
Edsger Dijkstra, Per Brinch Hansen, và C.A.R. Hoare là các nhà nghiên cứu tiên phong về xử lý tương tranh. Một trong những đề xuất đầu tiên là sử dụng mạng Petri để đặc tả mô hình xử lý tương tranh của Carl Adam Petri vào năm 1960. Trong những năm gần đây có rất nhiều kỹ thuật hình thức được phát triển để mô hình hóa và lập luận, chứng minh về hệ tương tranh. Các mô hình toán học phổ biến được phát triển cho mục tiêu mô tả xử lý tương tranh gồm: Mạng Petri, Process Algebra, Parallel Random Access Machine Model, Actor Model và Reo Coordination Language. Trong giới hạn phạm vi luận văn sẽ chỉ đề cập đến mô hình Process Algebra. Ngôn ngữ CSP# sử dụng trong luận văn là ngôn ngữ mở rộng từ ngôn ngữ CSP được đưa ra bởi C.A.R. Hoare, đây là một ngôn ngữ thuộc họ Process Algebra, dùng đặc tả mô hình hệ tương tranh [7]. Hiện nay, lý thuyết về xử lý tương tranh vẫn đang là một chủ đề nhận được nhiều sự quan tâm, nghiên cứu trong khoa học máy tính.
Trong một số hệ tương tranh, cơ chế giao tiếp phức tạp giữa các thành phần được ẩn đi đối với lập trình viên, nhưng trong hầu hết các trường hợp còn lại quá trình giao tiếp này phải xử lý thủ công. Giao tiếp trong hệ tương tranh được chia làm hai loại [3]:
• Giao tiếp thông qua chia sẻ bộ nhớ(Shared Memory Communication): Các thành phần giao tiếp với nhau bằng cách cùng sửa nội dung tại phần bộ nhớ chia sẻ. Kiểu giao tiếp này trong xử lý tương tranh yêu cầu phải có một số cơ chế khóa (locking) như mutexes, semaphores, monitors... để điều khiển truy cập bộ nhớ;
• Giao tiếp thông qua truyền thông điệp(Message Passing Communication): Các thành phần giao tiếp bằng cách trao đổi thông điệp. Quá trình trao đổi thông điệp có thể tiến hành đồng bộ hoặc bất đồng bộ. Giao tiếp thông qua truyền thông điệp thường dễ dàng để lập luận và chứng minh hơn so với kiểu chia sẻ bộ nhớ, do đó thường được dùng nhiều hơn trong lập trình xử lý tương tranh.
Thiết kế hệ tương tranh gặp rất nhiều khó khăn như trên, tuy nhiên các lợi ích mà hệ tương tranh mang lại là rõ rệt:
• Tăng thông lượng ứng dụng: kiến trúc tốt cho phép tận dụng tối đa khả
năng của phần cứng, cho phép nhiều tác vụ được hoàn thành hơn trong một khoảng thời gian nhất định;
• Đáp ứng tốt hơn cho vấn đề đầu vào/ đầu ra: khi một tác vụ chờ đợi đầu
vào hoặc đầu ra để hoàn thành thì lập tức bộ xử lý được chuyển cho tác vụ khác thực thi trong thời gian chờ đợi;
• Cấu trúc chương trình phù hợp hơn: Một vài vấn đề hoặc miền vấn đề
được thể hiện phù hợp hơn với cấu trúc xử lý tương tranh.
2.2. Mô hình hóa hệ tương tranh bởi hệ dịch chuyển
Để kiểm chứng mô hình, hệ thống cần được mô hình dưới dạng hệ dịch chuyển. Chương 1 đã trình bày phương pháp mô hình hóa các hệ thống phụ thuộc dữ liệu dạng tuần tự thông thường bằng hệ dịch chuyển. Trong thực tế, hầu hết các hệ