12

私は昨年、オペレーティング システムを取り上げました。その間、ユーザー コンテキスト ( header で定義) を使用ucontext.hして、プロジェクトのスレッド スケジューラ (各スレッドがプロセスをシミュレートする) を実装しました。getcontext私は講義に参加していて、ユーザー コンテキストについて話します。昨年このプロジェクトを行ったにもかかわらず、システム コールが実際に何をするのかがよくわからないことに気づきました。

マニュアルページgetcontextは、

ucp が指す構造を現在アクティブなコンテキストに初期化します。」

また、 への引数についてsetcontext、もし ucp 引数が

getcontext() の呼び出しによって取得された場合、プログラムの実行は、この呼び出しがちょうど戻ってきたかのように続行されます。

わかりました。

だからここに私が混乱しているものがあります。通常、私が学んだ方法では、コンテキストスイッチを実行するには、ucontext_t構造体を初期化し、それを次のようにスワップ/設定します。

ucontext_t ucp;
ucontext_t oucp;
getcontext(&ucp);

// Initialize the stack_t struct in the ucontext_t struct
ucp.uc_stack.ss_sp = malloc(STACK_SIZE);
ucp.uc_stack.ss_size = STACK_SIZE;
ucp.uc_stack.ss_flags = 0;

ucp.uc_link = /* some other context, or just NULL */;

// Don't block any signals in this context
sigemptyset(&ucp.uc_sigmask);
// Assume that fn is a function that takes 0 arguments and returns void
makecontext(&ucp, fn, 0);

// Perform the context switch. Function 'fn' will be active now
swapcontext(&oucp, &ucp);
// alternatively: setcontext(&ucp);

小さなプログラムで省略するgetcontextと、何も面白いことはありません。ユーザーコンテキストを介したコンテキスト切り替えが多いやや大規模なプログラムでは、セグメンテーション違反が発生しますが、これは再度追加することによってのみ解決されgetcontextます。

正確には何をしgetcontextますか?構造体を割り当て、とフィールドをucontext_t初期化して初期化し、なしで呼び出すことができないのはなぜですか? 実行しない必要な初期化はありますか?uc_stackuc_sigmaskmakecontextgetcontextgetcontextmakecontext

4

1 に答える 1