Системные вызовы работы с сокетами в ОС UNIX
Структура адреса сокета
Существует два семейства адресов сокетов:
- семейство адресов UNIX (домен UNIX), используется для межпроцессного взаимодействия на одном компьютере;
- семейство адресов Internet (домен Internet) используется для межпроцессного взаимодействия в сети.
Структура адреса сокета домена Internet:
struct sockaddr in{
u_char sin_len; /* длина структуры */
u_char sin_family; /* константа AF_INET */
u_short sin_port; /* номер порта */
struct in_addr sin_addr; /* IP-адрес */
char sin_zero[8]; /* резерв */
}
Получить дескриптор сокета (создать сокет)
Сокет создается при помощи системного вызова socket.
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain,int type,int protocol);
Здесь domain – (IF_INET для домена Интернет, AF_UNIX Для домена UNIX), type – тип обслуживания (SOCK_STREAM для TCP, SOCK_DGRAM для UDP), protocol – номер применяемого протокола или 0. Нулевое значение параметра указывает, что должен применяться протокол, предусмотренный по умолчанию для данного семейства адресов и типа обслуживания. Функция socket в случае успешного выполнения возвращает дескриптор сокета, в случае ошибки возвращает -1.
Пример: sd = socket(AF_INET,SOCK_STREAM,0);
Указать адрес локальной оконечной точки
Функция bind привязывает локальный сокет к адресу, или указывает адрес локальной оконечной точки.
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *lockaddr, int addrlen);
Здесь sockfd – дескриптор сокета, созданный в результате вызова функции socket; lockaddr – указатель на структуру адреса сокета, в которой указаны IP-адрес и номер порта; addrlen – размер структуры адреса сокета. Функция bind возвращает 0 в случае успешного выполнения и -1 при ошибке.
Функция "привязывает" сокет к локальному IP-адресу и локальному порту.
Перевод сокета в пассивный режим
Перевод сокета в пассивный режим выполняет функция listen. Она вызывается процессом-сервером. Переводит сокет в прослушивающий режим и устанавливает очередь для запросов на установление соединения.
#include <sys/socket.h>
int listen(int sd,int backlog);
Здесь sd – дескриптор сокета; backlog – максимальная длина очереди для запросов на установление соединения. Функция listen возвращает 0 в случае успешного выполнения и -1 при ошибке.
Принять соединение с сокетом
Функция accept используется процессом-сервером.
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sd, struct sockaddr *addr,int *addrlen);
Здесь sd – дескриптор сокета; addr – указатель на структуру, в которую функция accept записывает IP-адрес и номер порта протокола удаленного компьютера; addrlen – указатель на целое число, в которое перед вызовом функции записывается размер структуры *addr, а после возврата из функции содержится число байтов, записанных фуекцией в эту структуру. Функция accept возвращает неотрицательный дескриптор сокета в случае успешного выполнения и -1 при ошибке.
Функция accept 1) извлекает из очереди сокета с дескрипторм sd следующий запрос на установление соединения; 2) создает новый сокет для нового запроса и возвращает дескриптор этого сокета. Этот сокет используется только для нового соединения. Старый сокет служит для приема новых запросов на соединения. Старый сокет sd называют прослушивающим, новый сокет – присоединенным.
Установить соединение с сервером.
Функция connect соединение с сервером.
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sd, struct sockaddr *addr, int addrlen);
Здесь sd – дескриптор сокета; addr – указатель на структуру, в которую записан адрес оконечной точки, соответствующей удаленному компьютеру; addrlen – длина второго параметра. Функция connect возвращает 0 в случае успешного выполнения и -1 при ошибке.
Функция connect используется клиентом. Она инициирует соединение TCP и возвращает код возврата, говорящий об успехе или неуспехе.
Чтение данных из сокета и запись данных в сокет
Чтение и запись данных могут производиться как при помощи универсальных функций (read, write), так и при помощи специализированных функций работы с сокетами (send, recv для сокетов TCP и sendto, recvfrom для сокетов UDP).
Операции клиента и сервера
На рис. 13.2 показаны операции клиента и сервера при взаимодействии с установлением соединения.
Вопросы для самоконтроля
1. Что такое IP-адрес?
2. Как адресуются службы в сети?
3. Что представляет собой порт?
4. Дайте определение понятиям "протокол", "стек коммуникационных протоколов".
5. Что такое сокет?
6. Могут ли процессы, работающие на одном и том же компьютере, взаимодействовать при помощи сокетов?
Раздел 4. Планирование
Тема 14. Краткосрочное планирование
Основные понятия
В многозадачных системах ОС должна выполнять планирование процессов. Существует три вида планирования:
Долгосрочное планирование – решение о добавлении процесса в пул выполняемых процессов.
Среднесрочное планирование – решение о добавлении процесса к числу процессов, полностью или частично размещенных в ОП.
Краткосрочное планирование – решение о том, какой из доступных процессов будет выполняться процессором.
Далее будет рассматриваться только краткосрочное планирование. Краткосрочный планировщик, или диспетчер, работает чаще всего, решая, какой именно процесс будет выполняться следующим. Режим решения определяет, в какие моменты времени выполняется выбор следующего процесса. Режимы решения подразделяются на две основные категории.
Невытесняющие. Выполняющийся процесс продолжает выполняться до тех пор, пока он не завершится или пока не окажется в заблокированном состоянии, ожидая завершения операции ввода-вывода или некоторого системного сервиса.
Вытесняющие. Выполняющийся процесс может быть прерван и переведен операционной системой в состояние готовности к выполнению. Решение о вытеснении может приниматься при запуске нового процесса по прерыванию или периодически – на основе прерываний таймера.
Вытесняющие стратегии приводят к повышенным накладным расходам по сравнению с невытесняющими, но при этом обеспечивают лучший уровень обслуживания всего множества процессов, поскольку предотвращают монопольное использование процессора одним процессом.
14.2. Критерии краткосрочного планирования.
Основная цель краткосрочного планирования состоит в распределении процессорного времени таким образом, чтобы оптимизировать один или несколько критериев (аспектов поведения системы). Основные из этих критериев перечислены ниже.
Время оборота – интервал времени поступлением процесса и его завершением. Включает время выполнения и ожидания.
Время отклика – в интерактивных процессах это время между подачей запроса и началом получения ответа на него.
Предсказуемость – данное задание должно выполняться примерно за одно и то же время независимо от загрузки системы.
Пропускная способность – количество процессов, завершающихся за единицу времени.
Использование процессора – процент времени, в течение которого процессор занят.
14.3. Стратегии краткосрочного планирования.