Процессор имеет очередь записи, поэтому, когда что-то сохраняется в памяти, данные просто попадают в очередь. Инструкция считается завершенной, как только данные поступают в очередь - вы можете начать выполнение следующей инструкции, не дожидаясь, пока данные перейдут из очереди в целевую память.
Пространство ввода / вывода не то же самое. Если вы читаете из пространства ввода-вывода, ваше чтение не будет даже начинаться , пока все данные в очереди записи в память в это время не будут записаны в память. Если вы выполняете запись в пространство ввода / вывода, инструкция начинает выполняться немедленно, но следующая инструкция не может быть выполнена, пока все данные в очереди записи не будут записаны и данные, записываемые текущая инструкция была написана.
Причина этого довольно проста: когда вы имеете дело с памятью, процессор знает обо всем отображении адресов, поэтому, если (например) вы записываете что-то в память и (почти) сразу же читаете это обратно, процессор может / обнаружит, что данные на самом деле находятся в очереди записи, и гарантирует, что ваше чтение получит текущие данные.
Однако при использовании пространства ввода / вывода процессор не знает, как чтение / запись с / на конкретный адрес может быть связано с предыдущей операцией чтения / записи в области памяти. Например, вы можете отправлять некоторые данные в память, а затем указывать графической карте использовать эти данные в качестве текстуры. Вы, возможно, не так хорошо, но у ЦП нет реального способа узнать, поэтому он должен сделать пессимистическое предположение и подождать, пока данные, которые вы записали в память, действительно попадут туда (или, по крайней мере, покинуть ЦП), прежде чем он скажет графическая карта для использования этих данных.