Операционные системы. Учебное пособие. Марапулец Ю.В. - 178 стр.

UptoLike

Составители: 

будет ли команда ожидать готовности клиента, чтобы установить с ним соединение, или
же она немедленно завершится.
Параметр dwMaxInstances. Программа-сервер может открывать каналы для не-
скольких клиентов, однако она должна заранее знать, со сколькими клиентами ей при-
дется поддерживать связь. Вводить новое имя канала для каждого клиента неудобно.
Каким же образом клиенты будут заранее узнавать, какое имя канала они должны ис-
пользовать, открывая соединение на своем конце? Чтобы обойти эту проблему, Win32
разрешает серверу многократно создавать один и тот же канал.
Каждый раз при вызове функции CreateNamedPipe() с одним и тем же именем вы
получаете новый экземпляр данного канала. Каждый такой экземпляр обеспечивает не-
зависимую линию связи с другим клиентом. Кроме того, сервер может заранее несколь-
ко раз создать один и тот же канал. Он получит несколько различных дескрипторов и
будет ожидать подключения программ-клиентов на других концах каналов. Все про-
граммы-клиенты для получения своих дескрипторов используют одно и то же имя кана-
ла, однако каждая из них получает дескриптор, указывающий на другой экземпляр кана-
ла. Если после того, как все каналы будут заняты, следующая программа-клиент
попытается установить соединение, она будет заблокирована до тех пор, пока сервер не
разорвет связь с одним из предыдущих экземпляров канала.
Параметр dwMaxInstances функции CreateNamedPipe() устанавливает верхний пре-
дел количества экземпляров одного канала, которые будут поддерживаться системой до
тех пор, пока функция CreateNamedPipe() не возвратит код ошибки. Флаг
PIPE_UNLIMITED_INSTANCES свидетельствует об отсутствии верхнего предела. В
этом случае максимальное число экземпляров ограничивается только системными ре-
сурсами. Значение параметра dwMaxInstances не может превышать значения
PIPE_UNLIMITED_INSTANCES. В файле Winbase.H значение параметра dwMaxIns-
tances задано равным 255.
Параметры dwOutBuf и dwInBuf задают начальные размеры буферов, в которые
производится запись информации. Для выходного канала (PIPE_ACCESS_OUTBOUND)
значение имеет только размер выходного буфера, для входного канала - только размер
входного буфера.
Пределы, заданные параметрами буфера, достаточно гибки. Каждая операция чте-
ния или записи заставляет операционную систему выделить место для буфера из дина-
мической области системной памяти ядра. Значение, определяющее размер буфера, ин-
терпретируется как квота, ограничивающая выделенный объем памяти. Когда система
предоставляет место для буфера операций записи, она анализирует заданные пределы
буфера. Если размер нового буфера не превышает заданный, операция выполняется кор-
ректно. Но даже если размер созданного буфера не укладывается в заданные рамки, сис-
тема все равно выделяет для него место - за счет ресурсов процесса. Во избежание пере-
грузки ресурсов процесса каждая операция WriteFile(), вызывающая превышение
выделенного размера буфера, блокируется. Записывающий поток приостанавливается до
тех пор, пока поток-получатель не уменьшит объем буфера, прочитав из него достаточ-
ный объем информации.
При оценке размеров буфера необходимо принимать во внимание тот факт, что ре-
альный размер всегда должен быть немного больше расчетного, поскольку каждое со-
общение сопровождается дополнительной внутренней структурой данных размером
приблизительно в 28 байтов. Точный размер этой структуры не документируется и мо-
жет изменяться от версии к версии.
Итак, операционная система при необходимости динамически выделяет системную
память для буфера, однако потоки, для работы которых требуется объем памяти, пре-
вышающий выделенный размер буфера, могут быть заблокированы. От увеличения раз-
180
будет ли команда ожидать готовности клиента, чтобы установить с ним соединение, или
же она немедленно завершится.
      Параметр dwMaxInstances. Программа-сервер может открывать каналы для не-
скольких клиентов, однако она должна заранее знать, со сколькими клиентами ей при-
дется поддерживать связь. Вводить новое имя канала для каждого клиента неудобно.
Каким же образом клиенты будут заранее узнавать, какое имя канала они должны ис-
пользовать, открывая соединение на своем конце? Чтобы обойти эту проблему, Win32
разрешает серверу многократно создавать один и тот же канал.
      Каждый раз при вызове функции CreateNamedPipe() с одним и тем же именем вы
получаете новый экземпляр данного канала. Каждый такой экземпляр обеспечивает не-
зависимую линию связи с другим клиентом. Кроме того, сервер может заранее несколь-
ко раз создать один и тот же канал. Он получит несколько различных дескрипторов и
будет ожидать подключения программ-клиентов на других концах каналов. Все про-
граммы-клиенты для получения своих дескрипторов используют одно и то же имя кана-
ла, однако каждая из них получает дескриптор, указывающий на другой экземпляр кана-
ла. Если после того, как все каналы будут заняты, следующая программа-клиент
попытается установить соединение, она будет заблокирована до тех пор, пока сервер не
разорвет связь с одним из предыдущих экземпляров канала.
      Параметр dwMaxInstances функции CreateNamedPipe() устанавливает верхний пре-
дел количества экземпляров одного канала, которые будут поддерживаться системой до
тех пор, пока функция CreateNamedPipe() не возвратит код ошибки. Флаг
PIPE_UNLIMITED_INSTANCES свидетельствует об отсутствии верхнего предела. В
этом случае максимальное число экземпляров ограничивается только системными ре-
сурсами. Значение параметра dwMaxInstances не может превышать значения
PIPE_UNLIMITED_INSTANCES. В файле Winbase.H значение параметра dwMaxIns-
tances задано равным 255.
      Параметры dwOutBuf и dwInBuf задают начальные размеры буферов, в которые
производится запись информации. Для выходного канала (PIPE_ACCESS_OUTBOUND)
значение имеет только размер выходного буфера, для входного канала - только размер
входного буфера.
      Пределы, заданные параметрами буфера, достаточно гибки. Каждая операция чте-
ния или записи заставляет операционную систему выделить место для буфера из дина-
мической области системной памяти ядра. Значение, определяющее размер буфера, ин-
терпретируется как квота, ограничивающая выделенный объем памяти. Когда система
предоставляет место для буфера операций записи, она анализирует заданные пределы
буфера. Если размер нового буфера не превышает заданный, операция выполняется кор-
ректно. Но даже если размер созданного буфера не укладывается в заданные рамки, сис-
тема все равно выделяет для него место - за счет ресурсов процесса. Во избежание пере-
грузки ресурсов процесса каждая операция WriteFile(), вызывающая превышение
выделенного размера буфера, блокируется. Записывающий поток приостанавливается до
тех пор, пока поток-получатель не уменьшит объем буфера, прочитав из него достаточ-
ный объем информации.
      При оценке размеров буфера необходимо принимать во внимание тот факт, что ре-
альный размер всегда должен быть немного больше расчетного, поскольку каждое со-
общение сопровождается дополнительной внутренней структурой данных размером
приблизительно в 28 байтов. Точный размер этой структуры не документируется и мо-
жет изменяться от версии к версии.
      Итак, операционная система при необходимости динамически выделяет системную
память для буфера, однако потоки, для работы которых требуется объем памяти, пре-
вышающий выделенный размер буфера, могут быть заблокированы. От увеличения раз-



                                         180