Before we start studying SQLOS we will recollect some of the basic OS concepts.
What is process?
Process is instance of service or application which is running. Each process will have address space that contains all the Executable, Dlls, data, thread stacks etc. Operating system maintains a kernel objects for each process to manage the process. One or more threads which runs under the context of the process and execute the code in address space. Each thread can execute the code and maintains its own set of CPU registers and stack. When a process is created primary thread of the process is created and starts executing the main() or Other similar function. Primary thread can create additional threads using create thread function and lpStartAddress (Thread entry point ) defines the function that is to be executed by the thread which is created.
Ex: Ureadfile will be the thread entry point for the new thread which is created using below code.
CreateThread(0,0,(LPTHREAD_START_ROUTINE )Ureadfile,(LPVOID)&PSUreadfile[i], 0, NULL);
What is thread?
Threads executes the code in process. There can be one (Single threaded ) or more( Multi-threaded) threads for every process. In multi-threaded applications each thread has to synchronize their activities among other threads. Ex: Allowing one thread to modify a Global while other is reading it can cause race conditions.
SQL Server uses synchronization techniques like Spinlocks, Latches, Events Etc.
Threads can be in below core states (There are other states which we will discuss on need)
Wait state represents thread is waiting for some resource. A thread in this state is not eligible to be scheduled from OS.
SQL Server threads can be in wait state in multiple places. A thread requesting for lock has to wait till it is available and goes for sleep unless signaled when the lock is available.
A thread can call WaitForSingleObject and wait without competing CPU resource
LMHandle = CreateMemoryResourceNotification(LowMemoryResourceNotification);
In above example Thread will wait till there is Lowmemoryresourcenotification from windows.
Thread is running in CPU.
Thread is ready to run and waiting for its CPU slice. In SQL Server thread which are ready to run on scheduler will stay in runnable list of scheduler till they get chance to run on scheduler.
All the threads which is executed in operating system will get a time slice to run in CPU called as quantum.Thread is yielded from scheduler after its quantum is completed.
Operating system can interrupt the thread execution any time. OS can halt the thread execution and schedule another thread to run at any time.
Operating system cannot interrupt the thread execution any time. The worker owns the scheduler until it yields to another worker on the same CPU. If the thread which runs on CPU(Scheduler) don’t yield in time it monopolizes the CPU until it finishes.
Windows 3.x and DOS were using Non-Preemptive scheduling. In Non-Preemptive scheduling context switching is generally reduced because the operating system does not interrupt code execution and It is easier to implement a multi-threaded application in Non-Preemptive mode because synchronization may be less of an issue. A bad application can easily ‘hang’ the entire system if thread from application does not yield from CPU allowing other applications threads to execute.