ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

2
DMAコントローラーはどのように機能しますか?
セクション5.1.4からのダイレクトメモリアクセスアンドリュー・タネンバウム、ハーバート・ボス、2014年までに近代オペレーティングシステム、 説明を簡単にするために、図5-4に示すように、CPU、メモリ、I / Oデバイスを接続する単一のシステムバスを介して、CPUがすべてのデバイスとメモリにアクセスすると仮定します。 DMAがどのように機能するかを説明するために、DMAが使用されていないときにディスク読み取りがどのように発生するかをまず見てみましょう。 最初に、ディスクコントローラは、ブロック全体がコントローラの内部バッファに格納されるまで、ブロック(1つまたは複数のセクタ)をドライブからビットごとにシリアルに読み取ります。 次に、チェックサムを計算して、読み取りエラーが発生していないことを確認します。次に、コントローラーが割り込みを発生させます。オペレーティングシステムが実行を開始すると、ループを実行することで、コントローラーのバッファーからディスクブロックを一度に1バイトまたは1ワードずつ読み取り、各反復でコントローラーデバイスレジスタから1バイトまたは1ワードを読み取り、メインメモリに格納できます。 Q:2番目のステップでは、 データは「コントローラーのバッファー」からメインメモリーに転送されませんか?「コントローラのバッファから」と「コントローラデバイスのレジスタから」の両方が表示されるのはなぜですか? 2番目のステップでは、コントローラーはCPUに割り込むことなく、OSを再度関与させることなく、バッファーからメインメモリにデータを転送できますか? DMAを使用する場合、手順は異なります。 まず、CPUはレジスタを設定してDMAコントローラーをプログラムし、何をどこに転送するかを認識します(図5-4のステップ1)。 また、ディスクから内部バッファーにデータを読み取り、チェックサムを検証するように指示するコマンドをディスクコントローラーに発行します。 有効なデータがディスクコントローラーのバッファーにある場合、DMAを開始できます。DMAコントローラは、バス経由でディスクコントローラに読み取り要求を発行することにより、転送を開始します(ステップ2)。この読み取り要求は他の読み取り要求のように見え、ディスクコントローラーは、それがCPUから来たのかDMAコントローラーから来たのかを知りません(または気にしません)。通常、書き込み先のメモリアドレスはバスのアドレスライン上にあるため、ディスクコントローラーは内部バッファーから次のワードをフェッチするときに、書き込み先を認識します。メモリへの書き込みは、別の標準バスサイクルです(ステップ3)。 書き込みが完了すると、ディスクコントローラーは確認応答信号をDMAコントローラーにバス経由で送信します(ステップ4)。DMAコントローラは、使用するメモリアドレスをインクリメントし、バイトカウントをデクリメントします。バイトカウントがまだ0より大きい場合、カウントが0に達するまで手順2〜4が繰り返されます。 その時点で、DMAコントローラーはCPUに割り込み、転送が完了したことを知らせます。オペレーティングシステムは、起動時にディスクブロックをメモリにコピーする必要はありません。すでにそこにあります。 Q:2番目のステップで、DMAコントローラーはディスクコントローラーにデータをディスクコントローラーのバッファーからメインメモリに転送するように要求します。最初のステップで、CPUはディスクコントローラにコマンドを発行し、ディスクから内部バッファにデータを読み込むように指示します。同時に、ディスクコントローラーがディスクからディスクコントローラーのバッファーへのデータの転送を完了したときに、CPUがディスクコントローラーのバッファーからメインメモリにデータを転送するようにディスクコントローラーに指示できるので、 DMAコントローラーは、ディスクコントローラーのバッファーからメインメモリにデータを転送するようにディスクコントローラーに指示しますか?(ディスクとメインメモリ間のデータ転送にDMAコントローラーが必要な理由が理解できないので、見積もりを理解するために重要な何かを見逃していると思います)。 デバイスのデバイスコントローラーは、デバイスを制御し、デバイスで操作を実行します。DMAコントローラーはどのデバイスで操作を制御および実行しますか? ありがとう!

2
クラスはJavaで不変であることをどのように注釈する必要がありますか?
私は最近、不変オブジェクトの有用性につまずきました。たとえば、要素をコンストラクタに渡し、クラスを不変にする必要がある場合、これらの要素が不変でない場合はこれらの要素をコピーする必要があります。 これには、プロジェクトに関する多くの確認または知識が必要です。 public A(B foo) かつB不変ではない、A私はコピーする必要があるだろうB。今でBは不変のように思えますが、それ自体はコンストラクタなどに可変クラスを持っています。 Javaでクラスが不変である場合、文書化するための標準またはベストプラクティスはありますか?@immutableJavadoc にはキーワードがないようです。 @Immutable注釈は自動クラスの生成ではなく、標準のJavaの一部については全く違うもののようです。

2
メールアドレスをデータベースにプレーンテキストとして保存する必要がありますか?
少なくともソルト/ハッシュせずにパスワードを保存するのはひどい考えであることは誰にとっても明らかです(私は願っています)。 メールはどうですか?サブスクリプションの電子メールアドレスを保持しているとしましょう。適切に暗号化すると、ユーザーに電子メールを送信することができなくなる可能性があります。一方、暗号化せずにデータベースが盗まれると、すべてのユーザーが潜在的なスパムの危険にさらされます。 この質問は、法律に固有の問題(それらは与えられるかもしれませんが、国依存のままです)やデータベース自体の暗号化に関するものではありません。

1
ペアプログラミングは、エクストリームプログラミング(XP)プロジェクトでのコードレビューの必要性を排除しますか?
極端なプログラミングプロジェクトでは、プログラマはほとんどの場合ペアプログラミングを行います。 これらのペアも回転するため、つまり、プログラムをさまざまな人とペアにし、集団所有権の感覚があるため、ソースコードは頻繁にレビューおよび更新されています。 そうであれば、コードレビューが必要ですか?つまり、プログラミングを停止し、実際にコードレビューを行うだけです。

2
これは良いパターンですか?長い関数を一連のラムダに置き換えますか?
最近、次のような状況に遭遇しました。 class A{ public: void calculate(T inputs); } まず、A物理世界のオブジェクトを表します。これは、クラスを分割しないことの強力な議論です。今、calculate()非常に長く複雑な機能であることが判明しました。私は3つの可能な構造を知覚します: テキストの壁としてそれを書く-利点-すべての情報が一箇所にある privateクラスでユーティリティ関数を記述し、それらをcalculateボディで使用する-欠点-クラスの残りの部分は、これらのメソッドを知らない/気遣わない/理解しない calculate次のように書きます: void A::calculate(T inputs){ auto lambda1 = () [] {}; auto lambda2 = () [] {}; auto lambda3 = () [] {}; lambda1(inputs.first_logical_chunk); lambda2(inputs.second_logical_chunk); lambda3(inputs.third_logical_chunk); } これは良いプラクティスか悪いプラクティスか?このアプローチは問題を明らかにしますか?全体として、再び同じ状況に直面したとき、これを良いアプローチと考えるべきですか? 編集: class A{ ... public: // Reconfiguration of the algorithm. void set_colour(double …
14 c++11  lambda 

3
変更に対してプログラミング言語をより安定(互換)にするメカニズムはありますか?
プログラミング言語は多数あります。それらのいくつかは成長し、非常に人気があります。人々はそのような言語をますます頻繁に使用します。そのような言語の創設者(または設立組織/コミュニティ)は、言語を改善するために変更を実装しようとする場合があります。しかし、下位互換性のために変更を加えるのが難しい場合があり、そのようないことは何年も言語にすでに存在しており、多くのユーザーによって使用されています。 言語設計段階で、言語設計者が下位互換性を破ることを恐れないように、より安定させるのに役立つアーキテクチャの原則や手順はありますか?

4
SIMDプログラミングコードベースのメンテナンスコスト
質問: ソフトウェア業界のコンセンサスは、クリーンでシンプルなコードが、コードベースとそれを所有する組織の長期的な実行可能性の基本であるということです。これらのプロパティにより、メンテナンスコストが削減され、コードベースが継続される可能性が高まります。 ただし、SIMDコードは一般的なアプリケーションコードとは異なります。SIMDコードに特に適用されるクリーンでシンプルなコードに関して、同様のコンセンサスがあるかどうかを知りたいと思います。 私の質問の背景。 さまざまな画像処理および分析タスクのために、たくさんのSIMD(単一命令、複数データ)コードを作成します。最近、これらの関数のいくつかを、あるアーキテクチャ(SSE2)から別のアーキテクチャ(ARM NEON)に移植しなければなりませんでした。 このコードはシュリンクラップされたソフトウェア用に記述されているため、MATLABなどの無制限の再配布権がなければ、独自の言語に依存することはできません。 典型的なコード構造の例: 使用のOpenCVのマトリックスタイプ(Mat)すべてのメモリのため、緩衝液および寿命管理。 入力引数のサイズ(次元)を確認した後、ピクセルの各行の開始アドレスへのポインターが取得されます。 ピクセルカウント、および各入力マトリックスからのピクセルの各行の開始アドレスは、いくつかの低レベルC ++関数に渡されます。 これらの低レベルC ++関数は、SIMD組み込み関数(Intel ArchitectureおよびARM NEON用)を使用して、生のポインターアドレスからの読み込みと保存を行います。 これらの低レベルC ++関数の特徴: 排他的に1次元(メモリ内で連続) メモリ割り当てを処理しません。(一時を含むすべての割り当ては、OpenCV機能を使用する外部コードによって処理されます。) シンボルの名前の長さの範囲(組み込み関数、変数名など)は約10〜20文字で、これは非常に過剰です。(テクノバブルのように読みます。) コンパイラは「単一割り当て」コーディングスタイルで記述されていないコードを正しく解析するのに非常にバグがあるため、SIMD変数の再利用は推奨されません。(私はいくつかのコンパイラのバグレポートを提出しました。) SIMDプログラミングのどの側面が議論を一般的な場合と異なるものにしますか?または、SIMDが異なるのはなぜですか? 初期開発コストの観点から 優れたパフォーマンスを備えたC ++ SIMDコードの初期開発コストは、カジュアルに記述された C ++コードと比較して、約10倍から100倍(マージンは大きい)であることはよく知られています。 パフォーマンスと読み取り可能/クリーナーコードの選択の回答で述べたように?、ほとんどのコード(カジュアルに記述されたコードとSIMDコードを含む)は、最初はクリーンでも高速でもありません。 (スカラーコードとSIMDコードの両方での)コードパフォーマンスの進化的な改善は推奨されません(ソフトウェアの一種と見なされるため)。コストと利点は追跡されません。 傾向の観点から (例えば、パレート原理、別名80-20ルール) 画像処理がソフトウェアシステムの20%(コードサイズと機能の両方)のみで構成されている場合でも、画像処理は(CPU時間の割合として見た場合)比較的遅く、80%以上の時間がかかります。 これは、データサイズの影響によるものです。典型的な画像サイズはメガバイト単位で測定されますが、非画像データの典型的なサイズはキロバイト単位で測定されます。 画像処理コード内で、SIMDプログラマーは、C ++コード内のループ構造を識別することにより、ホットスポットを含む20%コードを自動的に認識するように訓練されます。したがって、SIMDプログラマーの観点からは、「重要なコード」の100%がパフォーマンスのボトルネックです。 多くの場合、画像処理システムには複数のホットスポットが存在し、同等の割合の時間を消費します。たとえば、5つのホットスポットがそれぞれ合計時間(20%、18%、16%、14%、12%)を占める場合があります。高いパフォーマンスを実現するには、すべてのホットスポットをSIMDで書き換える必要があります。 これは、バルーンをポップするルールとして要約されています。バルーンを2回ポップすることはできません。 バルーンがいくつかあると仮定します。たとえば、そのうち5つです。それらを間引く唯一の方法は、それらを1つずつポップすることです。 最初のバルーンがポップされると、残りの4つのバルーンの合計実行時間の割合が高くなります。 さらに利益を上げるには、別のバルーンをポップする必要があります。(これは、最適化の80-20ルールに反します:ぶら下がりが最も少ない果物の20%が選ばれた後、良好な経済的結果を達成できます。) 読みやすさとメンテナンスの面で SIMDコードは、明らかに読みにくいです。 これは、すべてのソフトウェアエンジニアリングのベストプラクティス(ネーミング、カプセル化、const-correctness(および副作用の明確化)、関数の分解など)に従っても当てはまります。 これは、経験のあるSIMDプログラマーにも当てはまります。 最適なSIMDコードは、同等のC ++プロトタイプコードと比較して、非常にゆがんでいます(注意を参照)。 SIMDコードをゆがめる方法は数多くありますが、10回の試行のうち1回だけで許容可能な高速の結果が得られます。 (つまり、高い開発コストを正当化するために、4倍から10倍のパフォーマンスゲインを調整します。実際には、さらに高いゲインが観察されています。) …

5
JSONに相当するXSLT
JSONに相当するXSLTを見つける(または必要に応じて開発する)ことに興味がありました。 私は何も見つけていないので、一致したときにテンプレートを(JavaScriptから)適用するためにJSONパスの一致に使用できるクエリ言語を考えていました(おそらく一致するパターンの配列を順番にチェックし、一致する最初のテンプレート。ただし、xsl:apply-templatesに相当するものを許可し、テンプレートを子供向けに保持します)。 JSONPath、JSONQuery、RQLをJSONクエリ言語として認識しています(ただし、RQLが絶対パスと相対パスをサポートしているかどうかは明確ではありませんでした)。考慮すべき要素に関する提案と、そのような使用法に対するそれぞれの相対的な利点。
14 javascript  json  xslt 

4
適切なModel-View -_____デザイン
モデルビューコントローラー、モデルビュープレゼンター、モデルビューViewModelなどについて読んでいますが、一般的に、基本的な概念は非常に理解しやすいようです。可能。デザインチョコレートにロジックピーナッツバターは含まれていません。クール、私はそれが好きです。 問題は、その3番目の部分についてはまだ少し曖昧だということです...モデルまたはビューではありません。誰もがそれを何と呼ぶべきか、何をすべきか、何が適切で、何が間違っているのか、自分の考えを持っているようです...それはプレゼンターの仕事だからです。 私はとりとめのないです。 それらの違いを誰かに説明するように頼むのではなく、すでに何度も行われているので(私は知っています;数え切れないほど多くの記事を読んでいます)-私は私は自分でモデルを作った少数のプログラマーです。 そうは言っても、このデザインをどのように分類しますか?そしておそらくもっと重要なことですが、これについて明らかに悪いことはありますか?確かに、これが本当に堅実な設計であれば、私は良いことをしていると聞きたいと思いますが、賞賛よりもむしろ堅実なアドバイスを与えられるでしょう。 注:Model-View-の神秘的な3番目の部分に「ブリッジ」を使用しますか?それが「すべき」であるという潜在意識の提案を避けるため。 モデル データに対する権限です。 リクエストされた変更に関する情報をブリッジから受け取ります。 データが他のデータにどのように関連するかについてのすべてのロジックを含み、実行します。 データが変更されたときにブリッジに通知します(ブリッジが関心を示したデータについて)。表現の編集:外部のサブスクライバー(何も知らない)が、その状態または計算結果をモニターできるようにします。 ビューに関する知識がありません。 見る ユーザーにデータを表示および操作する方法を提供することに関心があります。 ブリッジからデータ更新に関する情報を受け取ります。 ユーザーにデータとコントロールを提示する方法のすべてのロジックを含み、実行します。 ユーザーがモデルに(おそらく)影響を与えるアクションを実行したときに、ブリッジに通知します。 興味のある情報をブリッジに通知します。 モデルに関する知識がありません。 ブリッジ モデルとビューの間のコーディネーターおよびトランスレーターです。 モデルとビューの間で受け渡される情報に適切なフォーマット変更を加えます。 「誰が何を知る必要があるか」に関する情報を保持します。 モデルとビューの両方の知識がある。 その他の注意事項 より複雑なプログラムでは、複数のモデルが存在するのが一般的です。この状況では、ブリッジは通常、複数のモデル間の調整/翻訳の仕事を引き受けるため、protocall / API / designモデルの構築対象の権限になります。(たとえば、カードゲームプログラムを構築し、代替のデッキシャッフルモデルを構築する場合、ブリッジを使用して、ブリッジとの適切な通信に必要な機能を決定する必要があります。) ビューとモデルが1つだけの小さな単純なプログラムでは、ブリッジがどちらの側でどの機能を使用できるかを「想定」するのが一般的です。ただし、プログラムがより複雑になると、非効率性とバグのある仮定を回避できるように、ビューとモデルが機能をブリッジに報告することをお勧めします。 ほぼカバーしていると思います。どうしても、私が使用する傾向のあるデザインについて質問がある場合は歓迎します。また、提案をお勧めします。 そしていつものように、お時間をいただきありがとうございます。

10
同じクラスから構築されたオブジェクトは、一意のメソッド定義を持つことができますか?
同じクラスを共有する2つ以上のオブジェクトのポイントは、振る舞いが同じ、つまりメソッドが同一であるということなので、これは奇妙な質問のように思えます。 ただし、フィールドに異なる値を割り当てるのと同じ方法でオブジェクトのメソッドを再定義できるOOP言語があるかどうか興味があります。結果は、まったく同じ動作を示さなくなった同じクラスから構築されたオブジェクトになります。 私が間違っていなければ、このJavaScriptを実行できますか?この質問とともに、なぜ誰かがこれをしたいのでしょうか?

4
明示的なインターフェイス実装を使用してC#のメンバーを非表示にすることはできますか?
C#でのインターフェイスおよび明示的なインターフェイスの実装の操作方法は理解していますが、頻繁に使用されない特定のメンバーを非表示にするのが悪いと考えられているのではないかと考えていました。例えば: public interface IMyInterface { int SomeValue { get; set; } int AnotherValue { get; set; } bool SomeFlag { get; set; } event EventHandler SomeValueChanged; event EventHandler AnotherValueChanged; event EventHandler SomeFlagChanged; } イベントは有用ですが、使用されることはほとんどないことを事前に知っています。したがって、IntelliSenseの乱雑さを避けるために、明示的な実装を介して実装クラスからそれらを隠すことは理にかなっていると思いました。

3
オブジェクトを作成すると、インスタンスフィールドとメソッドの両方、またはインスタンスフィールドのみに新しいメモリが割り当てられます
次のクラスがあります class Student{ int rollNumber; int marks; public void setResult(int rollNumber, int marks){ this.rollNumber=rollNumber; this.marks=marks; } public void displayResult(){ System.out.println("Roll Number= "+this.rollNumber+" Marks= "+this.marks); } } 次に、次のようにStudentタイプの2つのオブジェクトを作成します Student s1=new Student(); Student s2=new Student(); これで、2つの異なるメモリセットがインスタンスフィールドに割り当てられます。今私の質問は、メモリがメソッドに割り当てられているかどうかです(setResultそしてdisplayResult)に2回または1回です。 次の図を参照してください。どの図が正しい情報を提供しているかを教えてください。

4
マイクロサービスとデータ複製
私は新しいアプリケーションを構築しており、マイクロサービスアーキテクチャについて読んでいました。アーキテクチャ自体は、開発、展開、ライフサイクル管理の観点から非常に理にかなっています。しかし、出てきた問題の1つは、マスターデータの処理方法に関するものでした。 たとえば、2つのアプリがあります。たとえば、SalesアプリとTicketingアプリです。これらのアプリは両方とも独自のマイクロサービスとして構築されていると仮定します。ただし、これらのアプリの両方をデプロイする場合(セールスがMongoDBを使用し、チケットがMariaDBを使用すると言う場合)、別々にデプロイすると、アカウント、製品などの同じマスターデータインスタンスにアクセスする必要があります。これは、特定のマスターデータエンティティの所有者アプリ(例:アカウントの場合は販売アプリ)と関係者(例:発券アプリにはアカウントに関する情報が必要)があることを意味します。 これを実現する方法は複数あります。-マスターから関係者へのデータ複製-関係者からマスターへの同期読み取り(同期依存関係はマイクロサービスアーキテクチャパラダイムでは推奨されません)-独自の中央リポジトリ また、アカウント内でも、販売と発券の両方に共通のコア部分(アカウント名、住所など)が存在する場合があります。ただし、アカウントの一部の側面は販売にのみ関連し、他の側面はチケットにのみ関連する場合があります。 上記のオプションのいずれかに関する考え/ベストプラクティス/意見はありますか?
14 soa  services 

2
ソフトウェアの複雑さの管理におけるOOPの有効性に関する研究はありますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新することがありますので、上のトピックソフトウェア工学スタックExchange用。 2年前に閉店。 OOPは、非OOP手続き型プログラミングとは対照的に、ソフトウェアの複雑さを管理する効果的な戦略と見なされることがよくあります。 この概念をテストする研究はありますか?OOPが大規模なプロジェクトの複雑さを管理するのに役立つことがしばしば証明されていますか?

2
C#にJavaよりも多くの機能があるのはなぜですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 これはJavaとC#の引数であることを意図していないことに注意してください。私は、C#の経験のないJavaプログラマーであり、好奇心だけを求めています。 私はC#でいくつかの読書をしましたが、Javaよりもはるかに多くの機能を持っているようです。いくつかの例: 型推論。 dynamic キーワード。 デリゲート。 オプションのパラメーター。 ラムダとLINQ (実際、これらが何であるかわかりません)。 プロパティ。 ただし、JavaにはC#にはない機能は何もありません。 私の質問は、なぜC#にはJavaよりもはるかに多くのネイティブ機能があるのですか?そして、なぜJavaは、プロパティや型推論など、これらの一部を長年にわたって追加しなかったのですか?Java言語の設計者は、より単純なアプローチを取っていますか?この理由は何ですか?
14 java  c#  languages 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.