操作系统part2:四种常见调度算法、进程同步和互斥机制

1. 四种常见调度算法的实现原理及优缺点。

a. 先来先服务(FCFS):

  • 实现原理:按照进程到达的先后顺序进行调度,先到达的进程先执行,直到执行完毕或阻塞。
  • 优点:简单易懂,适用于长作业时间或低优先级的任务。
  • 缺点:平均等待时间较长,可能会导致长作业时间的进程饥饿问题。

b. 最短作业优先(SJF):

  • 实现原理:根据进程的估计执行时间(或预测执行时间)进行调度,选择估计时间最短的进程先执行。
  • 优点:能够最大程度地减少平均等待时间,适用于短作业时间的任务。
  • 缺点:对作业时间估计准确性要求高,可能会导致长作业时间的进程饥饿问题。

c. 轮转调度(RR):

  • 实现原理:将CPU时间划分为固定大小的时间片(时间量子),每个进程按照时间片轮流执行,如果时间片用完则切换到下一个进程。
  • 优点:公平性好,适用于多个进程的时间片轮转。
  • 缺点:对于长时间的进程,可能会导致上下文切换频繁,增加系统开销。

d. 优先级调度:

  • 实现原理:为每个进程分配一个优先级,优先级高的进程先执行。优先级可以根据进程类型、重要性等因素确定。
  • 优点:能够根据任务的优先级进行调度,适用于不同优先级任务的场景。
  • 缺点:可能会导致低优先级的进程饥饿问题,需要合理设置优先级。

2. 四种常见的进程同步和互斥机制的实现原理及优缺点。

a. 信号量:

  • 实现原理:信号量是一种用于线程或进程间同步与互斥的机制。基于一个计数器,当计数器大于0时,线程可以继续执行;当计数器等于0时,线程需要等待。通过两个基本操作:P(等待)和V(发信号),可以实现资源的同步和互斥。
  • 优点:可以用于解决生产者-消费者问题、限制并发访问资源等场景。
  • 缺点:需要手动管理计数器的值,容易引起死锁或饥饿问题。

b. 互斥锁:

  • 实现原理:互斥锁是一种用于保护共享资源的机制。在任意时刻,只允许一个线程持有互斥锁,其他线程需要等待。当线程完成对共享资源的访问后,释放互斥锁,其他线程才能继续访问。
  • 优点:简单易用,能够确保共享资源的互斥访问。
  • 缺点:容易引起死锁或饥饿问题,需要小心使用。

c. 条件变量:

  • 实现原理:条件变量用于在线程间进行通信和同步。与互斥锁一起使用。当线程需要等待某个条件满足时,通过条件变量进入等待状态,同时释放互斥锁。当其他线程改变了条件并发出信号时,等待的线程被唤醒,重新获取互斥锁并继续执行。
  • 优点:能够有效地进行线程间的通信和同步。
  • 缺点:容易引起死锁或竞态条件,需要小心使用。

d. 管程:

  • 实现原理:管程是一种高级的同步原语,结合了互斥锁、条件变量和共享数据结构。提供了一种结构化的方式来管理共享资源和协调线程间的操作。线程通过调用管程中的过程来访问共享资源,并通过互斥锁和条件变量来保证正确的同步和互斥。
  • 优点:提供了一种高级的抽象,能够更方便地管理共享资源和线程间的通信。
  • 缺点:实现较为复杂,需要保证正确使用互斥锁和条件变量。

互联网大厂测开经历,目前担任测试开发负责人,每天分享互联网面经,如果你有测试相关的问题,欢迎咨询,海鲜市场【简历优化】、【就业指导】、【模拟/辅导面试】,已辅导20位以上同学拿到心仪offer

简历修改119/次
模拟面试149/小时
测试开发工具指导149/小时

相关推荐
汤姆和杰瑞在瑞士吃糯米粑粑几秒前
【C++学习篇】AVL树
开发语言·c++·学习
J不A秃V头A6 分钟前
IntelliJ IDEA中设置激活的profile
java·intellij-idea
Biomamba生信基地8 分钟前
R语言基础| 功效分析
开发语言·python·r语言·医药
DARLING Zero two♡8 分钟前
【优选算法】Pointer-Slice:双指针的算法切片(下)
java·数据结构·c++·算法·leetcode
手可摘星河10 分钟前
php中 cli和cgi的区别
开发语言·php
小池先生19 分钟前
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
java·spring boot·后端
CodeClimb23 分钟前
【华为OD-E卷-木板 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
odng25 分钟前
IDEA自己常用的几个快捷方式(自己的习惯)
java·ide·intellij-idea
CT随33 分钟前
Redis内存碎片详解
java·开发语言
brrdg_sefg42 分钟前
gitlab代码推送
java