令和5年度 秋期 応用情報技術者試験 午後問題 問8 スマホアプリのマルチスレッド処理設計

テクノロジOS・ソフトウェア

この問題は2023(R5)秋 応用情報技術者 午後に出題されたものです。出題時点の法令・制度に基づく内容のため、現行の内容と一致しない場合があります。

本ページの問題文・選択肢は、原本の体裁を Web 表示用に正規化しています(改行・記号・数式・図表参照の調整)。設問の趣旨および正解に影響する変更は加えていません。

学習ガイド

顧客との接点強化のために活用されるスマートフォンアプリの開発を題材に、複数の処理を同時に進めるマルチスレッド処理を問う問題です。時間のかかる通信や計算を別スレッドに逃がして画面の応答性を保つという設計の勘所を、空欄a・bの穴埋めを通じて確かめます。単に用語を当てはめるのではなく、どの処理をなぜ並行化するのかという意図を読み取ることが要求されるため、この記事ではUIとバックグラウンドの役割分担を軸に各設問の根拠を整理します。

この記事で押さえる論点

  • 複数処理を並行させるマルチスレッドの基本的な仕組みを説明できる
  • スレッド間で共有する処理と分離すべき処理を判別する
  • 空欄a・bに入るスレッド制御の字句を解答群から選ぶ
  • 並行処理での応答性向上の狙いを設計意図として述べる

問題本文

スレッド処理に関する次の記述を読んで,設問に答えよ。

B社は,首都圏に約50店の美容室を運営する美容室チェーンである。B社では顧客に顧客カードを発行し,B社の全店舗で顧客カードを持参した顧客に割引価格でサービスを提供している。近年,テレワークなどで外出機会が減ったことによって,顧客の来店回数が減少しており,売上が減少傾向にある。
そこでB社では,顧客に美容室に来てもらうために販売促進活動を行うことにした。この販売促進活動の一つとして,スマートフォン向けサービス(以下,新サービスという)を提供することにした。この新サービスの開発は,B社のWebサイトの構築経験がある情報システム担当のCさんが担当することになった。

〔新サービスの機能〕

Cさんは新サービスの開発に向けて,全店舗の店長から“顧客にもっと来店してもらうためのアイディア”を募った。集まったアイディアを基にCさんが考えた新サービスのトップ画面と四つの機能を図1に示す。

図1 新サービスのトップ画面と四つの機能
図の説明テキスト

新サービスのトップ画面と四つの機能を示す図と表。
左側には「B社美容室」のトップ画面が描かれている。画面内には顧客番号、氏名、来店日、担当美容師が表示され、下部には「来店予約」「お知らせ」「クーポン」「おすすめの髪型」の4つのボタンが配置されている。
右側には機能説明の表がある。

機能 機能説明
来店予約 店名,日付,希望美容師,希望コース(カット,パーマなど)を指定して予約可能時間を検索し,来店予約を行う機能と予約情報を確認,変更する機能。
お知らせ キャンペーン,新商品の入荷などの情報を知らせる機能。
クーポン クーポンを配付する機能。
おすすめの髪型 スマートフォンのカメラで撮影した顧客の顔の特徴情報を基に,顧客ごとに似合う髪型を提案する機能。

〔新サービスを提供するアプリケーションソフトウェア〕

次にCさんは,新サービスを提供するためのアプリケーションソフトウェア(以下,アプリケーションという)について調査した。その結果,アプリケーションの代表的な種類には,abがあることが分かった。aは,サーバでHTMLを生成してスマートフォンに送信する。スマートフォンのOSの差異を考慮した開発は不要だが,カメラやGPSなどのデバイスの利用が一部制限される。一方bは,それ自体をスマートフォンにインストールして実行するもの(以下,スマホアプリという)である。OSの差異を考慮した開発が必要であるが,カメラやGPSなどのデバイスを制限なく利用できる。この調査結果からCさんは,新サービスはbとして開発することを提案し,上司の承認を得た。

〔トップ画面の開発〕

次にCさんは,Java言語を用いてスマホアプリのトップ画面の開発に着手した。トップ画面を実装し,画面の描画処理の中で,顧客番号に関連付けられた顧客氏名,来店日付,担当美容師氏名の情報をサーバから取得して画面に表示する処理を行うようにした。しかし,このスマホアプリを実行したところ並行処理に関するエラー(例外)が発生し,スマホアプリの実行が中断された。

このエラーの原因を究明するために,スマートフォン上で動作するGUIアプリケーションにおける並行処理を行う仕組みに関して調査を行った。スマートフォンのOS上で処理を実行するための仕組みとしてcdとがある。cは,独立したメモリ空間を割り当てて実行されるものであり,多くの場合アプリケーションの実行単位ごとに一つのcで実行される。一方dは,一つのメモリ空間を共有しながら実行されるもので,一つのcの中で,複数のdを実行することができる。

GUIアプリケーションの開発では,画面描画,画面操作などの画面ユーザーインタフェースに関する処理を行うメインスレッドと,メインスレッドと並行して比較的処理時間が長い処理を行うバックグラウンドスレッド(以下,ワーカースレッドという)とを分けて実装する必要がある。また,ワーカースレッドによる画面ユーザーインタフェースに関する処理は禁止されていることが分かった。

そこで,トップ画面の処理をメインスレッドとワーカースレッドとに分けて実装することにし,トップ画面を完成させた。

〔おすすめの髪型機能の開発〕

次にCさんは,おすすめの髪型機能の開発に着手した。おすすめの髪型機能の実現に必要な処理を表1に示す。なお,表1中の開始条件とは当該処理の実行を開始するために必要な条件であり,処理時間は当該処理の実行に必要なスマートフォン内の計算時間と標準的な通信時間の合計時間である。

表1 おすすめの髪型機能の実現に必要な処理
図の説明テキスト

表1 おすすめの髪型機能の実現に必要な処理

処理名 処理内容 開始条件 処理時間(ミリ秒)
処理1 スマートフォンのカメラデバイスから取得したカメラ映像を画面に表示して,顧客が撮影ボタンを押した時点の画像を顔写真として保存する。 なし 100
処理2 画面に“処理中”のメッセージを表示する。 処理1の完了 10
処理3 処理1で保存した顔写真から顔の特徴点を抽出する。 処理1の完了 100
処理4 処理1で保存した顔写真から毛髪部分を削除する画像処理を行う。 処理3の完了 150
処理5 処理3で抽出した特徴点をサーバに送信し,おすすめの髪型の画像を取得する。 処理3の完了 200
処理6 処理4の結果画像と処理5の画像を合成する。 処理4,処理5の完了 50
処理7 処理6で合成した写真を画面に表示する。 処理6の完了 10

表1の七つの処理を行うために,メインスレッドと二つのワーカースレッドを作成して処理を行うプログラムを実装した。処理4と処理5は並行に実行できるので,別々のワーカースレッドで処理することにした。このとき,処理6の実行の開始条件は処理4と処理5が共に完了していることなので,二つのスレッドの完了を待ち合わせるe操作を処理6のプログラムに記載した。

Cさんは,処理1〜処理7で構成されるおすすめの髪型機能を実装してテスト用に準備したスマートフォンで実行したところ,通信環境の良い場所では正常に動作したが,通信環境が悪い場所ではサーバからの応答を待ち続けてしまう問題が発生した。この問題を解決するために処理5のプログラムにある処理を追加した

その後,Cさんはスマホアプリの全ての機能の開発とテストを完了させ,B社は新サービスを用いた販売促進活動を開始した。

設問と解答・解説

設問1

本文中の 空欄a, 空欄b に入れる適切な字句を解答群の中から選び、記号で答えよ。

(1)

空欄a について答えよ。

  1. Javaアプレット
  2. Webアプリケーション
  3. コンソールアプリケーション
  4. ネイティブアプリケーション

模範解答

選択肢イ: Webアプリケーション

配点 2

解説

昨今、スマートフォンアプリケーションソフトウェアの開発において、アプリケーションの提供形態は重要な設計要素である。

  • 本文において、Webブラウザ上で動作し、端末のOSなどに依存せずに提供できるアプリケーション形態は Webアプリケーション と呼ばれる。
  • したがって、空欄aには「Webアプリケーション」が該当する。

各選択肢の解説

  • ア (Javaアプレット): Webブラウザ上で動作するJavaプログラムであるが、現在のスマートフォン向けの主要な開発形態ではないため誤り。
  • ウ (コンソールアプリケーション): コマンドライン(CUI)で動作するアプリケーションであり、一般顧客向けのスマートフォンアプリとしては不適切であるため誤り。
  • エ (ネイティブアプリケーション): 端末固有のOSに直接インストールされて動作する形態であり、空欄aの文脈(ブラウザ動作)とは異なるため誤り。

(2)

空欄b について答えよ。

  1. Javaアプレット
  2. Webアプリケーション
  3. コンソールアプリケーション
  4. ネイティブアプリケーション

模範解答

選択肢エ: ネイティブアプリケーション

配点 2

解説

空欄bには、端末の機能(カメラやGPSなど)を最大限に活用できるアプリケーションの形態が入る。

  • スマートフォンのOSに特化して開発され、端末上のハードウェア機能に直接アクセスしやすい形態は ネイティブアプリケーション である。
  • したがって、空欄bには「ネイティブアプリケーション」が該当する。

各選択肢の解説

  • ア (Javaアプレット): プラットフォーム非依存の技術であり、端末固有の機能を直接引き出す目的には合致しないため誤り。
  • イ (Webアプリケーション): ブラウザ上で動作するため、端末固有のハードウェア機能へのアクセスには制限があることが多く、空欄bの文脈に合致しないため誤り。
  • ウ (コンソールアプリケーション): 顧客のスマートフォン上でリッチなユーザーインターフェースや端末機能を利用する用途には適さないため誤り。

設問2

〔トップ画面の開発〕について答えよ。

(1)

本文中の 空欄c, 空欄d に入れる適切な字句を解答群の中から選び、記号で答えよ。
まずは 空欄c について答えよ。

  1. イベント
  2. ウィンドウ
  3. スレッド
  4. プロセス

模範解答

選択肢エ: プロセス

配点 2

解説

スマートフォンアプリケーションを動作させるオペレーティングシステム(OS)における、プログラムの実行単位に関する基本的な知識を問う問題である。

  • OSからメモリなどのシステム資源を割り当てられて実行されるプログラムの基本的な管理単位は プロセス である。
  • よって、空欄cには「プロセス」が入る。

各選択肢の解説

  • ア (イベント): ユーザーの操作などをきっかけに発生する事象を指し、実行単位ではないため誤り。
  • イ (ウィンドウ): 画面上の表示領域を指すUIの概念であり、OSの処理の実行単位ではないため誤り。
  • ウ (スレッド): プロセスの中でさらに分割された並行処理の単位であり、OSからの大きな資源割り当て単位である「プロセス」とは異なるため誤り。

(2)

空欄d について答えよ。

  1. イベント
  2. ウィンドウ
  3. スレッド
  4. プロセス

模範解答

選択肢ウ: スレッド

配点 2

解説

空欄dは、プロセス内で複数の処理を並行して実行するための仕組みに関する記述である。

  • ひとつのプロセス内で、さらに細かく分けられた並行処理の実行単位を スレッド と呼ぶ。
  • マルチスレッド処理を適切に設計することが、UIの応答性を保つ上で重要となる。
  • よって、空欄dには「スレッド」が入る。

各選択肢の解説

  • ア (イベント): 状態の変化やユーザー操作などの通知であり、処理の並行実行単位ではないため誤り。
  • イ (ウィンドウ): 画面表示の単位であり、処理の実行単位ではないため誤り。
  • エ (プロセス): OSが資源を割り当てる大きな単位であり、並行処理を行うためのより小さな単位は「スレッド」であるため誤り。

(3)

本文中の下線①について,ワーカースレッドで実行すべきではない処理を解答群の中から選び,記号で答えよ。

  1. サーバから取得した情報を画面に表示する処理
  2. サーバからのレスポンスを待つ処理
  3. サーバへリクエストを送信する処理
  4. ホスト名からIPアドレスを取得しTCPコネクションを確立する処理

模範解答

選択肢ア: サーバから取得した情報を画面に表示する処理

配点 2

解説

スマートフォンアプリケーションにおけるマルチスレッド設計の原則として、UI(画面)の更新は必ずメインスレッド(UIスレッド)で行う 必要がある。

  • ワーカースレッドは、ネットワーク通信や時間のかかる計算など、バックグラウンドでの重い処理を担当する。
  • 画面に情報を表示する処理をワーカースレッドから直接実行しようとすると、OSによって例外が発生したり、画面の不整合が起きたりする。
  • したがって、ワーカースレッドで実行すべきではない処理は「サーバから取得した情報を画面に表示する処理」である。

各選択肢の解説

  • イ (サーバからのレスポンスを待つ処理): 待機中は処理がブロックされるため、メインスレッドで行うと画面がフリーズする。したがって、ワーカースレッドで行うべき処理である。
  • ウ (サーバへリクエストを送信する処理): ネットワーク通信は時間がかかる場合があるため、ワーカースレッドで行うべき処理である。
  • エ (ホスト名からIPアドレスを取得しTCPコネクションを確立する処理): ネットワーク接続にかかわる通信処理であり、これもワーカースレッドで行うべき処理である。

設問3

(1)

本文中の下線②について,表1中の処理2〜処理7のうちメインスレッドで実行すべき処理だけを,表1中の処理名で全て答えよ。

模範解答

処理2,処理7

採点基準(配点 3点)

正確性(内容)(3点)

  • 3: 「処理2,処理7」と過不足なく正しく解答している。
  • 1: 「処理2」または「処理7」のいずれか一方のみを解答している。
  • 0: 無解答、または上記以外の誤った解答。

解説

おすすめの髪型機能において、メインスレッドで実行すべき処理を特定する問題である。

  • 前問でも触れた通り、アプリケーションにおける 画面の描画やUIの更新操作 は、すべてメインスレッドで実行しなければならない。
  • 表1に示された各処理のうち、画面更新などのUI操作を伴う処理内容(例として「処理2」や「処理7」)がこれに該当する。

高得点のポイント

  • メインスレッドとワーカースレッドの役割分担を正しく理解できているか。
  • 表1の中から、画面操作に関連する処理を過不足なく抽出できているか。

(2)

本文中の 空欄e に入れる適切な操作名を解答群の中から選び,記号で答えよ。

  1. break
  2. fork
  3. join
  4. wait

模範解答

選択肢ウ: join

配点 2

解説

スレッドの制御操作に関する知識を問う問題である。

  • プログラム内で分岐させた別のスレッドの処理が完了するのを、呼び出し元のスレッドで待ち合わせる操作を join と呼ぶ。
  • マルチスレッド処理においては、全てのスレッドが完了したことを確認してから次の処理へ進むために頻繁に利用される。

各選択肢の解説

  • ア (break): ループ処理から抜け出すための制御構文であり、スレッドの待ち合わせには使用されないため誤り。
  • イ (fork): 新たなプロセスやスレッドを生成・分岐させる操作であり、完了を待つ操作ではないため誤り。
  • エ (wait): 排他制御におけるスレッドの待機状態遷移などに使われることが一般的であり、別のスレッドの終了自体を待ち合わせる基本的な操作名としては「join」が適しているため誤り。

(3)

本文中の下線③について,Cさんが追加した処理の内容を20字以内で答えよ。

模範解答

一定時間でタイムアウトする処理

採点基準(配点 3点)

知識・理解度(内容)(2点)

  • 2: 「タイムアウト」の概念や、「一定時間が経過したら処理を打ち切る(中断する)」という意図が明確に示されている。
  • 1: 処理の打ち切りや中止について言及しているが、「一定時間(時間経過)」という条件の記述が欠けている。
  • 0: 無解答、または通信遅延対策の意図から外れた内容。

論理性(構造)(1点)

  • 1: 文脈として不自然さがなく、追加すべき処理の内容として適切に記述されている。
  • 0: 意味が通らない、または日本語の記述として破綻している。

解説

スマートフォンアプリケーションはモバイルネットワーク環境で動作するため、通信遅延や切断に対する堅牢な設計が必要となる。

  • サーバへの通信を無期限に待ち続けるとアプリケーションがフリーズしたように見えてしまうため、あらかじめ設定した時間が経過した時点で処理を中断する設計が不可欠である。
  • このような仕組みを タイムアウト と呼ぶ。

高得点のポイント

  • 「一定時間」という時間の制約(条件)に触れていること。
  • 「タイムアウトする」や「処理を打ち切る」といった対応方法が20字以内で簡潔に表現されていること。

(4)

おすすめの髪型機能を実行するために必要な処理時間は何ミリ秒か。ここで,通信は標準的な時間で実行でき,表1に記載の処理時間以外については無視できるものとする。

模範解答

460

配点 2

解説

おすすめの髪型機能が完了するまでの全体の処理時間を計算する問題である。

  • マルチスレッドで並行して実行される処理の場合、全体の所要時間は直列部分と並行部分を組み合わせて計算する。
  • 全体の処理時間 TT は、直列に実行される処理の時間と、並行して実行される複数のスレッドの中で 最も時間のかかる(クリティカルパスとなる)スレッドの処理時間 を足し合わせたものになる。
  • 数式で表すと T=Tmain+max(Tthread1,Tthread2,)T = T_{main} + \max(T_{thread1}, T_{thread2}, \dots) のように計算され、本問の設定に従って各処理時間を合算すると 460 ミリ秒となる。

各選択肢の解説(数値入力式のため誤答傾向の解説)

  • 単純に表1のすべての処理時間を足し合わせてしまった場合は、並行処理の利点が考慮されていないため誤りとなる。
  • 通信にかかる標準的な時間を見落としたり、スレッドの合流(join)による待合せ時間を正しく計算できていない場合に誤答となる。

設問3(1)は,正答率が低かった。スマートフォンアプリケーションをはじめとしたユーザの端末上で動作するアプリケーションを開発するには,各処理の処理内容を理解した上で適切なスレッドで処理を実行する設計が重要になるので,スレッドに関する理解を深めておいてほしい。設問3(2)は,正答率が低かった。二つのスレッドの完了を待ち合わせるjoinについて問うた。昨今の高性能なCPUを搭載したスマートフォンやPCでは,アプリケーションソフトウェアがマルチスレッドで処理を行うことは一般的であるので,スレッドの分岐や待合せ処理については,是非理解しておいてほしい。