• Как ОС определяет из какого устройства надо достать данные?

    @Vitteran
    Рассмотрим архитектуру x86 в защищенном режиме.
    Предположим, 0x01 - виртуальный адрес, к которому хочет обратиться процесс и инструкция выглядит например так:
    mov eax, 0x01
    Когда процессор начнет выполнять эту инструкцию, он пойдет в таблицу страниц (page table) (адрес корня которой лежит в регистре cr3), найдет запись соответствующую этой странице (в данном случае номер страницы - 0x0) и проверит специальный бит - присутствует ли страница в памяти или нет.
    Предположим, присутствует - тогда процессор возьмет физический адрес этой страницы из таблицы страниц, и получит по нему данные - если они были в L1/L2/L3 кэше, то из кэша, иначе выставит адрес на шину и получит данные из RAM.
    Теперь предположим, что страница не присутствует - тогда происходит исключение Page fault (#PF, номер 14 на x86) и вызывается специальный обработчик из ядра операционной системы, который будет решать, откуда взять эту страницу - возможно она есть в свопе, тогда произойдет подкачка страницы из свопа, она запишется в память, бит присутствия станет 1 в соответствующей записи в таблице страниц, а процесс получит нужные ему данные.
    Но также возможно, что такой виртуальный адрес (что скорее всего верно для адреса 0x1) процессу недоступен и система пошлет ему сигнал SEGFAULT и он завершится.
  • Что лучше для новичка в программировании C или C++?

    @Vitteran
    Мда, и вот это лучший ответ.
    Этот код далже не скомпилируется.
    char a[], b[]; // a и b - массивы символов

    Это никакие не массивы символов.