2010-02-07 14 views
9

Tôi hiện đang viết một chương trình C++ đa luồng lớn (> 50K LOC).Có đang giao tiếp các tiến trình tuần tự từng được sử dụng trong các chương trình C++ đa luồng lớn không?

Vì vậy, tôi đã được thúc đẩy để đọc rất nhiều kỹ thuật khác nhau để xử lý mã đa luồng. Một lý thuyết tôi đã tìm thấy là khá mát mẻ là:

http://en.wikipedia.org/wiki/Communicating_sequential_processes

Và nó được phát minh bởi một anh chàng hơi nổi tiếng, người có những đóng góp không nhỏ khác để lập trình đồng thời.

Tuy nhiên, CSP có được sử dụng trong thực tế không? Bất cứ ai có thể trỏ đến bất kỳ ứng dụng lớn nào được viết theo phong cách CSP?

Cảm ơn!

+2

lol @ 50k loc là lớn –

+0

[PySCP] (http://code.google .com/p/pycsp /) trông giống như một thực thi khả thi thực tế của CSP. Một số ví dụ được bao gồm. Mặc dù, tại thời điểm nó được báo cáo chỉ được sử dụng cho các mục đích giáo dục. – spacediver

Trả lời

8

CSP, như một phép tính quá trình, về cơ bản là một điều lý thuyết cho phép chúng tôi chính thức hóa và nghiên cứu một số khía cạnh của một chương trình song song.

Nếu bạn thay vì muốn có một lý thuyết cho phép bạn xây dựng chương trình phân phối, sau đó bạn nên có một cái nhìn để parallel structured programming.

Lập trình cấu trúc song song là cơ sở của nghiên cứu HPC (tính toán hiệu suất cao) hiện tại và cung cấp cho bạn phương pháp về cách tiếp cận và thiết kế các chương trình song song (về cơ bản, sơ đồ giao tiếp các nút tính toán) và hệ thống thời gian chạy thực hiện chúng.

Ý tưởng chính trong lập trình có cấu trúc song song là của bộ xương thuật toán, được phát triển ban đầu bởi Murray Cole. Một bộ xương là một thứ giống như một mẫu thiết kế song song với một mô hình chi phí được liên kết và (thường) là một hệ thống thời gian chạy hỗ trợ nó. Bộ xương mô hình, nghiên cứuhỗ trợ một lớp thuật toán song song có một "hình dạng nhất định".

Như một ví dụ đáng chú ý, MapReduce (được phổ biến bởi Google) chỉ là một loại xương mà giải quyết dữ liệu song song, nơi một tính toán có thể được mô tả bởi một đồ giai đoạn (áp dụng một hàm f cho tất cả các yếu tố đó soạn dữ liệu đầu vào) và giảm giai đoạn (lấy tất cả các mục được chuyển đổi và "kết hợp" chúng bằng cách sử dụng toán tử kết hợp +).

Tôi đã tìm thấy ý tưởng lập trình song song có cấu trúc cả âm thanh lý thuyết và thực tiễn hữu ích, vì vậy tôi khuyên bạn nên xem xét nó.

Một từ về đa luồng: vì bộ xương xử lý song song lớn, thường chúng được triển khai trong bộ nhớ phân phối thay vì chia sẻ. Intel đã phát triển một công cụ, TBB, địa chỉ đa luồng và (một phần) theo khuôn khổ lập trình có cấu trúc song song. Nó là một thư viện C++, vì vậy có lẽ bạn chỉ có thể bắt đầu sử dụng nó trong các dự án của bạn.

+1

Điều thú vị là, CSP bây giờ là cơ chế đồng thời nóng nhất được sử dụng trong lập trình :) – nXqd

0

Kiểu này có mặt khắp nơi trên Unix, nơi nhiều công cụ được thiết kế để xử lý từ tiêu chuẩn sang chuẩn. Tôi không có bất kỳ kiến ​​thức đầu tiên về các hệ thống lớn được xây dựng theo cách đó, nhưng tôi đã thấy nhiều hệ thống một lần nhỏ lẻ là

ví dụ dòng lệnh đơn giản này sử dụng (ít nhất) 3 quy trình.

cat list-1 list-2 list-3 | sort | uniq > final.list 
+0

Có, nhưng đường ống không nằm giữa các quy trình, không phải giữa các chủ đề như OP đang hỏi. – Omnifarious

+0

Bài báo mà anh ta liên kết là về các quy trình. –

+2

CSP là một lý thuyết không quan tâm đến sự khác biệt giữa chủ đề và chương trình. Các câu hỏi như đã nêu vẫn còn hợp lệ: là lý thuyết CSP được sử dụng trong thực tế, trong các chương trình đa luồng? – MSalters

0

Hệ thống này chỉ có kích thước vừa phải, nhưng tôi đã viết một bộ xử lý giao thức loại bỏ và diễn giải các lớp liên tiếp trong thư sử dụng kiểu tương tự như vậy. Đó là một hệ thống hướng sự kiện sử dụng một cái gì đó giống như luồng hợp tác, nhưng tôi có thể đã sử dụng đa luồng khá dễ dàng với một vài tinh chỉnh bổ sung.

Chương trình là độc quyền (không may) nên tôi không thể hiển thị mã nguồn.

Theo ý kiến ​​của tôi, kiểu này hữu ích cho một số thứ, nhưng thường được pha trộn tốt nhất với một số kỹ thuật khác. Thường thì có một phần cốt lõi của chương trình của bạn đại diện cho một nút cổ chai xử lý, và áp dụng các kỹ thuật tăng đồng thời khác nhau có khả năng mang lại lợi ích lớn nhất.

0

Microsoft có công nghệ gọi là ActiveMovie (nếu tôi nhớ chính xác) đã xử lý tuần tự trên luồng âm thanh và video. Dữ liệu được truyền từ bộ lọc này sang bộ lọc khác để chuyển từ định dạng đầu vào sang đầu ra (và nguồn/sink). Có lẽ đó là một ví dụ thực tế ??

+0

không thực sự, một thread được sử dụng để đẩy dữ liệu tất cả các cách thức thông qua chuỗi các bộ lọc. –

6

Có và không. Ý tưởng cơ bản của CSP được sử dụng khá một chút. Ví dụ, các hàng đợi an toàn theo chủ đề ở dạng này hay dạng khác thường được sử dụng làm cơ chế truyền thông chính (thường là duy nhất) để xây dựng một đường dẫn ra khỏi các tiến trình riêng lẻ (các luồng).

Hoare là Hoare, tuy nhiên, có nhiều hơn một chút so với lý thuyết ban đầu của mình hơn thế. Ông đã phát minh ra một ký hiệu để nói về các quá trình, xác định một tập hợp cụ thể các tín hiệu có thể được gửi giữa các quá trình, v.v. Các ký hiệu đã được tinh chế theo nhiều cách khác nhau, khá nhiều công việc đưa vào chứng minh các khía cạnh khác nhau, và như vậy.

Áp dụng mô hình CSP tương đối chính thức đó (trái với ý tưởng chung) ít phổ biến hơn nhiều. Nó được sử dụng trong một vài hệ thống có độ tin cậy cao được coi là cực kỳ quan trọng, nhưng rất ít lập trình viên xuất hiện quan tâm đến việc học (một cách khác) ký hiệu thiết kế chính thức.

Khi tôi đã thiết kế các hệ thống như thế này, tôi thường sử dụng một cách tiếp cận ít nghiêm ngặt hơn, nhưng ít nhất là dễ hiểu hơn: một sơ đồ khá đơn giản, với các hộp biểu diễn các quy trình và các mũi tên đại diện các dòng truyền thông. Tôi nghi ngờ tôi thực sự có thể cung cấp nhiều bằng chứng về hầu hết các thiết kế (và tôi sẽ thừa nhận rằng tôi chưa thiết kế một hệ thống thực sự lớn theo cách này), nhưng nó vẫn hoạt động hợp lý.

0

Bài viết trên Wikipedia nhìn tôi giống như rất nhiều biểu tượng vui được sử dụng để đại diện cho một số khái niệm cho người đi bộ. Đối với các chương trình rất lớn hoặc có thể mở rộng, chủ nghĩa hình thức có thể rất quan trọng để kiểm tra các quy trình (phụ) được phép tương tác như thế nào.

Đối với chương trình 50.000 dòng, bạn có thể tốt hơn khi kiến ​​trúc nó khi bạn thấy phù hợp.

Nói chung, các ý tưởng sau đây như thế này là ý tưởng hay về mặt hiệu suất. Các chủ đề liên tục xử lý dữ liệu theo các giai đoạn sẽ có xu hướng không tranh chấp và khai thác tốt vị trí dữ liệu. Ngoài ra, nó rất dễ dàng để quản lý các chủ đề để tránh dữ liệu chồng chất lên như là một giai đoạn nhanh chóng nguồn cấp dữ liệu một giai đoạn chậm: chỉ cần chặn nhanh nếu bộ đệm đầu ra của nó phát triển quá lớn.

3

Hãy xem trang web cho một công ty có tên là Verum. Công nghệ ASD của họ dựa trên CSP và được sử dụng bởi các công ty như Philips Healthcare, Ericsson và NXP chất bán dẫn để xây dựng phần mềm cho tất cả các loại thiết bị và ứng dụng công nghệ cao.

Vì vậy, để trả lời câu hỏi của bạn: Có, CSP được sử dụng cho các dự án phần mềm lớn trong đời thực.

tiết lộ đầy đủ: Tôi làm công việc tự do cho verum

0

Một chút off-topic nhưng cho luận án của tôi, tôi sử dụng một khuôn khổ công cụ gọi là TERRA/LUNA nhằm mục đích phát triển phần mềm cho hệ thống điều khiển nhúng nhưng được sử dụng chủ yếu cho tất cả các loại phát triển phần mềm tại viện của tôi (chỉ sử dụng ở đây). TERRA là trình soạn thảo CSP và kiến ​​trúc phần mềm đồ họa và LUNA là tên cho thư viện C++ cho các cấu trúc dựa trên CSP và plugin bạn sẽ tìm thấy trong TERRA để tạo mã C++ từ các mô hình CSP của bạn. Nó trở nên rất tiện dụng kết hợp với FDR3 (bộ kiểm tra tinh lọc CSP) để phát hiện bất kỳ loại khóa (chết/cuộc sống/vv) hoặc thậm chí là lược tả.

0

Trả lời một câu hỏi rất cũ, nhưng điều quan trọng vẻ như là một

Go nơi CSP là một phần cơ bản của ngôn ngữ. Trong các số FAQ to Go, các tác giả viết:

Lập trình đồng thời và đa luồng có danh tiếng khó khăn. Chúng tôi tin rằng điều này là do một phần thiết kế phức tạp như pthreads và một phần để overemphasis trên các chi tiết cấp thấp như mutexes, biến điều kiện, và các rào cản bộ nhớ. Các giao diện cấp cao hơn cho phép mã đơn giản hơn nhiều, ngay cả khi vẫn còn các mâu thuẫn và như vậy dưới các trang bìa.

Một trong những mô hình thành công nhất để cung cấp hỗ trợ ngôn ngữ cấp cao cho đồng thời đến từ Quy trình liên lạc giao tiếp của Hoare hoặc CSP. Occam và Erlang là hai ngôn ngữ nổi tiếng xuất phát từ CSP. Các nguyên tố đồng thời của Go bắt nguồn từ một phần khác của cây gia đình mà đóng góp chính của nó là khái niệm mạnh mẽ của các kênh như các đối tượng lớp đầu tiên. Kinh nghiệm với một số ngôn ngữ trước đó đã chỉ ra rằng mô hình CSP phù hợp tốt với một khuôn khổ ngôn ngữ thủ tục.

Dự án triển khai tại Gò là:

Các vấn đề liên quan