АОР2/К2П 2022

Извор: SI Wiki
< АОР2
Датум измене: 10. мај 2023. у 22:29; аутор: KockaAdmiralac (разговор | доприноси) (Prvi zadatak // Edit via Wikitext Extension for VSCode)
(разл) ← Старија измена | Тренутна верзија (разл) | Новија измена → (разл)
Пређи на навигацију Пређи на претрагу

Поправни други колоквијум 2022. године одржан је 11. јуна и трајао је 90 минута.

1. задатак

Поставка

Описати општи поступак виртуелизације уређаја. Посебно описати виртуелизацију дискова и начина на који је обављена виртуелизација прекида који стижу од ових уређаја.

Решење

Уређаји се могу виртуелизовати тако што се гостујућем оперативном систему представи један виртуелни уређај са којим он може комуницирати (мислећи да комуницира са правим уређајем), а затим хипервизор усмерава захтеве упућене том виртуелном уређају ка правим хардверским уређајима. Код дискова, гост може мислити да има приступ целом диску а заправо има приступ само делу диска или само једној датотеци на диску, у којем случају хипервизор мора да пресликава адресе којима се приступа на праве адресе. Прекиди од ових уређаја се такође емулирају тако што прави прекид стигне до хипервизора а он затим изазове виртуелни прекид у гостујућем оперативном систему.

2. задатак

Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.

Поставка

Потребно је оптимизовати функцију int find(register char* str1, register int len1, register char* str2, register int len2) коришћењем уграђеног макроа void prefetch(const void *addr) на одговарајућим местима тако да се максимално смањи број промашаја у кеш меморији. Дата функција проналази позицију низа карактера задат[sic] показивачем str2 и дужином len2 унутар низа карактера задат[sic] показивачем str1 и дужином len1. Уколико се низ карактера задат показивачем str2 и дужином len2 не налази унутар низа карактера задат[sic] показивачем str1 и дужином len1, резултат функције је -1. Сматрати да је len1>0 и len2>0.

int find(register char* str1, register int len1, register char* str2, register int len2)
{
    register int i;
    register int j;

    for (i = 0; i <= len1 - len2; i++) {
        for (j = 0; j < len2; j++) {
            register c1 = str1[i + j];
            register c2 = str2[j];
            if (c1 != c2)
                break;
        }
        if (j == len2)
            return i;
    }
    return -1;
}

Процесор поседује само L1 кеш меморију. Величина блока кеш меморије је 64B.

Меморијски контролер и аритметичко логичка јединица процесора имају могућност рада у паралели. Сматрати да void prefetch враћа резултат након 5 C++ израза који користе оперативну меморију. C++ изрази који не користе оперативну меморију сматрати да не утичу значајно у времену приликом извршавања void prefetch, тако да такве изразе треба игнорисати.

Решење