Preguntas sobre la lengua SI - página 8

 
 
Igor Makanu:

hay zonas de memoria y hay punteros a zonas de memoria almacenadas en otras zonas de memoria

y luego hay una jerarquía mientras el cerebro pueda percibir

 
Vladimir Simakov:
Además, las inserciones de los ensambladores son muy utilizadas también.

Me retracto parcialmente, mira a partir de las 18:00 , sí, no escriben en asm, sino que arreglan código ya compilado - entonces es lógico

por lo que tengo entendido lo que hacen los compiladores modernos con inserciones en ensamblador es sólo una imitación de asm, es decir, no es un hecho que las inserciones asm en tal forma lleguen al código compilado, y para optimizar realmente en código asm lo suficiente como para reescribir secciones de código en asm en el depurador - imho


 
Maxim Dmitrievsky:

hay zonas de memoria y hay punteros a zonas de memoria almacenadas en otras zonas de memoria

y luego hay una jerarquía mientras el cerebro pueda percibir

Sí, y también es genial no estar pendiente de si un enlace está vivo o no y arrastrarse a una sección de memoria largamente liberada que ya está siendo utilizada por otro proceso y romper todo allí))))

 
Vladimir Simakov:

Sí, y también es genial no rastrear cuando un enlace está vivo o no y arrastrarse a un espacio de memoria largamente liberado, que ya es utilizado por otro proceso y romper todo allí))))

Qué cuento, esto sólo era posible en Windows 3.*. Windows no te dejará entrar en la memoria de procesos ajenos, cada proceso trabaja en su propia área, y para él el direccionamiento de la memoria comienza desde cero, así se lo presenta Windows. Y en general, Windows asigna memoria sólo cuando realmente se escriben datos. Haga un array doble arr[1024*1024*1024] y vea cuánta memoria está realmente asignada en el Administrador de Tareas. ¡Pero en absoluto! Hasta que no se empiece a escribir en el array, la memoria no se asignará en trozos de 4Kb. Incluso si lo escribes usando índices aleatorios, seguirá estando en esos trozos. ¡Cómo virtualiza Windows todo esto es insondable para mí!

 
Alexey Volchanskiy:

Cómo virtualiza Windows todo esto me resulta insondable.

No quiero buscarlo en Google, pero con la llegada del Pentium-1 el procesador tenía descriptores de segmentos de memoria y memoria virtual, es decir, lo más probable es que sea una virtualización a nivel de hardware, y Windows la utiliza con habilidad

 
Alexey Volchanskiy:

Qué cuento, esto sólo era posible en Windows 3.*. Windows no te dejará entrar en la memoria de procesos ajenos, cada proceso trabaja en su propia área, y para él el direccionamiento de la memoria comienza desde cero, así se lo presenta Windows. Y en general, Windows asigna memoria sólo cuando realmente se escriben datos. Haga un array doble arr[1024*1024*1024] y vea cuánta memoria está realmente asignada en el Administrador de Tareas. ¡Pero en absoluto! Hasta que no se empiece a escribir en el array, la memoria no se asignará en trozos de 4Kb. Incluso si lo escribes usando índices aleatorios, seguirá estando en esos trozos. Cómo virtualiza Windows todo esto me resulta insondable.

Fallo de la página. La excepción fue un golpe: dieron memoria por página, nada más. Esto es conveniente y transparente para las aplicaciones, pero conduce a la fragmentación de la memoria. Puede asignar memoria física de una sola vez si llama a virtuallock en el puntero resultante después de virtualalloc. Por cierto, es un agujero interesante, tendré que ver si es posible colapsar el servidor de esa manera.


El tres no tenía virtualización, es un sistema diferente, no es NT. Había un montón de colas de DOS allí, la mitad de las funciones del sistema dependían de la int 21.

 

Este caso no está claro:

/*
 * 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;

Además, en el f-i hay un cambio en el tamaño de la matriz 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; }

Es decir, según entiendo, todo este lío es sólo para asignar memoria para la matriz, pero no se llena con ningún valor? Así, este código puede ser lanzado para mql (bueno, después de determinar el número de filas y el mismo número de columnas de la matriz cuadrada)

o la matriz se inicializa con algunos valores

 
Alexey Volchanskiy:

...¡Cómo el sistema eólico virtualiza todo esto es insondable para mí!

Lee a Richter. Lo tiene todo masticado hasta el punto de herir tu corazón.

SeriousRacoon:
Por cierto, interesante agujero, tendré que ver si es posible colapsar el servidor de esa manera

No se puede.

 
Maxim Dmitrievsky:

Este caso no está claro:

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)); а здесь идет просто выделение памяти для матриы М?

Además, hay un cambio en el tamaño de la matriz M en el f-i:

Es decir, según entiendo, todo este lío es sólo para asignar memoria para la matriz, pero no se llena con ningún valor? Así, este código puede ser lanzado para mql (bueno, después de determinar el número de filas y el mismo número de columnas de la matriz cuadrada)

o, después de todo, la matriz se inicializa con algunos valores

Enmine_score*m es un puntero a int, y el comentario dice que es un array, por lo que cada fila tiene un número diferente de columnas, se llama un "array en peine" no rectangular.

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

Simplemente asigna memoria para esta matriz de longitudes de fila, sin valores

Para la propia matriz M.

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

aquí se asigna memoria para los punteros de las filas

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

y aquí para las columnas