問題タブ [system-calls]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
9 に答える
52328 参照

multicore - プロセスが実行されるコアを制御する方法は?

複数のプロセスまたはスレッドを使用するプログラムを作成する方法を理解できます。新しいプロセスを fork() して IPC を使用するか、複数のスレッドを作成してそのような通信メカニズムを使用します。

コンテキストの切り替えも理解しています。つまり、CPU が 1 つしかない場合、オペレーティング システムは各プロセスの時間をスケジュールします (そして、スケジューリング アルゴリズムは無数にあります)。これにより、複数のプロセスを同時に実行することができます。

マルチコア プロセッサ (またはマルチプロセッサ コンピュータ) を使用できるようになったので、2 つの別々のコアで 2 つのプロセスを同時に実行できます。

私の質問は、最後のシナリオに関するものです。カーネルは、プロセスが実行されるコアをどのように制御しますか? 特定のコアでプロセスをスケジュールするシステム コール (Linux または Windows) はどれですか?

私が尋ねている理由: 私はコンピューティングの最近のトピックを調査する学校のプロジェクトに取り組んでおり、マルチコア アーキテクチャを選択しました。そのような環境でプログラミングする方法 (デッドロックや競合状態を監視する方法) に関する資料はたくさんあるようですが、個々のコア自体の制御に関する資料はあまりありません。いくつかのデモンストレーション プログラムを作成し、アセンブリ命令または C コードを提示して、「2 番目のコアで無限ループを実行しています。その特定のコアの CPU 使用率のスパイクを見てください。」 .

コード例はありますか? それともチュートリアル?

編集:明確にするために-これはOSの目的であり、OSにこれを任せるべきだと多くの人が言っています。同意します!しかし、私が求めている (または感触を得ようとしている) のは、オペレーティング システムがこれを行うために実際に行っていることです。スケジューリング アルゴリズムではありませんが、「コアが選択されたら、そのコアが命令のフェッチを開始するには、どの命令を実行する必要がありますか?」

0 投票する
0 に答える
2147 参照

c# - .NET から mono へのシステム コール

mono を使用して外部システム コールを実行しようとしています。以下の例のようなものをエミュレートできるかどうか知りたいです (もちろん、クロスプラットフォームのサポートを探しています)。

**更新: このコードはモノラルで動作します。System.Diagnostics 名前空間が使用されている限り、このコード ブロックは機能します。

0 投票する
5 に答える
1471 参照

c - Cでシステムコールを使用してLinuxに相当する「nl」コマンドを作成するには?

システムコールのみを使用して、 catおよびnlに相当するコマンドである C でコーディングする必要がある場所を実行する演習があります。与えられたシステム コールは、open()、close()、read()、および write() です。

「cat」に相当するものは既に実行しており、正常に動作しているようです。「nl」を実行する必要がありますが、行ごとに記述する方法に問題があります。

考えられるのは、可能な限り少ないシステム コールを使用することです。

バッファで「\n」を見つける必要があることはわかっています。バッファをループして「\n」の位置を見つけ(Xと呼びましょう)、X個のバイトを標準出力に書き込むことができます。

しかし、バッファ内のすべての文字をループして行末を検索するのは私には適切ではありませんが、他にどのようにこれを行うことができるかわかりません...

重要な編集:
私の質問のポイントを見逃している人もいると思います...これを行う方法についての説明は必要ありません。それは私の問題ではありません。私はそれを行う方法を知っています (または非常に良いアイデアを持っています。まだ試していません)。「問題」は、行の終わりを見つけるために、バッファ、ファイル、またはその他のものを1文字ずつループするのが正しくないと感じることです(方法は関係ありません)。これが答えではないと言っているわけではありませんし、これを行うことは許可されていないと言っているのではありません。これを行うのは奇妙な方法のように思えます。それだけです...しかし、それが方法である場合、それが私の質問に対する答えです。

でも、みんなの助けに感謝します:)

0 投票する
4 に答える
10770 参照

c - sched_setaffinity() はどのように機能しますか?

Linux syscall sched_setaffinity() の仕組みを理解しようとしています。これは私の質問hereの続きです。

私はこのガイドを持っています。これは、syscall の使用方法を説明し、かなりきちんとした (動作する!) 例を示しています。

そこで、Linux 2.6.27.19カーネル ソースをダウンロードしました。

そのシステムコールを含む行に対して「grep」を実行したところ、91 件の結果が得られました。有望ではありません。

最終的に、カーネルが特定のコア(またはプロセッサ)の命令ポインターを設定する方法を理解しようとしています。

シングルコア、シングルスレッドのプログラムがどのように機能するかはよく知っています。「jmp foo」命令を発行すると、基本的に IP が「foo」ラベルのメモリ アドレスに設定されます。しかし、複数のコアがある場合、「メモリアドレス foo で次の命令をフェッチし、コア番号 2の命令ポインタを設定して、そこで実行を開始する」と言わなければなりません。

アセンブリ コードのどこで、どのコアがその操作を実行するかを指定していますか?

カーネル コードに戻ります。ここで何が重要なのでしょうか? ファイル 'kernel/sched.c' には sched_setaffinity() と呼ばれる関数がありますが、タイプ "long" を返します。これはマニュアル ページと矛盾しています。では、ここで重要なことは何ですか?これらのモジュールのうち、発行された組み立て手順を示しているのはどれですか? 「task_struct」を読み取り、「cpus_allowed」メンバーを見て、それを命令に変換しているモジュールはどれですか? (glibc のソースも調べてみましたが、このタスクを実行するためにカーネル コードを呼び出すだけだと思います。)

0 投票する
5 に答える
3668 参照

mmap - mmap() 内部

最も重要な mmap() 機能は、ファイル マッピングが多くのプロセス間で共有されることであることが広く知られています。しかし、すべてのプロセスが独自のアドレス空間を持っていることはあまり知られていません。

問題は、memmap されたファイル (より具体的にはそのデータ) が実際にどこに保存されているか、プロセスがこのメモリにアクセスするにはどうすればよいかということです。*(pa+i) やその他の高レベルのものではなく、プロセスの内部を意味します。

0 投票する
6 に答える
3772 参照

c - Linuxの「cat」と比較して、システムコールを使用した「cat」関数の速度が遅いのはなぜですか。

Linuxシステムで「cat」関数をシミュレートするためにシステムコール(open、read、write)を使用してCでこの関数を実行しましたが、実際の関数よりも低速です...

実際の「cat」と同じバッファサイズを使用しており、「strace」を使用しているので、同じ量のシステムコールが実行されていると思います。しかし、私の「猫」からの出力は、実際の「猫」よりも少し遅いです。

これは私が持っているコードです:

私はファイルから読み取っています(mainに引数として渡します。ここではコードは必要ないと思います)。そのファイル記述子と出力記述子に1を指定してcatPrint()関数を呼び出し、stdoutに出力します。

テストに同じファイルを使用していて、両方(実際の「猫」と私のもの)では、テキスト全体に対して1つのread()と1つのwrite()しかないため、なぜ遅くなるのかわかりません。テキスト全体を画面に表示するだけではいけませんか?

PS:ここでの私の質問(なぜ遅いのか)は宿題の一部ではありませんが、これを宿題としてタグ付けしました。システムコールを使用して「cat」タイプの関数を作成するだけで済みました。少し遅いコードに興味があります。

私からの愚かさで解決した問題:
同じファイルでLinuxの元の猫を次々と呼び出すことにしましたが、呼び出すときも同じくらい遅いことに気づきました。自分の。私はすべてがより良いと思います...

この人のように時間を無駄にしてすみません。

0 投票する
2 に答える
9569 参照

c - fork、wait、exit などの正しい使い方

この問題を解決するために使用できるシステムコールはわずかしかなく、それらが状況にどのように役立つかがわからないため、解決方法がわかりません。

演習:
サイズ [10][1000000] の行列があり、行ごとに fork() を使用して新しいプロセスを作成します。各プロセスの考え方は、その特定の行のすべての番号を調べて特定の番号を見つけ、それに関するメッセージを出力することです。これが問題の最初のステップであり、これで完了です。2 番目のステップは、各行にその数の出現回数の合計をorderごとに出力することです。そして最後に、その数の発生の総合計です。

呼び出し:
私が使用できるシステム コールは、この演習のドキュメントで次のように説明されています。

  • pid_t fork(void);
  • void exit(int status);
  • pid_t wait(int *status);
  • pid_t waitpid(pid_t pid, int *status, int options);

問題:呼び出しで 256 未満の数値しか渡せない
ため、どうすればよいかわかりません。発生回数がこの数値よりも大きい場合はどうなりますか? exit()そのような数値を返すにはどうすればよいですか?

別の問題:
と の違いwait()と、どちらwaitpid()をどのように/どこで使用するかを正確に理解していません。man ページ以外に、コード例などを参照して理解を深めることができるドキュメントはありますか? または、誰かが私に違いを説明し、そのような違いを示す基本的な例を提供できますか?

0 投票する
4 に答える
16985 参照

c - exit() ステータスで 256 による除算よりも C で WEXITSTATUS マクロを使用する利点はありますか?

私は出口で値を返さなければならない大学の演習を行っていましたが、その値は実際には何かのカウントでした。これは 255 を超える可能性があります (exit() では処理できません) が、教師は、カウントがその値を超えることのないテスト データを使用することを提案しました。

このすべての後、このカウント値、終了ステータスを処理する必要がありました。この値は、waitpid() を使用してメイン プロセスで取得しました。驚いたことに、子プロセスが 1 を返した場合、メイン プロセスの「実際の」値は 256、2 は 512 などでした...

この値を出力する必要があったので、単純に 256 で割りました。ただし、WEXITSTATUS() マクロを使用すると、この値も思い通りに取得できます...

Cソースコードを調べたところ、次のことがわかりました。

ここで何が起こっているか理解しています。たとえば、2 進数の 512 は 10 0000 0000 です。8 を右にシフトすると 00 0000 0010 になり、10 進数では 2 になります。このマクロで私が理解できないのは、& 演算子と、0xff00 が乱数のように見えるという事実です (おそらくそうではありませんが、どこから来たのでしょうか?)。これは正確には何をしますか?マクロに「& 0xff00」があるのはなぜですか? それがなければうまくいきませんか?

そして、このトピックの真の疑問は、コードでこのマクロを 256 で割ることと同じことを呼び出すことでしょうか?

0 投票する
2 に答える
287 参照

operating-system - syscall がカーネル モードに切り替える必要があるのはなぜですか?

私は自分のオペレーティング システムの最終試験に向けて勉強していますが、システム コールのために OS がカーネル モードに切り替える必要がある理由を誰か教えてもらえないだろうかと思っていました。

0 投票する
4 に答える
2957 参照

c - mprotect の呼び出しが多すぎます

私は並列アプリ(C、pthread)に取り組んでいます。ある時点で並列パフォーマンスが悪いため、システム コールをトレースしました。私のトレースは、私のプログラムがmprotect()何度も呼び出していることを示しました...私のプログラムを大幅に遅くするのに十分です。

私は大量のメモリを割り当てますが (を使用) 、ヒープ サイズを増やすためmalloc()の呼び出しは妥当な数しかありません。brk()では、なぜこれほど多くの呼び出しが行われるのmprotect()でしょうか?!