Có thể chứng minh an toàn chủ đề?


9

Đưa ra một chương trình bao gồm các biến và hướng dẫn sửa đổi các biến này và nguyên thủy đồng bộ hóa (màn hình, mutex, khóa của java hoặc khóa C #), liệu có thể chứng minh rằng chương trình đó là an toàn cho luồng không?

Thậm chí có một mô hình chính thức để mô tả những thứ như an toàn chủ đề hoặc điều kiện đua xe?


2
Có, nhưng các ngôn ngữ trong thế giới thực có thể là một vấn đề khó khăn vì ngữ nghĩa đồng thời của chúng không phải lúc nào cũng được xác định rõ / cố định. Ngoài ra, không phải mọi thứ đều có thể quyết định trong mọi mô hình. Đó là một lĩnh vực rộng lớn; google "Lý thuyết đồng thời" để có ấn tượng. Đặc biệt, có một lý thuyết phong phú liên quan đến lưới Petri.
Raphael

Câu trả lời:


9

Chứng minh rằng một chương trình là "chủ đề an toàn" là khó. Tuy nhiên, có thể định nghĩa cụ thể và chính thức thuật ngữ "cuộc đua dữ liệu". Và có thể xác định xem một dấu vết thực thi của một chương trình cụ thể có hay không có một cuộc đua dữ liệu theo thời gian tỷ lệ thuận với kích thước của dấu vết. Kiểu phân tích này quay trở lại ít nhất là vào năm 1988: Barton P. Miller, Jong-Deok Choi, "Một cơ chế để gỡ lỗi hiệu quả các chương trình song song", Conf. trên Prog. Lang. Dsgn. và Impl. (PLDI-1988): 135-144 .

Đưa ra một dấu vết của một thực thi, trước tiên chúng ta xác định một sự kiện xảy ra - trước một phần - giữa các sự kiện trong dấu vết. Cho hai sự kiện b xảy ra trên cùng một luồng thì a < b hoặc b < a . (Các sự kiện trên cùng một luồng tạo thành một tổng thứ tự được đưa ra bởi ngữ nghĩa tuần tự của ngôn ngữ lập trình.) Các sự kiện đồng bộ hóa (ví dụ, chúng có thể được mua lại và phát hành), đưa ra một liên kết bổ sung xảy ra - trước khi đặt hàng từng phần. (Nếu luồng S phát hành một mutex và sau đó luồng T thu được mutex đó, chúng ta nói rằng việc phát hành xảy ra - trước khi có được.)mộtbmột<bb<mộtST

Sau đó được cung cấp hai lần truy cập dữ liệu (đọc hoặc ghi vào các biến không phải là biến đồng bộ hóa) b ở cùng một vị trí bộ nhớ, nhưng bởi các luồng khác nhau và trong đó a hoặc b là thao tác ghi chúng ta nói rằng có dữ liệu- cuộc đua giữa ab nếu không a < b hay b < a .mộtbmộtbmộtbmột<bb<một

Các 11 tiêu chuẩn C ++ là một ví dụ điển hình. (Phần có liên quan là 1,10 trong thông số kỹ thuật dự thảo có sẵn trực tuyến.) C ++ 11 phân biệt giữa các đối tượng đồng bộ hóa (mutexes và các biến được khai báo với một atomic<>loại) và tất cả các dữ liệu khác. Thông số kỹ thuật C ++ 11 nói rằng lập trình viên có thể lý giải về việc truy cập dữ liệu trên một dấu vết của chương trình đa luồng như thể nó phù hợp theo tuần tự nếu các truy cập dữ liệu không có dữ liệu chạy đua.

Công cụ Helgrind (một phần của Valgrind) thực hiện loại phát hiện dựa trên dữ liệu xảy ra trước khi thực hiện một số công cụ thương mại (ví dụ: Intel Inspector XE.) Các thuật toán trong các công cụ hiện đại dựa trên việc giữ đồng hồ vector liên kết với mọi luồng và đồng bộ hóa vật. Tôi nghĩ rằng kỹ thuật sử dụng đồng hồ vector này để phát hiện cuộc đua dữ liệu đã được Michiel Ronsse tiên phong ; Koen De Bosschere: "RecPlay: một hệ thống phát lại / ghi lại thực tế tích hợp đầy đủ", ACM Trans. Tính toán. Hệ thống. 17 (2): 133-152, 1999 .


6

Từ khía cạnh thực tế, có một hệ thống xác minh VCC có thể được sử dụng để chính thức chứng minh sự an toàn của luồng của các chương trình C.

Đây là một trích dẫn từ trang web:

VCC hỗ trợ đồng thời - bạn có thể sử dụng VCC để xác minh các chương trình sử dụng cả đồng thời hạt mịn và hạt mịn. Bạn thậm chí có thể sử dụng nó để xác minh các nguyên thủy kiểm soát đồng thời của bạn. Xác minh một chức năng hoàn toàn đảm bảo an toàn luồng của nó trong bất kỳ môi trường đồng thời nào tôn trọng các hợp đồng trên các chức năng và cấu trúc dữ liệu của nó.


2
Làm thế nào nó hoạt động? Mô hình chính thức cơ bản là gì? Lưu ý rằng OP không (chỉ) yêu cầu một công cụ!
Raphael

1

Đây là một lĩnh vực rất khó để đảm bảo tính chính xác của chương trình khi loại trừ các điều kiện chủng tộc, một loại "gót chân achilles" của xử lý song song. Cách tiếp cận tốt nhất cho tính chính xác của chương trình nói chung là để tránh các nguyên hàm cấp thấp và làm việc với các mẫu thiết kế cấp cao hơn (ví dụ từ các thư viện) để đảm bảo đồng bộ hóa luồng. Có một CSP mô hình , truyền đạt các quy trình tuần tự của Hoare, có một số bằng chứng về tính chính xác được đưa ra rằng các nhà phát triển tự giới hạn trong "khung". Nó có một số điểm tương đồng về khái niệm & nguồn gốc theo thời gian / sự chồng chéo để unix "ống và bộ lọc" mặc dù chưa tìm thấy một liên kết trực tiếp giữa hai.

Hai khung khác cố gắng cải thiện tính chính xác song song thông qua các mẫu thiết kế và có hầu hết các thuật toán / mẫu thiết kế chuẩn / đã biết cho mục đích này:


1
Đây có thể là lời khuyên (lập trình) tốt, nhưng nó không trả lời câu hỏi (CS) nào cả.
Raphael

1
?!? những lời chỉ trích không cụ thể chút nào
vzn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.