2012-02-18 16 views
7

Vì lý do nào, một trong những lý do sẽ chọn một số quy trình trên một số luồng để thực hiện một ứng dụng trong Java?Khi nào nên chọn một số quy trình trên các chuỗi trong Java?

Tôi đang tái cấu trúc một ứng dụng java cũ hơn hiện được chia thành nhiều ứng dụng nhỏ hơn (quy trình) chạy trên cùng một máy đa lõi, giao tiếp với nhau thông qua ổ cắm.

Cá nhân tôi nghĩ rằng điều này nên được thực hiện bằng cách sử dụng các chủ đề chứ không phải là quy trình, nhưng đối số nào sẽ bảo vệ thiết kế ban đầu?

Trả lời

9

I (và những người khác, xem thông tin ghi nhận dưới đây) có thể nghĩ đến một vài lý do:

lý do lịch sử

  • Việc thiết kế là từ những ngày khi chỉ đề màu xanh lá cây đã có sẵn và bản gốc tác giả/nhà thiết kế cho rằng họ sẽ không làm việc cho anh ta.

Mạnh mẽ và Fault Tolerance

  • Bạn sử dụng các thành phần mà không phải là thread an toàn, vì vậy bạn không thể parallelize withough phải dùng đến nhiều quy trình.

  • Một số thành phần bị lỗi và bạn không muốn chúng có thể ảnh hưởng đến nhiều quá trình. Giả sử, nếu một thành phần có bộ nhớ hoặc rò rỉ tài nguyên mà cuối cùng có thể bắt buộc quá trình khởi động lại thì chỉ có quá trình sử dụng thành phần đó bị ảnh hưởng.

  • Đa luồng chính xác vẫn khó thực hiện. Tùy thuộc vào thiết kế của bạn khó hơn so với đa xử lý. Tuy nhiên, sau này được cho là không quá dễ dàng.

  • Bạn có thể có một mô hình nơi bạn có quy trình giám sát có thể chủ động giám sát (và cuối cùng khởi động lại) các quy trình công nhân bị lỗi. Điều này cũng có thể bao gồm tạm ngưng/tiếp tục các quy trình, không an toàn với các chủ đề (nhờ vào @Jayan để chỉ ra).

Giới hạn Resource OS & Quản

  • Nếu quá trình, sử dụng một chủ đề duy nhất, đã được sử dụng tất cả các không gian địa chỉ có sẵn (ví dụ cho các ứng dụng 32bit trên Windows 2GB), bạn có thể cần phân phối công việc giữa các quy trình.

  • Hạn chế sử dụng tài nguyên (CPU, bộ nhớ, v.v.) thường chỉ có thể trên cơ sở cho mỗi quá trình (ví dụ trên Windows, bạn có thể tạo đối tượng "công việc", yêu cầu quy trình riêng).

cân nhắc an ninh

  • Bạn có thể chạy các quá trình khác nhau sử dụng các tài khoản khác nhau (ví dụ: "Người sử dụng"), thì cung cấp cách ly tốt hơn giữa chúng.

vấn đề tương thích

  • Hỗ trợ nhiều/phiên bản Java khác nhau: Sử dụng các quy trình differnt bạn có thể sử dụng các phiên bản Java khác nhau cho các bộ phận ứng dụng của bạn (nếu yêu cầu của thư viện của bên thứ 3).

Location Transparency

  • Bạn có thể (khả năng) phân phối ứng dụng của bạn trên nhiều máy vật lý, do đó tăng thêm khả năng mở rộng và/hoặc mạnh mẽ của ứng dụng (xem @Qwe's answer để biết thêm chi tiết/ý tưởng ban đầu).
+0

danh sách hoặc đối số tuyệt vời, cảm ơn! – wannabeartist

+0

+1 Bao gồm mọi thứ tôi có thể đã liệt kê. (Tôi muốn nhấn mạnh việc quản lý tài nguyên và các mục phân tách đặc quyền; chúng là những thứ bạn không thể thực hiện mà không có các quy trình riêng biệt, mặc dù đôi khi những ngày này bạn vượt xa điều đó để tách các máy ảo.) –

+0

+1 Giống như một số quy trình khởi động và xem các quy trình khác (postgres thực hiện một số điều như nó). – Jayan

6

Nếu bạn quyết định theo chủ đề, bạn sẽ hạn chế ứng dụng của mình được chạy trên một máy. Giải pháp này không quy mô (hoặc quy mô ở một mức độ nào đó) - luôn có giới hạn phần cứng.

Và các quy trình khác nhau liên lạc qua ổ cắm có thể được phân phối giữa các máy, để bạn có thể thêm số lượng hầu như không giới hạn hoặc chúng. Điều này tốt hơn với chi phí giao tiếp chậm giữa các quy trình.

Quyết định cách tiếp cận nào phù hợp hơn là một nhiệm vụ rất thú vị. Và một khi bạn đưa ra quyết định, không có gì đảm bảo rằng nó sẽ trông ngu ngốc với người thừa kế của bạn sau một vài năm khi yêu cầu thay đổi hoặc phần cứng mới trở nên khả dụng.

+0

Rất đúng. Trong trường hợp này, ứng dụng có nghĩa là phải chạy trên một máy đơn lẻ, nhưng thường là một điểm rất hợp lệ để xem xét. – wannabeartist

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