Supreme Topics

Qual è la piattaforma più utilizzata nel servizio di monitoraggio della sicurezza?

Come funziona l’IA in giochi come FIFA?

Quando un telefono viene rilasciato in un Paese, il telefono viene rilasciato in tutto quel Paese a quella data?

Qualcuno può rintracciare me e il mio indirizzo IP se mi trovo in una scheda di navigazione in incognito in Chrome?

Quale distribuzione Linux è la migliore per un programmatore?

Dove e come hai imparato l’IA e quali sono i tuoi consigli per i principianti?

Quali sono alcuni elementi essenziali di cui tutti hanno bisogno oltre a uno smartphone e un laptop?

Alcuni siti Web inviano un messaggio che dice “questo sito utilizza i cookie”. Ci sono degli svantaggi se usano i miei cookie?

In che modo Google visualizza il mio sito?

Come devo avvicinarmi alla pubblicazione di un documento di ricerca? Ho completato diversi corsi su Coursera e corsi online di Stanford sull’apprendimento automatico e la classificazione delle immagini usando la CNN e l’apprendimento profondo per la PNL.

L’aggiunta di una scheda di memoria con una specifica di velocità leggermente più lenta spesso vale la pena per altri 4 GB di RAM? Per quali casi sarebbe usato?

La videocamera Nest per $ 199 vale il prezzo?

Qual è la massima unità di misura per la memoria di un computer?

Qual è il miglior fornitore di servizi di rivestimento a Dubai?

È possibile utilizzare un’unità CD esterna per riprodurre un gioco basato su disco (richiede sempre un disco) in un laptop che non dispone di un’unità CD?

Come funziona il processo di rimozione in un elenco collegato? È semplicemente rimuovendo il riferimento del nodo? Quale meccanismo viene utilizzato per disporre un nodo?

Dipende da come l’ambiente di runtime in uso gestisce la memoria.

Ad esempio, in C, devi allocare in modo esplicito la memoria per un nodo chiamando malloc() , quindi rimuovendo il nodo devi restituire la sua memoria alla lista dello spazio free() chiamando free() . I dati nel nodo si trovano ovunque siano in memoria fino a quando malloc() non li riutilizza, motivo per cui è possibile ottenere bug orribili in C mantenendo un puntatore a un nodo dopo averlo liberato, poiché i dati sono ancora lì fino a quando improvvisamente non lo è.

Nei linguaggi garbage collection, la rimozione di tutti i riferimenti a un nodo libera automaticamente la memoria quando viene eseguito il garbage collector.

Esistono diversi approcci a questo problema. C # tiene traccia di quanti riferimenti esistono a un oggetto e il GC lo raccoglie quando il numero è zero. Go utilizza un algoritmo mark / sweep, in cui imposta un bit su ogni oggetto nell’heap a cui può navigare dalla radice, quindi raccoglie tutti gli oggetti nell’heap il cui bit non è stato impostato. (In entrambi i casi, nulla può allocare nuova memoria mentre il GC è in esecuzione e il runtime essenzialmente interrompe il programma mentre pulisce la casa. La garbage collection Stop-the-world è il motivo per cui i sistemi in tempo reale sono generalmente ancora scritti in C.)

In entrambi i casi, il GC passa attraverso l’heap e restituisce tutto ciò che viene raccolto nell’elenco degli spazi liberi. Forse compatta persino l’heap, spostando blocchi di memoria usata in modo che più spazio libero sia contiguo.

Quindi in un linguaggio GC, rimuovi un nodo dall’elenco non facendo più nulla. Di solito questo assomiglia a n.prev.next = n.next . Prima di questa operazione, l’unica cosa che indicava n era n.prev.next ; dopo questa operazione, niente lo fa. (Va bene, non è vero. n indica ancora la memoria. Ma quando n esce dal campo di applicazione alla fine del metodo, allora nulla lo indicherà.) La prossima volta che il GC funziona, scopre che nulla punta al memoria a cui n puntava (o perché la fase di marcatura non l’ha contrassegnata o perché il suo conteggio di riferimento è andato a 0) e inserisce il blocco di memoria che conteneva n nella lista dello spazio libero.

In C, dopo aver fatto n.prev.next = n.next devi chiamare free(n) o avrai quella che è nota come perdita di memoria. Il programma aggiungerà nodi all’elenco e li eliminerà, ma eliminandoli non verranno aggiunti nodi eliminati all’elenco degli spazi liberi e alla fine il programma rimarrà senza memoria libera.

Pseudo codice (tipo C / ++ / #):

(oggetto) * this = currentNode;
this-> next-> prev = this-> prev;
this-> prev-> next = this-> next;
this.Dispose ();

dispose () può essere implementato in molti modi a seconda della lingua e dell’ambiente. Potrebbe effettivamente contrassegnare la memoria come inutilizzata, rilasciare il blocco di memoria per la garbage collection, contrassegnarla come disponibile, ecc …

Devi separare due meccanismi.

Uno è la struttura dell’elenco.

L’altro è il sistema di allocazione della memoria, che fa parte del sistema operativo. Funziona come una scatola nera: chiedi un pezzo di memoria e quando hai finito, la rinunci.

Internamente il sistema di allocazione della memoria mantiene tutti i tipi di informazioni di manutenzione utilizzando strutture di dati proprie (possibilmente includendo più elenchi collegati). Ma di solito non ci si confronta con quello mentre si scrive il programma.

Pertanto, quando si rimuove un nodo in un elenco collegato, ciò comporta questi passaggi:

  • Reindirizzare il collegamento o i collegamenti che puntano a quel nodo
  • Comunicare al sottosistema di memoria che non è più necessaria la memoria associata a quel nodo.