PostgreSQLは単純な「1プロセスに1ユーザ」のクライアント/サーバモデルによって実装されています。
このモデルでは1つのサーバプロセスに対し厳密に1つのクライアントプロセスしか存在しません。
いくつの接続が行われるか事前にわからないので、接続要求の度に新しいプロセスを作るマスタープロセスを使わなければなりません。
このマスタープロセスはpostgres
と呼ばれ、指定されたTCP/IPポートで入ってくる接続要求を監視します。
接続要求を検出すると、postgres
プロセスは新しいサーバプロセスを生み出します。
このサーバのタスクはセマフォと共有メモリを活用してお互いに連絡を取り合い、同時にデータにアクセスしても整合性が保たれるようにします。
クライアントプロセスは51章フロントエンド/バックエンドプロトコルに記載されたPostgreSQLプロトコルを理解できるどんなプログラムでも構いません。 多くのクライアントはlibpq C言語ライブラリに基づいていますが、Java JDBCドライバのようにいくつかの独立したプロトコル実装も存在します。
いったん接続が確立されると、クライアントプロセスはバックエンド(サーバ)に問い合わせを送ることができます。 問い合わせは平文で送信されます。 つまり、フロントエンド(クライアント)は構文解析を行いません。 サーバは問い合わせの構文解析を行い、実行計画を作り、そして計画を実行し、抽出した行を確立された接続を通じてクライアントに返します。