Nachos Instructional OS and Project 1 CS 170, Tao Yang.

Slides:



Advertisements
Similar presentations
More on Processes Chapter 3. Process image _the physical representation of a process in the OS _an address space consisting of code, data and stack segments.
Advertisements

Process management Information maintained by OS for process management  process context  process control block OS virtualization of CPU for each process.
Computer Architecture CSCE 350
The Kernel Abstraction. Challenge: Protection How do we execute code with restricted privileges? – Either because the code is buggy or if it might be.
CSC 501 Lecture 2: Processes. Von Neumann Model Both program and data reside in memory Execution stages in CPU: Fetch instruction Decode instruction Execute.
Lecture 4: Concurrency and Threads CS 170 T Yang, 2015 Chapter 4 of AD textbook.
Processes CSCI 444/544 Operating Systems Fall 2008.
Home: Phones OFF Please Unix Kernel Parminder Singh Kang Home:
TTIT61 Nachos - short introduction Gert Jervan IDA/SaS/ESLAB.
CS-502 Fall 2006Processes in Unix, Linux, & Windows 1 Processes in Unix, Linux, and Windows CS502 Operating Systems.
Unix & Windows Processes 1 CS502 Spring 2006 Unix/Windows Processes.
Processes in Unix, Linux, and Windows CS-502 Fall Processes in Unix, Linux, and Windows CS502 Operating Systems (Slides include materials from Operating.
CSE 451: Operating Systems Autumn 2013 Module 6 Review of Processes, Kernel Threads, User-Level Threads Ed Lazowska 570 Allen.
Parallel Processing (CS526) Spring 2012(Week 8).  Thread Status.  Synchronization in Shared Memory Programming(Java threads ) ◦ Locks ◦ Barriars.
COP 4600 Operating Systems Spring 2011 Dan C. Marinescu Office: HEC 304 Office hours: Tu-Th 5:00-6:00 PM.
Welcome to the World of Nachos CPS 110 Spring 2004 Discussion Session 1.
CS 153 Design of Operating Systems Spring 2015
Introduction to Processes CS Intoduction to Operating Systems.
CSC 501 Lecture 2: Processes. Process Process is a running program a program in execution an “instantiation” of a program Program is a bunch of instructions.
Threads Many software packages are multi-threaded Web browser: one thread display images, another thread retrieves data from the network Word processor:
Threads and Concurrency. A First Look at Some Key Concepts kernel The software component that controls the hardware directly, and implements the core.
Exec Function calls Used to begin a processes execution. Accomplished by overwriting process imaged of caller with that of called. Several flavors, use.
Processes and Threads CS550 Operating Systems. Processes and Threads These exist only at execution time They have fast state changes -> in memory and.
Chapter 1 Process and Thread. 1.2 process The address space of a program – Text – Code – Stack – Heap A set of registers – PC – SP Other resources – Files.
Lecture 3 Process Concepts. What is a Process? A process is the dynamic execution context of an executing program. Several processes may run concurrently,
Operating Systems ECE344 Ashvin Goel ECE University of Toronto Thread Scheduling.
Race Conditions Defined 1. Every data structure defines invariant conditions. defines the space of possible legal states of the structure defines what.
Project 2: Initial Implementation Notes Tao Yang.
Multiprogramming. Readings r Silberschatz, Galvin, Gagne, “Operating System Concepts”, 8 th edition: Chapter 3.1, 3.2.
Nachos Instructional OS CS 270, Tao Yang, Spring 2011.
4P13 Week 3 Talking Points 1. Process State 2 Process Structure Catagories – Process identification: the PID and the parent PID – Signal state: signals.
CS333 Intro to Operating Systems Jonathan Walpole.
CPS110: Implementing threads Landon Cox. Recap and looking ahead Hardware OS Applications Where we’ve been Where we’re going.
Concurrency & Context Switching Process Control Block What's in it and why? How is it used? Who sees it? 5 State Process Model State Labels. Causes of.
1 Computer Systems II Introduction to Processes. 2 First Two Major Computer System Evolution Steps Led to the idea of multiprogramming (multiple concurrent.
Concurrency, Processes, and System calls Benefits and issues of concurrency The basic concept of process System calls.
Processes, Threads, and Process States. Programs and Processes  Program: an executable file (before/after compilation)  Process: an instance of a program.
CPS110: Threads review and wrap up Landon Cox February 11, 2009.
2 Processor(s)Main MemoryDevices Process, Thread & Resource Manager Memory Manager Device Manager File Manager.
Managing Processors Jeff Chase Duke University. The story so far: protected CPU mode user mode kernel mode kernel “top half” kernel “bottom half” (interrupt.
1 Lecture 6 “Nachos” n nachos overview n directory structure n nachos emulated machine n nachos OS n nachos scheduler n nachos threads.
NachOS Threads System Road Map through the Code Lab 3.
Nachos Project 2 Lecturer: Hao-Hua Chu TA: Chun-Po Wang (Artoo) Date: 2008/10/14 Material Provided by Yuan-Hao Chang, Yung-Feng Lu.
1 Critical Section Problem CIS 450 Winter 2003 Professor Jinhua Guo.
Mutual Exclusion -- Addendum. Mutual Exclusion in Critical Sections.
CPS110: Implementing threads on a uni-processor Landon Cox January 29, 2008.
CSCI/CMPE 4334 Operating Systems Review: Exam 1 1.
Processes and threads.
Process Tables; Threads
Process concept.
Process Management Process Concept Why only the global variables?
CPS110: Threads review and wrap up
CS 6560: Operating Systems Design
CSCS 511 Operating Systems Ch3, 4 (Part B) Further Understanding Threads Dr. Frank Li Skipped sections 3.5 & 3.6 
Protection of System Resources
More Threads and Synchronization
Nachos Threads and Concurrency
Threads & multithreading
CSCI 511 Operating Systems Ch3, 4 (Part B) Further Understanding Threads Dr. Frank Li Skipped sections 3.5 & 3.6 
Nachos Instructional OS
Process Tables; Threads
Nachos Assignment#2 Priority Scheduling.
Mid Term review CSC345.
Threads Chapter 5 2/17/2019 B.Ramamurthy.
Threads Chapter 5 2/23/2019 B.Ramamurthy.
Still Chapter 2 (Based on Silberchatz’s text and Nachos Roadmap.)
Threads and Concurrency
Implementing Processes, Threads, and Resources
Processes in Unix and Windows
CS510 Operating System Foundations
Presentation transcript:

Nachos Instructional OS and Project 1 CS 170, Tao Yang

9/3/20152 Why Nachos OS? Learn by reading and modifying simple operating system code Extremely important OS experience Deep understanding of OS features/system calls Where/when they can fail, or have poor performance A skeletal OS that supports kernel threads, user-level processes MIPS instruction execution as a virtual machine ~9K lines of C++ code.

System Layers Base Operating System (Linux for our class) Nachos kernel threads Thread 1Thread 2Thread N Nachos OS modules (Threads mgm, File System, Code execution/memory mapping, System calls/Interrupt) Simulated MIPS Machine (CPU, Memory, Disk, Console) User process

Project 1B Tasks 1-3 Linux Nachos threads Thread 1Thread 2Thread N Nachos OS modules Simulated MIPS Machine main() ThreadTest()

9/3/20155 Steps to Install Nachos Obtain and install Nachos source code. Copy the source code from ~cs170/nachos2015.tar Compile the source code with Makefile Run Nachos demo Under the threads subdirectory (run threads) Under the userprog subdirectory (compile/execute binary code)

9/3/20156 Nachos code directory machine --- Basic machine specification (MIPS simulator as a virtual machine). threads --- threads management (Project 1). userprog -- binary code execution and system calls (Project 2). vm -- virtual memory (empty, Project 3A). filesys -- file system (Project 3B) test -- binary code to be executed in this virtual machine network -- networking protocol (not used in this class) bin -- utilities/tools (binary format conversion)

9/3/20157 Source code reading and Project 1 Objectives of next 2 weeks Scan through ~1,000 lines of code under threads directory Learn how context switch is accomplished among threads. Learn how thread scheduling is done. Learn how locks/synchronization are implemented and used. Use Linux pthreads. Complete Project 1

int shared=1; main () { Thread *t1 = new Thread("forked thread1"); Thread *t2 = new Thread("forked thread2"); t1->Fork(SimpleThread, 1); t2->Fork(SimpleThread, 2); SimpleThread(3); } SimpleThread(int i) { printf(“Hello %d. Shared %d\n”, i, shared); currentThread->Yield(); } Sample Example of Nacho Threads Start to fork and execute a function in each child thread. Parent also executes the same function Function executed by threads Create 2 new threads.

9/3/20159 Nachos Threads Each thread has the following TCB (thread control block) from thread.h int *stackTop; // stack pointer int machineState[18]; // copy of registers int *stack // bottom of stack ThreadStatus status; //ready, running, or blocked char *name; Thread operations: Thread(char *debugName). Create a thread. Fork(VoidFunctionPtr func, int arg). Let a thread execute a function. Yield(). Suspend the calling thread and select a new one for execution. Sleep(). Suspend the current thread, change its state to BLOCKED, and remove it from the ready list Finish()

Nachos Thread States and Transitions running (kernel) readyblocked Scheduler::Run Scheduler::ReadyToRun Thread::Sleep Thread::Yield

9/3/ Semaphore object for thread synchronization Disable and re-enable interrupts to achieve mutual exclusion (e.g., by calling Interrupt::SetLevel()). Operations for a Semaphore object: Semaphore(char* debugName, int initialValue) P(): Decrement the semaphore's count, blocking the caller if the count is zero. V() :Increment the semaphore's count, releasing one thread if any are blocked waiting on the count.

Semaphore Implementation with no busy waiting Each semaphore has a waiting queue. Two internal operations: Sleep– place the thread invoking the operation on the waiting queue. Nachos: Thread:Sleep() wakeup – remove one thread in the waiting queue and place it in the ready queue.

Semaphore Implementation with no Busy waiting (Cont.) P(semaphore *S) Disable-interrupt S->value--; if (S->value < 0) { Add this thread to waiting-queue; sleep(); } Enable-interrupt n V(semaphore *S) n Disable-interrupt S->value++; if (S->value <= 0) { Remove x from waiting-queue; wakeup(x); } Enable-interrupt

9/3/ Reading source code Have a picture of overall components and their roles. Be able to compile and run a simple case. Trace the code execution through a simple case Basic/high level mechanism involved in execution. Walk through a simple thread test case in Nachos. Week 2 link in

Project 1A: Concurrent Hash Table Many pthreads

What each thread test calls? Many pthreads void *tfunc(void *arg){ long k= (long) arg; //thread ID inti, b=NUMKEYS/NumberofThread; for (i= b *k; i< b*k+b && i<NUMKEYS; i++){ test1(&hash, NUMKEYS, i,2); } } void test1(HashMap *htable, int n, int k, int w){ int i, errorflag=0; for (i=0; i<n; i++) (*htable).get(i); for (i=k-w; i<k+w; i++) (*htable).put(i,i); if((*htable).get(k)==-1) errorflag=1; (*htable).remove(k); for (i=0; i<n; i++) (*htable).get(i); (*htable).put(k,k); for (i=0; i<n; i++) (*htable).get(i);} get() put() remove()

Coarse-grain synchronization of concurrent hash table access Many pthreads

Fine-grain synchronization Many pthreads

9/3/ Part B of Project 1 Objectives Tasks 1-3 under threads subdirectory. Gain experience with simple thread programming (execute multiple Nachos threads with synchronization). Implement locks and condition variables (missing from the file synch.cc). Use for concurrent access of a hash table

Project 1B Tasks 1-3 Linux Nachos threads Thread 1Thread 2Thread N Nachos OS modules Simulated MIPS Machine main() ThreadTest() Hashtable

9/3/ Tasks 1/2/3: Nachos Files involved Key files to read and modify (modify 3 files in red) main.cc, threadtest.cc -- a simple test of our thread routines. TA Varun provides a sample change template for threadtest.cc thread.h thread.cc -- Nachos thread data structure and operations. scheduler.h scheduler.cc -- The thread ready list. synch.h synch.cc -- synchronization routines. system.h, system.cc -- Nachos startup initialization /shutdown switch.h, switch.s -- assembly code for thread switching. Other related files: synchlist.h, synchlist.cc -- synchronized access to lists using locks/conditions (useful examples for your programming). list.h list.cc -- generic list management. utility.h utility.cc -- some useful definitions and debugging routines. interrupt.h interrupt.cc -- manage interrupts. time.h timer.cc -- clock emulation. stats.h stats.cc -- collect interesting statistics.

9/3/ Tasks of Project 1 (Part B) Task 1 Synchronize hash table (fine-grain) with semaphore Task 2. Implement Lock code in synch.cc similar as Nachos semaphore code Follow the Nachos semaphore implementation Synchronize hash table (fine-grain) Task 3 Implement conditional variables Synchronize hash table (fine-grain)

9/3/ Key steps when Nachos executes After you type ``nachos'' under threads subdirectory: It is executing as a single Linux process. The main() calls Initialize() to start up interrupt handling, create a scheduler for managing the ready queue. ThreadTest() currentThread->Finish() to let other threads continue to run.

9/3/ Current Nachos Threadtest.cc void SimpleThread(int which) { int num, val; for(num = 0; num < 5; num++) { printf("*** thread %d looped %d times\n", which, num); c currentThread->Yield(); } } *** thread 0 looped 0 times *** thread 1 looped 0 times *** thread 0 looped 1 times *** thread 1 looped 1 times *** thread 0 looped 2 times *** thread 1 looped 2 times *** thread 0 looped 3 times *** thread 1 looped 3 times *** thread 0 looped 4 times *** thread 1 looped 4 times No threads ready or runnable, and no pending interrupts. Assuming the program completed. Machine halting void ThreadTest1() { Thread *t = new Thread("forked thread"); t->Fork(SimpleThread, 1); SimpleThread(0); }

9/3/ Key calling graph when Nachos executes under thread directory All files are in threads directory. main() in main.cc Initialize() in system.cc ThreadTest () in threadtest.cc Thread:Yield () in thread.cc Thread:Fork () in thread.cc StackAllocate() in thread.cc FindNextToRun () in scheduler.cc ReadyToRun () in scheduler.cc Run () in scheduler.cc SWITCH () in switch.s ThreadRoot () in switch.s func() such as SimpleThread() in ThreadTest.cc currentThread->Finish () in threadtest.cc

9/3/ Key Calling graph for Project 1 Task 1 All files are in thread directory. main() in main.cc Initialize() in system.cc ThreadTest () in threadtest.cc Thread:Yield () in thread.cc Thread:Fork () in thread.cc currentThread->Finish () in threadtest.cc Spawn multiple threads similar to ptest.cc in Part A (hashtable test) Insert some Yield() Semaphore P()/V() in synch.cc

9/3/ Nachos Scheduler object for thread scheduling Decide which thread to run next Invoked when the current thread gives up CPU. The current Nachos scheduling policy is round-robin: Select the front of ready queue list Append new threads to the end. Key operations: ReadyToRun(Thread *thread). Make thread ready to run and add to ready list. Thread *FindNextToRun() Run(Thread *nextThread) Nachos scheduler

9/3/ Thread Switching Suspend current thread, save its state, and restore the state of new thread. Switch(oldThread, newThread): Save all registers in oldThread's TCB. to be used when the old thread is resumed. Load new values into the registers from TCB of the new thread.

9/3/ Key operations of Nachos’ function SWITCH() SWITCH () in switch.s Thread->Fork(func(), arg) func(arg) Call ThreadRoot () in switch.s Save current thread context Load target thread context Call ThreadFinish() Call InterruptEnable() Call func(arg)

9/3/ TCB of Nachos Threads Each thread has the following TCB (thread control block) from thread.h int *stackTop; // stack pointer int machineState[18]; // copy of registers int *stack // bottom of stack ThreadStatus status; //ready, running, or blocked char *name; Thread operations: Thread(char *debugName). Create a thread. Fork(VoidFunctionPtr func, int arg). Let a thread execute a function. Yield(). Suspend the calling thread and select a new one for execution. Sleep(). Suspend the current thread, change its state to BLOCKED, and remove it from the ready list Finish()

9/3/ Thread Switching Switch(oldThread, newThread): Save all registers in oldThread's TCB. to be used when the old thread is resumed. Load new values into the registers from TCB of the new thread. int *stackTop; int machineState[18] int *stack ThreadStatus status; int *stackTop; int machineState[18] int *stack ThreadStatus status;

9/3/ SWITCH(oldThread a0, nextThread a1) Save register values to current thread’s TCB # a0 -- pointer to old thread’s TCB sw sp, SP(a0) # save new stack pointer sw s0, S0(a0) sw s1, S1(a0) sw s2, S2(a0) sw s3, S3(a0) sw s4, S4(a0) sw s5, S5(a0) sw s6, S6(a0) sw s7, S7(a0) sw fp, FP(a0) sw ra, PC(a0) # save return address sp s0 s1 s2 … stackTop machineState[0] machineState[1] machineState[2] … TCB save MIPS Registers

9/3/ SWITCH(oldThread a0, nextThread a1) sw sp, SP(a0) # save new stack pointer sw s0, S0(a0) sw s1, S1(a0) sw s2, S2(a0) sw s3, S3(a0) sw s4, S4(a0) sw s5, S5(a0) sw s6, S6(a0) sw s7, S7(a0) sw fp, FP(a0) sw ra, PC(a0) # save return address sp s0 s1 s2 … stackTop machineState[0] machineState[1] machineState[2] … TCB save MIPS Registers switch.h #define SP 0 #define S0 4 #define S1 8 #define S2 12 #define S3 16 #define S4 20 #define S5 24 #define S6 28 #define S7 32 #define FP 36 #define PC 40 What is value of SP and S0?

9/3/ Load register values from new thread’s TCB a1 -- pointer to new thread’sTCB lw sp, SP(a1) # load the new stack pointer lw s0, S0(a1) lw s1, S1(a1) lw s2, S2(a1) … lw s7, S7(a1) lw fp, FP(a1) lw ra, PC(a1) # load the return address j ra #Call ra which is ThreadRoot(); sp s0 s1 s2 s3 stackTop machineState[0] machineState[1] machineState[2] machineState[3] … machineState[9] ra

9/3/ Key operations of Nachos’ function SWITCH() SWITCH () in switch.s Thread->Fork(func(), arg) func(arg) Call ThreadRoot () in switch.s Save current thread context Load target thread context Call ThreadFinish() Call InterruptEnable() Call func(arg) ThreadRoot

9/3/ How TCB is initialized? # a0 -- pointer to old thread’s TCB a1 -- pointer to new thread’sTCB lw sp, SP(a1) # load the new stack pointer lw s0, S0(a1) lw s1, S1(a1) lw s2, S2(a1) … lw s7, S7(a1) lw fp, FP(a1) lw ra, PC(a1) # load the return address j ra #Call ra which is ThreadRoot(); sp s0 s1 s2 s3 stackTop func() arg ThreadFinish() InterruptEnable() … ThreadRoot() addr ra a1

9/3/ Which routine fills values of the new thread TCB ? StackAllocate() in Thread::Fork() machineState[PCState] = (int) ThreadRoot; // PCState=9 machineState[StartupPCState] = (int) InterruptEnable; //StartupPCState=3 =>s3 machineState[InitialPCState] = (int) func; //InitialPCState=0 =>s0 machineState[InitialArgState] = arg; //InitialArgState=1 =>s1 machineState[WhenDonePCState] = (int) ThreadFinish; //WhenDonePCState=2=>s2

9/3/ ThreadRoot() uses registers s0, s1,s2,s3 to execute targeted func() jalStartupPC# call InterruptEnable() stored in register s3 movea0, InitialArg#move argument in s1 to a0 jalInitialPC# call main thread procedure func() stored in s0 jal WhenDonePC# when done, call ThreadFinish() in s2