Thuật toán táo Bad Bad, hoặc xử lý sự cố chia sẻ hộp cát


9

Tôi đang tìm kiếm một thuật toán để xử lý vấn đề sau, hiện tại tôi đang gọi thuật toán "quả táo xấu".

Vấn đề

  • Tôi đã có N tiến trình đang chạy trong M sandbox, trong đó N >> M.
  • Đó là không thực tế để cung cấp cho mỗi quá trình hộp cát riêng của mình.
  • Ít nhất một trong số các quy trình đó có hành vi xấu và làm giảm toàn bộ hộp cát, do đó giết chết tất cả các quy trình khác trong cùng một hộp cát.

Nếu đó là một quá trình hành xử tồi tệ, thì tôi có thể sử dụng một phép chia đơn giản để đặt một nửa các quy trình vào một hộp cát, và một nửa trong hộp cát khác, cho đến khi tôi tìm thấy sự bất hợp lý.

Câu hỏi

Nếu có nhiều hơn một quá trình bị hành xử xấu - bao gồm cả khả năng tất cả chúng đều hoạt động kém - thuật toán ngây thơ này có "hoạt động" không? Được đảm bảo để làm việc trong một số giới hạn hợp lý?

Đơn giản hóa

Để tranh luận, hãy giả sử rằng một quy trình xấu sẽ đưa hộp cát xuống ngay lập tức và một quy trình tốt không bao giờ xảy ra.


Làm thế nào đảm bảo rằng quá trình hành xử xấu sẽ đưa hộp cát xuống? Ý tôi là - chúng ta có thể giả sử một thời gian hữu hạn khi chúng ta biết chắc chắn hộp cát đã cho chỉ chạy các quy trình "sạch" vì nó không bị sập?
SF.

Thật không may là: thực tế là một hộp cát không bị sập trong 5 phút không có nghĩa là tất cả các quy trình đều hoạt động tốt, nhưng nó giúp chúng tôi tự tin hơn về thực tế đó.
Roger Lipscombe

... nhưng với mục đích của câu hỏi này, chúng tôi có thể ước chừng bằng cách cho phép một thời gian hữu hạn, tôi đoán vậy.
Roger Lipscombe

Bạn phải nguyên tử hóa những gì bạn cho là quá trình "thông qua" và "thất bại". Nếu nó chạy được 5 phút mà không bị lỗi, về mặt kỹ thuật nó vẫn có thể là một quả táo xấu, nhưng giống như vấn đề tạm dừng, bạn sẽ không bao giờ có được sự chắc chắn 100% khi vượt qua mà không tạo ra một số đường cứng trên cát.
Neil

Nghe có vẻ bạn đang đi đúng hướng. Nếu có nhiều quy trình và nhiều táo xấu, thì bạn có thể phải sử dụng một giá trị lớn của M hoặc các nhóm không đồng đều để bạn có thể cách ly những quả táo tốt đã biết, sau đó giữ hàng hóa đã biết trong một hộp cát và tiếp tục phân chia các quy trình chưa biết giữa hộp cát khác của bạn cho đến khi bạn đã xác định được các cá nhân. Bạn càng có nhiều hộp cát, điều này sẽ diễn ra nhanh hơn. Như @Neil đã chỉ ra, đây là một chữ O lớn của cơ sở log của thuật toán N, vì vậy việc tăng M sẽ cắt giảm các thử nghiệm của bạn.
GlenPeterson

Câu trả lời:


2

Nếu bạn đang tìm một quả táo xấu, thì bạn có thể áp dụng thuật toán:

  1. Chia N thành các nhóm M
  2. Thực hiện kiểm tra trên mỗi nhóm.
  3. Nếu kích thước nhóm lớn hơn 1, quay lại bước 1, thay thế N bằng số mục trong nhóm xấu.

Tương tự như vậy, nếu bạn đang tìm một quả táo "tốt", thì thuật toán tương tự sẽ được áp dụng, nhưng thay vào đó là tìm nhóm tốt.

Thuật toán này có tốc độ hiệu suất O (log_M (N)) nhưng nó phụ thuộc vào thực tế là chỉ có một quả táo xấu.

Nếu bạn không biết có bao nhiêu quả táo tốt / xấu, thì bạn có thể sử dụng thuật toán sau:

For each M processes in N
  Test M processes

Đây là trường hợp xấu nhất, nhưng nó chạy theo O(N/M)thời gian (hoặc O(N)tùy thuộc vào việc bạn xem xét một lần vượt qua như một thử nghiệm đơn lẻ hay như một tập hợp các thử nghiệm được thực hiện song song). Tất cả những điều được xem xét, đây không phải là một cách tiếp cận xấu bằng bất kỳ phương tiện.

Có thể có các thuật toán hoạt động tốt hơn thế này, nhưng nó đòi hỏi bạn phải biết có bao nhiêu quả táo xấu / quả táo tốt trong lô. Không biết yếu tố này, trong khi tôi không thể chứng minh được, tôi sẵn sàng đặt cược rằng bạn không thể làm tốt hơn thuật toán sau được liệt kê ở trên.

Mong rằng sẽ giúp!

Chỉnh sửa : Từ góc độ thực tế, tôi hiểu rằng một số thao tác này không dễ thực hiện. Tuy nhiên, điều đó đúng, một thực tế đáng tiếc là bạn không thể xác định đúng quả táo xấu mà từ đó các quy trình đang chạy trên hộp cát đang chạy vào thời điểm đó mà không phải ít nhất là kích hoạt hoặc hủy kích hoạt các quy trình. Nếu câu hỏi liên quan đến thuật toán, tôi nghĩ rằng tôi đã trả lời điều đó. Nếu câu hỏi liên quan đến cách xử lý một tình huống như thế này, thì có lẽ câu hỏi sẽ phù hợp hơn với siêu người dùng SE.


1
Thật không may, tôi không thể "kiểm tra" các quy trình; tất cả những gì tôi biết là một trong những hộp cát bị rơi và nó được gây ra bởi một hoặc nhiều quá trình trong đó.
Roger Lipscombe

1
Vấn đề là, sau khi chia đôi tập hợp, cả hai phân vùng có thể có những quả táo xấu trong đó. Điều này khiến tôi nghĩ rằng tôi cần nhiều hơn một phân vùng đơn giản ...
Roger Lipscombe

@RogerLipscombe Bạn đang cố gắng áp dụng thuật toán cho kịch bản trong thế giới thực. Tất nhiên, bạn sẽ không thể kiểm tra từng quy trình một lần và có thể khó kiểm tra các quy trình này trên các máy khác nhau, tuy nhiên, nếu bạn muốn tìm hiểu sâu về quy trình này, bạn sẽ phải tìm cách này hay cách khác Nếu bạn chèn các biến không thể giải quyết, đơn giản là bạn sẽ không thể tìm thấy thuật toán có thể xác định chính xác (các) quả táo xấu.
Neil

OK, vậy bằng cách "kiểm tra", bạn chỉ có nghĩa là "để họ chạy đủ lâu để tự tin" ...?
Roger Lipscombe

@RogerLipscombe Tôi cho là vậy. Có thể mất nhiều thời gian hơn, nhưng bạn là người phải tính toán thời gian chờ đợi. Biết rằng và theo thuật toán này, về mặt kỹ thuật bạn có thể tìm ra bất kỳ và tất cả các quả táo xấu. Tuy nhiên, có thể nhanh hơn khi chỉ cần nhìn vào nhật ký sự kiện của Windows cho các sự cố.
Neil
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.