Cómo se establecen las conexiones

Postgres está implementado como un simple modelo cliente/servidor a "proceso por usuario". En este modelo hay un proceso cliente conectado a exactamente un proceso servidor. Como nosotros no conocemos per se cuantas conexiones se harán, utilizaremos un proceso master que lanza un nuevo proceso servidor para cada conexión que se solicita. Este proceso master se llama postmaster y escucha en un puerto TCP/IP específico a las conexiones entrantes. Cada vez que se detecta un requerimiento de conexión, el proceso postmaster lanza un nuevo proceso servidor llamado postgres. Las tareas de servidor (los procesos postgres) se comunican unos con otros utilizando semáforos y memoria compartida (shared memory) para asegurar la integridad de los datos a través de los accesos concurrentes a los datos. La figura \ref{connection} ilustra la interacción del proceso master postmaster, el proceso servidor postgres y una aplicación cliente.

El proceso cliente puede ser el interface de usuario (frontend) psql (para realizar consultas SQL interactivas) o cualquier aplicación de usuario implementada utilizando la biblioteca libpg. Nótese que las aplicaciones implementadas utilizando ecpg (el preprocesador de SQL embebido de Postgres para C) también utiliza esta biblioteca.

Una vez que se ha establecido una conexión, el proceso cliente puede enviar una consulta al servidor (backend). Esta consulta se transmite utilizando un texto plano, es decir, no se ha hecho una traducción en el cliente (frontend). El servidor traduce la consulta, crea un plan de ejecución, ejecuta el plan y remite las tuplas recuperadas al cliente a través de la conexión establecida.