問題タブ [systems-programming]

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 投票する
1 に答える
513 参照

linux - glibcのドキュメントとエンディアン

プロセス完了ステータスに関するglibcのドキュメントには、マクロWEXITSTATUSが完了ステータスの下位8バイトを返すと記載されています。

マクロ:int WEXITSTATUS(int status)

WIFEXITEDのステータスがtrueの場合、このマクロは子プロセスからの終了ステータス値の下位8ビットを返します。

しかし、/usr/include/sys/wait.h言う:

そして、/usr/include/bits/waitstatus.h言及:

私のエンディアンの概念がすべて台無しにされていない限り、これはどのように下位8ビットですか?または、libcは、データがスモールエンディアンの方法で保持されていると想定していますか?

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

unix - システムコールのソースコードにステップインできません

freebsd libcソースを-gオプションでコンパイルしたので、libc関数にステップインできます。

しかし、システムコールコードに足を踏み入れるのに問題があります。freebsdカーネルのソースコードを-gでコンパイルしました。ブレークポイントを設定すると、gdbは.Sファイルのブレークポイントについて通知します。ブレークポイントに到達すると、gdbはsyscallソースコードにステップインできなくなります。

また、私は試しました:gdb $ catch syscall open

しかし、これも機能していません。

何か提案してもらえますか?

ありがとう。

0 投票する
3 に答える
3043 参照

c - mmap と madvise シーケンシャルを使用して行ごとに大きなファイルをシーケンシャルに読み取ると、fgets よりも遅いのはなぜですか?

概要

IO によって大幅に制限されたプログラムがあり、それを高速化しようとしています。mmap を使用するのは良いアイデアのように思えましたが、実際には一連の fgets 呼び出しを使用する場合に比べてパフォーマンスが低下します。

いくつかのデモコード

約 350 万行を含む 800 MB のファイルに対してテストして、デモを本質的なものだけに絞り込みました。

fgets を使用:

800MB ファイルのランタイム:

mmap バージョン:

実行時間はかなり異なりますが、fgets よりも速くなることはありません。

その他の注意事項

  • top でプロセスが実行されるのを見ると、memmap されたバージョンは途中で数千のページ フォールトを生成しました。
  • fgets バージョンでは、CPU とメモリの使用量はどちらも非常に低くなっています。

質問

  • これはなぜですか?fopen/fgets によって実装されたバッファリングされたファイル アクセスが、madvise POSIX_MADV_SEQUENTIAL を使用した mmap の積極的なプリフェッチよりも優れているという理由だけですか?
  • おそらくこれを高速化する代替方法はありますか(IO負荷をプロセッサにシフトするオンザフライ圧縮/解凍以外)? 同じファイルで 'wc -l' のランタイムを見ると、そうではないかもしれないと推測しています。
0 投票する
1 に答える
6975 参照

c - vfork()システムコール

vfork()システムコールを使用して作成された新しいプロセスが親のアドレス空間でスレッドとして実行され、子スレッドがexit()またはexec()システムコールを呼び出さなくなるまで、親がブロックされることを読みました。そこで、vfork()システムコールを使用してプログラムを作成しました

次のような出力が得られました。

returnステートメントはexit()システム呼び出しを内部的に呼び出す必要があると想定していたので、出力は次のようにのみ期待していました。

なぜ実際にそれが停止せず、無限ループで継続的に印刷されないのか、誰かが私に説明できますか?

0 投票する
3 に答える
6082 参照

c - cフォーク、実行、getpidの問題

私はc言語とLinuxが初めてです。fork()、getpid()、および exec() 関数に関連する問題があります。fork() 呼び出しを使用して ac プログラムを作成しました。私のプログラムのコードは次のコードです。

このプログラムの出力は次のとおりです。

子プロセスが作成されます

これは子プロセスの試行です

子プロセスが作成されます

これは子プロセスの試行です

今、私の質問は次のとおりです。

  1. プログラムの出力が同じことを 2 回表示するのはなぜですか? 「子プロセスが作成されました。これは子プロセスの試行です」となるはずの出力
  2. 出力がコードに従っていないのはなぜですか?
  3. 4 つのプロセスがあり、すべてのプロセスが異なるタスクを実行するプログラムを作成できますか。たとえば、1 つのプロセスが「私の名前」を出力します。1 つのプロセスは "my age" を出力し、もう 1 つのプロセスは "my address ?
  4. メイン関数で複数のプロセスを作成する方法は?
  5. 複数のプロセスの実行を制御するには?
  6. 関数は何をしexec()ますか?exec()の動作をソースコードfork()で説明してもらえますか?getpid()

この初心者を助けてください。

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

c - C言語でのフォークの働き

今、fork()システムコールの仕組みを理解するのに問題があります。次のコードを書きます。

このコードの出力は次のとおりです。

出力がこのようになる理由がわかりませんか?

その後、コードに行を追加するだけで、出力がまったく異なります。私のコードは次のとおりです。

コードを実行すると、出力は次のようになります 2389my name is manish

今、私はfork()呼び出しの働きについて完全に混乱しています。

私の質問は次のとおりです。

  1. どのようにfork()動作しますか?
  2. fork()呼び出しの後、コントロールはどこに行きますか?
  3. 問題で書かれたコードの出力の理由を説明できる団体はありますか?
  4. の出力がb異なる場所で発生するのは、最初のコードで の出力が出力のb = 2260直前にありb = 0、 の値が のb = 2389直前ではないことを意味するのはなぜb = 0ですか?

問題 に 書か れ て いる コード の fork の 働き を 説明 し て ください .

0 投票する
3 に答える
35152 参照

operating-system - セマフォを使用した N プロセス バリアの実装

私は現在、以前の反復で OS 試験のトレーニングを行っていますが、これに遭遇しました。

「N Process Barrier」を実装します。つまり、それらのグループの各プロセスが、それぞれの実行のある時点で、他のプロセスが特定のポイントに到達するまで待機するようにします。

次の ops を利用できます。

init(sem,value), wait(sem) and signal(sem)

N は任意の数です。特定の数のプロセスで機能するように作成できますが、任意の数では機能しません。

何か案は?疑似コードで返信しても構いません。これは課題ではなく、個人的な勉強です。

0 投票する
3 に答える
572 参照

windows - Windowsシステムプログラミング

私はWindowsプラットフォームでシステムプログラミングを学ぶことに本当に興奮しています。「ProgrammingWindowsFifthEdition」を読み始めたところ、ほとんどがGUI指向であることに気づきました。

ばかげた質問で失礼しますが、Windowsフォームやドロップダウンメニューを作成するために数十行のコードを記述する代わりに、これをIDEで使用できるのではないでしょうか。

これをすべて回避し、システムプログラミングに直接取り組む方法はありますか?

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

c++ - ブースト::スレッドデータ構造のサイズはばかげていますか?

コンパイラ: Linux での clang++ x86-64。

複雑な低レベル システム コードを作成してからしばらく経ち、通常はシステム プリミティブ (windows および pthreads/posix) に対してプログラムを作成しています。だから、in#s と out は私の記憶から抜け落ちました。私は現在、と一緒に働いていboost::asioますboost::thread

非同期関数エグゼキューターに対して同期 RPC をエミュレートするために (boost::io_service複数のスレッドio::service::runでリクエストが実行されるio_serviced::post)、ブースト同期プリミティブを使用しています。好奇心のために、私sizeofはプリミティブに決めました。これは私が見るものです。

出力:

ミューテックスの 40 バイト ?? ?? ? なんてこった!condition_variable の場合は 88 !!! 私は何百notification_objectもの

移植性のためのこのレベルのオーバーヘッドはばかげているように思えますが、誰かがこれを正当化できますか? 私が覚えている限り、これらのプリミティブは、CPU のメモリ モデルに応じて 4 または 8 バイト幅である必要があります。