笔记目录
1.线程
线程
:现代计算机模型中CPU执行任务调度的最小单元;在操作系统中,线程是进程当中的⼀条执⾏流程。同⼀个进程内多个线程之间可以共享代码段、数据段、打开的⽂件等资源,但每个线程各⾃都有⼀套独⽴的寄存器和栈,这样可以确保线程的控制流是相对独⽴的。
1.1 线程私有空间
每一个线程都有其自己的栈空间:
1.2 POSIX线程函数
为了实现可移植的线程程序,IEEE在IEEE 1003.1c中定义了线程的标准,它定义线程包叫
做pthread
,现在大部分UNIX系统都支持这个标准。
线程调用 | 描述 |
---|---|
pthread_create | 创建一个新线程 |
pthread_exit | 结束调用的线程 |
pthread_join | 等待一个特定的线程退出 |
pthread_yield | 释放CPU来运行另一个线程 |
pthread_attr_init | 创建并初始化一个线程的属性结构 |
pthread_attr_destory | 删除一个线程的属性结构 |
1.3 用户空间和内核空间的线程实现
1.4 用户线程和内核线程混合
- 一对一
- 一对多
- 多对一
1.4.1 混合模式(多对一)
1.5 线程上下文切换
- 当两个线程不是属于同一个进程,则切换的过程就跟进程上下文切换一样;
- 当两个线程是属于同一个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据;
所以,线程的上下文切换相比进程,开销要小很多。
2.进程调度
调度程序
:在多道程序操作系统中,通常会有多个进程同时竞争CPU计算资源,只要有2个或2个以上的进程处于就绪状态,就会发在调度问题,为了完成这一调度任务,操作系统提供了一套程序逻辑支持,叫做调度程序,使用的算法称之为调度算法
。
2.1 调度原则
- CPU利用率
- 系统吞吐量
- 周转时间
- 等待时间
- 响应时间
2.2 进程调度算法
非抢占式调度
:CPU执行进程运行直到被阻塞,或者直到该进程退出,才会调用另外一个进程。
抢占式调度
:CPU采用时间片机制,进程只运行某段时间,如果在该时段结束时,该进程仍然在运行时,则会把它挂起,接着调度程序从就绪队列挑选另外一个进程运行。
2.2.1 先来先服务
属于非抢占式算法,进程按照他们请求CPU的顺序来进行依次排队执行,这种算法最易理解,但是缺点较多,CPU的利用率不高。
2.2.2 最短作业优先 SJF(饥饿问题)
2.2.3 轮转调度
这是一种最简单最公平的调度算法,但是有可能会存在问题。由于进程的切换,需要耗费时间,如果时间片太短,频繁进行切换,会影响效率。如果进程时间片太长,有可能导致排后面的进程等待太长时间。因此时间片的长度,需要有大致合理的数值。(《现代操作系统》的观点是建议时间片长度在20ms~50ms)
2.2.4 最短剩余时间优先
2.2.5 优先级调度
每一个进程都赋予一个优先级,优先级高的进程可优先运行,但是容易造成饥饿
问题。
2.2.6 多级反馈队列
多级反馈队列调度基于时间片轮转和优先级调度,设置多个就绪队列,赋予每个就绪队列优先级,优先级越高的队列进程的时间片越短。第1级就绪队列优先级最高,进程的时间片长度最短,第2级就绪队列次之,以此类推。