PostgreSQL is implemented using a simple "process per-user"
client/server model. In this model there is one client process
connected to exactly one server process.
As we don't know per se
how many connections will be made, we have to use a master process
that spawns a new server process every time a connection is
requested. This master process is called postmaster and
listens at a specified TCP/IP port for incoming connections. Whenever
a request for a connection is detected the postmaster process
spawns a new server process called postgres. The server
tasks (postgres processes) communicate with each other using
semaphores and shared memory
to ensure data integrity
throughout concurrent data access. Figure
\ref{connection} illustrates the interaction of the master process
postmaster the server process postgres and a client
application.
The client process can either be the psql frontend (for
interactive SQL queries) or any user application implemented using
the libpg library. Note that applications implemented using
ecpg
(the PostgreSQL embedded SQL preprocessor for C)
also use this library.
Once a connection is established the client process can send a query
to the backend (server). The query is transmitted using plain text,
i.e. there is no parsing done in the frontend (client). The
server parses the query, creates an execution plan,
executes the plan and returns the retrieved tuples to the client
by transmitting them over the established connection.