Algoritmo "Apple non valido" o processo che blocca il sandbox condiviso


9

Sto cercando un algoritmo per gestire il seguente problema, che per ora sto chiamando l'algoritmo "mela cattiva".

Il problema

  • Ho N processi in esecuzione in M ​​sandbox, dove N >> M.
  • Non è pratico assegnare a ciascun processo il proprio sandbox.
  • Almeno uno di questi processi ha un comportamento scorretto e sta facendo crollare l'intero sandbox, uccidendo così tutti gli altri processi nella stessa sandbox.

Se fosse un singolo processo mal comportato, allora potrei usare una semplice bisection per mettere metà dei processi in un sandbox e metà in un altro sandbox, fino a quando non ho trovato il maltrattante.

La domanda

Se più di un processo si comporta male - inclusa la possibilità che siano tutti mal comportati - questo ingenuo algoritmo "funziona"? È garantito che funzioni entro certi limiti sensibili?

semplificazioni

Per ragioni di argomento, supponiamo che un cattivo processo abbassi istantaneamente il suo sandbox e un buon processo non lo faccia mai.


Quanto è garantito che il processo mal comportato ridurrà il sandbox? Voglio dire - possiamo presumere un momento finito quando sappiamo per certo che sandbox dato sta eseguendo solo processi "puliti" perché non si è bloccato?
SF.

Sfortunatamente no: il fatto che un sandbox non si arresti in modo anomalo per 5 minuti non significa che tutti i processi siano ben educati, ma ci dà più fiducia di questo fatto.
Roger Lipscombe,

... ma ai fini di questa domanda, potremmo approssimarci concedendo un tempo finito, immagino.
Roger Lipscombe,

Devi atomizzare quello che consideri un processo "superato" e "fallito". Se dura 5 minuti senza fallire, potrebbe tecnicamente essere una brutta mela, ma come il problema dell'arresto, non avrai mai la certezza al 100% quando passa senza fare alcune linee dure nella sabbia.
Neil,

Sembra che tu sia sulla buona strada. Se ci sono molti processi e più mele cattive, potrebbe essere necessario utilizzare un grande valore di M o gruppi irregolari in modo da poter isolare le mele buone conosciute, quindi conservare il bene noto in una sandbox e continuare a dividere i processi sconosciuti tra gli altri sandbox fino a quando non hai identificato gli individui. Più sandbox hai, più veloce andrà. Come ha sottolineato @Neil, questa è una grande O dell'algoritmo M di N base log, quindi l'aumento di M taglierà le tue prove.
GlenPeterson,

Risposte:


2

Se stavi trovando una mela cattiva, allora potresti applicare l'algoritmo:

  1. Dividi N in gruppi M.
  2. Eseguire il test su ciascun gruppo.
  3. Se la dimensione del gruppo è maggiore di 1, tornare al passaggio 1, sostituendo N con il numero di elementi nel gruppo errato.

Allo stesso modo, se stavi trovando l'unica "buona" mela, si applica lo stesso algoritmo, ma piuttosto trova il buon gruppo.

Questo algoritmo ha un tasso di prestazione O (log_M (N)) ma dipende dal fatto che c'è solo una mela cattiva.

Se non sai quante mele buone / cattive ci sono, allora potresti usare il seguente algoritmo:

For each M processes in N
  Test M processes

Questo è lo scenario peggiore, ma viene eseguito nel O(N/M)tempo (o a O(N)seconda se si considera un singolo passaggio come un singolo test o come una raccolta di test eseguiti in parallelo). Tutto considerato, questo non è affatto un cattivo approccio.

Potrebbero esserci degli algoritmi che funzionano meglio di questo, ma richiede che tu sappia quante mele cattive / mele buone ci sono nel batch. Non conoscendo questo fattore, anche se non posso provarlo, sarei disposto a scommettere che non puoi fare di meglio rispetto a quest'ultimo algoritmo sopra elencato.

Spero che aiuti!

Modifica : da un punto di vista pratico, capisco che alcune di queste operazioni non sono facilmente eseguibili. È vero, tuttavia, la sfortunata realtà è che non è possibile determinare la mela cattiva rigorosamente da quali processi erano in esecuzione sulla sandbox che era in esecuzione in quel momento senza essere almeno per attivare o disattivare i processi. Se la domanda riguarda l'algoritmo, penso di aver risposto. Se la domanda riguarda come affrontare una situazione come questa, forse la domanda sarebbe più adatta per il superutente SE.


1
Sfortunatamente, non posso "testare" i processi; tutto quello che so è che uno dei sandbox si è schiantato e che è stato causato da uno o più dei processi in esso.
Roger Lipscombe,

1
Il problema è che, dopo aver diviso in due il set, entrambe le partizioni potrebbero contenere mele cattive. Il che mi fa pensare che ho bisogno di qualcosa di più di una semplice partizione ...
Roger Lipscombe,

@RogerLipscombe Stai cercando di applicare un algoritmo a uno scenario del mondo reale. Ovviamente non sarai in grado di testare i processi uno alla volta, e potrebbe essere difficile testarli su macchine diverse, tuttavia, se vuoi arrivare a fondo di questo, stai per trovare un modo in un modo o nell'altro. Se inserisci variabili che non possono essere risolte, semplicemente non sarai in grado di trovare un algoritmo in grado di individuare con precisione le mele difettose.
Neil,

OK, quindi per "test" intendi semplicemente "lasciarli in esecuzione abbastanza a lungo da essere sicuri" ...?
Roger Lipscombe,

@RogerLipscombe Suppongo di si. Potrebbe volerci più tempo, ma sei tu quello che deve capire per quanto tempo aspettare. Sapendo che e seguendo questo algoritmo, potresti tecnicamente scoprire tutte le mele cattive. Tuttavia, potrebbe essere più veloce guardare semplicemente il registro eventi di Windows per gli arresti anomali.
Neil,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.