Esiste una bomba a tempo nell'assegnazione di ID processo sequenziale quando il "non firmato" si avvolge?

1

Sto progettando e implementando un interprete postscript multiprocessing (processi "leggeri" simulati da un singolo thread OS), e ho bisogno di generare un identificatore univoco per ogni processo nel sistema, oltre a mantenere gli ID per qualsiasi guasto processi che hanno ancora riferimenti dal vivo. (Riferimento: Adobe PLRM, 2ed, Ch. 7 Visualizza PostScript, link )

Ho iniziato con un semplice incremento, che viene mappato in modo aritmetico all'indice della tabella per i dati per processo.

link

unsigned nextid = 0;  // global (file-static) counter

unsigned initctxid(void) {  // generate a new cid
    while ( ctxcid(++nextid)->state != 0 )  // .state == 0 means free
        ;
    return nextid; 
}

context *ctxcid(unsigned cid) {  // get context data from cid
    return &itpdata.ctab[ (cid-1) % MAXCONTEXT ];
}

Ma ci sarà un grosso problema se (quando) i non firmati si intrecciano. Forse non è spaventoso per un gioco o un'applicazione, ma questa cosa dovrebbe essere un server. Infine. Mi piacerebbe evitare di scrivere (sul serio) il disclaimer, "avviso: inizierà ad avere strani problemi dopo aver funzionato a lungo".

Quindi, dovrebbe essere abbastanza facile rilevare quando si avvolge, ma che cosa allora? Salvataggio?

Quindi la situazione / scenario finora è: sei un server postscript multitasking con una manciata di processi con cids assegnati durante una epoca del generatore, e l'epoca è appena diventata. Il mio pensiero (non impossibile, sembra davvero difficile) è quello di compattare questi ID esistenti fino all'intervallo 0..N (riscrivendo tutti i riferimenti, scansionando tutta la memoria se necessario) e reimposta nextid su N.

Ma sarà un vero rompicapo. C'è un modo diverso di generare questi ID, quindi non devo fare un grosso lavoro di raccolta di dati su di loro, e farlo funzionare, lo sai, perpetuamente ?

Modifica: un fatto che ho dimenticato di menzionare è che il riferimento PostScript Display dice che gli ID non vengono riutilizzati durante un'istanza in esecuzione del sistema. Ma poiché questi ID non sono esposti, non possono essere salvati in alcuna forma diversa dall'oggetto contesto. Quindi il riutilizzo dovrebbe andare bene fino a quando nessun processo in esecuzione può saperlo (contiene un vecchio oggetto di contesto in memoria accessibile).

    
posta luser droog 28.05.2013 - 11:39
fonte

1 risposta

2

Non importa se nextid esegue il wrapping (se non hai abilitato il controllo di overflow).

Quello che succederà è che l'ID è passato alla funzione ctxcid che lo limita all'intervallo [0..MAXCONTEXT) (usando la mod % ). Quindi il wrapping avviene molto prima che nextid si completi.

Quindi in realtà il caso peggiore per te è il riempimento dell'array, che causerà un loop infinito perché quel ciclo while non verrà chiuso.

    
risposta data 28.05.2013 - 11:52
fonte

Leggi altre domande sui tag