Как компьютер понимает, что он может переключиться на процесс, который ожидает данные из сети?

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

Сейчас я думаю, что нет другого способа сделать это, кроме периодической проверки некоторого регистра процессора, который указывает, что данные готовы, а затем выполнять вычисления. В моем понимании под капотом сетевая карта получает данные, помещает их в память и сама записывает в регистр процессора, что процессор может выполнять вычисления. После очередной периодической проверки процессор будет вычислять вещи. Можете ли вы сделать объяснение того, что на самом деле происходит в деталях (на оборудовании и в ОС). Этот вопрос волнует меня целую вечность!

Также будем рады любым материалам об этом!

1 ответ

Решение

Метод, описанный в вопросе процессора, периодически проверяющего какой-либо регистр данных, используется и называется опросом. Опрос часто используется в более простых системах, потому что он прост в реализации, но имеет недостаток в том, чтобы тратить циклы ЦП на проверку данных, которые могут быть, а могут и не быть.

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

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

Когда пакет получен сетевой картой, сетевая карта где-то сохранит его в ОЗУ. После этого сетевая карта запускает прерывание для ЦП. Прерывание (обычно) заставляет ЦП прекратить выполнение любой программы, которая могла выполняться в данный момент, а ЦП выполняет код ядра, связанный с обработкой сетевой активности. В этом случае он отправляет полученный пакет программе, которая ожидала получения данных.

Наконец, ядро ​​использует семафор, чтобы сигнализировать о получении пакета. Затем в ядре есть планировщик, "разбудивший" программу, которая ждала данные из сети. Программа может обрабатывать данные, а затем ждать следующего набора данных из сети.

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

Другие вопросы по тегам