Uke 14 - Threads, serialisering, race conditions, virtualisering og PowerShell.

Oppgaver til mandag 31. - fredag 4. apr

  1. 
    Linux-JVM i samarbeid med Linux-kjernen tar ikke hensyn til prioriteten, det samme skjer om alle prioritetene er like. Om man som root kjører java med opsjonen -XX:ThreadPriorityPolicy=1 vil det settes nice-verdier fra -5 til 4 på trådene. 
    (men ikke til negative verdier på docker-containeren, se over; her er det ikke forskjell på root og vanlig bruker, 
    begge kan kun sette prioriteten ned) Kun root kan sette opp prioriteten. Men dette kunne vært gjort slik at prioritetene ble mappet til niceverdi 0-9. 
    
    
  2. Windows-JVM i samarbeid med NT-kjernen tar ihensyn til prioriteten, det er stor forskjell på prioritet 4 og 5.
  3. (Oblig)

     
    // Kompileres med  javac NosynchThread.java
    // Run: java NosynchThread

    import java.lang.Thread;

    class SaldoThread extends Thread
    {
        static int MAX = 50000000;
        static int count = 0;
        public static int saldo; // Felles variable, gir race condition
        int id; 
        
        SaldoThread()
        {
            count++;
            id = count;
        }
        
        public void run()
        {
        System.out.println("Thread nr. "+ id +", med prioritet " + getPriority() + " starter");
        updateSaldo();
        }
        
        public void updateSaldo()
        {
        int i;
        if(id == 1) 
        {
            for(i = 1;i < MAX;i++) 
            {
            saldo++;
            }
        }
        else      
        {
            for(i = 1;i < MAX;i++)
            {
                saldo--;
            }
        }
        System.out.println("Thread nr. " + id + " ferdig. Saldo: " + saldo);
        }
    }

    class NosynchThread extends Thread
    {
       public static void main (String args[])
       {
           int i;
           System.out.println("Starter to threads!");

           SaldoThread s1 = new SaldoThread();
           SaldoThread s2 = new SaldoThread();
           s1.start();
           s2.start();

           try{s1.join();} catch (InterruptedException e){}
           try{s2.join();} catch (InterruptedException e){}

           System.out.println("Endelig total saldo: " +SaldoThread.saldo);
       }
    }

  4. Race condition: Når to eller flere prosesser skriver/leser til en eller annen form for delte data og sluttresultatet er avhengig av hvilket tidspunkt prosessene kjører. Minst en av prosessene må skrive.
  5. (Oblig)

  6.  
    main(){
       int i,S = 0;
       for(i=1;i < 5;i++){
          S = S + i;
       }
    }

    -0x4(%rbp) tilsvarer løkke-variabelen i og -0x8(%rbp) tilsvarer summen S. Variabelen i starter lik 1 og den legges til S for hver runde og økes deretter med 1. Så lenge i er mindre eller lik 4 (jle), hoppes det tilbake til start i koden og dermed kjøres løkken 4 ganger som den skal og i får verdiene 1,2,3 og 4. Når den er ferdig ligger dermed tallet 10 i -0x8(%rbp).
  7. (Oblig)

     
    class For{
       public static void main(String args[]){
          int i,S = 0;
          for(i=1;i < 5;i++){
              S = S + i;
          }      
       }
    }

  8. (Oblig)

  9. (Oblig)
  10. (Oblig)
  11. (Oblig)
  12. (Oblig)
  13. (Oblig)
  14. PS C:\> (ls fil.txt).FullName
  15. (Oblig)
  16. (Oblig)
  17. 
    Den første måten henter ut størrelsen, direkte fra feltet "Length", mens den andre måten kaller
    metoden get_Length().
    
  18. (Oblig)
  19. ps | foreach {if($_.name -eq "notepad") {kill $_.Id}}
    
    En enda enklere (og bedre) løsning er følgende
    kill -Name notepad
    
  20. (Oblig)