問題タブ [low-level]
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.
linux - Linux でコンテキストの切り替えにかかる時間はどれくらいですか?
Linux でコンテキストを変更するのに何サイクルかかるのか知りたいです。私は特に E5405 Xeon (x64) を使用していますが、他のプラットフォームとの比較も楽しみです。
variables - スタック上の変数はどのようにアクセスされますか?
次のローカル変数があるとします。
私の知る限り、これらは次のようにシステムスタックに割り当てられます。
これは、aの値を取得するために、d、c、およびbの値を最初にスタックからポップアウトする必要があることを意味しますか?もしそうなら、これらの値はどこに行きますか?これは、最近宣言された変数へのアクセスが高速になることを意味しますか?それとも私は何かが足りないのでしょうか(私はそうだと思います)、そしてすべてが他の方法で機能しますか?
編集:ありがとう、みんな!
windows - 制御された環境 (Win32) でアプリケーションを実行する際の問題
この質問にタグを付ける方法やタイトルの書き方がよくわからないので、誰かがより良いアイデアを持っている場合は編集してください
契約は次のとおりです。
少し前に、私はコンピューティング オリンピック管理システムの重要な部分を少し書きました。システムの仕事は、参加者からの提出物 (コード ファイル) を取得し、それらをコンパイルし、定義済みのテスト ケースに対して実行し、結果を返すことです。さらに、あなたが想像できる残りのすべてのことを実行する必要があります。
私が書いた部分はリミッターと呼ばれていました。それは、制御された環境で別のプログラムを実行する小さなプログラムでした。この場合の制御とは、使用可能なメモリ、計算時間、およびシステム リソースへのアクセスに対する制限を意味します。さらに、プログラムがクラッシュした場合は、例外の種類を特定し、それをユーザーに報告できるはずです。また、プロセスが終了したときに、プロセスが実行された時間を記録する必要があります (少なくとも 0.01 秒以上の精度で)。
もちろん、これに対する理想的なソリューションは仮想化ですが、私はそれを書く経験がありません。
これに対する私の解決策は、3 つの部分に分かれていました。
最も単純な部分は、システム リソースへのアクセスでした。プログラムは、限られたアクセス トークンで単純に実行されます。システムへの読み取り専用アクセスを実質的に提供するために、すべてのプロセスで使用できる基本的な (Everyone、Anonymous など) アクセス トークンをいくつか組み合わせました。ただし、システムが実行されているフォルダーは例外です。
メモリの制限は、ジョブ オブジェクトを介して行われました。最大メモリ制限を指定できます。
最後に、実行時間を制限してすべての例外をキャッチするために、リミッターをデバッガーとしてプロセスにアタッチします。したがって、私はそれが費やした時間を監視し、時間がかかりすぎる場合は終了することができます. Job オブジェクトはジョブの Kernel Time と User Time のみを報告するため、これには Job オブジェクトを使用できないことに注意してください。プロセスは、それらのいずれにもカウントされないようなことを行う可能性がありますSleep(99999999)
が、それでもテスト マシンを無効にします。したがって、最終的な実行時間にプロセスのアイドル時間をカウントしませんが、それでも制限が必要です。
さて、私はこのような低レベルの専門家ではありません。MSDN を読んだり遊んだりして数日を過ごし、できる限りの解決策を思いつきました。残念ながら、期待どおりに動作していないようです。ほとんどの場合、問題なく動作しているように見えますが、奇妙なケースが忍び寄り続けています。ちょうど今、私はそれ自体で一瞬で実行される小さな C++ プログラムを持っていますが、リミッターは 8 秒のユーザー モード時間を報告します (ジョブ カウンターから取得)。これがコードです。約 0.5 秒で出力を出力し、待機するだけで 7 秒以上かかります。
リミッターのコードはかなり長いので、ここには含めません。また、私のアプローチに何か問題があるのではないかと感じています。おそらく、デバッガーのことをすべきではありません。おそらく、私が知らないいくつかの一般的な落とし穴があります。
他の人がこの問題にどのように取り組むかについて、アドバイスをお願いします。おそらく、これを行う何かが既にあり、私のリミッターは廃止されましたか?
追加:問題は、私が上に投稿した小さなプログラムにあるようです。少し関係がないので、新しい質問を開きました。プログラムを制限するためのこのアプローチについて、引き続きコメントをお願いします。
c++ - コンパイラー・プログラミング: 最も基本的な要素は何ですか?
非常に最小限のコンパイラを書くことに興味があります。
次の基準を満たす小さなソフトウェア (C/C++) を作成したいと考えています。
- ELF形式で出力 (*nix)
- 入力は単一のテキストファイルです
- C ライクな文法と構文
- リンカーなし
- プリプロセッサなし
- 非常に小さい (最大 1-2 KLOC)
言語機能:
- ネイティブ データ型: char、int、float
- 配列 (すべてのネイティブ データ型)
- 変数
- 制御構造 (if-else)
- 機能
- ループ(いいだろう)
- 単純な代数 (div、add、sub、mul、ブール式、ビットシフトなど)
- inline asm (システムコール用)
誰か始め方教えてくれませんか? コンパイラがどの部分で構成されているか (少なくとも、すぐに使い始めることができるという意味では)、それらをどのようにプログラムするかはわかりません。アイデアありがとうございます。
accessibility - 視覚障害者は、起動エラーやその他の低レベル環境をどのように処理しますか?
私は、視覚障害者が Windows やその他のオペレーティング システムでコンピュータを使用できるようにするための、スクリーン リーダーや同様のソフトウェアが存在することを知っています。
OS インストーラーや BIOS セットアップなど、下位レベルの環境でどのようなサポートが利用できるのか興味があります。
low-level - レジスタの増分を使用してクロックレートを決定できますか?
(ループ内の)レジスタの増分を使用して、(実効)クロックレートを決定できますか?当然のことながら可能だと思いましたが、CPUはこの種の計算を役に立たなくするスーパースカラー技術を組み込む可能性があるとコメントされました。また、CPUのレジスタのインクリメントは1クロックサイクル未満で実行できると言われました。
それは本当ですか?
programming-languages - 推奨できる高速な低レベル言語は何ですか?
パフォーマンス コンピューティング用の C ライクな言語に興味を持つようになりました。次の属性を持つ代替プログラミング言語をいくつかお勧めできますか:
- ハードウェアの近くにある必要があります (ビット操作、ポインター、または参照などの別の安全な方法)
- マネージド コードなし (jvm/.net 言語なし)
- (Cのように)本当に高速でなければなりません
- ASM レベル以上である必要があります (はい、ASM 上のマクロ言語に興味があります)
- あいまいで、あまり普及していない可能性があります
私は主にあまり知られていない言語に興味があります。
mips - 第 2 のアセンブリ言語として MIPS を学習していますか?
私は x86 アセンブリを知っています (そして FPGA などで作業したことがあります)。RISC について書いたことはありません。MIPS のコースを受講する機会がありますが、忙しいので、私の質問は、ある意味では有益だとは思いますが、実際にはどのくらい有益なのでしょうか? (私は低レベルの熱狂者ですが、これは必須ですか?)
(私はmips-is-it-important を認識していますが、何らかの種類のアセンブリを既に知っているので、私の場合は少し異なると感じています)
ありがとう。
memory - 低レベルのプログラミング: 別の実行中のプロセスのメモリでデータを見つける方法は?
ゲームのプロセスメモリから値を抽出することにより、ゲームの統計ツールを作成しようとしています (他に方法がないため)。最大の課題は、関心のあるデータを格納するために必要なアドレスを見つけることです。さらに難しいのは、動的メモリ割り当てです。ゲームが再起動するたびにアドレスが変化するため、データを格納するアドレスだけでなく、それらのメモリ ブロックへのポインタも見つける必要があります。
今のところ、メモリ エディタ (ArtMoney) を使用して手動でゲーム メモリを検索し、データの変更に応じて値が変化する (または変化しない) アドレスを探しています。アドレスが見つかった後、同様の方法でこのメモリ ブロックを指すポインタを探しています。
そのようなタスクにはどのようなテクニック/ツールが存在するのだろうか? 読める記事もあるかも?逆アセンブラーをマスターすることが唯一の方法ですか? たとえば、ゲームのトレーナーは同様のタスクを解決していますが、彼らは数日で解決し、私はすでに数週間苦労しています.
ありがとう。
PS。全て窓下です。