📂
build a OS
  • Learn OS with me
  • OS Interfaces
    • OS interfaces
    • I/O and File descriptors
    • Process and Memory
    • Pipes
    • File
  • OS Organization
    • OS Organization
    • Challenge yourself
  • Memory Management
    • XV6 Virtual Memory
    • Page Table
      • Part 1: How to translate address
      • Part 2: Create an Address Space
      • Part 3: How Page Table is used
      • Part 4: Page Fault and Swap
      • Part 5: How to operate on page tables
    • xv6 buddy allocator
      • How to display physical memory
    • Memory Management Walk Through
  • Traps and Interrupts
    • Trap Home Page
      • 系统调用的核心原理
    • What is trapframe
    • What is trampoline
    • Traps from kernel space
    • How fork() works
    • How system calls get into/out of the kernel
    • How exec() works
  • Scheduling
    • XV6 CPU Scheduling
    • How unix pipes work?
    • How does wait(), exit(), kill() work?
  • File System
    • Overview and Disk Layout
    • Buffer Cache
    • Design Inode Layer
    • Inode Content
    • Block Allocator
    • Design a log system for crash recovery
    • Directory Layer
    • Path names
    • File Descriptor Layer
    • FS System Calls
    • XV6 VS Real World
    • Make Xv6 File disk management system
    • Write FS simulator in python
    • How Redirect Shell command works
  • Concurrency
    • Spinlock
    • How linux select work
    • Hardware Support Locking
    • Exercise: Implement atomic counter
    • Locking in Xv6
    • Concurrency in Xv6
    • Exercise: Socket Programming with Event loop
  • Labs
    • Lab 1 Xv6 and Unix utilities
    • Lab 2 Shell
    • Lab 3 Buddy Allocator
    • Lab 4 Lazy
    • Lab 5 Copy-on-Write Fork for xv6
    • Lab 6 RISC-V assembly
    • Lab 6 Uthread: switching between threads
    • Lab 6 Alarm
    • Lab 7 Lock
    • Lab 8 File System: Large Files
    • Lab 8 File System: Symbolic links
    • Lab 9 mmap
    • Lab 10 Networking Part 1
    • Lab 10 Networking Part 2
  • Hardware, Device, Assembly
    • RISC-V assembly
    • Assembly: Access and Store information in Memory
    • Start xv6 and the first process
    • Why first user process loads another program?
    • What does kernel.ld do in XV6?
    • XV6 Device Driver
Powered by GitBook
On this page

Was this helpful?

  1. Scheduling

How does wait(), exit(), kill() work?

wait() is waiting for a child process to exist, and return its pid. It checks for any process's parent is itself. If the process state is ZOMBIE, copy some data, do the clean up. If has children but not dead yet, the parent is going to sleep, inside a big for loop.

exit() first close all open files. Acquire parent lock, and child itself’s lock. Give my children to the root init process. Wake up my parent. Make me as ZOMBIE state. Release parent lock. Jump into scheduler and never returns.

kill() does very little. It just set killed flag to 1. If state is SLEEPING, change it to RUNNABLE. So the process is waken up. When the process entering or leaving kernel, the trap will find out it is killed, and call exit(). Since xv6 using loops for sleep, if the killed process is wakeup from sleeping, the while condition still not applied, so it is sleeping again. But this is a problem, since it requires a lot of places handling killed == 1 correctly.

Challenges

1. Implement signal in xv6

2. Implement semaphore in xv6

3. Research how real OS use explicit free list to find free proc structures, instead of searching in allocproc in linear-time.

PreviousHow unix pipes work?NextOverview and Disk Layout

Last updated 5 years ago

Was this helpful?