4.线程
线程的创建
A context must be created, including a register set storage location for storage during context switching, and a local stack to record the procedure call arguments, return values, and return addresses, and thread-local storage.
进程的两个角色
1.resource ownership–virtual address space to hold the process image
2.execution—follows an execution path (also called instruction 序列?)
进程和线程
进程:资源所有者
have a virtual address space
protected access to resources
线程:unit of execution
- an execution state (running, ready etc.)
- Save thread context
- static storage for local variables (stack per thread)
- individual access to resources
每个Thread都有自己的stack, register, PCB。
以Windows XP线程为例,它具有:
- thread id
- register set
- stacks
- private data storage area
其中,register set
, stacks
, private storage area
组成了线程的上下文(context)。
Multithreading
优势
- 提高响应速度
- 实现线程之间的资源共享
- 创建线程比创建进程更加经济,节省分配内存和资源的overhead。
- 发挥多处理器的性能。多个线程可以在多个处理器上并行运行。
用户进程
由thread library管理的、user-level的进程。
主要有:
POSIX Pthreads
Win32 threads
Java threads
Thread Library的实现方式
- 完全在用户空间实现,不使用内核支持。
- implement a kernel-level lib. supported by the OS.
多线程模型
多对一(JAVA,Solaris Green)
多个用户线程链接一个内核线程。由内核线程等待CPU时间,获得后分配给用户线程。
好处:容易实现。可以通过只修改thread library来控制线程优先级从而分配CPU时间。
坏处:
1. 当某个用户线程发出阻塞的system call时就会阻塞。
2. 即使在多处理器环境下也无法实现多线程并行。
一对一(Windows, Linux)
好处:当前线程阻塞时可以创建别的线程执行,不会阻塞;可以实现多处理器上的多线程并行。
坏处:overhead太高。
多对多
好处:用户可以创建任意多线程。也可以实现多线程并行。也不会阻塞。
拓展:Two-level Model
允许多对多,也允许一个或多个用户线程只绑定一个内核进程。
HyperThreading
在nanosecond级别上进行线程切换。
线程池 Thread Pools
在进程启动时就创建大量线程并放置在pool中,让它们等待被唤醒。
当一个线程完成了它的工作,就回到pool中继续等待。
优点
- 用已存在的线程提供服务比创建线程要快。
- pool控制了服务的规模。
5. CPU调度
CPU Scheduling 是多道程序(multiprogrammed)操作系统的基础。
什么是Multiprogramming
多道程序 是指多个进程可以同时运行,多个进程根据一定的调度策略轮流使用CPU。
它的目标在于最大化CPU的使用(Maximum CPU utilization)。
影响调度策略的因素:Burst Cycle
进程的运行是由一连串的CPU burst和I/O burst组成的。每个进程都由CPU burst开始,由CPU burst结束。
根据统计结果,总体上大部分的都是较短的CPU burst,长的CPU burst比例较少。
一个 I/O bound的程序会有很多短的CPU burst;而一个 CPU bound的程序会有一些长的CPU burst。
每个程序的CPU burst的不同比例影响了CPU调度策略。
CPU调度的执行者:CPU scheduler
CPU scheduler(short-term scheduler)在CPU空闲时,从就绪队列(ready queue)中选择一个进程,将CPU资源分配给它。
CPU调度发生的场景
1. 某个进程 从running切换到waiting(如等待IO操作时)
2. 某个进程从running切换到ready(发生IO中断;时间片到期)
3. 某个进程从waiting到ready(IO操作完成)
4. 进程终止(Terminates)
其中1&4属于非抢占式调度,2&3属于抢占式调度(preemptive)。
非抢占式调度
cpu会被当前进程一直占用,直到进程终止释放CPU,或者进程切换到waiting状态。
CPU scheduler重要组成:Dispatcher
Dispatcher是将CPU的控制权移交给被选中的进程的模块。
它有以下功能:
- Switching Context(保存&恢复现场)
- 切换到用户模式
- 根据PC 的值,跳到重启程序的正确位置。
Dispatch latency:从暂停一个进程到启动另一个进程所需时长。
调度准则 Scheduling Criteria
CPU utilization
CPU使用的百分比。
Throughput:吞吐量
单位时间内完成执行的进程数量。
Turnaround Time 轮转时间
一个进程的submission到它的完成所需的时长。
Waiting time
进程在就绪队列中等待的总时长。
Response time
进程从submission到第一次响应的时间。
CPU uitilization和throughput都应该越高越好,其他越低越好。
调度策略 Scheduling Algorithm
FCFS:First-Come, First-Served 先到先得
该策略的进程平均等待时间会受到进程的CPU burst time的极大影响。
若一个大进程排在首位,会出现车队效应(convoy efect),小进程要等大进程的完成,等很久。这会降低CPU和设备的使用率。
SJF:Shortest-Job-First 最短优先
它有两种实现方案:
1. 非抢占式:正在使用CPU的进程不会被抢占。
2. 抢占式:如果一个新到达的进程需要的CPU burst长度小于当前进程剩余的执行时间,当前进程就会被强占。这个方案也叫SRTF(shortest-remaining-time-first)最小剩余优先。
该策略对于一组已知执行时长的进程花费的平均等待时间是最小的,因而是最优策略。
但实际情况中,进程的长度往往是未知的,需要进行预测(predict)。
Priority Scheduling 优先级
也分为两种实现:抢占式&非抢占式。
Starvation问题
指在该策略下低优先级的进程可能永远不会被执行。
解决:Aging。让进程的优先级随等待时间变长而提高。
RoundRobin(RR)轮转法
每个进程都执行指定时长,这个时长称为time quantum,时间到了就要移到就绪队列的尾部(当然,若当前进程在time quantum内执行完毕,则调度器会选择下一个进程)(此时也会发生context switch)。
若有n个进程,time quantum为q,则进程最大等待时间为q*(n-1)。
该策略的性能基本由q的取值决定。若q太大,RR就会退化成FCFS。
若q太小,上下文切换太多,overhead太高。
应该选择恰好大于较高频率出现的CPU周期的长度,让大部分进程能在一个time quantum 内完成CPU burst。
该策略中进程的轮转时间可能大于SJF,但进程的响应更频繁。
更复杂的Multilevel Queue Scheduling
基本概念:将进程分类。比如,根据响应时间的要求分成foreground/interactive和background/batch。foreground进程的优先级比background的高。
这之后,将就绪队列 分成多条不同的队列。每个进程所处的队列是固定的,不同的队列使用不同的调度策略。比如,foreground进程的队列使用RR,以获得更好的响应;而background 进程的队列使用FCFS,以保持稳定。
队列之间也要排序,通常以priority作为标准,使用Fixed priority scheduling。当然,该策略也可能出现starvation的问题。
另外一个队列调度(排序)的策略是time-slice。每个队列分配到固定的CPU时间,队列将这些时间分配给进程。
Multilevel Feedback Queue
指一个进程可以在多个队列中进行移动。这个策略也可以作为Aging的一个实现。
它有多个属性:
队列的数量;
每个队列各自的调度策略;
将队列upgrade(升级)或demote(降级)的策略;
为进程选择队列的策略。
它的核心思想是根据进程的CPU burst来将进程分类。使用CPU较频繁的进程,会被移动到低优先级的队列中。这是为了让那些CPU burst较短的进程能够快速地在较短的CPU时间(某个给定的time quantum )内执行完毕,从而达到更高的吞吐量。
而等待时间过长的进程也会被移动到高优先级的队列中。
Real-Time Scheduling 实时调度
Hard real-time systems
在该类系统中,某些任务被硬性要求在给定时间内完成,如导弹发射的轨道计算。Soft real-time computing
只能保证某些重要进程的优先级较高。
Thread Scheduling
- Local Scheduling –
How the threads library decides
which thread to put onto an available LWP
由线程库进行的对线程的调度。 - Global Scheduling – How the kernel decides which
kernel thread to run next
由内核执行的对内核线程的调度。
示例:Windows XP:多任务·抢占式调度
对于实时任务(real-time)进程,它们拥有高于其他所有进程的优先级。