Переключение контекста во время системного вызова - PullRequest
2 голосов
/ 12 июля 2020

Предположим, у нас есть 2 потока в процессе. теперь мы запускаем следующий код:

read(fd, buf, 10);

, где fd - это некоторый дескриптор файла, который используется совместно между потоками (скажем, stati c), а buf - это массив, который не используется совместно между потоками (локальный переменная).

теперь предположим, что размер файла составляет 1 КБ, и первые 10 символов в файле - «AAAAAAAAAA», а все остальные - «B». ("BBBBBB .....").

now Если у нас есть только один процессор, каковы будут результаты буферов, если я буду печатать их в каждом потоке?

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

Возможно ли переключение контекста в середине системного вызова? и если да, то что, по вашему мнению, будет у buf's в конце выполнения?

1 Ответ

0 голосов
/ 13 июля 2020

Современные диски не могут выполнять чтение и запись с детализацией 10 байт, а вместо этого выполняют чтение и запись в единицах секторов, обычно 512 байт для жестких дисков (HDD).
Копирование 10 символов в буфер потока происходит очень быстро, до переключения контекста, хотя и не гарантируется.

Простая программа, чтобы почувствовать, будет иметь 2 потока печати на одной консоли, один печатает + и другой -. Проверьте, сколько + перед первым -. В любом случае, что касается исходного вопроса, измените размер массива на 1024 и поставьте 1024 A для начала, и вы, скорее всего, увидите разницу.

...