Perguntas sobre a linguagem SI - página 8

 
 
Igor Makanu:

há áreas de memória e há ponteiros para as áreas de memória armazenadas em outras áreas de memória

e depois há uma hierarquia, desde que o cérebro possa perceber

 
Vladimir Simakov:
Além disso, as inserções de montadores também são muito utilizadas.

Eu o retiro parcialmente, assisto a partir das 18:00, sim, eles não escrevem de forma sigilosa, mas corrigem o código já compilado - então é lógico

tanto quanto eu entendo o que os compiladores modernos com inserções assembler fazem é apenas uma imitação de asm, ou seja, não é certo que a inserção de asm em tal forma entre no código compilado, e para realmente otimizar em código asm o suficiente para reescrever seções de código em asm no depurador - imho


 
Maxim Dmitrievsky:

há áreas de memória e há ponteiros para as áreas de memória armazenadas em outras áreas de memória

e depois há uma hierarquia, desde que o cérebro possa perceber

Sim, e também é legal não ficar sabendo se um link está vivo ou não e rastejar para uma longa seção de memória liberada que já é usada por outro processo e quebrar tudo lá))))

 
Vladimir Simakov:

Sim, e também é legal não rastrear quando um link está vivo ou não e rastejar para um longo espaço de memória liberado, que já é usado por outro processo e quebrar tudo lá))))

Que conto de fadas, isto só foi possível no Windows 3.*. O Windows não deixará você entrar na memória de processo de outra pessoa, cada processo funciona em sua própria área, e para ele o endereçamento de memória começa do zero, é assim que é apresentado a ele pelo Windows. E em geral, o Windows aloca memória somente quando realmente escreve dados. Faça um arraste duplo [1024*1024*1024] e veja quanta memória está realmente alocada no Task Manager. Mas não de jeito nenhum! Até que você realmente comece a escrever para a matriz, a memória não será alocada em blocos de 4Kb. Mesmo que você o escreva usando índices aleatórios, ele ainda estará em tais pedaços. Como o Windows virtualiza tudo isso é insondável para mim!

 
Alexey Volchanskiy:

Como o Windows virtualiza tudo isso é insondável para mim!

Não quero pesquisar no Google, mas com o advento do Pentium-1 o processador tem descritores de segmento de memória e memória virtual, ou seja, muito provavelmente é uma virtualização de nível de hardware, e o Windows usa-o habilmente

 
Alexey Volchanskiy:

Que conto de fadas, isto só foi possível no Windows 3.*. O Windows não deixará você entrar na memória de processo de outra pessoa, cada processo funciona em sua própria área, e para ele o endereçamento de memória começa do zero, é assim que é apresentado a ele pelo Windows. E em geral, o Windows aloca memória somente quando realmente escreve dados. Faça um arraste duplo [1024*1024*1024] e veja quanta memória está realmente alocada no Task Manager. Mas não de jeito nenhum! Até que você realmente comece a escrever para a matriz, a memória não será alocada em blocos de 4Kb. Mesmo que você o escreva usando índices aleatórios, ele ainda estará em tais pedaços. Como o Windows virtualiza tudo isso é insondável para mim!

Falha de página. A exceção foi um golpe - eles deram memória por página, nada mais. Isto é conveniente e transparente para aplicações, mas leva à fragmentação da memória. Você pode alocar memória física de uma só vez se você chamar o virtuallock no ponteiro resultante após o virtualalloc. A propósito, é um buraco interessante, terei que ver se é possível travar o servidor dessa forma.


Três não tinham virtualização, é um sistema diferente, não NT. Havia muitas caudas de DOS lá dentro, metade das funções do sistema estavam articuladas no int 21.

 

Este caso não é 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;

Além disso, na f-i há uma mudança no tamanho da 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; }

Ou seja, como eu entendo, toda essa bagunça é apenas para alocar memória para a matriz, mas ela não está cheia de valores? Portanto, este código pode ser jogado fora por mql (bem, após determinar o número de linhas e o mesmo número de colunas da matriz quadrada)

ou a matriz é inicializada com alguns valores

 
Alexey Volchanskiy:

...Como o sistema eólico virtualiza tudo isso é insondável para mim!

Leia Richter. Ele tem tudo mastigado a ponto de machucar seu coração.

SeriousRacoon:
A propósito, buraco interessante, terei que ver se é possível travar o servidor dessa forma

Você não pode.

 
Maxim Dmitrievsky:

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

Além disso, há uma mudança no tamanho da matriz M no f-i:

Ou seja, como eu entendo, toda essa bagunça é apenas para alocar memória para a matriz, mas ela não está cheia de valores? Portanto, este código pode ser jogado fora por mql (bem, após determinar o número de linhas e o mesmo número de colunas da matriz quadrada)

ou, afinal de contas, a matriz é inicializada com alguns valores

Nomeu_ponto*m é um ponteiro a int, e o comentário diz que é uma matriz, então cada linha tem um número diferente de colunas, é chamada de "matriz de pente" e não retangular.

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

Ele simplesmente aloca memória para este conjunto de comprimentos de linha, sem valores

Para a própria matriz M.

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

aqui é alocada memória para apontadores de filas

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

e aqui para as colunas

Razão: