计算机操作系统-进程管理
进程与线程
进程是资源分配的基本单位。
进程控制块(PCB)创建进程,撤销进程的操作都是由PCB进行控制。
下图显示了4个程序创建了4个进程,这4个进程能够并发的执行。
线程是独立调度的基本单位。
一个进程里可以有多个线程,他们共享资源,就像QQ与浏览器属于两个进程,但是浏览器进程中的包含事件响应线程,渲染线程等线程。
区别
进程拥有资源,但是线程不拥有资源,但是线程可以访问进程的资源,统一进程中线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程的线程中会引起进程切换,进程的创建和销毁都需要系统进行分配和回收资源,如内存空间,I/O设备等,所付出的开销远大于线程的创建和销毁,线程之间的通信可以通过读取同一进程的数据进行通信,但是进程通信需要借助IPC。
进程状态的切换
就绪状态(ready):等待被调度
运行状态(running)
阻塞状态:等待资源
只有就绪态和运行态可以相互转换,其他都是单向转换。就绪状态的进程通过调度算法从而获得cpu时间,转为运行状态,而运行状态的进程,在分配给它的CPU时间片用完之后就会转为就绪状态,等待下一次调度。
阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括CPU时间,缺少CPU时间会从运行状态转换为就绪状态。
进程调度算法
不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。
批处理系统
批处理系统里面没有太多的用户操作,在该系统中,调度算法是保证吞吐量和周转时间。
先来先服务(FCFS)
非抢占式的调度算法,安装请求的顺序进行调度,有利于长作业,不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。
短作业优先(SJF)
非抢占式的调度算法,按估计运行时间最短的顺序进行调度,长作业可能饿死,处于一直等待短作业执行完毕状态。
最短剩余时间优先(SRTN)
最短作业优先的抢占式版本,按剩余运行时间的顺序进行调度,当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较,如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。
交互式系统
交互式系统有大量的用户交换操作,在该系统中的调度算法的目标是快速地进行响应。
时间片轮转
将所有就绪进程按FCFS的原则排成一个队列,每次调度时,把CPU时间分配给对首进程,该进程可以执行一个时间片,当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送到就绪队列的末尾,同时继续把CPU时间分配给队首的进程。
时间片轮转算法的效率和时间片大小有很大关系:
因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。
而如果时间片过长,那么实用性就不能够得到保证。
优先级调度
为每一个进程分配一个优先级,按优先级进行调度。
为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。
多级反馈队列
一个进程需要执行100个时间片,如果采用时间片轮转调度算法,那么需要交换100次。
多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同。
实时系统
实时系统要求一个请求在一个确定的时间内得到响应。
分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时。
进程同步
临界区
对临界资源进行访问的那段代码称为临界区,为了互斥访问临界资源,每个进程进入临界区之前,需要先进行检查。
同步与互斥
同步:多个进程因为合作产生的直接制约关系,使得进程有一定的先后执行关系。
互斥:多个进程在同一时刻只有一个进程能进入临界区。
信号量
信号量是一个整形变量,可以对其执行down和up操作,也就是常见的P和V操作。
down如果信号量大于0.执行-1操作,如果信号量等于0,进入睡眠,等待信号量大于0;
up对信号量执行+1操作,唤醒睡眠的进程,让其完成down操作。
down和up操作需要被设计成原语,不可分割,通常的做法是在执行这些操作的时候屏蔽中断。
如果信号量的取值只能为0和1,那么就成了互斥量,0表示临界区已经加锁,1表示临界区解锁。
进程通信
进程同步与进程通信很容易混淆,它们的区别在于:
进程同步:控制多个进程按一定顺序执行;
进程通信:进程间传输信息。
进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。
管道
管道是通过调用 pipe 函数创建的,fd[0] 用于读,fd[1] 用于写。
只支持半双工通信(单向交替传输);
只能在父子进程或者兄弟进程中使用。
FIFO
也称为命名管道,去除看管道只能在父子进程中使用的限制。
FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户进程和服务器进程之间传递数据。
消息队列
相比于 FIFO,消息队列具有以下优点:
消息队列可以独立于读写进程存在,从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难;
避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法;
读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。
信号量
它是一个计数器,用于为多个进程提供对共享数据对象的访问。
共享存储
允许多个进程共享一个给定的存储区。因为数据不需要在进程之间复制,所以这是最快的一种 IPC。
需要使用信号量用来同步对共享存储的访问。
多个进程可以将同一个文件映射到它们的地址空间从而实现共享内存。另外 XSI 共享内存不是使用文件,而是使用内存的匿名段。
套接字
与其它通信机制不同的是,它可用于不同机器间的进程通信。
请到客户端“主题--自定义配置--配置”中填入leancloud_appID和key