Tôi nên bắt đầu từ đâu trong một nhiệm vụ lập trình đồng thời lớn? [đóng cửa]


8

Nhiệm vụ của tôi là triển khai một hệ thống semaphore phân tán (liên kết đến mô tả) và một ứng dụng cho nó. Tôi sẽ sử dụng các socket Java và nó sẽ sử dụng các mảng watermark và hàng đợi ưu tiên (không chắc chắn ở đâu), và vì vậy tôi tò mò về cách giải quyết dự án này. Cụ thể, tôi muốn biết mục tiêu bước đầu tốt hay hệ thống con đơn giản mà tôi có thể thực hiện là gì. Hiện tại, tôi không biết tập trung chú ý vào đâu.

Ứng dụng này là một hệ thống giấy phép nổi - giống như trong phòng thí nghiệm máy tính chỉ có một bản sao của phần mềm (có thể là chương trình CAD), chỉ cho phép một PC mỗi lần sử dụng phần mềm. Khi một máy đang sử dụng phần mềm, quyền truy cập vào phần mềm sẽ bị khóa. Khi máy đó được sử dụng xong, nó sẽ cung cấp cho nó và bất kỳ ai là người đầu tiên yêu cầu nên là người tiếp theo.

Đây là thuật toán mã giả được tham chiếu - http://i.imgur.com/q9kRm.png


1
Âm thanh như một dự án thú vị. Một "bước đầu tiên" tốt sẽ khiến ứng dụng xuất bản trạng thái đang chạy của nó lên mạng cục bộ. Thứ hai: các ứng dụng khác có thể từ chối chạy trong khi ứng dụng đầu tiên đang chạy. Thứ ba: các ứng dụng có thể tham gia hàng đợi và đợi đến lượt của chúng. Cuối cùng: Hãy để các ứng dụng biết vị trí của chúng trong hàng đợi, có thể cho chúng cơ hội mua một vị trí tốt hơn. ;-)
An thần người ngoài hành tinh

Câu trả lời:


5

Hãy xem xét bắt đầu với hệ thống phụ "bắt tay" - ứng dụng sẽ cho phép ứng dụng được cấp phép chạy trên máy cụ thể đăng ký phiên tại máy chủ cấp phép của bạn và nhận mã thông báo xác định duy nhất cho các tương tác tiếp theo.

Tôi nghĩ sẽ hợp lý khi hệ thống con này cũng bao gồm một số "đàm phán" về giao thức liên lạc tiếp theo ("tín hiệu nhịp tim sẽ được dự kiến ​​trao đổi ở tốc độ từ 5 đến 10 giây" - đại loại như vậy).

Bước hợp lý tiếp theo có lẽ sẽ là thiết lập loại mô-đun "heartbeat" - mô-đun cho phép máy và máy chủ đã đăng ký ... rất tiếc bạn đã hỏi về mục tiêu bước đầu tiên không phù hợp.


8

Câu trả lời chung chung

Semaphore là một kỹ thuật phân bổ tài nguyên để quản lý các bế tắc và điều kiện cuộc đua thông qua các hàng đợi ưu tiên. Nói một cách ẩn dụ, bạn có 3 chiếc xe đạp cho thuê. Giả sử, bạn thuê nó trên cơ sở đầu tiên đến trước phục vụ. Vì vậy, nếu bạn đã thuê cả 3 chiếc xe đạp của bạn và một người thứ tư yêu cầu, anh ta phải đợi cho đến khi một trong số họ mang chiếc xe đạp trở lại. Có nhiều khả năng bạn có thể đặt trước chiếc xe đạp cho ai đó, ai đó có thể hủy một chiếc xe đạp đã đặt trước và cứ thế. Tương tự trong trường hợp các quy trình muốn có được một số tài nguyên, semaphores được sử dụng.

Trong trường hợp của một semaphore phân tán, có thể có nhiều tài nguyên có thể được truy cập bởi nhiều quy trình. Giả sử một máy chủ lưu trữ một ứng dụng và có thể lưu trữ nhiều phiên bản của nó và người dùng có thể sử dụng ứng dụng đó nếu nó miễn phí. Đặt máy chủ là S1, S2, .. Sn trong khi ứng dụng là A1, A2, ... An và người dùng là U1, U2, ... Un. Vì vậy, nếu máy chủ đầu tiên có thể lưu trữ ba phiên bản của ứng dụng thì nó sẽ được ký hiệu là S1A1, S1A2, S1A3. Cũng giả sử các trường hợp ứng dụng là vị trí hoặc hộp để dễ hiểu. Một vị trí được coi là trống khi nó miễn phí và đầy đủ khi bận. Vì vậy, trong trường hợp này, phương pháp sau được đề xuất

  • Người dùng yêu cầu ứng dụng
  • Yêu cầu được chuyển đến hàng đợi ưu tiên.
  • Hàng đợi chạy một quá trình nền liên tục để tìm kiếm các vị trí miễn phí và khi tìm thấy vị trí miễn phí, chuyển yêu cầu đến ứng dụng để bắt đầu xử lý
  • Khi một vị trí nhận được yêu cầu, họ đánh dấu mình đang bận và bắt đầu xử lý và tự đánh dấu miễn phí khi họ xử lý xong
  • Các vị trí phát định kỳ trạng thái của chúng đến hàng đợi để hàng đợi có thể chuyển tiếp các yêu cầu khi một vị trí trở nên miễn phí

Tài nguyên được đề xuất

  • Mô hình này dựa trên môi giới tin nhắn tập trung. Hàng đợi xử lý yêu cầu phải luôn luôn có sẵn. Cũng có thể có mô hình không có môi giới có thể được thực hiện theo một cách khác
  • Lập trình Semaphore trên Wikipedia
  • Sách nhỏ về Semaphores là một nguồn tài nguyên tuyệt vời có sẵn miễn phí
  • Semaphore dựa trên mô hình bộ nhớ chia sẻ. Mô hình diễn viên sẽ đưa ra một cái nhìn sâu sắc mới để giải quyết vấn đề này theo một cách khác

Câu trả lời cụ thể cho câu hỏi trong ngữ cảnh

Nhìn vào mã, tôi thích phiên bản cổ điển của một semaphore. Java có gói semaphore tích hợp để thực hiện điều này và bạn có thể dễ dàng xây dựng trên nó.

Cụ thể, tôi muốn biết mục tiêu bước đầu tốt hay hệ thống con đơn giản mà tôi có thể thực hiện là gì.

Giả sử chỉ có một phiên bản của ứng dụng được chạy trên mạng LAN

  • Sử dụng gói được đề xuất ở trên
  • Tạo semaphore với cơ chế hàng đợi tích hợp (tương tự như ngăn xếp) và thực hiện nó như một máy chủ
  • Khi người dùng khởi động ứng dụng, nó sẽ tìm kiếm semaphore, giảm số đếm (trong trường hợp này chỉ là 0 vì chỉ cho phép một trường hợp duy nhất) và cung cấp cho người dùng quyền truy cập vào ứng dụng
  • Khi một người dùng khác khởi động ứng dụng, nó sẽ tìm kiếm semaphore, vì nó là 0, đưa người dùng vào hàng đợi và đưa ra một thông báo cho người dùng rằng ứng dụng đang bận
  • Khi người dùng đầu tiên thoát khỏi ứng dụng, semaphore được tăng lên, tài nguyên sẽ khả dụng, người dùng bị đe dọa và giờ anh ta có thể khởi động ứng dụng.
  • Semaphore có thể được triển khai như một máy chủ độc lập (có thể với giao diện web đơn giản) có thể được ghép nối với ứng dụng.

Những cảnh báo sau đây đáng để suy nghĩ

  1. Hàng đợi có thể được xóa hoàn toàn hoặc ưu tiên có thể được thay đổi
  2. Ghép nối nó với ứng dụng như một máy chủ, yêu cầu sẽ chỉ có một phiên bản của máy chủ trên mạng LAN
  3. Chuẩn bị cho sự cố hoặc hàng đợi tin nhắn không giám sát (Truy cập yêu cầu của người dùng nhưng không khả dụng khi ứng dụng miễn phí)

Tôi có lẽ sẽ đề nghị những điều sau đây để hiểu rõ hơn

  • Theo liên kết này để hiểu rõ hơn
  • Hãy thử SCALA . Bạn có thể sử dụng tất cả các thư viện JAVA hiện có của mình cộng với bạn có được sự tương tranh tốt
  • Hãy nhìn vào ZMQ . Đây có thể là tùy chọn nếu bạn trừu tượng hóa toàn bộ quá trình thành một ứng dụng nhắn tin riêng biệt tương tác với các tài nguyên
  • Đọc về hệ thống cấp phép AutoCAD (họ triển khai mô hình cấp phép phù hợp với một số yêu cầu của bạn)

Câu trả lời EDIT được chỉnh sửa hoàn toàn vì câu trả lời ban đầu dựa trên quan điểm rộng hơn nhiều


Cảm ơn bạn rất nhiều vì câu trả lời thấu đáo này. Tôi đang đọc qua các tài liệu bạn cung cấp. Chủ yếu, tất cả những gì tôi biết là dự án có triển khai thuật toán đó trong hình 9.3.
Adel

1
@Adel Trả lời cập nhật để phù hợp với yêu cầu. Liên kết cũng thay đổi
Ubermensch
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.