ほとんど知っている - ソフトウェアアーキテクチャの設計について話をする組み込みソフトウェア開発エンジニア

記事を書きます

ソフトウェアアーキテクチャの設計について話をする組込みソフトウェア開発エンジニア

画像

画像

恐ろしい夢を感じなくなりました

40人がこの記事に同意します

ソフトウェアアーキテクチャの設計について話をする組込みソフトウェア開発エンジニア

注意:ここでは組み込みに基づいて、特に、Linuxの範囲を超えたプラットフォーム、SCMおよびその他のRTOS


 

  • 私は、組込みソフトウェア開発に従事して6〜7年を持って、BSP、ドライバ、アプリケーションソフトのAndroidホール、フレームワークと他の人がカバーしています。こうした懸念の方向として、分散Web、バックエンドサーバー、組み込みのための産業の発展だけでなく、どのくらいの技術に通常の注意に加えて。
  • zeromq NIO、ファイルディスクリプタ、ngnix、:前作と、このエリアには、実際の需要が、彼らの通常の注意のようないくつかの知識を、学習するので、業界の方向の変化のアイデアの最近の開始は、バックエンドサーバーの開発に関連やりたいです 、 libevent、libuv、高い並行性、分散は、Redisのパイソン、トルネード、Djangoは、ヘテロアリールは比較をカバーし、毛皮は罰金ではない、理解しています。驚くべきことに、多くの場合、インターネット業界を軽蔑、面接の機会が少ないです。
  • 私は、問題はそれが何であるかを最終的に考えて、この時点で、その起源は、それを満たされなければなら埋め込むことがないのですか?まず、組み込み、ドライバ開発が、業界のラッシュ(9年前に少し誇張されたが、8、が、組み込みを聞いなぞらえたJava Webは、いくつかのオハイオ州に回帰し)

問題は、私は私自身の理解の下に言って、いつもの理由です。

なぜ、組込みソフトウェア・アーキテクトかどうかに本当に背の高い埋め込まれていませんか?


 

  • プルフックおよびその他の求人サイトを開き、検索アーキテクチャ部門、そこので、上のシステムアーキテクトの様々な、ウェブ建築家、建築家のバックグラウンド・サーバーとなりますが、それだけでは、組込みソフトウェアアーキテクトを参照することは困難であるだろう。それにアーキテクチャを駆動する必要はありません組込みソフトウェア・アーキテクチャは、必要ありませんか?答えはもちろん必要ありませんが、この点で、なぜ何の位置?

マイビュー:現在の国内の組込み開発は、組込み開発や組み込みアプリケーション開発の下部に分かれているが、一般的に組込み開発は、下駆動開発と呼ばれている、またはBSP開発、時にはそこに呼ばれているLinuxのすべての名前を聞いて、カーネル開発を非常に大きいの感じ。

なぜ建築家で、このようなビッグネームはしませんでした:Linuxカーネルの建築家があるため、独自のLinuxカーネルやの、など国選弁護人としてライナスLinuxカーネルの開発であるオペレーティングシステムは、一般的な問題に対処するための共通のプラットフォームで、Linuxの大規模なオープンセッションを牛はただ、周辺機器をやって、その上に仕事のほとんどは唯一のフレームワークの規則に従って充填する必要がありますが、また、同社のビジネスニーズの大半を提示するために、再生するために多くのない場所を残し、優れたアーキテクチャのルールを開発しました統合は、組み込みプラットフォームを移植、切断を構築し、ビジネス要件は、内部のカーネルが提供する機能の範囲を超えることはありません。新しいアーキテクチャで結果として得られる、設計、実装するために、開発者が必要です。組み込み開発者がやっているBSP:周辺機器の多種多様な試運転の他には、裏面用のハードウェアは、デバッグ周辺機器の数が増加します、ここでは詳細に説明されていない特定のジョブのためのソリューション(一部のバグの安定性であります経験、幅を増加させ、深さはデバッグによってだけでなく、貢献度を改善することではありません- 「デバッグします- 」迅速な開発のこのラインを起動し、解決策が実際にいくつかの安定性の問題は、経験を蓄積する必要がされます)

組み込みアプリケーションの開発は、一般的なビジネスロジックは、採用担当者は建築家のレベルを見つける必要性を全く感じませんので、多くの人々が、無視され、比較的簡単です。

この時点で、建築家を必要としない、実際に埋め込まれた産業を感じ、また大騒ぎインターネット業界を軽蔑しませんでした。


 

  • しかし、それは、このことのようですか?ほとんどの普通の人のために、またはコースIのLinuxカーネルの建築家を(「妄想」しませんんので、カーネルに組み込まれた基本的な能力、駆動型アーキテクチャ提案するアーキテクチャ層の最適化の発展のために、国内の開発者は、あまりすべきではありません私はいくつかのより多くを飛ぶために、いくつかのバグを発見し、解決するため、)ダニエルの能力がなければならないの人々があると信じています。

そして、組み込みアプリケーション層の開発のために、私たちは本当にそれアーキテクチャを必要としませんか?


 

  • 彼らの実際の経験についての下に埋め込まれたデバイス・アプリケーション・ソフトウェアアーキテクチャの設計と最適化を持っているために:私は一度プロジェクトを引き継いだ、このプロジェクトは、マルチスレッド、単一のプロセスモデルを使用して、このプロジェクトは、B、Cには、いくつかのモジュールを含んでいます、D、Eの代表。プロジェクトのビジネスロジックは、これらのモジュールは、関連性の多くを持っていることを決めました。例:モジュールのオリジナルデザインは、状態監視モジュールは、それが監視状態に基づいてBを呼び出します、Cモジュールのインターフェイス機能の一部(開発者はほとんどがとても乾燥しているので、マルチスレッドの利点は、直接呼び出しが簡単であり、単純です失礼)が、ニーズが常に前のルーチンによれば、モジュールFは、Fモジュールは、モジュールを必要とするプロセスの状態を監視追加、変更され、この関数は、2つのステップで完了した:1、2、インターフェースモジュールFを提供、インタフェースモジュールへの呼び出し。これまでのところ、新たな需要を解決するために、「完璧」となっています。
  • 前述のニーズは常に変化している、新たな需要が再び、カスタムニーズのための顧客は、あなたが他のグラムモジュールを追加する必要があり、モジュールは、同じ処理の状態を監視しますが、カスタマイズの必要性を必要としないだけで、この時間をFモジュールに参加しました最もシンプルで、粗な方法は、プログラムの2つのバージョンを構築し、前のカスタマイズや一般の需要のための必要性を区別するためにマクロを定義することです。このアプローチは、単純なように見えるが、徐々に需要のカスタマイズは、プログラムのように多くのカスタマイズされたバージョンのメンテナンスが悪夢、コード管理であれば、後に増加し、汎用性が大きな問題になりますが、コードが異なるマクロ定義のための分化で満たされていること処理、XXX IFDEF#; do_something;ダイナミック監視装置のモデルバージョン、ダイナミックサポートに加入することをお勧め#endifのすべてのカスタムは、このように別のビルド手順のメンテナンスを軽減、プログラムのビルドバージョンを必要とします。しかし、このアプローチは、バージョンのビルドプログラムの保守作業に取り組む問題マクロ定義差別治療を解決していませんが、これらの判断は一つだけの場所で分化た場合、裁判官の前にマクロは、動的なデバイスに、バージョン番号を確認します行って、それは大きな複雑な問題が発生することはありませんが、明らかにこれは良い保証するものではありません、これらのプロセスの違いがあるかもしれないプロジェクト全体の隅々にまで広がっていく、このプロジェクトは、それらを維持するために悪夢になります。
  • ソフトウェアは、任意の高度なアイデアを必要とせず、ほとんどの人はこの場所の統一された管理上の差別化だけを集中する部分的に、統一された集中管理に場違い抽出された変化の違いを考えます。一般的にはフックを設定するコールバックを使用し、その後、需要のコールバックの差をカスタマイズし、上記一例に相当する分化構成プロセスコールバックを行うことであり、それはモジュールにフックを追加することで、システムの初期化装置におけるバージョンに従って異なる数、差別カスタムコールバックハンドラ、我々はまた、それ以外の場合は、まだ様々なコーナーに散在し、同じ場所にこれらのカスタムコールバック関数に対処する必要があるが(前者のアプローチは、これらの違いのフックを配置することではありませんが、設定することはできません意味がありません。一緒に)、この治療法は、他の利点は、我々はつまり、私たちはコードに(以前のモジュールを変更せずに機能を追加し、機能要件を変更し、モジュールの処理に影響を与えないということですもたらしますコールフローモジュールを変更する方法)、それはモジュールの分離を実現するように。
  • 他のカスタム要件については、少なくともいくつかの開発者が少し楽になるように、最初のプログラムに比べアーキテクチャプログラム(実際にはアーキテクチャに言及)の第二の点は、開発者が修正するために必要なアップグレードがたくさんされていますコールバック処理、注意がそれの一部を分化しました。

ソフトウェアは、絶えず進化する必要がある最適化のそれのための余地がある、第二の選択肢はない、もちろん、最善の解決策の権利でありますか?

次Xianpao問題、主の利点について、マルチスレッド、マルチプロセスの利点と欠点/マルチプロセスモデルについて話:

教科書の説明が記載されていない、私の最初の大きなプロジェクトには2つの主な理由のために、関係なく、パフォーマンスの、尊敬マルチプロセスモデルであります:


 

  • あなたが信じていない場合は、よく、あなたが今ランダムサブモジュールプロジェクトである必要があり、モジュール間のクロス直接呼び出し:モジュールをデカップリング:マルチスレッドモデル事業は、以下の問題があるでしょうどのように多く持っている必要があり、多くの開発者は、維持・発展モジュールを削除し、私はそれを構築することができた場合(のみ実行する必要はありません構築する必要があります)を参照してくださいビルドの下で、私たちは、ほとんどの場合、関数呼び出しを越えてくると信じて、グローバル変数の状況が見つからない、このノートモジュール間のあなたの強い結合が存在します。ダイレクトコールにつながる各マルチスレッド自然の利点、目に見えるアドレス空間は、非常に、簡単に経験の浅いエンジニアがたくさんあるので、あなたが簡単にマップするために静的インタフェース機能が発生した場合、単純で、粗インターフェイスダイレクトコールを書くことは簡単です私たちは、静的を削除直接使用を引き継ぎます。ように機能してプロジェクト全体は、より高い、モジュール間の結合をより多くのクロスオーバーを追加し続けました。

私はその理由を尊重した理由は、時間で、その結果、通信のこの「利便性」からのマルチプロセス、マルチプロセス、物理的に隔離されているモジュールの相互作用を実装するこの相互作用の詳細が必要だと思いますし、そうであれば必要に応じて、それはプロセス間通信は、いくつかの比較的トラブルになりますので、開発者は慎重インタフェース、プロトコル、または自分自身のトスの定義を検討するインタフェースの明確な考えに沿って相互作用を軽減することができるようになります(さらにシンプルなインターフェース定義かどうかを検討しますあなたはとてもスムーズになっている場合a)に、それは、人生のようなものです、人々はあまりにも、考えすぎだと思うかもしれないが、いくつかのでこぼこ道ならば、それを別の認識を持つことになります。

だから私のアイデアは、あなたがより多くの思考設計プロセスを考えるように強制する物理的な結合モジュールを削減するマルチプロセスをモデル化することです

  • 抽象汎用コンポーネント、別個のビジネスロジック機能と共通の機能は:プロセスモデルのマルチスレッド、マルチプロセス・モデルを変更する場合、多くの場合、いくつかのインタフェース・コード反復は、プロセスモジュールの複数の発生を見つける、インターフェイス機能があるため前であります二つの別々のプロセス、界面必要、B後に分離bのプロセス空間は、誰もが、呼び出されたB、モジュールであり、このようなインターフェースモジュールAとして、直接呼び出すことができ、それぞれ、コードを複製、自己説明を達成するためにソフトウェア工学では、これはタブーで、排除しなければなりません。また、非常に単純な、これらのインタフェースの分離プロセスは、libが行われ、複数のモジュールと呼ばれ、あなたが仕事のこの部分を終了したときに呼び出す他のモジュールのために、何を見つけることはインターフェイスを剥奪されていないが、プロジェクトの一般的な目的として使用することができますアセンブリの存在下、完璧な場合は、コードは、各モジュールは独立したサービス処理モジュールであり、LIBベースアセンブリに一般的です。
  • 便利なロケーションの問題:別のスレッドが異常終了したマルチスレッドモデルでは、それは、あなたがスレッドが死んでいるが、スレッドモジュールは、複数のチーム、保守担当者で構成されている場合は見つけることができます全体のプロセスがクラッシュ情報の数によって、当然のことながら、終了させます全体のプロセスアウトの崩壊後、そのグループによって解決判断する方法を大きな問題になりますが、時々遭遇したスレッドによって引き起こされるモジュールがスレッドに掛かっの現象であるが、実際には別の(カップリング惨劇)でありますこの場合、必然的なチーム間の論争、言い逃れ。(自信エンジニアは自分のコードに問題はないと思います)

そして、マルチプロセス・モデルならば、よく、あなたのサービスプロセスは、それのためにあなた自身の理由を見つけ、について議論することは何もハングアップしません。

  • 簡単にパフォーマンステスト:リソース消費マルチスレッドの種類単一のスレッドは、資源消費のプロセス全体が高い場合には3のように、、、(組み込みシステムの少なくとも一部は完璧コマンドではありません)モジュールスレッドの位置を決定する方法の問題を見て非常に良いではありません困難なプロセスで多くのリソースを構成する選択肢、およびそれがマルチプロセス・モデルの場合は、バーの下にチェックするために来る、実際には、これは粒度の問題だったが、同じシステムを複数のプロセスに分割して、単一のプロセスの複雑さのみ、特定のプロセスの複雑さと複雑さの低減よりも低く、それが簡単にあらゆる種類の問題を見つけるために見つけます。
  • 分散型の展開:インターネット業界は、常に組込み業界は苦いを強制的にどのような分散型、クラウドああを強調しているが、一見任意のほとんどの場合、また、実際には、配布、組み込みのシングルチップ、独立の必要はありません非常に少ない遭遇した分散、実行します。一つのデバイスでの場合、あなたの日には、チップがそれを処理するために2つのチップに分散し、完全な機能であったであろう場合でも、マルチプロセスの詳細を拡大することは容易です。

これは単に特殊なケースは、実際には、それが分散組み込み機器業界であるが、初めはかなり開発された分散ルートへの集中からよりも、分離されています。

  • 同社のコード特権の分離を容易にするために:実は、私はこのような行為を軽蔑する、同社は独自の従業員を信頼しているが、中国での善意の観点から、既に。、アイソレーションが理解できるようにしてください。前述のモジュールの除去は、おそらく構築することはできません場合は、マルチスレッドモデルは、すべてのコードは、明らかではないので、各モジュールはライブラリのみの形で提供することができるが、私は思います、すべてのエンジニアにさらされて置きます共通リポジトリに編成汎用関数インタフェースは、ライブラリ、ビットとして提供するビジネス関連のモジュール場合も、通常の慣行です。

この時点では実際には、これらの利点のすべてを追加、ない非常に重要なポイントは、複数のプロセスが絶対圧倒的な優位性マルチスレッドモデルを持っていることはできませんが、マルチプロセスモデルは思考のいくつかを解決するために、より強制エンジニアである、という見解の個人的な視点から問題。(これらの問題経験豊富なエンジニアはどんなモデルだと思いません)

それはそんなに言う、それ以外の場合は、唯一の紙の上で、マルチプロセスモデルへのプロジェクトの前に、この例を考えると、次のことを始めました。

この問題での矢面に立つ:マルチプロセス通信を選択し、複数のスレッド間の直接呼び出しは、通信、マルチプロセスにそれを選択する方法、その後、使用されていませんか?


 

  • ここに列挙されていないLinuxでの多くの方法は、非のIPC申し出大規模なデータのunixソケット機を用いて制御の転送量、通信メッセージ、より良い方法は、ソケットを使用することで、より本実施例(このアプローチましたメリットは何ですか?あなたは、単一システム、分散システムを作るために必要がある場合、利点は明らかです)
  • しかし、前述の例の機能を実現するためのソケットの使用のみが、同じ問題が存在します。または、前の例では、まず私たちはもはやすべきではない、その理由は単純で、マルチプロセスモデルの使用を最適化し続けることができ、以前の後に2番目のオプションを説明していません私たちは説明する必要があります。
  • プログラムに基づいており、単純なアプローチは、コールは(通信プロトコルが良い定義することができます)直接ソケット通信に変更されましたが、おなじみのソケットの開発エンジニアは、通信が最初のソケットに主に二つに接続されているいくつかの準備作業を(開始しなければならないことを知っています)関連モジュールは、前の例では、追加Fモジュールだけでなく、モジュールは、接続、およびFを確立する場合に、接続を確立するために、モジュールとモジュールB、Cに、次のようになります。我々はモジュールを追加し、関連する、クモの巣織り、ノード間の複雑な関係、およびプログラムの一部を見つけてますかのように心が接続図を描くこのような場合には、コードモジュールを変更する必要があります、そしてこのような状況では、マルチスレッド化モデルよりも複雑なだけでなく、より複雑。このアプローチは間違いなく悪夢です。

まあを解決するためにどのように、私は多くの人がバスの配布を使用して方法を考えなければならないと思います。学びAndroidのシステム開発は、デスクトップがDBUS、インターネット業界の開発者が知っていなければならないと思うの理解、OpenWrtのはubusを思うだろう理解し、バインダーと思われますRedisののオファー/パブモジュールでのSubを。

バインダーの上に、ubusおよびその他の原理は、非常にシンプルである代わりに、メッセージセンターの転送を使用しての、メッセージセンターを作成し、前方のルーティングモデル、他のすべてのモジュールの間には直接的な相互作用を構築することである、ルーティング、およびルーティングルールをどのように決定するか、サブスクリプション/ルールを定義するためにリリースされObserverパターン。(エンベデッド開発やC言語の開発者は、多くの場合、誤ってデザインパターンはオブジェクト指向言語、オブジェクト指向言語に関連付けられていることを考えると、多くの大規模な牛やこの地域の人気がありますが、ユニークですが、開発者の情報の一部を与えられました比較的孤立チャンネル、この考えにつながる)まだ非常に人気があります

このモデルに基づいて、需要上記の例は、良い解決策である、メッセージセンターモジュールを追加し、すべてのモジュールが唯一のメッセージセンターモジュールと通信する必要が接続され、その後、イベントが発生したときに、関心のあるイベントをサブスクライブする、唯一のに必要その上で適切な治療。

例えば上記モジュールB、Cのサブスクリプションモジュールイベント、モジュールが特定のイベントを検出した場合、最初の着信メッセージセンターは、モジュールB、Cにメッセージセンターを転送することは、イベントを解放し、新しいモジュールの追加Fは、唯一の拡張機能は非常に便利であるように、モジュールのコードを変更することなく、モジュールに加入する必要があります。

カスタマイズされた開発のために、上述しながらモジュールgを追加する必要がある場合も同様に、カスタマイズされたバージョンを合理化され、このバージョンのみカスタマイズモジュールgを必要とするであろう独立したプロセスが開始されるように、イベントサブスクリプション・モジュールとすることができる、カスタマイズされましたビルディング・ブロックなどの機能を追加するだけに(開始)または(開始されません)引き抜きにモジュールを置く:バージョンとモジュールgのジェネリック版の違いは、ソフトウェア・エンジニアリングの目標を達成するために、プロセスを開始するかどうかであります部屋の機能を変更したり、いくつかのモジュールに限定、本体フレームには影響しません。

おそらくプロジェクト要件プロセスの段階的な最適化の上記の説明は、例が埋め込まれたプロジェクトに基づいているように見えますが、ソフトウェア工学に一見も同様に適用可能。


 

  • インターネット業界を来た:建築家は、サインインするように電気の供給業者として(、アプリケーションサーバ機能は、以前に事業を分割に基づいて、より洗練された技術的なアーキテクチャの変更、言及通常、最初のを共有するには、このウェブサイト上の主要なサイトの資料を表示スプリット登録、取引、コモディティ、売り手とその他の事業サービス)、そして同時を提供するために、複数のサーバーにデプロイされているサービスのうち、分割。いくつかの馴染みがあり、まだ同様の持っているかどうかを分割マルチスレッド、マルチプロセスの前で話しました。

この分割はまた、通信の問題を経験している、この時間は、メッセージングミドルウェアの多くは、このようなアリduboo、これらのミドルウェアの原則の簡単な理解、サブスクリプションの出版物にほかなら、RPCメカニズムとして、浮上し、私たちは同じくらいを言うことができますが、難易度これは、開発し、合意の処理性能を向上させることです。

インターネット業界のロードバランシングスキームの制御の下、フロントエンドのロード・バランシングの場合、1つのメッセージセンターのような。

これまでのところ、単に問題を説明するために組込み業界のビジネス・ロジックは、比較的簡単ですが、ソフトウェアの設計は、考え方は同じであるに基づいて、同じであるが、実際には、慎重に検討した後、まだ構造上の改善点がたくさんあるでしょう、デザイン。

しかし、私は問題を解決することができ、いくつかのではないので、良い感じのアプローチを使用して、簡単なビジネスロジックを与え、いくつかの組み込み開発者は、最適化し、改善する方法について考えていないことを悲しく感じます。例えばプログラムの、上記の例では、少し需要のカスタマイズで、メンテナンスも大した問題ではない場合は、さらに多くのカスタマイズを必要とし、その後、いくつかのジュニアプログラマがコードのセットの責任者を経由維持することができ募集プロジェクト会社は存在しません。

また、組込み業界やインターネット業界では一般的なソフトウェアエンジニアリングのアイデアは約我々は心配する必要があり、乗り越えられない壁が存在してはなりません。

2017年7月18日に編集されました

組み込み開発

組み込みライフ

プロセス

405件のレビューを同意

シェア

集めます

<投稿者:https://zhuanlan.zhihu.com/p/27958152?utm_source=wechat_session&utm_medium=social&utm_oi=27548712960000&from=singlemessage&isappinstalled=0&wechatShare=1&s_r=0>


おすすめ

転載: www.cnblogs.com/lizhensheng/p/11117388.html