OS进程调度
tss
Q1:你是如何保证两个进程不能同时访问共享资源的?
✅ 推荐回答:
我实现了基于结构体的互斥锁,使用 mutex_lock() 来加锁资源。如果已有任务持有锁,则当前任务会被阻塞并加入等待队列,直到被唤醒。解锁时通过 mutex_unlock() 唤醒下一个等待任务。整个过程通过关闭中断临界区 + 自定义调度器配合实现互斥。
❓Q2:你的信号量是怎么实现的?和互斥锁有何区别?
✅ 推荐回答:
信号量管理的是“资源数量”,可以大于1,适用于限制并发资源使用;而互斥锁只能是“0或1”,用于严格控制独占访问。我的 sem_wait() 会在资源为0时阻塞任务,sem_notify() 唤醒等待的任务或累加资源数。适合多消费者-多生产者场景。
❓Q3:你怎么阻塞/唤醒一个进程的?调度器是怎么配合的?
✅ 推荐回答:
我通过 task_set_block() 将当前任务从就绪队列移除,并放入互斥锁或信号量的等待队列。下一次调度器触发时,选择其他可运行任务。等资源可用时,mutex_unlock() 或 sem_notify() 调用 task_set_ready() 把任务放回就绪队列。
❓Q4:是否考虑了中断上下文并发访问问题?
✅ 推荐回答:
是的,我在 mutex_lock() 和 sem_wait() 等关键操作中使用 irq_enter_protection() 关闭中断,确保临界区原子性。这样即使中断在任何时刻触发,也不会破坏队列结构或状态变量。
✅ 四、亮点总结(面试总结这样说)
在进程同步方面,我实现了可重入互斥锁和标准的计数信号量,所有操作都支持阻塞/唤醒机制,并结合调度器完成进程切换。在具体实现中,我使用了链表管理等待队列,利用关闭中断保护临界区,确保在多任务切换下保持一致性。在 TTY 缓冲区、磁盘读写等模块中广泛应用,保证了多进程访问资源的正确性。
🎙️ 进程同步与互斥 实现答辩稿
在我的操作系统中,我实现了两种进程间同步与互斥机制:互斥锁(mutex) 和 信号量(semaphore)。
互斥锁用于保护共享资源,例如控制台输出、文件结构等,防止多个进程同时访问。我的 mutex_lock() 支持可重入,如果当前任务已持有锁则计数加一,否则任务会阻塞并加入等待队列。mutex_unlock() 在释放锁后会唤醒下一个等待任务,并立即赋予锁。
信号量用于控制资源数量,比如生产者-消费者模型。我实现了 sem_wait() 和 sem_notify(),前者在资源不足时阻塞当前进程,后者在资源可用时唤醒等待任务或增加计数。
这两者都通过链表维护等待队列,并在操作时使用 irq_enter_protection() 关闭中断,确保原子性。调度器会在任务阻塞或唤醒时切换到其他可运行任务。
目前我在 TTY 输入输出、磁盘驱动、文件系统等模块广泛应用了这两套机制,实现了安全可靠的多进程资源管理。