プロセスの終了とリソース解放
プロセスが終了する際、プログラム情報やタスク構造体(task_struct)内の退出コードが保持されます。OSはこの情報を管理し、ユーザが後でアクセスできるようにします。
struct Task {
int exit_code;
// その他の属性
};
ゾンビプロセスについて
ゾンビプロセスは、親プロセスが子プロセスの退出情報を回収しない場合に発生します。以下はコード例です:
#include <unistd.h>
int main() {
pid_t child_pid = fork();
if (child_pid == 0) {
// 子プロセス
_exit(0); // 終了
} else {
// 親プロセス
sleep(10); // 何もせず待機
}
return 0;
}
ゾンビプロセスが放置されるとメモリリークを引き起こす可能性があります。
オーファンプロセス
親プロセスが終了した後に残る子プロセスをオーファンプロセスといいます。システムがこれを自動的に引き取ります。
プロセスの優先度
プロセスの優先度は、資源獲得の順序を決定します。nice値(-20から19)によって調整可能です。
void adjust_priority(int pid, int new_nice) {
setpriority(PRIO_PROCESS, pid, new_nice);
}
プロセスの切り替え
時間片に基づいてプロセスは切り替わります。CPU内部のレジスタ状態は、タスクのコンテキストとして保存されます。
struct Context {
unsigned long ir;
unsigned long pc;
// その他のデータ
};
void save_context(struct Context *ctx) {
ctx->ir = get_ir_register();
ctx->pc = get_pc_register();
}
void restore_context(const struct Context *ctx) {
set_ir_register(ctx->ir);
set_pc_register(ctx->pc);
}
Linuxのスケジューリングアルゴリズム
LinuxではO(1)スケジューリングを使用します。runqueue構造体により、各優先度ごとにプロセスが管理されます。
struct RunQueue {
unsigned long bitmap[5];
struct Queue queues[40]; // 優先度に対応
};
リンク構造と環境変数
Linuxでは双方向リストが使用され、環境変数はシステム設定ファイルに格納されます。
struct EnvVar {
char name[64];
char value[256];
};
void load_env_vars() {
// 環境変数読み込み処理
}