WebサーバーとAPサーバの分離について

投稿者: Anonymous WebサーバとAPサーバの分離のメリット・デメリットはなんでしょうか? 現在一台のサーバに、Webサーバとしての役割とAPサーバとしての役割を両方乗せようと思っております。 ですが、もう一台サーバーを立てて分離させることによって、かかる費用よりも大きいメリットが得られるのなら、そうしたいのですが、決め手となる判断材料がなくどうしたらいいか迷っております。 ざっと調べた限り、メモリの量が足りなくなりがちなので分離するといった理由がよく挙げられているようです。そうだとしたら、メモリが足りていれば分ける必要はないということでしょうか? それとも他に分離すべきメリットというのは存在するのでしょうか? どうぞよろしくお願いいたします。 解決 一番大きな理由は、WebサーバとAPサーバでは求められる特性に正反対の部分があると言うことです。 Webサーバ 接続数 多い~極めて多い 一接続で消費されるリソース 少ない スケールアウト 容易 セキュリティリスク 低い APサーバ 接続数 1~多くても数100 一接続で消費されるリソース 多い スケールアウト 容易ではない セキュリティリスク 極めて高い 特に問題なのは、ネットワークの接続数です。これはCPUやメモリなど容易に増やせるリソースとは違うところで上限が出てきます。いわゆるC10K問題というやつです。接続数が極めて多い場合、サーバを複数にしないとさばききれません。 一方、APサーバはそれに合わせて複数台構成にする、というわけには簡単にはいきません。APサーバは一般にスケールアップで容易に性能が増やせるので、その点からも複数台構成にする、というのは無駄になります。 最初から極端に負荷が高いことが見込まれている場合はAPサーバも複数台構成を前提にすることもありますが、それにしてもWebサーバの数とは全然違います。 ・・・というわけで、これを考える意味があるのは、「サーバ1台では処理しきれない」場合です。サーバ1台で十分で、性能-コスト比で考えるなら、サーバを分離する意味は全くありません。 セキュリティ? これ勘違いしてる人が非常に多いです。 Webサービスに対するセキュリティ侵害のほとんどは、正規に外部に公開されているI/Fを経由してAPサーバ(アプリケーションかミドルウェア)の脆弱性を攻撃されるものです。一方、Webサーバ(HTTPサーバ)にはリスクの高い脆弱性というのはほぼ無いと言っていいでしょう。したがって、 APサーバがWebサーバと分離されているかどうか APサーバがDMZにあるか別ネットワークか とかいうのは、攻撃耐性という観点ではほとんど違いがありません。 非公開ファイル(アプリケーションの内部ログなど)の誤公開、といったポカミスのようなものは防げるかもしれませんが、まぁその程度の話です。 APサーバがセキュリティ侵害を受けた結果2次的な攻撃の発信源になる、というところまで考えると、保護すべき他のサーバと同じネットワークに配置するのは最悪の選択なので、DMZにおいて置いた方が遙かにましということになります。 セキュリティ上の観点では、CMSやEコマースシステムなどのように、 外部に公開するサービス 組織内部からのみ利用する管理システム みたいなものがある場合に、 外部接続はフロントエンドのWebサーバ経由 内部接続はAPサーバを直接触るか、それ用に別のWebサーバを用意してそれ経由 という分け方をすることはあります。極端な例は静的ファイル出力型のCMSで、これはWebサーバ→APサーバの接続が全くない形になります。 回答者: Anonymous

ヒープ領域とスタック領域の違いについて教えてください

投稿者: user4410 ヒープ領域とスタック領域の違いについて教えてください ひとまず以下の疑問があります。 いつ確保されるのか どちらが早いのか サイズはいつ決定されているのか スタックに確保されているAuto変数とはなにか ヒープ領域はなぜ、双方向リストによって構成されているのか スタック領域のデータ構造はどのようなものなのか 追記 なぜ、データ構造に違いを与えたのか 解決 スタックとヒープの違いを、使い方とデータ構造から説明します。 スタックは手続きの呼び出しで利用されます。手続きが呼び出されると、呼び出された手続きのローカル変数を格納するためのフレームがスタック上に生成されます。手続きからリターンすると、そのフレームも不要になります。メモリ領域の確保と解放のタイミングは、後から呼び出された手続きのフレームほど先に解放されます。 従って、スタックを実装するデータ構造としては、先入れ後出し(FILO)のデータ構造である「スタック(同じ名前なのでややこしいかもしれませんが)」がスタックを実装するのに利用されます。 これに対して、ヒープに確保されるメモリ領域は、確保と解放にこのような一定の順序がありません。先に確保したメモリ領域が先に解放されることもあります。そのため、メモリ領域を確保した順序に関係なく解放できる必要があります。 従って、ヒープを実装するデータ構造としては、途中の要素をいつでも削除できるデータ構造であるリストなどが利用されます。 回答者: Anonymous

静的型付と動的型付のメモリの動きを理解したい。

投稿者: Anonymous 私は本格的にはPythonしか触れた事が無いのですが、 私はPythonを学んだ時、静的型付けと動的型付けを以下のように考えていました。 静的型付言語・・・型宣言をしなくちゃ駄目。 動的型付言語・・・型宣言をしなくてもOK. これでもプログラムを組むには何ら支障はありませんでした。 だけど、最近さすがにそれじゃいけないだろうと思うようになりました。そのため、自分なりに考えを整理してみる事にしました。 不十分な理解を承知の上で、私の頭の中に、以下のように定めて行きます。 wikipedia によると、 静的型付言語・・・コンパイル(プログラム実行)前に変数の型が決定されている。 動的型付言語・・・コンパイル(プログラム実行)後に変数の型が決定される。 静的型付言語の場合、プログラム実行中に型が変更されることはないとします。 それぞれの変数のアドレスがメモリに割り当てられる。 そしてプログラムが終了するまで、このメモリは解放されないとします。 しかし、プログラマが、メモリを解放する処理を明示的に行った場合は別とします。 動的型付言語の場合、プログラム実行中に型が変更されるので、その都度型が調べられ、 適当な型がその変数に割り当てられるとします。 (動的型付言語は、この決定のためのプロセスに時間がかかり、処理速度が遅くなる最も大きな原因となる。) もしその変数が別の型の値が入れば、その型に上書きされる。Pythonの場合、s(str型)という変数を、i(int型)という変数に代入すると、iはstr型となる。   元々のiという変数には、sのメモリが割り当てられ、元々iのあるアドレスは解放される。 i = 0;s = “a”; i is a;-False i = s i is a;-True i;-“a” メモリ解放のプロセスは、言語側が自動で行ってくれており、プログラマが行わなくてもいい。 静的型付言語だと、このような事は出来ないとします。 極端に言えば、静的型付言語と、動的型付言語は、どんな場合でも、このように変数の型が定まるものであるとします。 頭の中で、このように動的型付言語と、静的型付言語を整理したとします。 しかし、静的型付言語であるJavaでは、強制型変換が行われます。また、自動型変換という機能もあります。 この静的型付言語であるはずのJavaで、メモリが割り当てられているのに、強制的に型が変換されるとすれば、メモリの動きはどのようになるのでしょうか。(強制)という言葉は、解放プロセスもなく、無理やりというニュアンスに思えます。 型が変換された後の型になるのはわかります。しかし、メモリの動きはいったいどうなっているんでしょうか?メモリはのっぺらな配列であると聞きます。そして、静的型付けの場合、最初に割り当てられたアドレスがギュッと詰まっているとします。その時、その中のアドレスの一部が強制的に書き換えられたとき、もし元の領域よりも大きな領域が割り当てられれば、それは何らかのエラーを発生させるのでしょうか?(別の領域と被ると思うからです。)それとも、元のアドレス自体は一旦解放され、新しく別の領域にメモリが割り当てられるのでしょうか?それとも、被ると思われるアドレスを、そのまま大きくなった分だけスライドさせるのでしょうか?元々そんなに詰めた形では割り当てられていないのでしょうか?   いずれにせよ、このような事が可能であるとするならば、静的型付言語の中にも、動的型付と言える部分があるんだなと感じます。 メモリにはスタックと、ヒープというのがあり、スタックは整列的。ヒープはランダム的に割り当てられると言います。静的型付言語だとしても、この二つを使い分けて移し合いながらメモリの動的管理を行っているのでしょうか? とすれば、スタックとヒープ両方のメモリが満杯になった時に、なおメモリの領域を要求する時に起るエラーが、スタック・オーバーフローと考えてもよろしいでしょうか?   wikipediaによると、結局静的型付と動的型付の境界線は曖昧だ。と知りました。 動的型付の場合は、メモリの解放を自動で行ってくれるため、楽ですし、また任意の場所に割り当てればよいと思いますが、静的型付けの場合、これはプログラマが解放と割り当ての責任を負う。という認識で間違いないでしょうか?   何個も聞いてるので、まとめます。(さりげなく項目が増えています。) ・静的型付言語でも、動的型付が行われれば、メモリはどのように動くのでしょうか。…(Continue Reading)

swiftでblockにインスタンスメソッドを指定したときのselfは循環参照になるか

投稿者: Anonymous 例えば以下のようなコードのときに、parentとchildは循環参照してしまうのか。 class Parent { let child = Child() let name = “parent” func didLoad() { child.callback = hoge } func hoge() { print(name) } } class Child { var callback: (() -> Void)? } let parent = Parent() parent.didLoad() もし、循環参照してしまう場合、対策として、 weak var callbackと宣言するのが正しいのか。でもそうすると今度は無名のブロックが指定された場合即解放されてしまうと思うのだが、どっちでもうまくいく方法はあるか。 解決 コード末尾の箇所を以下のようにかえてみれば実際に循環参照しているのか、いないのか確認できます。 weak var weakParent:Parent? = nil do { let…(Continue Reading)

Cocoa touchのデリゲートメソッドの呼び出しとメモリ管理について

投稿者: Anonymous iOS(Swift)でアプリを開発しています。 カスタムViewを作成し、あるViewControllerにaddSubviewし、そのViewControllerにカスタムViewから呼び出されるデリゲートメソッドを実装しています。 このとき、以下のようにCustomView内のUIButtonから直接メソッドの呼び出しを行うと、”unrecognized selector sent to instance xxxx”と、メモリに関するエラーでアプリが落ちてしまいます。 SampleViewController class SampleViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let customView = CustomView(frame: CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)) self.view.addSubview(customView) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func sampleFunc() { print(“sampleFunc”) } } CustomView class CustomView: UIView { let button = UIButton(frame: CGRectZero) func setup() {…(Continue Reading)

メモリ管理、スタックのmutabilityについて

投稿者: Anonymous スタック領域に積んだ値は、関数がネストしてもFrame Pointerから遡って参照することができると理解しているのですが、 その場合、より深い場所にある値の上書きはできないのでしょうか? また、できないとすればそれはなぜなのでしょう。 セキュリティでしょうか? ただし、代入する値のサイズがもとの値以下であり、Growableでないことを前提とします。 無駄に手書きですが、こういうイメージです ーーーーーーー | | | 関数 | | | | ローカル変数 <-| ———– | | | | | 上書きしたい | ネストした — | 関数 | | | ーーーーーーー 解決 質問するに至った動機と合致する答えになるのかどうか微妙な気がしますが void func1(int* p) { ++p[4]; } void func2(void) { int array[10]={0}; func1(array); } 上記コードはたいていの CPU (x86 も含む)…(Continue Reading)

クロージャに [weak self] をつけていない場合、予期しないメモリを参照することはありますか?

投稿者: Anonymous 前置き swiftでクロージャを書く場合に、[weak self]を付けていない場合、循環参照が起こりメモリリークしてしまう場合があります。 メモリリークしているのは、解放されていないオブジェクトなので、すぐにselfがどのオブジェクトを参照しているのかソースコード上わかります。 質問 今回の質問は、[weak self]を付けていない場合に、付けていないにも関わらず、クロージャ内に記載したselfは解放されており、コールバックなどでselfが参照された時点では、使用していたメモリ空間が別のものとして使用され、アプリ自体が落ちる場合があるか?(もしくは不正なメモリをアクセスしてしまうというところまではいかず、単純にnil参照で落ちるだけでしょうか?)という質問となります。 解決 [weak self]を付けていない場合に、付けていないにも関わらず、クロージャ内に記載したselfは解放されており、コールバックなどでselfが参照された時点では、使用していたメモリ空間が別のものとして使用され、アプリ自体が落ちる場合があるか? ありません。 [weak self]を付けない場合、selfはクロージャーに強参照で保持されています。クロージャー自身が生きている限り、selfの参照先が解放されてしまい、他の用途に使われることはありません。 もしくは不正なメモリをアクセスしてしまうというところまではいかず、単純にnil参照で落ちるだけでしょうか? 上記したように、[weak self]を付けない場合、selfの参照先がクロージャーの実行中に解放されることはないので、「nil参照で落ちる」こともあり得ません。 (ちなみに[weak self]を使用すれば、参照先が解放された場合にはselfはnilになりますから、不用意に「別のものとして使用され」ていることはないはずです。この場合変なことをすれば、nil落ちするのはもちろんです。[unowned self]だと「プログラマの自己責任」でそんなことは絶対に無いように気をつけて使わないといけません。自分自身で意味が完全に理解できていない限り[unowned self]は使わないほうがいいですね。) クロージャーがらみで何か不審な挙動でも見つけられたのでしょうか?もう少し具体的な事例を挙げてもらえれば、何か付け足すことがあるかもしれません。 回答者: Anonymous

今時のOSでのヒープとスタックの位置関係について

投稿者: Anonymous プログラミングの参考書などでよく、メモリー空間の先頭にスタックがあり、後方にヒープがある図を見かけます。しかし、今時のOS上の仮想空間も実際に図の様に連続で、つながっていて、そのような位置関係にあるのでしょうか。それとも間のどこかに、セキュリティ的なこと以外に、実メモリが確保されておらず、アクセスできない領域があったりするのでしょうか。 解決 メジャーなOSの1つとしてWindowsであればVMMapというツールが提供されています。もしWindowsをお使いでしたらご自身で確認してみてはどうでしょうか? Windowsであれば後方はシステム領域です。その手前にはImage(実行ファイル・DLL)が配置されていました。スタックもヒープも複数存在します。 スタックが複数存在する理由は、スレッド毎にスタックが必要になるためです。そのため「前の方」ではありますが「先頭」ではありません。 ヒープが複数存在する理由は、ヒープ確保の際にスレッド間ロックを排除するため、つまりパフォーマンスのためです。複数存在するため「後方」に配置する理由はなく、メモリー空間内に自由に点在していました。 これらはWindows以外にも当てはまる部分もあるかと思います。 それとも間のどこかに、セキュリティ的なこと以外に、実メモリが確保されておらず、アクセスできない領域があったりするのでしょうか。 わかりませんが、64bit OSになるとアドレス空間が広すぎて使い切れていないのは事実で、その空いた領域にアクセスさせないのはセキュリティが理由だと思います。 回答者: Anonymous

iOSアプリのメモリ使用量について

投稿者: Anonymous SwiftでiOSアプリを開発中なのですが、そのアプリのメモリ使用量が気になっています。 開発中のアプリはmap、カメラを使い、ページ数もそれなりに多いものになっており、Simulator上で走らせていると200MB以上のメモリを消費しているのですが、iOSアプリの何か指標になるメモリ使用量などはありますでしょうか。また一般的なメモリ使用量の解決策としてARCによるものがあるかと思いますが、それ以外でTipsなどがありましたら、あわせてご教示いただけますと幸いです。宜しくお願いします。 解決 数値の目安はないと思いますが、メモリが逼迫してくるといくつかの通知がなされます。 最近(たしかiOS6以降)ではアプリのメモリが不足してくると UIViewControllerのdidReceiveMemoryWarningが呼ばれる AppDelegateのapplicationDidReceiveMemoryWarningが呼ばれる UIApplicationDidReceiveMemoryWarningNotification通知が飛ぶ などの兆候が現れます。その場合に不要なビューの開放やキャッシュなどたくさんメモリを使用していて、あとで再構築できるものを開放する処理を記述していれば問題ないと思います。 参考: https://developer.apple.com/jp/documentation/MemoryUsage.pdf https://stackoverflow.com/questions/32389028/how-to-implement-didreceivememorywarning-in-swift 回答者: Anonymous

C#でListとした時、ヒープメモリなのかスタックメモリなのか?

投稿者: Anonymous UnityのC#でコードを組んでいて疑問に思ったことなのですが、 構造体はスタック領域を使うと書いてあるのですが、 Listに関しては記述がなく、値型でない限りは参照型になるので ヒープ領域を使うと思っています。 質問 List<構造体>とした時は、どちらにメモリが確保されるのでしょうか? また、スタックに確保されたか?ヒープに確保されたか?を知る方法はないでしょうか? 経緯 UnityのC#ではヒープ領域がガベージコレクションで解放されないため、 1度ヒープ領域が更新されるとアプリを落とすまでヒープを確保し続け アプリの確保メモリが非常に大きくなるため、スタックに移行できるものが あればスタックに移行したいと思い、このような質問をしました。 環境 Unity 5.0.1f1 .NET 2.0 C# 4.0 解決 構造体はスタック領域を使う は正確ではありません。 構造体は置かれた場所をそのまま使うと言えばいいでしょうか。ローカル変数として構造体を宣言した場合、ローカル変数はスタックを使うため構造体はスタックを使うと言えます。しかし、クラスメンバーとした場合、そのクラス内に存在するだけで、クラスがどこに配置されたかに依存します。(そしてクラスはヒープを使うため構造体もヒープ上に存在することになります。) 回答者: Anonymous

boost::interprocessのvector内のbasic_stringへのchar*からの変換

投稿者: Anonymous 別のサイトで同じような質問をさせて頂きました。 処理の流れとしてはカメラで撮ったcv::Matをunsined char化し、stringの動的配列として共有メモリに格納し、子プロセスでstringをイテレータで順次,unsigned char化してcv::Matに戻して再生したいです。 しかし、問題があり、 vcap >> mat; MatToBytes(mat, &pBuf ); std::string sName; myshmvector->push_back(sName(pBuf));、 というコードで、MatToBytesにMatと pBufというunsigned charの二重ポインタを引数でとり、格納し、memcpyしたいのですが、 共有メモリのVectorにてStringで格納する際、 コンパイルエラーでno match for call to ‘(std::string {aka std::basic_string}) (uchar*&)’ myshmvector->push_back(sName(pBuf)); pBufのucharがbasic_stringにどうしても合わないようです。 子プロセスのイテレータのも問題があるようで MyShmStringVector::iterator it; cv::Mat mat; cv::VideoCapture vcap(0); uchar* pBuf = NULL; for(it = myvector->begin(); it !=myvector->end(); ++it){ pBuf = (unsigned char*)(*it).c_str(); std::memcpy(mat, pBuf, it->size());…(Continue Reading)

ブロック分割とサイクリック分割の違いを教えてください

投稿者: Anonymous データ並列化の用語のようですがブロック分割とサイクリック分割の違いを教えてください 解決 1次元のデータの分割方法です. 1次元配列を分割する例で示します. 長さNの配列aをMブロックに分割するとき m番目のブロックの要素が, a[i+N/M*m]で指定されるのがブロック分割, a[N/M*i+m]なのがサイクリック分割です. ここでiはどちらも0~N/M-1をとります.また簡単のためにNはMでわりきれると仮定しています. 図がわかりやすいのでのせます [0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4] //ブロック [0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4] //サイクリック N=30,M=6の場合をのせました. 上がブロック分割,下がサイクリック分割です.ここで各色はブロックに対応しています. 画像処理やcudaでスレッドに分割する場合は2または3次元のデータを考える場合が多いですが,その場合には各次元それぞれブロックまたはサイクリックで分割します. 回答者: Anonymous