やかんです。

体調が本調子じゃないですが、悪あがいてます。ということで、今日のDALLEによるイラスト。

ほんと優秀。。

26日にやったことについて

オペレーティングシステム(自学)

  • the content from disk gets loaded into virtual memory first, then, it gets loaded into main memory on demand?
    • あってるみたい。
  • mmapを使うと、まず二次記憶からファイルの内容が仮想メモリに読み込まれる。仮想メモリに読み込まれる、という表現が正しいのかはわからんが。で、ページフォルトが起きたらメインメモリにその内容がロードされる。
    • readの場合は、即座にメインメモリにデータを読み込む。mmapの方は、一旦仮想メモリにマッピングして、必要に応じて(ページフォルトに応じて)メインメモリにデータを必要な分読み込む。だから、mmapの方が他のプロセスにとってみれば幸せなのかもしれない。
  • munmapは、仮想メモリに対する二次記憶のデータのマッピングを一掃するメソッドだと予想。

この辺までのGPTとの対話

  • プログラムが仮想メモリにアクセスする。
    • ページフォルトを起こす主体はプログラムということか?
  • mmapでマップした仮想メモリ上でページフォルトが発生した場合、ディスクの内容がRAMに読み込まれる。
  • mmapはページング領域として任意のファイルを指定できるようにしたと、、
    • つまり、仮想メモリに二次記憶上の任意のファイルをマップできるようにしたということか?

27日にやったことについて

オペレーティングシステム(授業)

  • ファイルディスクリプタの付け替えとかあるんだ。
    • dup2
  • パイプ
    • 左側の標準出力を右側の標準入力に繋ぐ。
    • pipeというシステムコール。
  • プロセスの生成において、ファイルディスクリプタは承継される。
    • これ、プロセス間でメモリは共有されないのに、ファイルディスクリプタは共有されるの?
  • いろんなコマンドが標準入力から読むというように設計されているから、dup2などのコマンドでファイルディスクリプタを付け替える必要がある。
  • てかそもそも、マルチプロセスでプログラム書くことってあるんかなあ。自分の生活的に。
  • 子プロセスから親へ出力を渡すということは結構行われることらしい。

疑似ファイル

  • mkfifo面白い。
  • mac osにはprocディレクトリが存在しないんんだ。linuxにはある。
  • tmpfsはリーディングリスト的なやつなのかな。指定のファイルをメモリ上に読み込んでおく。
  • デバイスファイル面白い。
  • ddコマンド、odコマンドは実用的だな。

シグナル

  • 割り込みとかの話か?
  • killコマンドって、killっていうシステムコールなんだ。
    • プロセスを終わらせる。
  • コントロールCも、シグナルの発生。シグナルが発生すると、基本的にプロセスが強制終了される。
  • 不正なメモリアクセス
    • segmentation fault
    • SIGSEGVというシグナル。
  • killしても死なないプロセスがある。
    • kill -9
    • kill -KILL
    • とかを実行すれば死んでくれる?
  • シグナルの処理方法を指定することで、殺しても死なないプロセスを作成することができるのでは?
  • segmentation fault
    • 割り当てられていないアドレスにアクセスした。
    • まああと、保護属性的に不正なメモリアクセスした場合。
    • あるいは、そうした場合に発生するシグナル。
  • シグナルは、シグナル自体がプロセスを終わらせるわけではない。シグナルに基づいて行われる処理によって、プロセスが終了したりする。
    • シグナルハンドルを指定していない場合は、デフォルトでプロセスが終了する。
  • では、sigactionをうまく指定することで、絶対に終了しないプロセスが作れるのか?
    • NO。sigkillを使えば、どんなプロセスでも終了させることができる。

ものを作ればいいんだ。

  • ディレクトリもeveryhting is fileに基づいて、ファイルとして表現されるの?

オペレーティングシステム(自学)

  • fileを扱いたい場合は、基本的にfcntlのヘッダーファイルを読み込んどくのがいいか。
  • readの場合も、fstatとmallocを利用することで、動的にファイルサイズを指定することが可能。

↑この辺はこのGPTとの対話

  • ファイルを読み込むだけなら、mmapもreadも変わらないということ?

readを利用する場合

#include <stdio.h>
#include <fcntl.h>
#include <dirent.h>
#include <err.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
  struct dirent *entry;
  DIR *dir = opendir(".");

  while ((entry = readdir(dir)) != NULL)
  {
    char *file_name = entry->d_name;

    int fd = open(file_name, O_RDONLY);
    if (fd < 0)
      err(1, "open");

    struct stat file_info[1];
    if (fstat(fd, file_info) < 0)
      err(1, "fstat");

    char *buffer = (char *)malloc(file_info->st_size);

    ssize_t r = read(fd, buffer, sizeof(file_info));

    close(fd);
    free(buffer);

    printf("%d, %s\n", fd, file_name);
  }

  closedir(dir);

  return 0;
}

mmapを利用する場合

#include <stdio.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <err.h>
#include <unistd.h>

int main()
{
  struct dirent *entry;
  DIR *dir = opendir(".");

  while ((entry = readdir(dir)) != NULL)
  {
    char *file_name = entry->d_name;

    int fd = open(file_name, O_RDONLY);
    struct stat file_info[1];
    if (fstat(fd, file_info) == -1)
    {
      err(1, "fstat");
    }

    char *mapped = mmap(0, file_info->st_size, PROT_READ, MAP_PRIVATE, fd, 0);

    printf("%d, %s\n", fd, file_name);

    munmap(mapped, file_info->st_size);
    close(fd);
  }

  closedir(dir);

  return 0;
}

どちらも、読み込み時には仮想メモリが割り当てられるわけだし、必要な分のメモリしか消費しないし。

じゃあ、readとmmapって何が違うの?

  • readは、ディスクからデータを読み込む際、まずカーネルスペースに読み込み、それからプロセスのメモリにコピーされる。
  • 一方mmapは、ディスクのデータが直接プロセスのメモリにマッピングされる。
  • readもmmapも、シンプルな使用であれば違いは影響ない範囲に収まると考えて良いだろう。が、使用方法によっては、mmapの方が効率に優れる場合があると。
  • てかそもそも、mmapの、二次記憶のデータを仮想メモリにマッピングするってどういう意味?
    • なるほど。仮想アドレスと二次記憶のデータを直接に結びつけているということか。
    • 違う、、?
    • 仮想アドレスは、二次記憶のデータへの参照と直接に結びついている。
  • では、read()を使うとき、そこで用いられる仮想アドレスは何と結びついているのか?mmapの場合はファイルの参照だった。

数理手法1(授業)

  • 重回帰分析むずそう。
  • 単回帰分析、復習してないな。やらねば。
  • 説明変数が二つ以上ある場合が重回帰分析
    • 説明変数は任意の個数でいいのか。
  • 射影する時の部分空間の次元のことを、F検定における自由度と呼ぶ。
  • Rすごいな。
    • 原理とかはまだ全然理解していないけどとりあえずいろんな便利な数字を取得できて感動。
    • ライブラリが充実してる。

サイバーセキュリティ3(自学)

  • mac osにある、ダウンロードされたアプリケーションの実行を確認するダイアログの部分はゲートキーパーと呼ばれているらしい。
  • macのアプリケーション作ってみたい。
    • OSレベルで理解したいんだよなあ。
  • アプリケーションレベルにおいても、鍵を使った認証が行われていて、そこにはCAが登場する。
    • まあそうだよな。インターネットは一つの応用なんだ。もっと基礎的なところを勉強するのが良いのかもしれない。
  • mac osのkeychain非常に興味がある。
    • keychainはchromeでいうところのパスワードマネージャ。
    • keychainの中身が漏洩するとめちゃまずいやん!
  • keychainの中身はAESで暗号化されている。
  • また、厳正な権限を持つユーザーしかアクセスできない。
  • keychain関連のファイルは複数に分散されて管理されている。また、AES暗号はやっぱめちゃ強力らしい。現代の現実的に考えられるコンピューティングリソースでは解読できないだろう。
  • じゃあ、プログラムが実行される時の、そのプログラムが持つ権限は何で決まるの?
    • それを実行するユーザーの権限が承継されると考えて良さそう。
    • 権限昇格は、通常の状況においてはできない。
    • 通常、権限昇格はユーザーの明示的な承認が必要になる。
  • てか、これだけOSとかが充実しているんだったら、なんで今時ランサムウェア攻撃とかが起きるんだ?
    • 結局、システムを使う人によるってことか。。怠慢な場合は、セキュリティアプデとかしないもんな。
  • gatekeeper面白いな。
    • アプリは開発者に紐づいていて、よくわからん開発者によるアプリはOSが一旦実行を止めてくれる。
  • では、すべてのアプリケーションが開発者に紐づいているのか?
    • そうでもないらしい。
    • apple storeにあるアプリはすべて開発者と紐づいている。
    • 紐づいていないものも、ちょっとイメージわかないけどあるらしい。そうしたものがよろしくないと。
  • なんか、見れば見るほど、個人レベルでのサイバーセキュリティって重要性高くないように感じるよな。組織レベルじゃないと、重要性が十分に大きくならない気がする。
    • あ、でもwanna cryとかあったわけか。それは怖いよな。

やることなど

  • 回帰分析
  • OSの課題

ということで、昨日と今日の日記は終了。最後までお読みいただき、ありがとうございます。