プロセス・システムコールとは何か、初学者向けに簡単に解説した

thumnail
2020-09-02

プロセスとは

OSの中で実行される各プログラムの実行単位をプロセスという。これだと少しイメージが湧きずらいので例を用いて解説する。次のような単にループし続けるC言語のプログラムを書いたとする。

$ cat loop.c
int main(void)
{
  for (;;)
    ;
}

このプログラムをコンパイルして実行する。

$ cc -o loop loop.c
$ ls
loop   loop.c
$ ./loop &
[1] 37221

実は、この実行ファイルを実行することで1つのプロセスが生成されている。コマンドの最後に&をつけるとそのプロセスのprocess IDがわかる。では生成されたプロセスが現在稼働しているかをpsコマンドを使って確認してみる。

$ ps
  PID TTY           TIME CMD
37221 ttys003    1:05.46 ./loop

PID 37221のプロセスが想定通り生成され、処理が実行されていることがわかる。このプロセス自体無限ループしているのでkillコマンドを使ってプロセスは停止させておく。

$ kill 37221
[1]  + 37221 terminated  ./loop

カーネルとは

OSの中心となるプログラムのことをカーネルという。各プロセスからの要求を受けて、カーネルはハードウェア対して直接命令をしたり、各プロセスにPCのリソースを割り当てたりする役割を持つ。アプリケーションから命令を受け取って、CPUやメモリ、外付けデバイスなどに対して処理を投げたりするのでアプリケーションとハードウエアの仲介するソフトウエアと考えても良さそう。

デバイスドライバとは

CPUやメモリ、コンピューターに接続されるハードウェアに対しての制御を行うプログラムをデバイスドライバと呼ぶ。デバイスドライバがあるおかげでハードウエアの直接の制御をプログラマーが意識せずに済む。プロセスがハードウエアに対して処理を依頼したい場合はこの後紹介するシステムコールという呼び出しを使って処理を依頼する。

システムコールとは

プロセスがハードウェアに命令を出したい場合、直接ハードウェアを操作することができないので一度デバイスドライバを呼び出してハードウェアに対する処理を依頼する。この呼び出しをシステムコールという。つまりシステムコールを呼び出せばハードウェアに対して命令を出すことができる。システムコールはハードウエアに対する処理をラップしていて、そのインターフェイスを提供してくれる。せっかくなのでwriteというシステムコールをC言語を使って呼び出してみる。

$ cat write.c
#include <unistd.h>

int main()
{
    const char *text = "ABC\n";

    write( STDOUT_FILENO, ( const void* )text, sizeof( text ) - 1 );

    return( 0 );
}

システムコールは上のような感じで関数みたいに呼び出すことができる。writeの場合は第1引数に書き込むファイル(今回は標準出力)、第2引数には書き込むデータのアドレス、第3引数には書き込むデータのサイズを指定する。では実際に実行ファイルを実行してみる。

$ ./write
ABC

textのABCが標準出力に書き込まれた。dtrussコマンドを使って、システムコールが実際に呼ばれたかを確認してみる。

❯ sudo dtruss ./write
dtrace: system integrity protection is on, some features will not be available

SYSCALL(args)            = return
ABC
open("/dev/dtracehelper\0", 0x2, 0xFFFFFFFFE495BD40)             = 3 0
ioctl(0x3, 0x80086804, 0x7FFEE495BC50)           = 0 0
close(0x3)               = 0 0
:
:
:(省略)
:
:
dtrace: error on enabled probe ID 2184 (ID 167: syscall::write:return): invalid kernel access in action #12 at DIF offset 68

最後の行を見るとわかるのだが、システムコールのwriteは実行されているようだがsystem integrity protection(SIP)が有効になってしまっているため、閲覧できないらしい。一応呼ばれていることは確認できたので、これ以上深追いはしない。

参考にしたサイト

https://en.wikipedia.org/wiki/Kernel_(operating_system)

https://geek-university.com/linux/what-is-a-process/

https://www.howtogeek.com/howto/31632/what-is-the-linux-kernel-and-what-does-it-do/

https://en.wikipedia.org/wiki/Device_driver

この記事内容とは関係ありませんが、筆者である僕が普段愛用しているPC周りのアイテムを別記事で紹介しているので、もし興味があればご覧になってください。

現在使用しているディスプレイ・ヘッドフォン・キーボードなどを紹介

KATUBLO

Copyright since 2018 KATUO All Rights Reserved.