АОР2/К2П 2022 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
(Prepis K2P 2022)
 
м (Prvi zadatak // Edit via Wikitext Extension for VSCode)
 
Ред 1: Ред 1:
{{tocright}}
{{tocright}}
{{нерешено}}
'''Поправни други колоквијум 2022. године''' одржан је 11. јуна и трајао је 90 минута.
'''Поправни други колоквијум 2022. године''' одржан је 11. јуна и трајао је 90 минута.


Ред 8: Ред 7:


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


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

Тренутна верзија на датум 10. мај 2023. у 23:29

Поправни други колоквијум 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, тако да такве изразе треба игнорисати.

Решење