🗊Презентация Серверы

Категория: Образование
Нажмите для полного просмотра!
Серверы, слайд №1Серверы, слайд №2Серверы, слайд №3Серверы, слайд №4Серверы, слайд №5Серверы, слайд №6Серверы, слайд №7

Вы можете ознакомиться и скачать презентацию на тему Серверы. Доклад-сообщение содержит 7 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Необходимо предусмотреть, чтобы единственный поток выполнения в сервере держал открытыми соединения с несколькими клиентами и обеспечивал обслуживание сервером того соединения, через которое в определенный момент поступают данные. 
Необходимо предусмотреть, чтобы единственный поток выполнения в сервере держал открытыми соединения с несколькими клиентами и обеспечивал обслуживание сервером того соединения, через которое в определенный момент поступают данные. 
Однопотоковая реализация не требует переключения между контекстами потоков или процессов, поэтому она может дан выдержать более высокую нагрузку по сравнению с реализацией, в которой используются несколько потоков или процессов.
Описание слайда:
Необходимо предусмотреть, чтобы единственный поток выполнения в сервере держал открытыми соединения с несколькими клиентами и обеспечивал обслуживание сервером того соединения, через которое в определенный момент поступают данные. Необходимо предусмотреть, чтобы единственный поток выполнения в сервере держал открытыми соединения с несколькими клиентами и обеспечивал обслуживание сервером того соединения, через которое в определенный момент поступают данные. Однопотоковая реализация не требует переключения между контекстами потоков или процессов, поэтому она может дан выдержать более высокую нагрузку по сравнению с реализацией, в которой используются несколько потоков или процессов.

Слайд 2





В основе разработки программы однопотокового, параллельного сервера лежит использование асинхронного ввода/вывода, организованного с помощь системного вызова select. 
В основе разработки программы однопотокового, параллельного сервера лежит использование асинхронного ввода/вывода, организованного с помощь системного вызова select. 
Сервер создает сокет для каждого соединения, которое он должен поддерживать, а затем вызывает функцию select, которая ожидает поступления данных через каждое из них. 
Функция select может ожидать поступления запросов на выполнение операций ввода/вывода через все возможные сокеты, в том числе и одновременно ожидать поступления новых запросов на установление соединения.
Описание слайда:
В основе разработки программы однопотокового, параллельного сервера лежит использование асинхронного ввода/вывода, организованного с помощь системного вызова select. В основе разработки программы однопотокового, параллельного сервера лежит использование асинхронного ввода/вывода, организованного с помощь системного вызова select. Сервер создает сокет для каждого соединения, которое он должен поддерживать, а затем вызывает функцию select, которая ожидает поступления данных через каждое из них. Функция select может ожидать поступления запросов на выполнение операций ввода/вывода через все возможные сокеты, в том числе и одновременно ожидать поступления новых запросов на установление соединения.

Слайд 3





SELECT
SELECT
НАЗВАНИЕ
      	select, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - синхронное 	мультиплексирование ввода-вывода   
КРАТКАЯ СВОДКА
	          #include <sys/time.h> 
	#include <sys/types.h> 
	#include <unistd.h> 
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 
      	FD_CLR(int fd, fd_set *set); 
	FD_ISSET(int fd, fd_set *set); 
	FD_SET(int fd, fd_set *set); 
	FD_ZERO(fd_set *set);  
Описание слайда:
SELECT SELECT НАЗВАНИЕ select, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - синхронное мультиплексирование ввода-вывода   КРАТКАЯ СВОДКА #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); FD_CLR(int fd, fd_set *set); FD_ISSET(int fd, fd_set *set); FD_SET(int fd, fd_set *set); FD_ZERO(fd_set *set);  

Слайд 4





ОПИСАНИЕ
ОПИСАНИЕ
select ждет изменения статуса нескольких файловых дескрипторов. 
    Отслеживаются три независимых набора дескрипторов. Те, что перечислены в параметре readfds, будут отслеживаться на предмет появления новых символов, доступных для чтения (говоря точнее, операция чтения не будет блокирована -- в частности, файловый дескриптор находится в конце файла); те, что указаны в параметре writefds, будут отслеживаться на предмет того, что операция записи не будет заблокирована; те же, что указаны в параметре exceptfds, будут отслеживаться на предмет исключительных ситуаций. При возврате из функции наборы дескрипторов модифицируются, чтобы показать, какие из них изменили свой статус. 
Для манипуляций наборами существуют четыре макроса: FD_ZERO очищает набор. FD_SET и FD_CLR добавляют или удаляют заданный дескриптор из набора. FD_ISSET проверяет, является ли дескриптор частью набора; этот макрос полезен после возврата из функции select. 
n на единицу больше самого большого номера дескриптора из всех наборов. 
timeout -- это верхняя граница времени, которое пройдет перед возвратом из select. Можно использовать ноль, при этом select завершится немедленно. Если timeout равен NULL (нет таймаута), то select будет ожидать изменений неопределенное время.  
Описание слайда:
ОПИСАНИЕ ОПИСАНИЕ select ждет изменения статуса нескольких файловых дескрипторов. Отслеживаются три независимых набора дескрипторов. Те, что перечислены в параметре readfds, будут отслеживаться на предмет появления новых символов, доступных для чтения (говоря точнее, операция чтения не будет блокирована -- в частности, файловый дескриптор находится в конце файла); те, что указаны в параметре writefds, будут отслеживаться на предмет того, что операция записи не будет заблокирована; те же, что указаны в параметре exceptfds, будут отслеживаться на предмет исключительных ситуаций. При возврате из функции наборы дескрипторов модифицируются, чтобы показать, какие из них изменили свой статус. Для манипуляций наборами существуют четыре макроса: FD_ZERO очищает набор. FD_SET и FD_CLR добавляют или удаляют заданный дескриптор из набора. FD_ISSET проверяет, является ли дескриптор частью набора; этот макрос полезен после возврата из функции select. n на единицу больше самого большого номера дескриптора из всех наборов. timeout -- это верхняя граница времени, которое пройдет перед возвратом из select. Можно использовать ноль, при этом select завершится немедленно. Если timeout равен NULL (нет таймаута), то select будет ожидать изменений неопределенное время.  

Слайд 5





ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном завершении select возвращает количество дескрипторов, находящихся в наборах дескрипторов, причем это количество может быть равным нулю, если таймаут истекает, а интересующие нас события так и не произошли. При ошибке возвращается -1, а errno устанавливается должным образом; наборы дескрипторов и значение timeout становятся неопределены, поэтому при ошибке нельзя полагаться на их значение.   

ОШИБКИ
	EBADF   В одном из наборов находится неверный файловый дескриптор. 
	EINTR   Был пойман незаблокированный сигнал. 
	EINVAL    n отрицательно. 
	ENOMEM   Функция select не смогла выделить участок памяти для внутренних таблиц. 

ЗАМЕЧАНИЕ
В некоторых программах select вызывается с тремя пустыми наборами файлов, n равным нулю, и ненулевым значением timeout, что является довольно переносимым способом сделать задержку с миллисекундной точностью. 
Под Linux timeout изменяется, чтобы сообщить количество времени, которое не было использовано; большинство других реализаций не делают этого. Это приводит к проблемам как в коде под Linux, который читает значение timeout и переносится в другие операционные системы, так и когда код переносится под Linux и использует при этом struct timeval для нескольких функций select в цикле без повторной инициализации. Считайте, что параметр timeout неопределен после возврата из функции select.  
Описание слайда:
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ При успешном завершении select возвращает количество дескрипторов, находящихся в наборах дескрипторов, причем это количество может быть равным нулю, если таймаут истекает, а интересующие нас события так и не произошли. При ошибке возвращается -1, а errno устанавливается должным образом; наборы дескрипторов и значение timeout становятся неопределены, поэтому при ошибке нельзя полагаться на их значение.   ОШИБКИ EBADF В одном из наборов находится неверный файловый дескриптор. EINTR Был пойман незаблокированный сигнал. EINVAL n отрицательно. ENOMEM Функция select не смогла выделить участок памяти для внутренних таблиц. ЗАМЕЧАНИЕ В некоторых программах select вызывается с тремя пустыми наборами файлов, n равным нулю, и ненулевым значением timeout, что является довольно переносимым способом сделать задержку с миллисекундной точностью. Под Linux timeout изменяется, чтобы сообщить количество времени, которое не было использовано; большинство других реализаций не делают этого. Это приводит к проблемам как в коде под Linux, который читает значение timeout и переносится в другие операционные системы, так и когда код переносится под Linux и использует при этом struct timeval для нескольких функций select в цикле без повторной инициализации. Считайте, что параметр timeout неопределен после возврата из функции select.  

Слайд 6





ПРИМЕР
ПРИМЕР
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int
main(void)
{  fd_set rfds;
    struct timeval tv;
    int retval;
          /* Ждем, пока на стандартном вводе (fd 0) что-нибудь появится. */
    FD_ZERO(&rfds);
    FD_SET(0, &rfds);
            /* Ждем не больше пяти секунд. */
        tv.tv_sec = 5;
        tv.tv_usec = 0;
        retval = select(1, &rfds, NULL, NULL, &tv);       /* Не полагаемся на значение tv! */
    if (retval)
          printf("Данные доступны.\n");  /* Теперь FD_ISSET(0, &rfds) вернет истинное значение. */
    else     
          printf("Данные не появились в течение пяти секунд.\n");
    exit(0);
} 
Описание слайда:
ПРИМЕР ПРИМЕР #include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int main(void) { fd_set rfds; struct timeval tv; int retval; /* Ждем, пока на стандартном вводе (fd 0) что-нибудь появится. */ FD_ZERO(&rfds); FD_SET(0, &rfds); /* Ждем не больше пяти секунд. */ tv.tv_sec = 5; tv.tv_usec = 0; retval = select(1, &rfds, NULL, NULL, &tv); /* Не полагаемся на значение tv! */ if (retval) printf("Данные доступны.\n"); /* Теперь FD_ISSET(0, &rfds) вернет истинное значение. */ else printf("Данные не появились в течение пяти секунд.\n"); exit(0); } 

Слайд 7





int msock;  /* Ведущий сокет сервера */
int msock;  /* Ведущий сокет сервера */
fd_set    rfds; /* Набор дескрипторов, готовых к чтению */
fd_set    afds; /* Набор активных дескрипторов */
int    fd, nfds,  ssock;
                                  /* инициализация пассивного сокета msock*/
       nfds = getdtablesize();
 FD_ZERO(&afds);    FD_SET(msock,  &afds);
while (1) {
                 memcpy(&rfds, &afds, sizeof(rfds));
                 if (select(nfds, &rfds,  (fd_set *)0,  (fd_set *)0, (struct timeval *)0) <0) { /* ошибка */}
                  if (FD_ISSET(msock, &rfds)) {
                        alen = sizeof(fsin);
                         ssock = accept(msock,  (struct sockaddr *)&fsin, &alen); if (ssock <0) {/* ошибка */}
                             FD_SET(ssock, &afds);
                   }
              for (fd=0; fd<nfds; fd++)
                   if (fd != msock && FD_ISSET(fd, &rfds))
                       if (handler(fd) == 0) { /* число полученных байт */
                             close(fd);
         FD_CLR(fd,  &afds);
    }
}
Описание слайда:
int msock; /* Ведущий сокет сервера */ int msock; /* Ведущий сокет сервера */ fd_set rfds; /* Набор дескрипторов, готовых к чтению */ fd_set afds; /* Набор активных дескрипторов */ int fd, nfds, ssock; /* инициализация пассивного сокета msock*/ nfds = getdtablesize(); FD_ZERO(&afds); FD_SET(msock, &afds); while (1) { memcpy(&rfds, &afds, sizeof(rfds)); if (select(nfds, &rfds, (fd_set *)0, (fd_set *)0, (struct timeval *)0) <0) { /* ошибка */} if (FD_ISSET(msock, &rfds)) { alen = sizeof(fsin); ssock = accept(msock, (struct sockaddr *)&fsin, &alen); if (ssock <0) {/* ошибка */} FD_SET(ssock, &afds); } for (fd=0; fd<nfds; fd++) if (fd != msock && FD_ISSET(fd, &rfds)) if (handler(fd) == 0) { /* число полученных байт */ close(fd); FD_CLR(fd, &afds); } }



Теги Серверы
Похожие презентации
Mypresentation.ru
Загрузить презентацию