Domande sul linguaggio SI - pagina 8

 
 
Igor Makanu:

ci sono aree di memoria e ci sono puntatori ad aree di memoria memorizzate in altre aree di memoria

e poi c'è una gerarchia finché il cervello può percepire

 
Vladimir Simakov:
Inoltre, anche gli inserti di montaggio sono molto usati.

Mi riprendo parzialmente, guarda dalle 18:00 , sì, non scrivono in asm, ma correggono il codice già compilato - allora è logico

per quanto ho capito quello che fanno i compilatori moderni con inserti assembler è solo un'imitazione di asm, cioè non è certo che l'inserimento asm in tale forma entrerà nel codice compilato, e per ottimizzare veramente in codice asm abbastanza per riscrivere sezioni di codice in asm nel debugger - imho


 
Maxim Dmitrievsky:

ci sono aree di memoria e ci sono puntatori ad aree di memoria memorizzate in altre aree di memoria

e poi c'è una gerarchia finché il cervello può percepire

Sì, ed è anche bello non tenere traccia del fatto che un collegamento sia vivo o meno e strisciare in una sezione di memoria rilasciata a lungo che è già usata da un altro processo e rompere tutto lì))))

 
Vladimir Simakov:

Sì, ed è anche bello non tracciare quando un collegamento è vivo o no e strisciare in uno spazio di memoria rilasciato da tempo, che è già usato da un altro processo e rompere tutto lì))))

Che favola, questo era possibile solo in Windows 3.*. Windows non vi farà entrare nella memoria del processo di qualcun altro, ogni processo lavora nella propria area, e per esso l'indirizzamento della memoria inizia da zero, è così che gli viene presentato da Windows. E in generale, Windows alloca la memoria solo quando scrive davvero dei dati. Fate un array doppio arr[1024*1024*1024] e vedete quanta memoria è effettivamente allocata in Task Manager. Ma non del tutto! Finché non iniziate effettivamente a scrivere nell'array, la memoria non sarà allocata in pezzi da 4Kb. Anche se lo scrivete usando indici randomizzati, sarà comunque in tali pezzi. Come Windows virtualizza tutto questo è insondabile per me!

 
Alexey Volchanskiy:

Come Windows virtualizza tutto questo è insondabile per me!

Non voglio cercarlo su Google, ma con l'avvento del Pentium-1 il processore ha descrittori di segmento di memoria e memoria virtuale, cioè molto probabilmente si tratta di virtualizzazione a livello hardware, e Windows la usa abilmente

 
Alexey Volchanskiy:

Che favola, questo era possibile solo in Windows 3.*. Windows non vi farà entrare nella memoria del processo di qualcun altro, ogni processo lavora nella propria area, e per esso l'indirizzamento della memoria inizia da zero, è così che gli viene presentato da Windows. E in generale, Windows alloca la memoria solo quando scrive davvero dei dati. Fate un array doppio arr[1024*1024*1024] e vedete quanta memoria è effettivamente allocata in Task Manager. Ma non del tutto! Finché non iniziate effettivamente a scrivere nell'array, la memoria non sarà allocata in pezzi da 4Kb. Anche se lo scrivete usando indici randomizzati, sarà comunque in tali pezzi. Come Windows virtualizza tutto questo è insondabile per me!

Errore di pagina. L'eccezione è stata un colpo di fortuna: hanno dato memoria per pagina, niente di più. Questo è conveniente e trasparente per le applicazioni, ma porta alla frammentazione della memoria. Potete allocare la memoria fisica in un colpo solo se chiamate virtuallock sul puntatore risultante dopo virtualalloc. A proposito, è un buco interessante, dovrò vedere se è possibile bloccare il server in questo modo.


Tre non aveva la virtualizzazione, è un sistema diverso, non NT. C'erano un sacco di code DOS, metà delle funzioni del sistema erano incardinate sull'int 21.

 

Questo caso non è chiaro:

/*
 * The mine_score structure describes the maximum normalized mutual information
 * scores (i.e. the characteristic matrix if est=EST_MIC_APPROX, the
 * equicharacteristic matrix instead). M[i][j] contains the score using a grid
 * partitioning x-values into i+2 bins and y-values into j+2 bins. m and M are
 * of length n and each M[i] is of length m[i].
 */
typedef struct mine_score
{
  int n;      /* number of rows of M */
  int *m;     /* number of cols of M[i] for each i */
  double **M; /* the (equi)characteristic matrix */
} mine_score;

Inoltre, nella f-i c'è un cambiamento nella dimensione della matrice M:

/*
* Returns an initialized mine_score structure. Returns NULL if an error
* occurs.
*/
mine_score *init_score(mine_problem *prob, mine_parameter *param) {   int i, j;   double B;   mine_score *score;   if ((param->alpha > 0.0) && (param->alpha <= 1.0))     B = MAX(pow(prob->n, param->alpha), 4);   else if (param->alpha >= 4)     B = MIN(param->alpha, prob->n);   else     goto error_score;   score = (mine_score *) malloc (sizeof(mine_score));   if (score == NULL)     goto error_score;   score->n = MAX((int) floor(B/2.0), 2) - 1; задали кол-во строк, ок   score->m = (int *) malloc(score->n * sizeof(int)); а кол-во столбцов тут чему равно? кол-ву строк?   if (score->m == NULL)     goto error_score_m;   for (i=0; i<score->n; i++)     score->m[i] = (int) floor((double) B / (double) (i+2)) - 1;   score->M = (double **) malloc (score->n * sizeof(double *));   if (score->M == NULL)     goto error_score_M;   for (i=0; i<score->n; i++)     {       score->M[i] = (double *) malloc ((score->m[i]) * sizeof(double)); а здесь идет просто выделение памяти для матриы М?       if (score->M[i] == NULL)         {           for (j=0; j<i; j++)             free(score->M[j]);           goto error_score_M_i;         }     }   return score;   error_score_M_i:     free(score->M);   error_score_M:     free(score->m);   error_score_m:     free(score);   error_score:     return NULL; }

Cioè, da quanto ho capito, tutto questo casino serve solo per allocare la memoria per la matrice, ma non viene riempita con nessun valore? Così, questo codice può essere buttato fuori per mql (bene, dopo aver determinato il numero di righe e lo stesso numero di colonne della matrice quadrata)

o la matrice è inizializzata con alcuni valori

 
Alexey Volchanskiy:

...Come il sistema del vento virtualizza tutto questo è insondabile per me!

Leggi Richter. Ha masticato tutto fino a farti male al cuore.

SeriousRacoon:
A proposito, buco interessante, dovrò vedere se è possibile far crashare il server in questo modo

Non si può.

 
Maxim Dmitrievsky:

Questo caso non è chiaro:

typedef struct mine_score
{
  int n;      /* number of rows of M */
  int *m;     /* number of cols of M[i] for each i */
  double **M; /* the (equi)characteristic matrix */
} mine_score;
  score->n = MAX((int) floor(B/2.0), 2) - 1; задали кол-во строк, ок
  score->m = (int *) malloc(score->n * sizeof(int)); а кол-во столбцов тут чему равно? кол-ву строк?
score->M[i] = (double *) malloc ((score->m[i]) * sizeof(double)); а здесь идет просто выделение памяти для матриы М?

Inoltre, nella f-i c'è un cambiamento nella dimensione della matrice M:

Cioè, da quanto ho capito, tutto questo casino serve solo per allocare la memoria per la matrice, ma non viene riempita con nessun valore? Così, questo codice può essere buttato fuori per mql (bene, dopo aver determinato il numero di righe e lo stesso numero di colonne della matrice quadrata)

o, dopo tutto, la matrice è inizializzata con alcuni valori

Inmine_score*m è un puntatore a int, e il commento dice che è un array, quindi ogni riga ha un numero diverso di colonne, si chiama "array a pettine" non rettangolare.

score->m = (int *) malloc(score->n * sizeof(int))

Alloca semplicemente la memoria per questo array di lunghezze di righe, nessun valore

Per la matrice M stessa.

score->M = (double **) malloc (score->n * sizeof(double *));

qui viene allocata la memoria per i puntatori delle righe

score->M[i] = (double *) malloc ((score->m[i]) * sizeof(double)); а здесь идет просто выделение памяти для матриы М?

e qui per le colonne

Motivazione: