アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして。CPUのコア数に関する質問です。
例えば、ある一つのサーバにCPUが2個、1CPUあたり6コアのスペックとします。
毎時定刻に、一つのバッチ処理が起動します。
そのバッチ処理は、多数のCSVファイルを入力として、チェック後、DBへ必要情報を更新します。
CSVファイルがめちゃめちゃ多い(数万件)ため、できる限り早く処理を実行したいと考えてます。
バッチ処理のアプリケーションは、シングルタスクです。
こうした条件のもと、OSは自動的に12コアのメリットを生かすようにジョブをコアに割り当てて
くれるものでしょうか?
私の周りには、技術者もどきが多く、いろんな意見があります。
ある人は、アプリを多重化したつくりにしないと、いくらコアがあっても一つの処理に使われるコアは一つだけという人と、アプリは意識しなくともOSが自動的にコアに割り当ててくれるという意見の人もいます。
本当のところどうなんでしょうか?
専門家のご意見をいただきたくお願いします。

A 回答 (4件)

バッチ処理は、「シングルタスク」で「シングルスレッド」です。


なので、結論から言えばコア1つの処理になります。

【マルチタスクとは】
複数のアプリケーションを同時に実行する処理の事です。
その際、シングルコアだと並列して処理するアプリケーションが順にスケジューリングされ、順番に処理されていきます。
なので、複数のアプリケーションが同時に実行出来ます。
※シングルタスクでは他のアプリが終了するまで、次のアプリは処理待ちになる。
また、マルチコアの場合はそれぞれのスケジューリングが複数のコアにスケジューリングされるので、コア数が増えれば処理速度が早くなる。
コア数が増えた場合、個々のアプリの速度は変わらないが複数のアプリを同時に実行した場合に早くなる。
例えば、シングルコアで4つのアプリを起動した場合に、シングルスレッドではそのアプリが終了するまで他のアプリは待ち状態となり、終わったら次へと処理されて行く。
マルチスレッドでは、4つのアプリがそれぞれプロセス単位でスケジューリングされ少しずつ順番にプロセスが処理されていきあたかも同時に実行しているかのように処理されて行く。
また、2コアだったとすると、4つのアプリのプロセスが2つのコアに分散されてスケジューリングされるので、1コアで2つのアプリが処理される。

【マルチスレッドとは】
一つのアプリケーションが複数のスレッドを作成し、複数のコアで同時に処理させる事です。
その為、コア数が増えればアプリ自体の速度がアップします。

なので、あくまでも仮にですが、バッチ処理が「シングルタスク」「マルチスレッド」だった場合、12コアを使用して高速に処理されます。

>アプリを多重化したつくりにしないと、いくらコアがあっても一つの処理に使われるコアは一つだけという人
これが、マルチスレッドの事です。

>アプリは意識しなくともOSが自動的にコアに割り当ててくれるという意見の人
これが、恐らくマルチタスクの事を言ってるのだと思います。
但し、複数同時にアプリを起動した場合に他の処理待ちにならないだけで、複数のコアに処理を振り分けてくれるわけではありません。
あくまでも、一つのアプリが使用するのは一つのコアです。
    • good
    • 0
この回答へのお礼

「シングルタスク」「シングルスレッド」の定義までご説明いただきありがとうございます。
結局今のアプリの作りでは、コアが多い恩恵が無いということですね。
これでモヤモヤしてものが取れました。感謝いたします。

お礼日時:2015/12/25 19:49

バッチ処理自体はシングルコアで実行されるが、DBのプロセスとは(おそらく)別コアで実行される、です。

バッチ処理がプログラムの中でフォークする仕組みでない限りは複数コアを使って演算してくれたりはしないと思います。もちろん、バッチ処理がスクリプト言語などで書かれており、その内部処理でフォークなどがプログラマに見えないところで実行されているのであれば、その限りではありません。
ちなみに、現代のCPUはスーパースケーラといって、1コア内にも複数の演算ユニットがあり、CPU自身がが命令レベルの並列性を見出したインストラクションについては可能な限り空いている演算ユニットに命令を詰め込んで処理を高速化しています。
    • good
    • 0
この回答へのお礼

これまでの回答に加え、より深い視点で回答頂き感謝します。大変参考になりました。有難うございます。

お礼日時:2016/01/01 10:13

>バッチ処理のアプリケーションは、シングルタスクです。


ということであれば、1プログラムでは1コアしか使いませんので、12コアを使うためには12多重でプログラムを動かす必要があります。
たとえばデータを12分割してそれぞれ並行に実行させるなど。
DBMSが同じシステムで動いているのであれば、DBMSもコアを使いますので、その分のコア数を引く必要があります。

>(1) アプリを多重化したつくりにしないと、いくらコアがあっても一つの処理に使われるコアは一つだけ
>(2) アプリは意識しなくともOSが自動的にコアに割り当ててくれる

言語によっては処理を自動的に多重化してくれる言語もあります。この場合は、プログラマが多重化を意識する必要はありませんが、言語の多重化の仕組みを効率よく使うためには、言語の多重化の仕組みを知った上でプログラミングする必要があります。その言語を使いさえすれば必ず多重化されるという物でもないです。

「アプリ」というものを「OSの上で動くプログラム」と捉えれば、(1)は正しくて(2)は間違いです。
「アプリ」というものを「プログラマが書くコード」と捉えれば、上に書いた通り言語によっては(2)が正しくなるケースもあります。
    • good
    • 3
この回答へのお礼

回答ありがとうございます。総じていえば、No1,2の回答とズレていないと受け取りました。さらに、一歩奥の世界までご説明頂きありがとうございます。とても参考になりました。感謝いたします。

お礼日時:2015/12/26 16:50

> アプリは意識しなくともOSが自動的にコアに割り当ててくれる


↑同時に複数のコアにジョブを割り当てるという意味においては幻想です。OSが使用するコアを決定するという意味においては正解です。

一般的にシングルタスク・シングルスレッドモデルのプログラムでは、アプリケーションプログラムの処理そのものが同時に複数のコアへ割り付けられることはありません。(コア間を移動したりすることはありますが、あくまでも移動であって同時複数使用ではありません)

よって、複数コアを同時に使える可能性を持ったプログラムモデル=マルチスレッドモデルやマルチタスク(マルチプロセス)モデルを採用したプログラムでなければなりません。
    • good
    • 0
この回答へのお礼

結局今のアプリの作りでは、コアが多い恩恵が無いということですね。
最初の回答者様と同じ意味の回答でより一層納得できました。
これでモヤモヤしてものが取れました。感謝いたします。

お礼日時:2015/12/25 19:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!