public class Exempel1 { public static void main(string[] args) { //skapa objekt som representerar processerna Kernel process1 = new TestProcess("Process 1", "Hej Anna!"); Kernel process2 = new TestProcess("Process 2", "Hej Bertil!"); //starta processer (lämna init-mode) Kernel.startProcesses(); public class TestProcess extends Kernel { private String message; TestProcess(String name, String message) { //tala om för kärnan att detta är en process createstdprocess(name, NoTimer); this.message = message; //denna metod representerar processen public void System.out.println(message); 1
class Utskrift { //mutexsemafor public static BinarySemaphore mutex = new BinarySemaphore(1); public static void main(... public class Even extends Kernel { Even() { createstdprocess("jämna", NoTimer); public void //skriver ut jämna tal i = 0; //första jämna talet Utskrift.mutex.binWait(); för att skriva ut System.out.println(i); Utskrift.mutex.binSignal(); //släpp mutex i+=2; public class Odd extends Kernel { Odd() { createstdprocess("udda", NoTimer); public void //skriver ut jämna tal i = 1; //första udda talet Utskrift.mutex.binWait(); för att skriva ut System.out.println(i); Utskrift.mutex.binSignal(); //släpp mutex i+=2; 2
class Utskrift2 { //mutexsemaforer public static BinarySemaphore mutexodd = new BinarySemaphore(0); public static BinarySemaphore mutexeven = new BinarySemaphore(1); public static void main(... public class Even extends Kernel { Even() { createstdprocess("jämna", NoTimer); public void //skriver ut jämna tal i = 0; //första jämna talet Utskrift2.mutexEven.binWait(); för att skriva ut System.out.println(i); Utskrift2.mutexOdd.binSignal(); //lämna över mutex till Odd i+=2; public class Odd extends Kernel { Odd() { createstdprocess("udda", NoTimer); public void //skriver ut jämna tal i = 1; //första udda talet Utskrift2.mutexOdd.binWait(); för att skriva ut System.out.println(i); Utskrift2.mutexEven.binSignal(); //lämna över mutex till Even i+=2; 3
class Main { public static BinarySemaphore mutex = new BinarySemaphore(1); //global class Reader { //läs databasen Main.mutex.binSignal(); //släpp mutex class Writer { //skriv databasen Main.mutex.binSignal(); //släpp mutex 4
class Main { //lås för databasen public static BinarySemaphore rw = new BinarySemaphore(1); class Reader { public static int nr = 0; //antal läsare i databasen //mutexlås för nr public static BinarySemaphore mutexr = new BinarySemaphore(0); nr = nr+1; if (nr == 1) Main.rw.binWait(); //en läsare mer i databasen //om först, lås databasen (för skrivare) //läs databasen nr = nr-1; //en läsare mindre if (nr==0) Main.rw.binSignal(); //om sist, släpp lås till databasen class Writer { Main.rw.binWait(); //lås databasen //skriv databasen Main.rw.binSignal(); //släpp låset 5
class Main { //lås för databasen public static BinarySemaphore rw = new BinarySemaphore(1); class Reader { public static int nr = 0; //antal läsare i databasen //mutexlås för nr public static BinarySemaphore mutexr = new BinarySemaphore(0); mutexr.binwait(); nr = nr+1; if (nr == 1) Main.rw.binWait(); mutexr.binsignal(); //en läsare mer i databasen //om först, lås databasen (för skrivare) //släpp mutex //läs databasen mutexr.binwait(); nr = nr-1; //en läsare mindre if (nr==0) Main.rw.binSignal(); //om sist, släpp lås till databasen mutexr.binsignal(); //släpp mutex class Writer { Main.rw.binWait(); //lås databasen //skriv databasen Main.rw.binSignal(); //släpp låset 6
class Main { public static BinarySemaphore mutex = new BinarySemaphore(1); //global class Reader { public static int nr = 0; //antal läsare i databasen public static BinarySemaphore block = new BinarySemaphore(0); public static int delayed = 0; //antal väntande läsare (block.binwait()) if (Writer.nw>0) { //kan vi gå in direkt? delayed=delayed+1; //vi ställer oss is kö Main.mutex.binSignal(); //släpper mutex block.binwait(); //och väntar (får sedan mutex) nr = nr+1; //vi går in (vi har nu mutex) if (delayed>0) { //släppa in fler läsare? delayed=delayed-1; //en mindre på kö block.binsignal(); //som vi släpper in (överlämna mutex) else Main.mutex.binSignal(); //släpp mutex (lämnade inte över) //läs databasen (här har vi inte mutex) nr = nr-1; //vi går ut if (nr==0 & Writer.delayed>0) { //släppa in skrivare? Writer.delayed = Writer.delayed-1; //en skrivare mindre i kön Writer.block.binSignal(); //släpp in skrivare (pass baton) else Main.mutex.binSignal(); //släpp mutex 7
class Writer { public static int nw = 0; //antal skrivare i databasen (0 eller 1) public static BinarySemaphore block = new BinarySemaphore(0); public static int delayed = 0; //antal väntande skrivare (block.binwait()) if (Reader.nr>0 nw>0) { delayed=delayed+1; Main.mutex.binSignal(); block.binwait(); nw = nw+1; Main.mutex.binSignal(); //kan vi gå in direkt? //en skrivare mer i kön //släpper mutex //ställer oss i kö //vi går in (vi har nu mutex) //vi släpper aldrig in fler //skriv databasen (här har vi inte mutex) nw = nw-1; //vi går ut if (Reader.delayed>0) { //finns läsare på kö? Reader.delayed=Reader.delayed-1; //en läsare mindre i kö Reader.block.binSignal(); //släpp in en läsare (pass baton) else if (delayed>0) { //finns skrivare på kö? delayed=delayed-1; //en skrivare mindre i kö block.binsignal(); //släpp in skrivare (pass baton) else Main.mutex.binSignal(); //släpp mutex (ingen ville in) 8