Operating Systems 2021F Lecture 22
Video
Video from the lecture given on December 7, 2021 is now available:
Video is also available through Brightspace (Resources->Class zoom meetings->Cloud Recordings tab)
Notes
Lecture 22
----------
When you make a system call, what is happening?
- process executes "syscall" instruction
- causes CPU to go into supervisor mode
- jumps to system call entry point into kernel
- syscall entry looks at CPU registers, decides
what system call was requested
- note this is all in assembly generally
- calls appropriate system call, it does its thing
- this is in C, but with weird declarations
(SYSCALL_DEFINE0, SYSCALL_DEFINE1, etc)
- in the kernel, the process that made the system call
is represented by current (type struct task_struct)
- when system call code returns, kernel
switches back to user mode via the scheduler
- decides what process to run next
CPU registers
- think of them as hard-coded variables
- limited number of them
- the storage you can actually do computation on
- basic flow (load/store architecture)
- load values into registers from memory
- do operations on registers, with results in
registers
- save registers to memory
- when you make a system call registers hold
system call parameters
- this can also happen when you call a C function,
but it depends on the compiler
- system call ABI (application binary interface)
is explicitly defined by the Linux kernel
Remember with the file API there is always file state
for open files
- our position in the file
The implicit in userspace must be explicit in kernelspace
- we have to represent our position in the file
mutex
- ensure exclusive access to a resource
- essentially, a lock
- needed when concurrent access to something
could mess it up (i.e., messing up a data structure
or variable)
- (a mutex is a semaphore that can have a value of 0 or 1)
- (for mutual exclusion, hence the name)
condition variable
- wait on an event to happen
- so one party waits while another tells it
to stop waiting
In this situation, the condition variable is the resource
being protected by the mutex
A virtual address can be divided into a virtual page number
and an offset within a page
- so to go to physical memory, we map the page number
to a frame
- we just copy the offset - it isn't changed
(it is just an index into a 4k array, which is the page)
slab allocation in the kernel
- used for kernel data structures
- on top of virtual memory
slab allocation is just a fancy malloc
- that understands patterns in the kinds of data being allocated
The idea is that we don't want to waste time allocating
data structures
- so reuse them when we can
- initialize in the background, not on critical paths
remember dynamic memory allocation is expensive
- often a huge bottleneck in any complex program
To solve this, use custom memory allocators
- the slab allocator is just the kernel's
garbage collection is a fancy memory management strategy
used for languages with heavy uses of dynamic memory allocation
- basically, used when you don't explicitly free
allocated storage
Why do we use pages?
- because allocating/deallocating fixed-sized chunks
of memory is about as efficient as we can get