"나쁜 사과"알고리즘 또는 프로세스 충돌 공유 샌드 박스


9

다음 문제를 처리하는 알고리즘을 찾고 있는데, 지금은 "나쁜 사과"알고리즘을 호출하고 있습니다.

문제

  • N >> M 인 M 샌드 박스에서 N 프로세스가 실행 중입니다.
  • 각 프로세스에 자체 샌드 박스를 제공하는 것은 비현실적입니다.
  • 이러한 프로세스 중 하나 이상이 제대로 작동하지 않아 전체 샌드 박스가 다운되어 동일한 샌드 박스에서 다른 모든 프로세스가 종료됩니다.

그것이 잘못 작동하는 단일 프로세스 인 경우 간단한 이분법을 사용하여 프로세스의 절반을 하나의 샌드 박스에, 다른 절반을 다른 샌드 박스에 넣을 수 있습니다.

질문

경우 두 개 이상의 프로세스가 심하게 행동한다 - 그들이있는 가능성을 포함하여 모든 심하게 행동 - 않습니다이 순진 알고리즘 "작업"? 합리적인 범위 내에서 작동하는 것이 보장됩니까?

단순화

논쟁을 위해 나쁜 프로세스는 샌드 박스를 즉시 중단 시키며 좋은 프로세스는 결코하지 않는다고 가정 해 봅시다.


제대로 작동하지 않는 프로세스 인해 샌드 박스가 다운 된다는 것이 얼마나 보장 됩니까? 우리는 주어진 샌드 박스가 충돌하지 않았기 때문에 "깨끗한"프로세스 만 실행한다는 것을 알고있을 때 유한 한 시간을 가정 할 수 있습니까?
SF.

안타깝게도 샌드 박스가 5 분 동안 중단되지 않는다고해서 모든 프로세스가 제대로 작동한다는 것을 의미하지는 않지만 그 사실에 대해 더 많은 확신을줍니다.
Roger Lipscombe

...하지만이 질문의 목적 상 유한 시간을 허용함으로써 근사 할 수 있다고 생각합니다.
Roger Lipscombe

"통과"및 "실패"프로세스로 간주되는 것을 미립화해야합니다. 실패하지 않고 5 분 동안 실행되면 기술적으로 여전히 나쁜 사과 일 수 있지만 정지 문제와 같이 모래에 딱딱한 줄을 만들지 않고 지나갈 때 절대 100 % 확실하지 않을 것입니다.
Neil

당신이 올바른 길을 가고있는 것처럼 들립니다. 프로세스가 많고 불량 사과가 여러 개있는 경우 알려진 좋은 사과를 분리 한 다음 알려진 샌드를 하나의 샌드 박스에 보관하고 알 수없는 프로세스를 계속 나누기 위해 큰 M 값 또는 고르지 않은 그룹을 사용해야 할 수 있습니다. 개인을 식별 할 때까지 다른 샌드 박스 샌드 박스가 많을수록 더 빠릅니다. @Neil이 지적했듯이 이것은 N 알고리즘의 log base M의 큰 O이므로 M을 늘리면 시험이 줄어 듭니다.
GlenPeterson

답변:


2

하나의 나쁜 사과를 찾으면 알고리즘을 적용 할 수 있습니다.

  1. N을 M 그룹으로 나누기
  2. 각 그룹에서 테스트를 수행하십시오.
  3. 그룹 크기가 1보다 크면 1 단계로 돌아가 N을 불량 그룹의 항목 수로 바꿉니다.

마찬가지로, 하나의 "좋은"사과를 찾으면 동일한 알고리즘이 적용되지만 오히려 좋은 그룹을 찾는 것입니다.

이 알고리즘은 O (log_M (N)) 성능 비율을 갖지만 잘못된 사과가 하나만 있다는 사실에 따라 다릅니다.

좋은 / 나쁜 사과가 몇 개인 지 모르는 경우 다음 알고리즘을 사용할 수 있습니다.

For each M processes in N
  Test M processes

최악의 시나리오이지만 O(N/M)시간 O(N)에 따라 실행됩니다 (또는 단일 패스를 단일 테스트 또는 병렬로 수행 된 테스트 모음으로 간주하는지에 따라 다름). 모든 것을 고려 했을 때, 이것은 결코 나쁜 접근법 이 아닙니다 .

이보다 성능이 좋은 알고리즘이있을 수 있지만 배치에 불량 사과 / 좋은 사과가 몇 개 있는지 알아야합니다. 이 요소를 알지 못하지만 그것을 증명할 수는 없지만 위에 나열된 후자의 알고리즘보다 더 잘 할 수 없다는 것을 기꺼이 내기 것입니다.

희망이 도움이됩니다!

편집 : 실용적인 관점에서 이러한 작업 중 일부가 쉽게 수행되지 않는다는 것을 알고 있습니다. 그러나 불행한 현실은 프로세스를 최소한 활성화하거나 비활성화하지 않고 해당 시점에 실행중인 샌드 박스에서 어떤 프로세스가 실행 중인지를 정확히 판단 할 수 없다는 것입니다. 질문이 알고리즘과 관련이 있다면 그 대답에 있다고 생각합니다. 질문이 이와 같은 상황을 처리하는 방법과 관련이 있다면 질문은 수퍼 유저 SE에게 더 적합 할 것입니다.


1
불행히도 프로세스를 "테스트"할 수 없습니다. 내가 아는 것은 샌드 박스 중 하나가 충돌했고 그 안에있는 하나 이상의 프로세스로 인해 발생한 것입니다.
Roger Lipscombe

1
문제는 세트를 이등분 한 후 두 파티션 모두에 나쁜 사과가있을 수 있다는 것입니다. 간단한 파티션 이상의 것이 필요하다고 생각합니다.
Roger Lipscombe

@RogerLipscombe 실제 시나리오에 알고리즘을 적용하려고합니다. 물론 프로세스를 한 번에 하나씩 테스트 할 수 없으며 다른 시스템에서 이러한 프로세스를 테스트하기가 어려울 수 있지만,이 단계를 원한다면 길을 찾아야합니다. 해결할 수없는 변수를 삽입하면 불량 사과를 정확하게 찾아 낼 수있는 알고리즘을 찾을 수 없게됩니다.
Neil

자, "테스트"는 "자신을 확신 할 수있을 정도로 오래 뛰도록 내버려 두는 것"을 의미합니다.
Roger Lipscombe

@RogerLipscombe 그렇게 생각합니다. 시간이 더 걸릴 수 있지만 얼마나 오래 기다려야하는지 알아야합니다. 이를 알고이 알고리즘을 따르면 기술적으로 모든 불량 사과를 찾을 수 있습니다. 그러나 Windows 이벤트 로그에서 충돌이 있는지 간단히 보는 것이 더 빠를 수 있습니다.
Neil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.