Будет ли мой сервер работать только с одним клиентом, если это однопоточный процесс. Если да, то почему? - PullRequest
1 голос
/ 28 апреля 2020

Я погуглил достаточно прилично, чтобы понять темы и процессы. Одна вещь, которую я запутался, - это однопоточный процесс. Сценарий представляет собой процесс приложения «сервер-клиент», где каждый клиент рассматривается как один процесс на сервере, который является однопоточным. Некоторые блоги говорят, что однопоточная программа не сможет одновременно обрабатывать несколько клиентов ie. Она может запустить один процесс, и только после его завершения может быть запущен другой процесс. Но некоторые блоги говорят, что это возможно.

Насколько я понимаю, в одноядерной процессорной системе, если она запрограммирована на многозадачность, в зависимости от временного интервала, выделенного для каждого процесса, более одного процесса может быть одновременно обработанным. В многопроцессорной системе также можно обрабатывать несколько клиентских процессов параллельно. Это просто веб-серверы, которые не обрабатывают более одного процесса одновременно, потому что это итеративный сервер? Если это какой-либо другой параллельный сервер, будет ли он обрабатывать более одного процесса, не дожидаясь завершения каждого процесса для обработки следующего ..?

Поскольку меня смущают многие разные объяснения в разных блогах, я Я ожидаю очень точного ответа только для вышеупомянутого сценария, либо в однопроцессорной среде с многозадачной средой (или) в многопроцессорной среде. Кроме того, хотелось бы узнать, есть ли какие-либо преимущества использования однопоточного процесса над процессом без каких-либо потоков.

Извините, если мое понимание неверно. Пожалуйста, ответьте.

Заранее спасибо ..

1 Ответ

0 голосов
/ 01 мая 2020

Если ваш сервер делает это:

while(true)
    listen()
    accept()
    read()
    process()
    write()
    close()

И каждый из вызовов на прием, чтение, обработку, запись и закрытие является однопоточным, то сервер не сможет снова прослушивать новые запросы, пока эти вызовы полный. Запросы могут стоять в очереди или просто отбрасываться, если сервер их не слушает. Если принять / прочитать / обработать / записать / закрыть занимает больше времени по сравнению с прослушиванием (), то ваш сервер не будет часто доступен для запросов на обслуживание. Более того, если некоторые запросы занимают 100 секунд, а некоторые - 1 секунду, и большая часть этого времени блокируется на ввод-вывод, например, для базы данных или веб-службы, то вы проводите большую часть своего времени на сервере, ничего не делая , Вот альтернатива:

while(true)
    listen()
    start new thread()
        accept()
        read()
        process()
        write()
        close()

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

...