进程就是一个正在执行的实例,包括程序技术器、寄存器、和变量当前值。进程的关键思想:一个进程是某种类型的一个活动,它有程序、输入输出以及状态。单个处理器可以被若干进程共享,它使用某种调度算法决定何时停止一个进程的工作,转为为另一个进程服务。
以下主要时间会导致进程的创建:
启动系统时,通常会创建若干个进程,有些是前台进程(与人类交互的进程),其他的事后台进程。
除了启动阶段创建进程以外,新的进程也会发出系统调用。以便创建一个或多个新进程协助器工作。
交互式系统中,键入一个命令或点击一个图标就可以启动一个程序,开启一个新的进程。
最后一种创建仅在大型计的批处理系统中应用。用户在这种系统中提交批处理作业,在操作系统认为有资源的可运行下一个作业时,创建新的进程。
从技术上来看,在这些所有情形中,新进程都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的。
进程创建后,父进程和子进程有着各自不同的地址空间。如果某个进程在其地址空间中修改一个字,对其他进程不可见。
进程在创建之后,它开始运行,完成其工作。进程会在以下条件终止
多数进程由于完成它们的工作而终止。当编译器完完成所给定程序的编译后,编译器执行一个系统调用,通知操作系统它的工作已经完成。
进程终止的第二个原因是有进程引起的错误,通常是程序的错误,如执行非法指令、引用不存在内存,在这种错误中,进程会收到信号被中断,而不是在这类错误出现时终止。
进程终止的第三个原因,出现严重错误,比如编译文件不存在。
第四种终止进程的原因是,某个进程执行某个系统调用通知操作系统杀死某个进程。
某些系统中,当进程创建了一个进程后,父进程以某种联系保持关联
在UNiX中,进程和它的所有子进程以及子进程后裔组成一个进程组。Windows没有层次结构的概念,所有的进程都是地位相同的。唯一类似的是在创建进程的时候,父进程会得到一个句柄来控制子进程,但是windows有权转移,而unix不能转移。
转换1,当操作系统发现进程不能继续运行下去时发生转换1.
转换2和转换3都是由进程调度引起的。调度程序的主要工作是决定应当运行那个进程。
转换4,当进程等待一个外部事件发生时![请添加图片描述](https://img-blog.csdnimg.cn/9562c479681c48a184eb4c74741f9988.png = 400x)
操作系统最底层的是调度程序,在它上面有很多进程,所有关于中断处理,启动进程和停止进程的具体细节都隐藏在调度程序中。
为了实现进程模型,操作系统维护着一张表格,即进程表。每个进程占用一个进程表项(进程控制块)。该表项包含了进程状态的重要信息。包括程序技术器,堆栈指针等其他在进程由运行态转换到阻塞态必须保存的信息。
在了解进程表后,可以对在单个CPU上如何维持多个顺序进程的错觉做更多解释。与每一个I/O类关联的是一个称作中断向量的位置。它包括中断程序的入口地址。加入当一个磁盘中断发生时,进程3正在执行,则中断硬件将程序计数器,程序状态字,有时还把多个寄存器压入堆栈,计算机随即跳转到所指向的地址
进程模型基于两个独立的概念:资源分组处理和执行。理解进程的一个角度是,用某种方法把相关的资源集中在一起,另一个概念是,用某种方法把相关的资源集中在一起,而线程是在CPU上被调度执行的实体。
进程中的不同线程不像不同进程之间存在很大的独立性。所有的线程都有完全一样的地址空间,一个线程可以读写其他线程的堆栈。
每个线程都有自己的堆栈,因为每个线程都有调用不同的过程,有着不同的执行历史。
有两种方式实现线程包:在用户空间中和在内核中。
第一种方法是整个线程放在用户空间,内核对线程包一无所知,从内核角度考虑,就是正常的方式管理,即单线程进程。
在用户空间管理线程时,每个进程需要有专用的线程表。记录线程的各个属性完成线程状态的转换。
缺点:
内核的线程表保存了每个线程的寄存器、状态和其他信息。所有能够阻塞线程的调用都以系统调用的形式存在,当一个线程阻塞时,内核的调用选择同一个进程的另一个线程还是另一个进程的线程。而在用户级线程,运行时系统始终运行自己进程的线程,直到内核剥夺它的CPU为止。
调度程序激活机制:其工作目标是模拟内核线程的功能,避免了在内核态和用户态之间的切换.其工作原理简述如下:
调度时机
调度算法分类
不同的应用领域有不同的目标,也就需要不同的操作系统。所以,不同的操作系统,需要有不同的调度算法。常见的操作系统分为3类:
批处理系统
交互式系统
实时系统
先来先服务
先来先服务调度算法(FCFS)
∙ 先来先服务(First-Come-First-served)调度算法是最简单的非抢占的调度算法。
∙ 它通过管理一个FIFO就绪队列来实现,从前到后按顺序将CPU分配给进程。
FCFS调度算法对短进程不利,尤其当一个短进程跟在长进程后面时,它需要等待很长的时间。有时候会导致CPU和设备的利用率很低,在实际情况中,FCFS算法通常与其他算法结合使用。
最短作业优先
∙ 最短作业优先(Shortest-Job First)调度算法克服了FCFS的对短进程不利的缺点,它在就绪队列中选择处理时间最短的进程,如果时间相同则可以按照FCFS准则来处理。
∙ 它提高了系统的吞吐量,但是反过来又对长进程不利。
最短剩余时间优先
最短剩余时间优先算法(SRTN, Shortest Remaining Time Next)是每当有进程加入就绪队列发生改变时就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列,此外,当一个进程完成时也需要重新调度。
轮转调度
时间片轮转(RR, Round-Robin)
** 优先级调度**
多级队列
最短进程优先
保证调度
彩票调度
公平分享调度
实时系统是一种时间起着主导作用的系统。他们的特点是:要求系统在恰当的时间内做出响应。对时间都都敏感的,正确的但是迟到的应答往往比没有响应更糟糕。比如,医院特别护理部门的病人监护装置、飞机中的自动驾驶系统、自动化工厂中的机器人控制系统等。
实时系统调度算法分为静态和动态。静态调度算法在系统开始运行之前做出决策。动态调度算法在运行过程中进行调度决策。静态调度算法要求事先掌握所完成的工作和必须满足的截止时间等所有必要信息时,才能工作,动态调度算法没有这个要求。
采用调度机制和调度策略分离的原则。将调度算法以某种形式参数化,参数可以由用户进程填写。
线程分为用户级线程和内核级线程。
用户级线程场景下,当进程获得CPU的时间片时,由进程内的线程调度程序决定把时间片分给哪个线程。直到该进程被挂起。用户级场景下,运行时系统使用的调度算法通常是轮转调度和优先级调度。唯一的缺陷是缺乏一个时钟中断运行过长的线程,但由于用户级线程之间是合作关系,这种影响通常也不是问题。
内核级线程的场景下,内核选择一个线程,内核级线程是脱离用户级的,内核不会考虑这个线程属于哪个进程。当然如果有必要,内核也做得到。内核对被选中的线程赋予一个时间片,超过时间片则线程被挂起。
用户级线程和内核级线程的差别在于性能。用户级线程的切换只需要少量的机器指令。而内核级线程需要完整的上下文切换,修改内存映射,使高速缓存失效,这导致了若干数量及的延迟。这也就是说,从进程A的一个线程A1切换到进程B的一个线程B1,其代价高于切换到进程A的线程A2。
用户级线程可以使用专为应用程序定制的线程调度程序,这能比内核更好的满足应用程序的需要。