Составители:
будет ли команда ожидать готовности клиента, чтобы установить с ним соединение, или 
же она немедленно завершится. 
Параметр 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
Страницы
- « первая
- ‹ предыдущая
- …
- 176
- 177
- 178
- 179
- 180
- …
- следующая ›
- последняя »
