Linux#
概要#
プロセス :実行中のプログラム
カーネル :OSの中核となるプログラムをまとめたもの。
システムコール :プロセスがカーネルに処理を依頼する方法。
例えばストレージへのアクセスをプロセスから直接行うと、複数のプロセスから同時に同じファイルを書き込むと問題が生じることがある(例えば1つのプロセスがファイルを削除して、もう一つのプロセスが書き込むなど)。そこでカーネルを通じてストレージデバイスにアクセスする。
具体的には、CPUの特殊な命令を実行することでシステムコールを行う。CPUには主にカーネルモードとユーザーモードがあり、システムコールが発行されたら、CPUにおいて例外というイベントが発生し、CPUのモードがユーザーモードからカーネルモードに切り替わり、カーネルの処理が始まる。処理が終わったらCPUはユーザーモードに戻ってもとのプロセスの動作を再開する。
システムコールを確かめてみる
Pythonで文字列をprintするだけのプロセスを実行し、その前後のシステムコールをstrace
コマンドで追跡してみる。
$ strace -o print.log python3 -c "print('Hello World')"
このログを開くと、1行が1つのシステムコール発行を示す形で書かれている
$ cat print.log
execve("/usr/bin/python3", ["python3", "-c", "print('Hello World')"], 0x7ffd21ebc8f0 /* 25 vars */) = 0
brk(NULL) = 0x560a4d642000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffc6077d360) = -1 EINVAL (Invalid argument)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4381347000
(中略)
write(1, "Hello World\n", 12) = 12
(後略)
特に write(1, "Hello World\n", 12)
は、画面やファイルへのデータの出力に関するwrite()
システムコールがなされたことがわかる。