进程
什么是进程?
用户层面:进程就是运行起来的程序
操作系统的层面:进程就是操作系统对一个运行的程序的描述
程序运行时需要把代码数据加载到内存中,操作系统上运行了很多程序,操作系统就必须去管理这些程序的运行,操作系统对这些程序先描述,再组织进行管理。操作系统通过描述来管理运行的程序,这个描述信息就叫PCB(Process Control Block),在Linux中就是task_struct结构体
PCB中的描述信息:
- 标识符PID:与进程相关的唯一标识符,用来区别正在执行的进程和其他进程。
- 进程状态:描述进程的状态,因为进程有挂起,阻塞,运行等好几个状态,所以都有个标识符来记录进程的执行状态。
- 进程优先级:如果有好几个进程正在执行,就涉及到进程被执行的先后顺序的问题,这和进程优先级这个标识符有关。
- 程序计数器:程序中即将被执行的下一条指令的地址。
- 内存指针:程序代码和进程相关数据的指针。
- 上下文数据:进程执行时处理器的寄存器中的数据。
- I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表等。
- 记账信息:包括处理器的时间总和,记账号等等。
操作系统需要对进程进行管理,也就是为程序的运行分配资源,可操作系统是怎么来为进程分配资源的呢?
进程调度算法
无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
调度算法是指:根据系统的资源分配策略所规定的资源分配算法
常见的进程调度算法:
1. 先来先服务
先来先服务算法,顾名思义就是系统在使用这个算法时,算法每次会将处理机分配给就绪队列中最先进来的进程,这个进程一直运行下去,直到运行完成或者因为某些原因而阻塞才放弃处理机
特点:算法简单,可以基本上实现公平,属于非抢占式调度
有利于长作业,不利于短作业。因为长作业长时间占用处理机,短作业只有等待前面的长作业运行完才可以分配到处理机
2. 短作业优先
短作业优先算法,就是算法会将处理机优先分配给就绪队列上的预估运行时间较短的进程,让它一直运行直到运行完毕或由于某个事件发生阻塞是放弃处理机
缺点:使用短作业优先算法前提是要预估每个作业运行的时间,对长作业非常不利,长作业的周转时间会明显变长且运行得不到保证
3. 时间片轮转
时间片轮转算法,就是先将就绪队列上的所有进程按照先来先服务算法排列成一个队列,每次调度时,将CPU分配给队首进程,运行完一个时间片之后,由计时器发生始终中断,停止这个进程的运行,并将它移动到队尾,CPU继续分配队首进程。
时间片轮转算法的效率和时间片的大小有很大的关系,时间片如果太小就会频繁的轮转,时间片如果过大,就有可能变成先来先服务算法,响应时间长
4. 优先级调度
优先级调度算法,就是给每个进程分配一个优先级,按照进程的优先级来进行调度,算法将处理机分配给就绪队列中优先级最高的进程。又分为两种情况:
- 非抢占式优先级调度算法
处理机分配给优先级最高的进程之后,这个进程一直运行直到结束或者由于某个事件发生中断时放弃处理机,算法再将处理机分配给下一个优先级最高的进程 - 抢占式优先级调度算法
处理机分配给优先级最高的进程之后,这个进程在运行的过程中,如果现在来了一个优先级更高的进程,进程调度就会立即中断对这个进程的运行,将处理机重新分配给这个优先级更高的进程
这种抢占式的优先权调度算法能更好地满足紧迫作业的要求,常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。