やかんです。
あまりにも年末でなんか焦ってます。年末だと、なんか特別なことをしなきゃっていう気分になりますね、、
気分になるだけだが。
ということで、DALLEに依頼したイラストがこちら。
すげー。
今日やったことについて
数理手法、回帰分析のところマジで呪文やな。がんばろ。
オペレーティングシステム(授業)
read、mmap、そしてメモリ管理について理解したい。
- In C, a string literal is a sequence of characters, and it is typically represented as a pointer to the first character of the sequence
- C言語で、文字の連結(要は文字列)を宣言する場合はポインターを使う必要がありそうだ。
- 先頭の文字へのポインタってことなんか?
- ファイルディスクリプタを宣言することで、そのファイルへのインターフェースを取得。
- readによるfileの読み込みは、削ぎ落とせば以下。
#include <stdio.h>
#include <fcntl.h>
#include <err.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
const char *file_name = "sorted.bin";
int main()
{
int fd = open(file_name, O_RDONLY);
struct stat file_info[1];
fstat(fd, file_info);
int sz = file_info->st_size;
char *buffer = (char *)malloc(sz);
ssize_t r = read(fd, buffer, sizeof(file_info));
close(fd);
free(buffer);
return 0;
}
- これ、mallocでプロセスに対してメモリを確保しているんだよな。
- 静的なメモリの確保だよな?
- あ、mallocはプログラム実行時にメモリが確保されるという意味で動的なメモリ確保だ。
- 日本語として、「仮想メモリに二次記憶からデータを読み込む」っていうのは存在しないよね?
- データが読み込まれるのは常にRAMのはず。仮想メモリは割り当てられるだけの実態のない物だと考えて良いだろう。
- 自分は何をわかっていないのか、何がわかれば理解につながるのかを意識する。
- OSは、まず最初にメモリの割り当てに際して仮想メモリを割り当てる。これを強く意識すれば理解につながるのではないか?
- あー、メモリの復習してえ。
- だから、仮想メモリって、気にしなくてもいいのでは?「割り当てられる」だけの物だから。
- 上のプログラムで、readが実行された時にRAMは読み込まれたファイルのデータを取得する。
- 仮想メモリって、あとはOSにおまかせっていう領域なんだ。
- mmapを使ったのが以下。
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
const char *file_name = "sorted.bin";
int main()
{
int fd = open(file_name, O_RDONLY);
struct stat file_info[1];
fstat(fd, file_info);
char *mapped = mmap(0, file_info->st_size, PROT_READ, MAP_PRIVATE, fd, 0);
return 0;
}
- mmapを使う場合は、fileの大きさ分RAMを占領しない。アクセスされたところだけRAMに読み込まれる。言い換えると、アクセスされた分だけ物理メモリを圧迫する。
- てことは、mmapってファイル分のメモリを確保する働きしかしてないんじゃね?
- mallocとほぼ同じ?
- mmapがファイルを指定する場合、メモリの確保と任意のファイルを対応づけることができる。
- だから、比べるべきはreadとmmapじゃなくてmallocとmmapだったか?
- で、mallocよりもmmapは柔軟な設定が可能ということか!
- だから、mmapは「柔軟なmalloc」という表現で理解しておけば良さそうだ!
- For small memory allocations,
mmap()
can have more overhead thanmalloc()
due to the way operating systems handle page mappings. - ↑とはいえ、小さなメモリ確保であればmallocの方がオーバーヘッドが小さくて済むよと。
- おけ。だいぶ理解できた気がする。次に理解したいのは、コピーオンライトとかの話。
- 複数プロセス間で同じファイルを扱う場合。どうやって共有するのっていう問題。
- いやでもこれ、コピーオンライトは別に難しくないよな。
そして課題に着手。
- read、おっそ。mmapが速いのか?
やること
- 統計!回帰!これやらないとまずいぜ!
- OS
ということで、今日の日記終了。最後までお読みいただき、ありがとうございます。