操作系统的特性
- 并发:并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。
- 共享:资源是被进程共享的。分为互斥共享和同时共享,互斥共享的被称为临界资源,需要同步机制来保护,即信号量/管程
- 虚拟:将物理实体映射成逻辑实体。时分复用:将CPU时间虚拟化时间片,分给进程。空分复用:将物理内存虚拟成逻辑空间,段页式访问物理内存。
- 异步:进程不是一次性执行完毕,而是断断续续地向前
进程管理
什么是进程?
- 资源分配的基本单位。例如内存、文件句柄和其他内核资源等都是分配给进程,进程中的线程共享这些资源。
- 独立运行的基本单位。独立运行是指冯诺伊曼模型中一段程序在一段数据中执行。进程有“数据段”和“程序段”,所以可以独立运行。
进程一般由以下的部分组成:
- 进程控制块PCB,是进程存在的唯一标志,包含进程标识符PID,进程当前状态,程序和数据地址,进程优先级、CPU现场保护区(用于进程切换),占有的资源清单等。
- 程序段
- 数据段
什么是线程?
- 是CPU调度的基本单位。占用CPU时间的最小单位
- 共享进程的资源,而不是独占资源。指独占线程自己运行所需的上下文(程序计数器、栈、寄存器)
- 也称为轻量级进程,因为线程不需要独立申请资源,线程切换的开销也较小,它做的上下文切换也比进程切换简单。因为每个进程都有自己的地址空间,所以进程切换时还要更改虚拟内存映射,而线程的资源是共享的,只需要切换线程的上下文(程序计数器、栈、寄存器)
打比方:
- 进程是工厂,线程是工厂里的几条流水线
- 线程就像农民对土地,只有使用权,没有所有权
什么是协程?
也称为用户态线程,更轻量的线程。称为用户态线程是因为,其切换不涉及内核态,不涉及上文说的进程切换/线程切换中的上下文切换,不需要变更程序计数器、栈等,他完全由程序员控制。
以下是关于协程的一些关键特性:
-
协作式调度:协程的一个关键特性是它们是协作式的,而不是抢占式的。这意味着协程必须显式地将控制权交给其他协程。因此,一个协程在运行时不会被其他协程强制中断。相反,程序员可以完全控制协程的调度。
-
轻量级:由于协程在单个线程中运行,它们不需要像线程那样进行上下文切换,也不需要与其他协程同步或进行数据通信,因此它们比线程更轻量级。
-
便于进行异步编程:协程通常用于需要进行大量异步操作的场景,如I/O操作,网络请求等。协程使得编写这样的程序更加简单,因为它们可以以看似同步的方式编写代码,但实际上是在执行异步操作。
进程状态的转换
- 就绪状态(ready):等待被调度
- 运行状态(running)
- 阻塞状态(waiting):等待资源
应该注意以下内容:
- 只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。
- 阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 时间会从运行态转换为就绪态。
进程调度算法
批处理系统
todo
交互式系统
时间片轮转算法。基于先来先服务的思想,线程会在队列中等待,时间片先给对首的线程,用完后中断该线程并会放到队尾。
时间片轮转算法的效率和时间片的大小有很大关系:
- 因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。
- 而如果时间片过长,那么实时性就不能得到保证。
实时系统
todo
同步和互斥
异步是操作系统的特性之一,操作系统是没办法保证多个任务的执行先后的。而我们的软件经常有A需要等待B完成之后再执行,这种就需要同步机制。
互斥是指同一时刻只能有一个线程使用某资源,需要互斥访问的资源叫临界资源,互斥访问的过程叫临界区。
两种原语:
- 信号量:semaphore
- 管程:java的condition,在条件上等待,条件满足时进行signal