C言語のCGIを語りつつ普及するスレat PHP
C言語のCGIを語りつつ普及するスレ - 暇つぶし2ch485:普及された人
09/03/18 14:14:04 XMWgki/Q
そう考えると、FastCGI + C は現在考え得る
サーバサイドプログラミングの中で最も高速
かつ安全な、まさに頂点に立つ方式だと考えます。

もちろん今の時代でC言語が使えるということは、
バッファオーバーフローの回避やコード部分に
おけるアルゴリズムの最適化などができることが
最低限の必要条件だと思いますが。
そうでなければ、高速かつ安全とは言えませんので。

486:普及された人
09/03/18 14:18:12 XMWgki/Q
ということで、皆さん、C言語のCGIをどんどんやって普及させましょう!

487:nobodyさん
09/03/18 20:57:18
誰とは言わないがアセンブラで書いてる人もいたな

488:nobodyさん
09/03/20 05:46:26
CGI + C より CGI + Perl / Python / Ruby の方が
メモリ使用量や実効速度が速いというのは変。

あとプロセスを起動するたびに毎回HDDにアクセスとかありえない。
キャッシュに残ってるよ。

起動したら1行printして終わるだけのプログラムを、
CとPerlとbashスクリプトで作って、それぞれ起動してみたけど、
やはりPerlの方が時間がかかる。

$ time ./test.app
real 0m0.001s
user 0m0.000s
sys 0m0.000s

$ time ./test.pl
real 0m0.002s
user 0m0.000s
sys 0m0.001s

$ time ./test.sh
real 0m0.001s
user 0m0.000s
sys 0m0.001s

489:nobodyさん
09/03/20 05:50:52
あと私も自分で一通りのAPI書いたけど、
そのCGIでtimeを測ってみても、↓の通り。
ソースコードで2.2MB、バイナリで350KBとかなり大物だけど、
それでもphpの実行バイナリ3Mとかと比べれば、軽いもんだね。

real 0m0.001s
user 0m0.001s
sys 0m0.000s

490:普及された人
09/03/21 12:48:40 yqEMcysT
>488さん
>CGI + C より CGI + Perl / Python / Ruby の方がメモリ使用量や実効速度が速いというのは変。
その通りでした。
間違えて記載してしまいました。
実際は少なくとも CGI + Perl よりも全て上にランキングされます。
FastCGI + ? に関しては状況によるかと思いますが。

>あとプロセスを起動するたびに毎回HDDにアクセスとかありえない。
>キャッシュに残ってるよ。
OSやハードディスクの行うキャッシュに関しては、他の要因で追い出されることが考えられますので、無視して記載しました。
それまで入れてしまうと、CGI自体の動作やFastCGI自体の動作やSpeedyCGI自体の動作やmodule型自体の動作の説明ではなくなってしまいますので。
CGI→エグゼキュートやインタプリタ+スクリプトをストレージから読み込み実行
FastCGI→エグゼキュートやインタプリタ+スクリプトをプロセスとしてメモリに常駐させそれを実行
SpeedyCGI→バイトコードをプロセスとしてメモリに常駐させそれを実行
module型→エグゼキュートやインタプリタをWebServerのModuleとして組み込みメモリに常駐させ、スクリプトはストレージから読み込み実行
という風にそれぞれの機能を説明したかったのでそう記載しました。

491:nobodyさん
09/03/21 15:47:08
>>490
なるほど。
私のCGIもapache moduleかFastCGIにしたいんだけど、
CGI専用にAPI開発したから、メモリ解放が手抜きすぎて無理だw

492:普及された人
09/03/21 21:30:03 yqEMcysT
相当大きなものなのでしょうか?
でも、それだけの実力者なら、時間は多少かかるものの簡単にできるのではと思います。
私の場合は、最初はプログラムの中でFastCGI仕様にしようとやっていたのですが修正が多すぎたので、main関数自体を別関数に変えてFastCGI仕様にしたらかなり楽に解決できました。
外部変数さえなければ、この技(というほどのものでもないですが)は有効だと思います。
apache moduleとして組み込むのは、一人で開発してますので、チェック機構(自分自身)に信頼がおけないのでやらないことにしました。
C言語で作る場合、FastCGIとmodule型は速度的にそれほど大差がない(処理速度は同じで、結果をWebServerプロセスに渡す渡し方の差しかない)ので、どちらでも良いのでしたらFastCGIを私はお勧めします。
スクリプト言語で組むなら、圧倒的にSpeedyCGIが抜きん出て、FastCGIのスクリプトを常駐させるアドバンテージとmodule型のスレッド通信のアドバンテージが相殺してあまり大差ないようですが。
いずれにしても、C言語でCGIが組めるのは(その根性があることこそが)大きなアドバンテージですので、お互いに頑張って良いものを作って普及させましょう!

493:nobodyさん
09/03/22 04:05:46
>>492
> 相当大きなものなのでしょうか?

そだねー。
フォーム受け取り、XML-RPC、クッキー、
MD5、各種暗号復元化、base64、文字コード変換、絵文字、
いろいろなDBに対応したモデル、それのコントローラ、HTML埋込ビュー、
画像処理、セッション、ユーザ処理、画像認証、各種ユーティリティとかあるよ。

いくつかはUNIXでメジャーなAPIの呼び出しで実現してる。

もう設計からして、メモリ解放を前提としてないから、
もしやるとしたら、参照カウンタ+ガベージコレクションの実装かな。

494:普及された人
09/03/22 17:50:13 uHOLJ9Dp
>>493
素晴らしい財産の数々、驚きました。
確かに、これら全てを改変するというのは重労働ですね。
でも、それ以前にこれらを作ってきたことが、とてつもない重労働です。
私には、高い品質で世に(無償)提供したいものがありますので、いくつかのものは作りましたが、かなり多くのそういった財産を作っていかないといけません。
今まで、492さんがやってこられた重労働です。
それをやることに比べたら、一つ一つのコードのメモリ開放型への変更は、基本的にはオブジェクト指向でないC言語で、これまでやってきた492さんにとっては、克服できるのではないでしょうか。
module型やFastCGI用にするとなると、確かにそれ専用で設計した方が良いものが結構ありますので、この際せっかくですので、一括でドン!ではなく、後世に残る財産と思ってチマチマやってみてはいかがでしょうか?
これだけできる人ならきっとすぐにできると思います。
私も始めた当初は、スクリプト言語で同じものを作る100倍以上の時間がかかっていましたが、今では2倍程度の時間しかかかりません。
せっかくのC言語でCGIですので、より高い品質のものを期待しています。
・・・というか、492さんは全盛期のYahoo!にでも勤めてた(る?)のでしょうか???

495:nobodyさん
09/03/23 02:32:56
>>494
私もこのAPIをもうちょい作り込んで、オープンソースででも公開したいんですが、
すでにいくつかの大手サイトで使っちゃってるので、
ソース公開してセキュリティホールが見つかったら怖いので、公開に踏み切れないw

> ・・・というか、492さんは全盛期のYahoo!にでも勤めてた(る?)のでしょうか???

ずっとフリーで活動してますよ。
でも最近は仕事が激減して、暇を持てあまし中 orz

496:nobodyさん
09/03/23 17:53:50
CGIをC言語で書いているので、FastCGI + C の組み合わせにも興味あるけど、いまいち仕組みが
理解できなくて移行をためらっているので、もし良ければ質問に答えてもらえるとありがたいです。

CGIをFastCGIにすると、プロセスがメモリに常駐してFCGI_Acceptのループでリクエスト待ちになる
みたいだけど、このとき複数のリクエストが同時に来たらどう対応されるの?

1. 一つのFastCGIのプロセスで順番に処理される
2. FastCGIのプロセスが新たに立ち上げられて、並行して処理される

"1" ならアップローダーみたいな処理に時間のかかるものにはFastCGIは向かないって認識でいいのかな?
(そもそも処理に時間がかかるなら起動コストの影響は少ないからノーマルCGIでいいのだろうけど)

"2" ならせっかく常駐するのだから、データの内容をメモリにキャッシュして高速化しようとかすると、
複数立ち上げられたときにメモリを大量に消費しちゃうのでやらないほうがいいのかな?

試してみればいいのだろうけど、FastCGIに興味はあるけど今のところはC言語CGIだけでもCPU負荷で
困ることはなかったので、環境構築するところまでは踏み切れずにいました(^^;

497:nobodyさん
09/03/25 15:31:05
fastcgi は、基本的にはリクエストが来たら余っているプロセスがあればそれを使い、
なければ立ち上げるってだけ。

プロセスの生死自体は親が握っていて、同じインスタンスが同時に動くことがある
ってのを覚えておけば、データをメモリにおいて使いまわすことは可能。


っていうかLinuxとかのOS標準のdevパッケージを使うなら、Hello, worldなcgi自体は
環境構築含めて15分もあれば出来るので、めんどくさがらず試せばよろしい。


498:普及された人
09/03/26 22:41:51 4YbFu+ij
>>495
これだけの実力者が暇を持て余しているとは、世の中狂っています。
これだけの実力者なら凡人がRubyで3000ステップの素晴らしいプログラムを作る時間で、10000ステップの同等の機能の素晴らしいプログラムを作るでしょうに。
早く、プログラマのフリーエージェント的な制度が確率すると良いと思います。
力のある人が、それなりの報酬を得られることは必要です。
それがなければ、努力もせずダラダラとIT業界に執着する人が増えるばかりです。
オープンソース化できるのなら是非してもらいたいです!
それこそC言語でCGIの普及になります。
> ソース公開してセキュリティホールが見つかったら怖いので、公開に踏み切れないw
だからこそオープンソースで良いのではないでしょうか?
一人の力には限界がある。
だからこそ、みんなの目で見てもし穴があるのなら、みんなで埋めていけば良いのだと思います。
完璧なものを公開して、威張るためのものがオープンソースではないと思います。

499:普及された人
09/03/26 22:43:44 4YbFu+ij
>>496
私が自分自身で言っていることと相反するようですが、495さんもおっしゃってたように、実動作では通常のCGIでも、キャッシュ化されますのでかなり高速です。
C言語の場合、処理自体が早いですから。
理論的に考えるとかなりの差ですが、実動作で考えると多くの場合FastCGIと通常のCGIの差は、「プロセスの生成」と「プロセスの廃棄」の時間になるかと思われます。
それと、昨日事情があって、Rubyの全コード見てみましたが、、、
素晴らしいプログラムで、感想は色々ありますが、とにかく長いですねぇ。。。
C言語のソースだけで、30ファイルくらいありますから、普通に流しで見るだけで4時間くらいかかってしまいました。
あのプログラムがインタプリタとして、スクリプトを読み込み処理することを考えると、遅いのが良く理解できます。
どれだけでかいWebアプリケーションをC言語で作ったとしても、あれほどでかくはなり難いので、間違いなくC言語で作ったWebアプリケーションは高速でメモリも食いません。
そう考えると、C言語のCGIだけで困っていないのなら、それでも良いかと思います。
ただ、多少の苦労で、無料で簡単に高速化できることは間違いないですし、多少のスキルアップにもなるかとも思いますので、是非一歩を踏み出して欲しいと思います。
RailsもRackをデフォルトとして一生懸命「単純化」や「高速化」を目指しています。
それよりも高いレベルのものが手の届くところにあるのですから、掴んじゃいましょう!
「手間がかかっても、面倒くさがらず、納得のいくアルゴリズムを完成させる」
「少しでも可能性があるのなら、より素晴らしいものを作るために努力を惜しまない」
それがC言語技術者だと思います。
色々相性など言われていますが、少なくとも私はApache & mod_fastcgiでとても安定動作しています。
やってみてダメなら戻せば良いのではないでしょうか?
で、仕組みに関して私のわかるレベルで、解説ページを作ってみました。
急いで作ったので、おかしいかもしれません。
間違いがあれば、ご指摘ください。
URLリンク(www.dreamhope.net)

500:nobodyさん
09/03/27 13:34:24
>>497-499
ありがとうございます。おかげでFastCGIを使ったときのイメージが理解できました。
FastCGIは興味があったけど、試してみるのが面倒というよりは、試してみるとのめり込んでしまいそうで
目の前にあるやらないといけないことをおろそかにできない状況だったので試せなかったのです。
元々はアセンブラでプログラムを組むのが趣味だったような人間ですので、手間よりも高速化が好きですから
今後は少しずつFastCGIも利用していきたいと思います。

501:nobodyさん
09/03/31 09:58:41
>>500
高速化にこだわるなら、自分でアプリケーションサーバ書くのがいいのでは
Apache臭はするけど、libaprなんかを使えばOSポータブルなdl()とかスレッドとか
メモリプールとか基本データ構造とか入っててお得ですよ。
ま、それなりにデカいけどね。


502:普及された人
09/03/31 22:35:52 Tx3EmaFc
この掲示板に出現する人は「C言語でCGI」をいかに、、、というのが目的ですし、
CGI部分を作るだけでも創造を絶する時間がかかりますので、アプリケーションサーバから作り始めるのは大変です。
今は情報が出回っていますので、作るに無理なことはないとは思いますが、一人で仕事外の時間利用だけで考えると、私ですと5年以上はかかりそうです。
Webアプリ一つ作るのにそれは効率的ではありません。
それにlibaprは、別にWebアプリケーションが高速になるものでもありません。
遅くなる可能性はあるけれど、作るときに便利で楽になるAPIだと思います。
C++技術者でない純粋なC言語技術者は、あまり使わないAPIだと思います。
使わざるを得ないAPI以外は、基本的に存在を知らなければすぐに自作してしまいますので。
「C言語が使える」ということは、別段便利なAPIを使う必要がないということでもあります。
libaprでメモリプールしなくとも、必要な分だけスレッドを立てて、mallocやcallocだけでしっかりメモリ管理できるということでもあります。(時に失敗しますが)
おまけにlibaprのメモリプールは確保した領域をシステムに対して返却しないと記載されていましたので、逆にかなりコントロールしにくいAPIな気もします。
それだけの手間(時間)をかけ、なおかつメモリ周りも適当な設計で良いのなら、普通にC言語でApache module型Webアプリケーションでも組んだ方が楽で高速で良いのではないでしょうか?

503:nobodyさん
09/04/01 11:08:56
作る際の効率が問題なら、そもそもwebアプリでCは選択しちゃダメ。
5年って、アナタたぶん作ったことないから死ぬほど安全に見積もってるよね?
アプリケーションサーバって、そこまで作るの大変じゃないよ。やることは基本的に待つだけだし。
実際は余暇を二週間位でも最初のプロトタイプ位はできるんじゃ...
まぁ、既存の適当にかかれたCGIをスレッド対応にするのは骨がおれると思うけど。

libaprのメモリプールの返却云々については、apr_pool_create の第二引数参照。
作業とか、ループとかにサブプールを作って、必要なメモリはそこから確保して、
終わったらサブプールだけ開放するって感じで。

でも、確かにCGIじゃないのでもうやめます。
fastcgiもCGIじゃないのではって気するけど...


504:nobodyさん
09/04/02 22:00:32
C言語が向いてるのは、開発費が多少増えたとしても、
サーバ台数が抑えられるから、トータルコストが安くて済むような案件だね。
検索サーバとか、2chとか、アクセス数が多いサイトとかね。

505:普及された人
09/04/04 11:18:37 JlRZ3FIj
>>503
はい、もちろん作ったことはありません。
それに、今までのところでは作る必要性も感じたことはありません。
私がC言語で既存のAPIを利用せずにアプリケーションサーバを作ることを考えると、、、
FastCGIのようにアプリケーションサーバ(これはハードのことです)側にある複数のTCPクライアントCGIと通信をこなしながら処理を進めることや、
アプリケーション側に、どのようにどのくらいのメモリを与えるのかなどを考えると、
できるだけ汎用的なものにしようとすれば、TCP先で利用できるlibaprのようなAPIを自分で作らないといけないし、、、
というような感じで、503さんとは少し論点がずれていたようです。
すみません。

だた、やっぱり基本的な考え方としてはFastCGIは
(Client → WebServer → FastCGI → CGI → FastCGI → WebServer → Client)
という形態ですので、アプリケーションサーバもFastCGIとほぼ同じで、
(Client → WebServer → AppServer → App → AppServer → WebServer → Client)
という形態になり、module型
(Client → WebServer(module型App) → Client)
の方が構成がかなり単純ですので、C言語で作ったCGIやAppの反応はかなり高速だと思います。
それに、やっぱりmodule型のC言語Appを一つ作る方が、
アプリケーションサーバとクライアントアプリケーションの両方を作るよりも遥かに楽だと思います。
それ以上に、FastCGIであれば、
FastCGI用C言語CGIを一つ作れば済みますので、労力は激減します。
ただ、やっぱりアプリケーションサーバはもとよりmocule型AppもCGIではありませんね。

あと、FastCGIはCGIプログラムをメモリ上に常駐させるのかさせないのかという違いで、基本的な仕組みはCGIと同じと考えて良いと思います。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch