AOR2/K2P 2022

Izvor: SI Wiki
< АОР2
Datum izmene: 10. maj 2023. u 23:29; autor: KockaAdmiralac (razgovor | doprinosi) (Prvi zadatak // Edit via Wikitext Extension for VSCode)
(razl) ← Starija izmena | Trenutna verzija (razl) | Novija izmena → (razl)
Pređi na navigaciju Pređi na pretragu

Popravni drugi kolokvijum 2022. godine održan je 11. juna i trajao je 90 minuta.

1. zadatak

Postavka

Opisati opšti postupak virtuelizacije uređaja. Posebno opisati virtuelizaciju diskova i načina na koji je obavljena virtuelizacija prekida koji stižu od ovih uređaja.

Rešenje

Uređaji se mogu virtuelizovati tako što se gostujućem operativnom sistemu predstavi jedan virtuelni uređaj sa kojim on može komunicirati (misleći da komunicira sa pravim uređajem), a zatim hipervizor usmerava zahteve upućene tom virtuelnom uređaju ka pravim hardverskim uređajima. Kod diskova, gost može misliti da ima pristup celom disku a zapravo ima pristup samo delu diska ili samo jednoj datoteci na disku, u kojem slučaju hipervizor mora da preslikava adrese kojima se pristupa na prave adrese. Prekidi od ovih uređaja se takođe emuliraju tako što pravi prekid stigne do hipervizora a on zatim izazove virtuelni prekid u gostujućem operativnom sistemu.

2. zadatak

Ovaj zadatak nije rešen. Pomozite SI Wiki tako što ćete ga rešiti.

Postavka

Potrebno je optimizovati funkciju int find(register char* str1, register int len1, register char* str2, register int len2) korišćenjem ugrađenog makroa void prefetch(const void *addr) na odgovarajućim mestima tako da se maksimalno smanji broj promašaja u keš memoriji. Data funkcija pronalazi poziciju niza karaktera zadat[sic] pokazivačem str2 i dužinom len2 unutar niza karaktera zadat[sic] pokazivačem str1 i dužinom len1. Ukoliko se niz karaktera zadat pokazivačem str2 i dužinom len2 ne nalazi unutar niza karaktera zadat[sic] pokazivačem str1 i dužinom len1, rezultat funkcije je -1. Smatrati da je len1>0 i 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;
}

Procesor poseduje samo L1 keš memoriju. Veličina bloka keš memorije je 64B.

Memorijski kontroler i aritmetičko logička jedinica procesora imaju mogućnost rada u paraleli. Smatrati da void prefetch vraća rezultat nakon 5 C++ izraza koji koriste operativnu memoriju. C++ izrazi koji ne koriste operativnu memoriju smatrati da ne utiču značajno u vremenu prilikom izvršavanja void prefetch, tako da takve izraze treba ignorisati.

Rešenje