etualelle korkeampi prioriteetti?

Miten Linuxissa saa juuri nyt päälimmäisenä olevan ikunan ohjelmalle automaattisesti korkeamman prioriteetin?
Tällä saisi käytettävyyttä paremmaksi.

Windowsissa on tähän asetus mutta Linuxista en ole löytänyt. Itellä käytössä Mint, Ubuntu ja Rasbian.
10367
Äänestä

Muut lukivat myös

Vastaukset 10

Vanhimmat

Ei kyllä saisi. Skedulerilla on algoritmi, joka painottaa prosesseja joilla on eniten tekemistä - idlaajia siis skeduloidaan vähemmän. Tästä seuraa, että päällimäinen ikkuna saa eniten ajoaikaa, mikäli se sitä tarvitsee. Asian huomaa helposti ajamalla esim. virtualboxia etualalla ja sitten siirtämällä sen taustalle: Kestää aika pitkään, koska ohjelman muistijälki ja käyttämä cpu-teho on niin isoja.
Jos sinulla on kaksi prosessia haukkaamassa resursseja, tapahtuu näille siten automaattisesti tasajako. Käynnistyksen yhteydessä voi tosin kertoa, kuinka paljon haluaa prosessia suosia nice-komennolla - ja sitäkin voi muuttaa jälkeenpäin renice-komennolla. Sen sijaan ikkunaan sidottu prioriteetin nosto huonontaa käytettävyyttä - ikkunasta ei pääse eroon. Mietipä vaikka pop-up mainosta, jonka klikkaaminen kestää pois kauan? Ei kovin mukavaa ja siksi sen tekeminen ei ole automaattista vaan käyttäjä joutuu itse virittelemään tuollaiset epäkelvot toteutukset jos niille tulee tarvetta: Oikeampi tapa on jakaa prosesseja osiin ja priorisoida tarpeen mukaan!

Äänestä

En tiedä onko tuohon mitään valmista ratkaisua, mutta ehkä sellaisen saisi tehtyä skripitllä, joka pyörisi taustalla, ja säätelisi nice-arvoa aktiivisena olevalle ikkunalle.

Pitää vaan sitten pitää kirjaa mille ikkunalle on muuteltu, jotta arvo muutetaan takaisin oletukseen ikkunan vaihtuessa.

Ikkunan PID-arvon saa luettua komentosarjalla.

xprop | grep _NET_WM_PID | awk -F' ' '{print $NF}'

Tuo siis odottaa hiiren klikkausta, ja palauttaa PID-arvon.

Renice-komennolla saa muutettua prioriteettiä PID-arvon perusteella. Tulosteesta näkee vanhan prioriteetin, jonka voi sitten ottaa jemmaan palautusta varten.

https://www.geeksforgeeks.org/priority-of-process-in-linux-nice-value/

Äänestä

Minulla on Linuxissa yleensä käytössä 3 tai 4 virtuaalityöpöytää jolloin ei ole päällekkäisiä ikkunoita ( jos ei halua käyttää).

Äänestä

Tuossa yksi vähän typerä tapa nostaa hetkeksi aktiivisen (klikatun) ikkunan NICE-arvoa. Skriptin DELAY-muuttujassa on arvo, minkä aikaa pidetään uutta NICE-arvoa. Lopuksi skripti ajetaan uudelleen. Pitää ajaa roottina, eli vaikka sudolla, koska NICE-arvon vähennys vaatii root-oikeudet. Tallentaa siis ensin skriptin jollain nimellä, ja tekee siitä sitten suoritettavan chmod x:llä. Sitten sudo skripti.sh.

#!/usr/bin/env bash
DELAY=5
NEWNICE=10
PID=$(xprop | grep _NET_WM_PID | awk -F' ' '{print $NF}')
OLDNICE=$(ps -o ni= -p ${PID})
renice ${NEWNICE} ${PID}
echo Sleeping...
sleep ${DELAY}
renice ${OLDNICE} ${PID}
exec $(readlink -f "$0")

Äänestä
  • Tämä pitäisi muuttaa kaksiosaiseksi skriptiksi, joista toisessa luettaisiin silmukassa viimeksi klikatun ikkunan PID xprop-komennon avulla, ja tallennettaisiin se tiedostoon.

    Toinen skripti huolehtisi prioriteetin muuttamisesta, joka suoritettaisiin esimerkiksi muutaman sekunnin välein. Siinä tallennettaisiin muuttujaan edellisellä kerralla käsittelyssä ollut PID ja sen prioriteetti.

    Ensin luetaan ensimmäisen skriptin tiedostosta käsittelyyn tuleva PID. Jos se on sama kuin edellisellä kerralla, niin ei tehdä mitään. Jos taas eri, niin muutetaan muuttujaan tallennetun edellisen PID:n prioriteetti ennalleen, ja asetetaan uusi PID muuttujaan, ja muutetaan sen prioriteetti.

    Tuohon ensimmäiseen skriptiin olisi mahdollista tehdä myös filtteröintiä, joka esimerkiksi rajaisi prioriteettimuutokset vain käyttäjän sovelluksiin.

    Äänestä

  • Anonyymi kirjoitti:

    Tämä pitäisi muuttaa kaksiosaiseksi skriptiksi, joista toisessa luettaisiin silmukassa viimeksi klikatun ikkunan PID xprop-komennon avulla, ja tallennettaisiin se tiedostoon.

    Toinen skripti huolehtisi prioriteetin muuttamisesta, joka suoritettaisiin esimerkiksi muutaman sekunnin välein. Siinä tallennettaisiin muuttujaan edellisellä kerralla käsittelyssä ollut PID ja sen prioriteetti.

    Ensin luetaan ensimmäisen skriptin tiedostosta käsittelyyn tuleva PID. Jos se on sama kuin edellisellä kerralla, niin ei tehdä mitään. Jos taas eri, niin muutetaan muuttujaan tallennetun edellisen PID:n prioriteetti ennalleen, ja asetetaan uusi PID muuttujaan, ja muutetaan sen prioriteetti.

    Tuohon ensimmäiseen skriptiin olisi mahdollista tehdä myös filtteröintiä, joka esimerkiksi rajaisi prioriteettimuutokset vain käyttäjän sovelluksiin.

    Työkalu "xdotool" on parempi tapa selvittää PID, koska xprop vaatii näköjään ikkunan klikkaamista aktiivisesti. Sen asentamisen jälkeen saa aktiivisen ikkunan komennolla:

    xdotool getactivewindow getwindowpid

    Äänestä

  • Anonyymi kirjoitti:

    Työkalu "xdotool" on parempi tapa selvittää PID, koska xprop vaatii näköjään ikkunan klikkaamista aktiivisesti. Sen asentamisen jälkeen saa aktiivisen ikkunan komennolla:

    xdotool getactivewindow getwindowpid

    Uusi versio, joka selvittää DELAY:n välein mikä ikkuna on aktiivinen, ja vaihtaa sen prioriteettia ACTIVE_NICE_DIFF verran plussalle. Lisätty myöt ctrl-c trappi, jotta lopettaessa palautetaan aktiisena olevan ikkunan prioriteetti alkuperäiseen.

    #!/usr/bin/env bash
    DELAY=5
    ACTIVE_NICE_DIFF=10
    PREV_PID=$(xdotool getactivewindow getwindowpid)
    PREV_NICE=$(ps -o ni= -p ${PREV_PID})
    renice $(($PREV_NICE $ACTIVE_NICE_DIFF)) $PREV_PID

    trap ctrl_c INT

    ctrl_c() {
    renice $(($PREV_NICE)) $PREV_PID
    exit 0
    }


    loop () {
    sleep $DELAY
    NEW_PID=$(xdotool getactivewindow getwindowpid)
    NEW_NICE=$(ps -o ni= -p ${NEW_PID})
    if [ $NEW_PID -ne $PREV_PID ]; then
    renice $(($PREV_NICE)) $PREV_PID
    PREV_PID=$NEW_PID
    PREV_NICE=$NEW_NICE
    renice $(($PREV_NICE $ACTIVE_NICE_DIFF)) $PREV_PID
    fi
    loop
    }

    loop

    Äänestä

  • Anonyymi kirjoitti:

    Uusi versio, joka selvittää DELAY:n välein mikä ikkuna on aktiivinen, ja vaihtaa sen prioriteettia ACTIVE_NICE_DIFF verran plussalle. Lisätty myöt ctrl-c trappi, jotta lopettaessa palautetaan aktiisena olevan ikkunan prioriteetti alkuperäiseen.

    #!/usr/bin/env bash
    DELAY=5
    ACTIVE_NICE_DIFF=10
    PREV_PID=$(xdotool getactivewindow getwindowpid)
    PREV_NICE=$(ps -o ni= -p ${PREV_PID})
    renice $(($PREV_NICE $ACTIVE_NICE_DIFF)) $PREV_PID

    trap ctrl_c INT

    ctrl_c() {
    renice $(($PREV_NICE)) $PREV_PID
    exit 0
    }


    loop () {
    sleep $DELAY
    NEW_PID=$(xdotool getactivewindow getwindowpid)
    NEW_NICE=$(ps -o ni= -p ${NEW_PID})
    if [ $NEW_PID -ne $PREV_PID ]; then
    renice $(($PREV_NICE)) $PREV_PID
    PREV_PID=$NEW_PID
    PREV_NICE=$NEW_NICE
    renice $(($PREV_NICE $ACTIVE_NICE_DIFF)) $PREV_PID
    fi
    loop
    }

    loop

    Kohta viisi tuntia jauhanut tuo skripti taustalla, eikä ainakaan ole kone sekoillut, joten vaikuttaisi toimivan kuten pitääkin. Htopilla olen seurannut miten nice-arvo muuttuu.

    Seuraavassa evoluutiossa voisi lisätä kirjanpidon, joka näyttäisi lopuksi ctrl-c:n jälkeen kuinka pitkään mikäkin PID on ollut ylipriorisoituna.

    Äänestä

  • Anonyymi kirjoitti:

    Kohta viisi tuntia jauhanut tuo skripti taustalla, eikä ainakaan ole kone sekoillut, joten vaikuttaisi toimivan kuten pitääkin. Htopilla olen seurannut miten nice-arvo muuttuu.

    Seuraavassa evoluutiossa voisi lisätä kirjanpidon, joka näyttäisi lopuksi ctrl-c:n jälkeen kuinka pitkään mikäkin PID on ollut ylipriorisoituna.

    Hulluilla halvat huvit..

    Äänestä

Versio joka kirjaa ylös mille PID:lle on annettu kuinkakin pitkään isompaa prioriteettiä. Tulostusta ei ole mitenkään järjestelty, ja tuollainen dictionary-tyyppinen array vaatii kait vähintään BASH 4.0:n. Alla esimerkkituloste muutaman ikkunanvaihdon jälkeen, ja perässä skripti, joka nimetty tässä nice.sh:ksi. Lopetus siis ctrl c:llä.

$ sudo ./nice.sh
20804 (process ID) old priority 0, new priority 10
20804 (process ID) old priority 10, new priority 0
29229 (process ID) old priority 0, new priority 10
29229 (process ID) old priority 10, new priority 0
2087 (process ID) old priority 0, new priority 10
2087 (process ID) old priority 10, new priority 0
36370 (process ID) old priority 0, new priority 10
36370 (process ID) old priority 10, new priority 0
2087 (process ID) old priority 0, new priority 10
2087 (process ID) old priority 10, new priority 0
20804 (process ID) old priority 0, new priority 10
^C20804 (process ID) old priority 10, new priority 0
PID TIME PROCESS NAME
2087 55 firefox
20804 40 qterminal
29229 5 qterminal
36370 10 kcalc

--
#!/usr/bin/env bash
DELAY=5
ACTIVE_NICE_DIFF=10
PREV_PID=$(xdotool getactivewindow getwindowpid)
PREV_NICE=$(ps -o ni= -p ${PREV_PID})
renice $(($PREV_NICE $ACTIVE_NICE_DIFF)) $PREV_PID
ARR[$PREV_PID]=$((${ARR[$PREV_PID]} $DELAY))

trap ctrl_c INT

ctrl_c() {
renice $PREV_NICE $PREV_PID
echo -e "PID\tTIME\tPROCESS NAME"
for key in ${!ARR[@]}; do
echo -e "${key}\t${ARR[${key}]}\t$(ps -p ${key} -o comm=)"
done
exit 0
}


loop () {
sleep $DELAY
NEW_PID=$(xdotool getactivewindow getwindowpid)
NEW_NICE=$(ps -o ni= -p ${NEW_PID})
if [ $NEW_PID -ne $PREV_PID ]; then
renice $PREV_NICE $PREV_PID
PREV_PID=$NEW_PID
PREV_NICE=$NEW_NICE
renice $(($PREV_NICE $ACTIVE_NICE_DIFF)) $PREV_PID
fi
ARR[$PREV_PID]=$((${ARR[$PREV_PID]} $DELAY))
loop
}

loop

Äänestä

Kommentoi aloitusta


Anonyymi kirjoitti:

Miten Linuxissa saa juuri nyt päälimmäisenä olevan ikunan ohjelmalle automaattisesti korkeamman prioriteetin?
Tällä saisi käytettävyyttä paremmaksi.

Windowsissa on tähän asetus mutta Linuxista en ole löytänyt. Itellä käytössä Mint, Ubuntu ja Rasbian.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu