SI言語に関する質問 - ページ 8

 
 
Igor Makanu:

メモリ領域があり、他のメモリ領域に格納されているメモリ領域へのポインタがあります。

と、脳が認識できる限り、階層があるのです。

 
Vladimir Simakov:
さらに、アセンブラも非常に多く使われています。

私は部分的にそれを取り戻す、18:00から見て、はい、彼らはasmで書いていない、しかし、すでにコンパイルされたコードを修正する - それは論理的である場合。

私が理解する限り、アセンブラを挿入した最新のコンパイラが行うことは、asmの単なる模倣です。つまり、そのような形式のasmの挿入がコンパイルされたコードに入るかどうかは確かではなく、asmのコードを本当に最適化するには、デバッガでasmのコード部分を書き直せば十分です - imho。


 
Maxim Dmitrievsky:

メモリ領域があり、他のメモリ領域に格納されているメモリ領域へのポインタがあります。

と、脳が認識できる限り、階層があるのです。

そうそう、リンクが生きているかどうかを追跡して、すでに他のプロセスによって使われている長く解放されたメモリセクションに這い込んで、そこですべてを壊してしまわないのもクールだ)))。

 
Vladimir Simakov:

そうそう、リンクが生きているかどうかを追跡して、すでに他のプロセスによって使われている、長い間解放されていたメモリ領域にもぐりこんで、そこですべてを壊してしまわないのもクールです)))

なんというおとぎ話だろう、これはWindows 3.*でしかできなかったことだ。Windowsは他人のプロセスメモリに入ることを許しません。すべてのプロセスは自分の領域で動作し、メモリアドレスはゼロから始まり、それがWindowsによって提示される方法です。また、一般にWindowsは、本当にデータを書き込むときだけメモリを確保する。配列 double arr[1024*1024*1024] を作成し、タスクマネージャで実際に割り当てられたメモリ量を確認します。でも、全然そんなことないですよ実際にアレイへの書き込みを開始するまで、メモリは4Kbチャンクで割り当てられません。ランダムインデックスを使って書いても、そのようなチャンクになります。Windowsがどうやってこれらを仮想化しているのか、私には理解できないのです

 
Alexey Volchanskiy:

Windowsがどうやってこれらを仮想化しているのか、私には理解できません。

ググる気はないが、Pentium-1の登場により、プロセッサはメモリセグメント記述子と仮想メモリを持つようになった。つまり、ハードウェアレベルの仮想化である可能性が高く、Windowsはそれを巧みに使っているのだ

 
Alexey Volchanskiy:

なんておとぎ話は、Windows3.*でしかありえないことなのだ。Windowsは他人のプロセスメモリに入ることを許しません。すべてのプロセスは自分の領域で動作し、メモリアドレスはゼロから始まり、それがWindowsによって提示される方法です。また、一般にWindowsは、本当にデータを書き込むときだけメモリを確保する。配列 double arr[1024*1024*1024] を作成し、タスクマネージャで実際に割り当てられたメモリ量を確認します。でも、全然そんなことないですよ実際にアレイへの書き込みを開始するまで、メモリは4Kbチャンクで割り当てられません。ランダムインデックスを使って書いても、そのようなチャンクになります。Windowsがどうやってこれらを仮想化しているのか、私には理解できないのです

ページの不具合。例外は、1ページあたりのメモリが与えられるだけで、それ以上にはならない、というものでした。これはアプリケーションにとって便利で透過的ですが、メモリの断片化を招きます。virtualallocの後に結果のポインタで virtuallockを呼べば、一気に物理メモリを確保することができます。ところで、面白い穴ですね、その方法でサーバーをクラッシュさせることが可能かどうか見てみないといけませんね。


3は仮想化なんてしてないし、NTとは別のシステムだし。DOSのテールがたくさん入っていて、システム機能の半分がint21にかかっていたんです。

 

このケースは明確ではありません。

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

さらに、f-iでは、行列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; }

つまり、私の理解では、この混乱は、マトリックスのためのメモリを割り当てる ためだけで、そこには何の値も入っていないのでは?というわけで、このコードは mql 用に捨てることができる(まあ、正方行列の行数と同じ数の列を決定した後だが)。

または,行列がいくつかの値で初期化されます.

 
Alexey Volchanskiy:

...風力発電のシステムが、どうやってこれらを仮想化しているのか、私には理解できません。

リヒターを読む。心を痛めるほど噛み砕いている。

SeriousRacoon
ところで、面白い穴がありますね、その方法でサーバーをクラッシュさせることが可能かどうか見てみなければなりませんね

無理でしょう。

 
Maxim Dmitrievsky:

このケースは明確ではありません。

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

さらに、f-iの行列Mのサイズに変化がある。

つまり、私の理解では、この混乱は、マトリックスのためのメモリを割り当てる ためだけで、そこには何の値も入っていないのでは?というわけで、このコードは mql 用に捨てることができる(まあ、正方行列の行数と同じ数の列を決定した後だが)。

あるいは,結局のところ,行列はいくつかの値で初期化されます.

mine_scoreでは*mはintへのポインターで、コメントによると配列なので各行が異なる列数を持つ、長方形ではなく「櫛形配列」と呼ばれるそうです。

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

これは、単にこの行の長さの配列のためにメモリを確保するもので、値はありません。

行列Mそのものについて。

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

ここには、行のポインタ用のメモリが割り当てられています。

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

コラムはこちら