Fragen zur SI-Sprache - Seite 8

 
 
Igor Makanu:

es gibt Speicherbereiche und es gibt Zeiger auf Speicherbereiche, die in anderen Speicherbereichen gespeichert sind

und dann gibt es eine Hierarchie, solange das Gehirn wahrnehmen kann

 
Vladimir Simakov:
Außerdem werden auch Assembler-Einsätze sehr häufig verwendet.

Ich nehme es teilweise zurück, siehe ab 18:00, ja, sie schreiben nicht in asm, sondern korrigieren bereits kompilierten Code - dann ist es logisch

Soweit ich verstehe, ist das, was moderne Compiler mit Assembler-Einschüben tun, nur eine Imitation von asm, d.h. es ist nicht sicher, dass asm-Einschübe in dieser Form in den kompilierten Code gelangen, und um asm-Code wirklich zu optimieren, reicht es, Codeabschnitte in asm im Debugger umzuschreiben - imho


 
Maxim Dmitrievsky:

es gibt Speicherbereiche und es gibt Zeiger auf Speicherbereiche, die in anderen Speicherbereichen gespeichert sind

und dann gibt es eine Hierarchie, solange das Gehirn wahrnehmen kann

Ja, und es ist auch cool, nicht zu verfolgen, ob ein Link lebendig ist oder nicht und in einen lange freigegebenen Speicherbereich zu kriechen, der bereits von einem anderen Prozess verwendet wird und dort alles kaputt zu machen))))

 
Vladimir Simakov:

Ja, und es ist auch cool, nicht zu verfolgen, wenn ein Link lebendig ist oder nicht und kriechen in eine lange freigegebenen Speicherplatz, die bereits von einem anderen Prozess verwendet wird und brechen alles dort))))

Was für ein Märchen, das war nur in Windows 3.* möglich. Windows lässt Sie nicht in den Speicher eines anderen Prozesses, jeder Prozess arbeitet in seinem eigenen Bereich, und für ihn beginnt die Speicheradressierung bei Null, so wird es ihm von Windows präsentiert. Und im Allgemeinen weist Windows nur dann Speicher zu, wenn wirklich Daten geschrieben werden. Erstellen Sie ein Array double arr[1024*1024*1024] und sehen Sie im Task-Manager nach, wie viel Speicher tatsächlich zugewiesen ist. Aber nicht doch! Bis Sie tatsächlich mit dem Schreiben in das Array beginnen, wird der Speicher nicht in 4Kb-Blöcken zugewiesen. Selbst wenn Sie sie unter Verwendung von zufälligen Indizes schreiben, werden sie immer noch in solchen Chunks sein. Wie Windows das alles virtualisiert, ist mir schleierhaft!

 
Alexey Volchanskiy:

Wie Windows das alles virtualisiert, ist mir schleierhaft!

Ich will es nicht googeln, aber mit der Einführung des Pentium-1 verfügte der Prozessor über Speichersegment-Deskriptoren und virtuellen Speicher, d.h. es handelt sich höchstwahrscheinlich um eine Virtualisierung auf Hardware-Ebene, und Windows nutzt sie geschickt

 
Alexey Volchanskiy:

Was für ein Märchen, das war nur in Windows 3.* möglich. Windows lässt Sie nicht in den Speicher eines anderen Prozesses, jeder Prozess arbeitet in seinem eigenen Bereich, und für ihn beginnt die Speicheradressierung bei Null, so wird es ihm von Windows präsentiert. Und im Allgemeinen weist Windows nur dann Speicher zu, wenn wirklich Daten geschrieben werden. Erstellen Sie ein Array double arr[1024*1024*1024] und sehen Sie im Task-Manager nach, wie viel Speicher tatsächlich zugewiesen ist. Aber nicht doch! Bis Sie tatsächlich mit dem Schreiben in das Array beginnen, wird der Speicher nicht in 4Kb-Blöcken zugewiesen. Selbst wenn Sie sie unter Verwendung von zufälligen Indizes schreiben, werden sie immer noch in solchen Chunks sein. Wie Windows das alles virtualisiert, ist mir schleierhaft!

Seite fehlerhaft. Die Ausnahme war ein Wermutstropfen - sie gaben Speicherplatz pro Seite, mehr nicht. Dies ist bequem und transparent für Anwendungen, führt aber zu einer Fragmentierung des Speichers. Sie können physischen Speicher auf einen Schlag zuweisen, wenn Sie nach virtualalloc virtuallock für den resultierenden Zeiger aufrufen. Das ist übrigens ein interessantes Loch, ich muss mal sehen, ob es möglich ist, den Server auf diese Weise zum Absturz zu bringen.


Drei hatten keine Virtualisierung, es ist ein anderes System, nicht NT. Es gab eine Menge DOS-Schwänze darin, die Hälfte der Systemfunktionen hing an int 21.

 

Dieser Fall ist nicht eindeutig:

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

Außerdem ändert sich in der f-i die Größe der Matrix 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; }

Das heißt, wie ich es verstehe, ist all dieses Chaos nur für die Zuweisung von Speicher für die Matrix, aber es ist nicht mit irgendwelchen Werten gefüllt? Dieser Code kann also für mql verwendet werden (nachdem man die Anzahl der Zeilen und die gleiche Anzahl der Spalten der quadratischen Matrix bestimmt hat)

oder die Matrix wird mit einigen Werten initialisiert

 
Alexey Volchanskiy:

...Wie das Windsystem dies alles virtualisiert, ist mir schleierhaft!

Lesen Sie Richter. Er hat alles so weit zerkaut, dass es dir das Herz bricht.

SeriousRacoon:
Übrigens, interessantes Loch, ich muss mal sehen, ob es möglich ist, den Server auf diese Weise zum Absturz zu bringen

Das können Sie nicht.

 
Maxim Dmitrievsky:

Dieser Fall ist nicht eindeutig:

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

Außerdem ändert sich die Größe der Matrix M in der f-i:

Das heißt, wie ich es verstehe, ist all dieses Chaos nur für die Zuweisung von Speicher für die Matrix, aber es ist nicht mit irgendwelchen Werten gefüllt? Dieser Code kann also für mql verwendet werden (nachdem man die Anzahl der Zeilen und die gleiche Anzahl der Spalten der quadratischen Matrix bestimmt hat)

oder schließlich wird die Matrix mit einigen Werten initialisiert

Inmine_score ist *m ein Zeiger auf int, und der Kommentar besagt, dass es sich um ein Array handelt, d.h. jede Zeile hat eine andere Anzahl von Spalten, es wird als "comb array" bezeichnet und nicht als rechteckig.

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

Es wird lediglich Speicher für dieses Array von Zeilenlängen zugewiesen, keine Werte

Für die Matrix M selbst.

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

hier wird Speicher für Zeiger auf Zeilen zugewiesen

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

und hier für Spalten

Grund der Beschwerde: