応用情報技術者過去問題 令和3年春期 午後問8

⇄問題文と設問を画面2分割で開く⇱問題PDF

問8 情報システム開発

クーポン券発行システムの設計に関する次の記述を読んで,設問1~3に答えよ。

 X社は,全国に約400店のファミリーレストランを展開している。X社の会員向けWebサイトでは,割引料金で商品を注文できるクーポン券を発行しており,会員数は1,000万人を超える。このたび,会員の利便性の向上や店舗での注文受付業務の効率向上のために,会員のスマートフォン宛てにクーポン券を発行することになった。
 スマートフォン宛てにクーポン券を発行する新しいシステム(以下,新システムという)は,スマートフォン向けアプリケーションソフトウェア(以下,スマホアプリという)とサーバ側のWebアプリケーションソフトウェア(以下,Webアプリという)から構成され,Webアプリの開発は情報システム部門のY君が担当することになった。

〔新システムの利用イメージ〕
 X社の会員は,事前に自分のスマートフォンにX社のスマホアプリをダウンロードし,インストールしておく。会員がクーポン券を利用する際は,スマホアプリに会員IDとパスワードを入力してログインする。ログインが完了すると,おすすめ商品と利用可能なクーポン券の一覧が表示される。会員が利用したいクーポン券を選択すると,QRコードを含むクーポン券画面が表示される。X社店舗の注文スタッフがQRコードを注文受付端末で読み取ると,割引料金での注文ができる。

〔Webアプリの処理方式の調査〕
 Y君がWebアプリの実現方式を検討したところ,X社のWebサイトで利用しているブロッキングI/O型のWebサーバソフトウェア(以下,サーバソフトという)では,スマホアプリからの同時アクセス数が増えると対応できないことが分かった。
 ブロッキングI/O型のサーバソフトでは,ネットワークアクセスやファイルアクセスなどのI/O処理を行う場合,CPUは低速なI/O処理の完了を待って次の処理を実行する。例えば,表1に示す,QRコードを作成するために必要なWebアプリの処理(以下,QRコード作成処理という)の場合,全体の処理時間のa%がI/O処理の完了待ち時間となる。
pm08_1.png/image-size:576×200
 このため,ブロッキングI/O型のサーバソフトでは,複数のスマホアプリにサービスを提供するために,プロセスやスレッドを複数生成している。しかし,プロセスやスレッドの数が増えると,プロセスやスレッドの切替え処理であるbスイッチがボトルネックとなり,CPUやメモリを追加してもスマホアプリからの同時アクセスへの対応は困難となる。
 そこでY君は,多数のスマホアプリからのアクセスを効率よく処理できるノンブロッキングI/O型のサーバソフトの利用を検討した。ノンブロッキングI/O型のサーバソフトでは,一つのプロセスやスレッドの中で,CPUはI/O処理の完了を待たずに,実行可能なほかの処理を実行する。その結果,Webサーバは複数のプロセスやスレッドを生成する必要がなく,スマホアプリへも効率的にサービスを提供できる。

〔リアクタパターンの調査〕
 ノンブロッキングI/O型のサーバソフトで,Webアプリを動作させるためには,非同期処理の考え方に基づいたソフトウェア設計が必要である。そこで,Y君は,ノンブロッキングI/O型の処理を実現するデザインパターンの一つであるリアクタパターンについて調査した。図1にY君が調査したリアクタパターンの処理の流れを示す。
pm08_2.png/image-size:557×231
 I/O処理の処理結果を利用する処理をハンドラとして定義する。次に,I/O処理の完了待ちを依頼したいメイン処理が,①I/O処理完了後に実行するハンドラ名を引数に"(ア)ハンドラの登録"を行うと,リアクタは"(イ)ハンドラを取得"する。次に,メイン処理がリアクタに"(ウ)イベントのハンドル依頼"を行うと,リアクタはデマルチプレクサに"(エ)イベント待ち"を指示する。デマルチプレクサは複数のI/O処理の完了を一括して監視し,"(オ)I/O処理の完了"を検知した場合には,対応する"(カ)イベント"をリアクタに発行する。イベントを受け取ったリアクタは"(キ)ハンドラを実行"する。メイン処理は,イベントのハンドル依頼を行った後は,I/O処理の完了を待たずにほかの処理を実行できる。

 リアクタパターンを適用する場合は,遅いI/O処理の次に実行される処理をハンドラとして分割するのがよい。しかし,リアクタパターンに基づき設計されたプログラムは,②保守性が下がるおそれがある。

〔QRコード作成処理の設計〕
 Y君は,リアクタパターンを用いて,スマホアプリからのアクセスに対する応答時間が最小になるように,QRコード作成処理を設計した。図2にY君が設計したQRコード作成処理の流れを示す。
pm08_3.png/image-size:548×333
 その後Y君は,新システムのWebアプリの開発を完了させ,X社の会員はスマートフォンを通じてクーポン券を利用することが可能となった。

設問1

〔Webアプリの処理方式の調査〕について,(1),(2)に答えよ。
  • 本文中のaに入れる適切な数値を答えよ。答えは,小数第3位を四捨五入して,小数第2位まで求めよ。
  • 本文中のbに入れる適切な字句を答えよ。

解答入力欄

    • a:
    • b:

解答例・解答の要点

    • a:99.77
    • b:コンテキスト
  • 解説

    • 〔Webアプリの処理方式の調査〕には「ブロッキングI/O型のサーバソフトでは,ネットワークアクセスやファイルアクセスなどのI/O処理を行う場合,CPUは低速なI/O処理の完了を待って次の処理を実行する」とあるので、以下のように全部の処理が逐次的に実行されることになります。
      pm08_4.png/image-size:373×50
      表1の処理全体の時間は、

       0.02+10+0.06+2+15+5+2=35.08秒

      このうち、I/O処理の時間(CPU処理でない時間)は35秒なので、I/O処理の完了待ち時間の割合は、

       35÷35.08=0.99771…=99.771%
      (小数第3位を四捨五入)99.77%

      a=99.77

    • マルチタスクOSでは、タスクスケジューリングに基づいて実行するタスク(プロセスやスレッド)を短い周期で切り替えながら処理を進めます。このタスクの切替えの際に、実行中のプロセスの状態を保存し、これから実行しようとする中断していたプロセスの状態を復元する処理を「コンテキストスイッチ」と言います。

      b=コンテキスト

    設問2

    〔リアクタパターンの調査〕について,(1),(2)に答えよ。
    • 本文中の下線①について,関数呼出しの引数として渡される関数のことを何というか,解答群の中から選び,記号で答えよ。
    • 本文中の下線②について,プログラムの保守性が下がる理由を15字以内で述べよ。
    解答群
    • callback関数
    • static関数
    • template関数
    • virtual関数

    解答入力欄

    解答例・解答の要点

    • 可読性が下がるから (9文字)
  • 解説

      • 正しい。プログラム中で関数呼出しをする際に、引数として渡される関数のことを「コールバック関数」といいます。本問のように非同期処理でイベント発火時に実行する関数を指定したり、関数の処理を拡張するために使います。
        function callback(a, b) {
          return parseInt(a) < parseInt(b) ? -1 : 1;
        }
        var arr = ['10-9','2-2','6-6','12-4','9-2'];
        arr.sort(callback); //関数callbackを引数にして関数呼び出し
      • static関数(静的関数)は、全てのオブジェクトに共有される関数です。インスタンスを生成しなくてもクラス名の指定だけで呼び出せます。
      • テンプレート関数(汎用関数)は、add(int a, int b)、add(double a, double b)のように引数や戻り値の型だけが異なった、関連する複数の処理を1つの関数として記述したものです。実際に使われている引数の型に応じて、コンパイラがその型に対応する関数を生成するようになっています。
      • virtual関数(仮想関数)は、下位クラスにおいて関数の処理内容を再定義(上書き)できる関数です。
    • 仮に処理1から処理7の処理をコールバック関数を利用して記述した場合を考えると、以下のソースコード例のように、関数の深い入れ子構造(通称、コールバック地獄)が現れることになります。JavaScriptのAjax処理でもそうであるように、コールバック関数を多用したコーディングは処理の順序関係が分かりにくいため、ソースコードが非常に読みにくくなります(可読性が下がる)。これにより保守性の低下を招きます。
      処理1;
      処理2(callback1(){
        処理3;
        処理4(callback3(){
          処理6(callback4(){
             処理7;
          });
        });
      },
      callback2(){
        処理5;
      });
      ∴可読性が下がるから

    設問3

    〔QRコード作成処理の設計〕について,(1),(2)に答えよ。
    • 図2中のcfに入れる適切な処理番号を,表1中の処理番号を用いて答えよ。ただし,複数ある場合は全て答えよ。
    • 図2のようにQRコード作成処理を設計した場合,処理4~7はどのような順序で完了するか,処理が早く完了する順にコンマ区切りで答えよ。

    解答入力欄

      • c:
      • d:
      • e:
      • f:

    解答例・解答の要点

    • c:2
    • d:3
    • e:4,5
    • f:6
    • 4,6,7,5
  • 解説

    • リアクタパターンを採用する場合、I/O処理を行う際は、リアクタにそのI/O処理の結果を利用するハンドラの実行を依頼することになります。表1でI/O処理の完了が開始条件になっているものとして、
      • 処理2の完了が開始条件になっている処理3及び処理5
      • 処理4の完了が開始条件になっている処理6
      • 処理6の完了が開始条件になっている処理7
      があるので、処理同士の先後関係としては以下のようになります。
      pm08_5.png/image-size:517×115
      これを図2に照らし合わせると、ハンドラ1が処理3,4,5、ハンドラ2が処理6、ハンドラ3が処理7に対応していることがわかります。

      cについて〕
      メイン処理で処理1に続いて実行する処理なので「処理2」が当てはまります。

      deについて〕
      処理2の結果を受けて実行する処理ですから、「処理3→処理4」と「処理5」が当てはまります。処理3と処理4は逐次実行する必要があるので、処理3は[d]に処理4は[e]に入れなければなりませんが、処理5は非同期処理なので[d][e]のどちらに入れてもOKです。

      fについて〕
      処理4の結果を受けて実行される処理、処理7を実行するイベントハンドルを依頼する処理ですから「処理6」が当てはまります。

      c=2
       d=3、e=4,5(またはd=3,5、e=4)
       f=6

    • 処理4は3ミリ秒、処理5は15ミリ秒、処理6は5ミリ秒、処理7は2ミリ秒の処理時間が掛かります。処理3,4,6,7と、処理5は非同期で並列実行されるので、4→6→7→5の順で完了することになります。
      pm08_6.png/image-size:393×119
      ∴4,6,7,5
    問8成績

    令和3年春期 午後問題一覧

    問1 問2 問3 問4 問5 問6 問7 問8 問9 問10 問11 採点講評
    © 2010-2024 応用情報技術者試験ドットコム All Rights Reserved.

    Pagetop