システム コールは、ユーザー プログラムがオペレーティング システムとインターフェイスするための方法です。プログラムはいくつかのサービスを要求し、OS は要求を満たすために一連のシステム コールを呼び出して応答します。システムコールはアセンブリ言語または次のような高級言語で記述できます。 C または パスカル 。システム コールは、高級言語が使用されている場合にオペレーティング システムが直接呼び出すことができる事前定義された関数です。
この記事では、オペレーティング システムのシステム コールについて学び、その種類やその他多くのことについて説明します。
システムコールとは何ですか?
システム コールは、コンピュータ プログラムが、それが実行されているオペレーティング システムのカーネルにサービスを要求する方法です。システム コールは、プログラムを介してオペレーティング システムと対話する方法です。システム コールは、コンピュータ ソフトウェアからオペレーティング システムのカーネルへの要求です。
の アプリケーション プログラム インターフェイス (API) オペレーティング システムの機能をユーザー プログラムに接続します。これはオペレーティング システムとプロセス間のリンクとして機能し、ユーザー レベルのプログラムがオペレーティング システム サービスを要求できるようにします。カーネル システムには、システム コールを使用してのみアクセスできます。システムコールは、リソースを使用するすべてのプログラムに必要です。
システムコールはどのように行われるのでしょうか?
コンピュータ ソフトウェアがオペレーティング システムのカーネルにアクセスする必要がある場合、システム コールを呼び出します。システム コールは API を使用して、オペレーティング システムのサービスをユーザー プログラムに公開します。これはカーネル システムにアクセスする唯一の方法です。実行にリソースを必要とするすべてのプログラムまたはプロセスは、システム コールを使用する必要があります。これは、システム コールがオペレーティング システムとユーザー プログラム間のインターフェイスとして機能するためです。
以下に、システム コールがユーザー関数とどのように異なるかの例をいくつか示します。
反復マップJava
- システムコール関数は、非同期処理を実行するためにカーネルプロセスを作成して使用する場合があります。
- システムコールは、標準のサブルーチンよりも高い権限を持っています。カーネルモード権限を持つシステムコールは、カーネル保護ドメインで実行されます。
- システム コールでは、カーネル保護ドメインに存在しない共有ライブラリやシンボルを使用することはできません。
- システム コールのコードとデータは、グローバル カーネル メモリに保存されます。
オペレーティング システムでシステム コールが必要なのはなぜですか?
オペレーティング システムでシステム コールが必要になる状況はさまざまです。状況としては以下のようなものがあります。
- ファイルシステムがファイルを作成または削除する場合は、これが必要です。
- ネットワーク接続には、データ パケットを送受信するためのシステム コールが必要です。
- ファイルを読み書きしたい場合は、システムコールを行う必要があります。
- プリンタやスキャナなどのハードウェア デバイスにアクセスする場合は、システム コールが必要です。
- システム コールは、新しいプロセスの作成と管理に使用されます。
システムコールの仕組み
アプリケーションは、ユーザー空間と呼ばれるメモリ領域で実行されます。システム コールはオペレーティング システムのカーネルに接続し、カーネル空間で実行されます。アプリケーションがシステム コールを作成するときは、まずカーネルから許可を取得する必要があります。これは、現在のプロセスを一時停止し、カーネルに制御を移す割り込み要求を使用してこれを実現します。
リクエストが許可されると、カーネルはファイルの作成や削除など、リクエストされたアクションを実行します。アプリケーションは入力としてカーネルの出力を受け取ります。アプリケーションは入力を受信した後、手順を再開します。操作が完了すると、カーネルは結果をアプリケーションに返し、データをカーネル空間からメモリ内のユーザー空間に移動します。
システムの日付と時刻の取得など、単純なシステム コールでは結果が得られるまでに数ナノ秒かかる場合があります。ネットワーク デバイスへの接続など、より複雑なシステム コールには数秒かかる場合があります。ほとんどのオペレーティング システムは、ボトルネックを回避するために、システム コールごとに個別のカーネル スレッドを起動します。最新のオペレーティング システムはマルチスレッドであるため、さまざまなシステム コールを同時に処理できます。
システムコールの種類
システムコールには通常 5 種類あります。これらは次のとおりです。
ここで、さまざまな種類のシステム コールを 1 つずつ学習していきます。
優先キューJava
プロセス制御
プロセス制御は、プロセスを制御するために使用されるシステム コールです。プロセス制御の例には、プロセスの作成、ロード、中止、終了、実行、処理、終了などが含まれます。
ファイル管理
ファイル管理は、ファイルを処理するために使用されるシステム コールです。ファイル管理の例には、ファイルの作成、ファイルの削除、開く、閉じる、読み取り、書き込みなどが含まれます。
端末管理
デバイス管理は、デバイスを処理するために使用されるシステム コールです。デバイス管理の例には、読み取り、デバイス、書き込み、デバイス属性の取得、デバイスの解放などが含まれます。
情報保守
情報保守とは、情報を保守するためのシステムコールです。情報保守の例には、システム データの取得、時刻または日付の設定、時刻または日付の取得、システム データの設定などが含まれます。
コミュニケーション
コミュニケーションとは、通信に使用されるシステムコールです。通信接続の作成、削除、メッセージの送信、受信などの通信の例がいくつかあります。
Windows および Unix のシステム コールの例
Windows および Unix のシステム コールにはさまざまな例があります。これらは以下の表にリストされているとおりです。
プロセス | ウィンドウズ | ユニックス |
---|---|---|
プロセス制御 | CreateProcess() 終了プロセス() WaitForSingleObject() | フォーク() 出口() 待って() |
ファイル操作 | CreateFile() ReadFile() WriteFile() クローズハンドル() | 開ける() 読む() 書く() 近い() |
端末管理 | SetConsoleMode() ReadConsole() WriteConsole() | Ioctl() 読む() 書く() |
情報保守 | GetCurrentProcessID() SetTimer() 寝る() | Getpid() 警報() 寝る() |
コミュニケーション | CreatePipe() CreateFileMapping() MapViewOfFile() | パイプ() シュムゲット() Mmap() |
保護 | SetFileSecurity() InitializeSecurityDescriptor() SetSecurityDescriptorgroup() | Chmod() umask() チョーン() |
ここでは、いくつかの方法について簡単に説明します。
strをintに変換する方法
開ける()
の 開ける() システム コールを使用すると、ファイル システム上のファイルにアクセスできます。ファイルにリソースを割り当て、プロセスが参照できるハンドルを提供します。多くのプロセスがファイルを一度に開くことも、単一のプロセスでのみ開くこともできます。それはすべてファイル システムと構造に基づいています。
読む()
ファイル システム上のファイルからデータを取得するために使用されます。通常、次の 3 つの引数を受け入れます。
- ファイル記述子。
- 読み取ったデータを格納するバッファ。
- ファイルから読み取るバイト数。
読み取られるファイルのファイル記述子を使用してファイルを識別し、次のように開くことができます。 開ける() 読む前に。
待って()
一部のシステムでは、プロセスは、続行する前に、別のプロセスの実行が完了するまで待機する必要がある場合があります。親プロセスが子プロセスを作成すると、子プロセスが終了するまで親プロセスの実行は一時停止されます。の 待って() システムコールは親プロセスを一時停止するために使用されます。子プロセスが実行を完了すると、制御は親プロセスに戻ります。
書く()
ユーザーバッファからファイルなどのデバイスにデータを書き込むために使用されます。このシステム コールは、プログラムがデータを生成する方法の 1 つです。通常、次の 3 つの引数を取ります。
- ファイル記述子。
- データが保存されるバッファへのポインタ。
- バッファから書き込まれるバイト数。
フォーク()
プロセスは、 フォーク() システムコール。これは、オペレーティング システムでプロセスを作成する最も一般的な方法の 1 つです。親プロセスが子プロセスを生成すると、子プロセスが完了するまで親プロセスの実行が中断されます。子プロセスが実行を完了すると、制御は親プロセスに戻ります。
近い()
ファイルシステムへのアクセスを終了するために使用されます。このシステム コールが呼び出されると、プログラムがそのファイルを必要としなくなったことを意味し、バッファがフラッシュされ、ファイル情報が変更され、結果としてファイル リソースの割り当てが解除されます。
Linuxでディレクトリの名前を変更する方法
実行()
すでに実行されているプロセス内の以前の実行可能ファイルが実行可能ファイルに置き換えられると、このシステム関数が呼び出されます。新しいプロセスが構築されないため、古いプロセスの識別は残りますが、データ、スタック、データ、ヘッドなどが新しいプロセスに置き換えられます。
出口()
の 出口() プログラムの実行を終了するために使用されるシステムコールです。この呼び出しは、スレッドの実行が完了したことを示します。これは、マルチスレッド環境で特に役立ちます。オペレーティング システムは、 出口() システム機能。