КДП/Филтерски процеси

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Филтерски процеси су тип задатка из дистрибуираног програмирања из трећег блока наставе и долазе на дистрибуираном делу испита за СИ и РТИ.










Септембар 2023, 3. задатак

Debug: КДП/Септембар 2023 3. задатак

Поставка

Филтерски процеси имају један улаз и један излаз и раде следеће: примају позитивне вредности на улазу и прослеђују их на излаз ако су веће од запамћеног минимума процеса. Процеси имају само две локације, за сачувани минимум и за последњу примљену вредност. Када на улаз стигне EOS, избацују минималну вредност на излаз а затим EOS. Направите проточну обраду (pipeline) од n процеса који опадајуће соритају до n улазних позитивних вредности које се убацују на почетак проточне обраде а завршавају се са EOS.

Решење

void process() {
    chan<int> in;
    chan<int> out;
    int input;
    int min;
    while ((input = in.receive()) != EOS) {
        if (input < min) {
            out.send(min);
            min = input;
        } else out.send(input);
    out.send(min);    
    out.send(EOS);
}

Фебруар 2020, 3. задатак

Debug: КДП/Фебруар 2020 3. задатак

Поставка

Филтерски процеси имају један улаз и један излаз. Процеси имају само три локације. Направите проточну обраду (pipeline) од n ових филтерских процеса који проналазе медијану: до n улазних позитивних вредности (непарно) које се убацују на почетак проточне обраде, а завршавају се са EOS. На излаз проточне обраде се шаље медијана па EOS.

Решење

Пошто је у задатку речено да је дозвољено користити само три локације у процесу, једна ће бити одвојена за број који пристиже а друге две за локалне минимуме и максимуме. Памтиће се минимуми и максимуми јер је медијана непарног броја елемената управо она вредност која је тачно на средини листе у сортираном поретку. За разлику од других решења оваквог типа задатка на викију, ништа се не шаље на излаз осим EOS кад се исти прими јер је сва обрада за медијану већ разрешена унутар петље.

void process() {

    chan<int> in;
    chan<int> out;
    int input;
    int mem[2];
    while ((input = in.receive()) != EOS) {       
        if (mem[0] <= input && input <= mem[1]) {
              out.send(input);
            } else if (input < mem[0]) {
                out.send(mem[0]);
                mem[0] = input;
            } else if (input > mem[1]) {
                out.send(mem[1]);
                mem[1] = input;
            }
    }
    out.send(EOS);
}

Фебруар 2021, 3. задатак

Debug: КДП/Фебруар 2021 3. задатак

Поставка

Филтерски процеси имају један улаз и један излаз, и до три локације за примљене бројева. Направите проточну обраду (pipeline) од n ових филтерских процеса која сортира па сабира до 2*n улазних реалних бројева које се убацују на почетак проточне обраде, а завршавају се са EOS. На излаз проточне обраде се шаље сума па EOS.

Решење

Када стигне EOS, уколико су се све остале вредности пропагирале кроз мрежу, ове вредности ће бити сортиране од највеће ка најмањој како се редом буде ишло кроз садржај филтерских процеса. У задатку није специфицирано на који начин треба да се види чињеница да се низ сортира, па је ово узето као претпоставка.

void process() {
    chan<int> in;
    chan<int> out;
    int numReceived = 0;
    int input;
    int mem[2];
    while ((input = in.receive()) != EOS) {
        if (numReceived < 2) {
            mem[numReceived++] = input;
        } else {
            if (input <= mem[0] && input <= mem[1]) {
                out.send(input);
            } else if (mem[0] <= input && mem[0] <= mem[1]) {
                out.send(mem[0]);
                mem[0] = input;
            } else {
                out.send(mem[1]);
                mem[1] = input;
            }
        }
    }
    out.send(mem[0] + mem[1]);
    out.send(EOS);
}