copia di memoria vs puntatore alla memoria in sistemi in tempo reale

0

Mentre si lavora in un ambiente multi-thread, la condivisione dei dati sembra essere una buona opzione per passare i dati tra i thread.

Mentre si lavora con sistemi in tempo reale è apparentemente consigliabile andare con l'ottimizzazione della memoria.

Quindi, nel mio scenario, ho un consumatore e un produttore. Condividono una coda di qualsiasi tipo di dati e.g int queue . Ora il produttore genera dati e amp; copia i dati in coda ed emette un segnale al consumatore che sta aspettando il segnale come segue:

thread 1:
pthread_mutex_lock(&mutex);
while (!condition)
    pthread_cond_wait(&cond, &mutex);
/* do something that requires holding the mutex and condition is true */
pthread_mutex_unlock(&mutex);

thread2:

pthread_mutex_lock(&mutex);
/* do something that might make condition true */
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);

Quando il produttore genera i dati nella coda ed emette un segnale, il consumatore riceve quel segnale e amp; blocca la coda per entrare in una sezione critica.

Ora, il consumatore deve copiare quei dati o elaborarli direttamente nella sezione critica? Quale opzione è consigliabile?

Consideriamo un esempio in tempo reale, il mio thread di produzione genera dati ad ogni 50ms e come per codice, blocca la coda ogni 50 ms, copia i dati in coda, emette un segnale e si sblocca.

Una volta che il consumatore riceve il segnale, deve elaborare i dati. Ma, prima di elaborare i dati, il consumatore internamente blocca prima la coda.

Quindi, prima che i dati vengano elaborati, devono essere copiati per primi o possono essere elaborati direttamente e quindi sbloccati?

FYI, il consumatore impiega solo 1ms di tempo per elaborare.

In questo scenario, la copia della memoria è più efficiente o è il puntatore alla memoria?

    
posta Nishant Bijani A 04.04.2018 - 15:28
fonte

2 risposte

2

Per questa situazione specifica, non vedo perché è necessario che il "produttore" e il "consumatore" si trovino in thread separati. Quindi, se questa specifica situazione è l'unica a cui tieni, non copiare i dati e non eseguire il thread.

Molto sulla progettazione di programmi sta pensando a tutti i modi in cui l'input del programma potrebbe andare storto. Se sai che il produttore produrrà solo dati ogni 50ms e tu sai che il consumatore avrà sempre solo 1ms per elaborare tali dati, potresti integrare il consumatore e produttore in un thread e rendere tutto più semplice. Tuttavia, se una di queste cose è in dubbio, e il produttore non può attendere che il consumatore finisca (che può sembrare dall'uso di un blocco mutex), potrebbe essere necessario inserire .

Fondamentalmente ciò che hai ora agisce come un programma non filettato, solo più complicato. Se ti stai solo esercitando a scrivere codice, allora va bene. Tuttavia, se è necessario eseguire il thread, ciò che farei è implementare la coda circolare senza blocco. In questo modo il produttore può sempre mettere le cose in coda (almeno fino a quando non si riempie) e il consumatore può lavorare sui dati senza doverlo copiare. La copia non è generalmente più efficiente del dereferenziamento di un puntatore, specialmente se stai facendo cose con molti dati.

    
risposta data 05.04.2018 - 05:42
fonte
0

Lo scopo del blocco è quello di prevenire una condizione di competizione durante l'accesso alla coda. In quanto tale, non dovrebbe essere più ampio del necessario.

Potresti essere soggetto a deadlock se non sei attento a questo: se la parte di elaborazione dei dati ha una logica asincrona nascosta in essa che avvia un altro thread che tenta di accodare qualcosa.

Mantenendo il blocco più lungo del necessario, si sconfigge in parte lo scopo dell'utilizzo dei thread in primo luogo, arrestando altri thread in attesa che il blocco diventi disponibile dal procedere.

Proprio come quando apri il frigorifero, prendi ciò di cui hai bisogno, chiudi il frigo e fai colazione, dovresti chiudere una dichiarazione di blocco subito dopo aver finito di fare ciò che il blocco dovrebbe proteggere.

    
risposta data 03.08.2018 - 07:34
fonte

Leggi altre domande sui tag