操作系统

进程是执行中的程序,这是一种非正式的说法。进程不只是程序代码,程序代码有时称为文本段。进程还包括当前活动,通过程序计数器的值和寄存器的内容来表示,还包括堆栈段和数据段(全局变量)。

虽然两个进程可以与同一程序相关,但是它们被当作两个独立的执行序列。虽然文本段相同,但数据段不同。比如同一用户能调用编辑器程序的多个拷贝。

进程的状态:新的,运行,等待,就绪,终止。等待是指进程等待一定事件的出现(如I/O完成或收到某个信号);就绪是指进程等待被分配给某个处理器。

image

每个进程在操作系统内用进程控制块(PCB)来表示。包含:

一:进程状态。比如等待,就绪等。

二:程序计数器:表示这个进程要执行的下个指令的地址。

三:CPU寄存器。

四:CPU调度信息:比如进程优先级,调度队列的指针。

五:内存管理信息:包括基址寄存器和界限寄存器的值,页表或段表。

六:计帐信息:CPU事件,实际使用时间,时间界限,计帐数量,作业或进程数量等。

七:I/O状态信息。

迄今为止所讨论的进程模型暗示:一个进程是一个只能进行单个执行线程的程序。这就说明用户不能在同一进程内,同时输入字符和运行拼写检查。许多现代操作系统扩展了进程概念,允许进程执行多个线程。

进程进入系统时,会被加到作业队列中。该队列包括系统中的所有进程。驻留在内存中就绪的等待运行的进程保存在就绪队列上。队列采用链表的形式,指向进程控制块(PCB)。

新进程开始处于就绪队列中。它在就绪队列中等待直到被选中执行(或分派)。当进程分配到CPU并执行时,有几种事件可能发生:

一:进程可能发出一个I/O请求,并被放到I/O队列中。

二:进程可能创建一个新的子进程,并等待其结束。

三:进程可能会由于中断而被强制移出CPU,并被放回到就绪队列。

image

长期调度程序或作业调度程序进程池中选择进程,并将它们装入内存以执行,实际上控制内存中进程的数量。短期调度程序或CPU调度程序就绪可执行的进程中选择进程,并为其中之一分配CPU。

UNIX分时系统没有长期调度程序,而有的分时系统有中期调度程序(能将进程移出内存),之后,进程能被重新调入内存,并从中断处继续执行。这种方案称为“交换”。由于过分使用内存而需要释放内存时,就有必要使用交换。

image

将CPU切换到另一个进程需要保存原来进程的状态并装入新进程的保存状态,这一任务称为上下文切换

当进程创建新进程时,有两种执行可能:

一:父进程与子进程并发执行。

二:父进程等待,直到某个或全部子进程执行完毕。

新进程的地址空间也有两种可能:

一:子进程是父进程的复制品。

二:子进程装入另一个程序进来。

例如对于UNIX系统,fork后,子进程由原来进程的地址空间的复制组成。这种机制允许父进程与子进程方便的进行通信。两个进程(父与子)都继续执行位于系统调用fork之后的指令,但有一点不同,此时fork后,子进程的返回值为0;而对于父进程,返回值为子进程的进程标示符。

DEC VMS操作系统创建新的进程,将指定程序装入该进程,并开始执行。Windows NT系统支持上述的两种方式。

比如生产者和消费者的问题,需要程序员自己来编写一个共用的缓冲区。而操作系统有消息传递系统,该功能是允许进程互相通信而不需要利用共享数据。在web系统中的chat程序就是这样的一个例子。

线程,有时称为轻量级进程,是CPU使用的基本单元。一个进程的多个线程共享进程的代码段,数据段和文件;各个线程有自己的寄存器,线程ID,程序计数器和堆栈。

线程分为用户线程和内核线程。这样有多对一的线程模型;容易阻塞。一对一线程模型;实际是创建一个用户线程就需要创建一个相应的内核线程;开销比较大。多对多线程模型;避免了上述两种线程的缺点。

CPU调度准则包括如下:

一:CPU使用率。

二:吞吐量:一个时间单元内所完成进程的数量。

三:周转时间:从进程提交到进程完成的时间间隔。

四:等待时间:在就绪队列中等待所花时间之和。

五:响应时间:从提交请求到产生第一响应的时间。

CPU调度应该使CPU使用率和吞吐量最大化,而使周转时间,等待时间和响应时间最小化。

调度算法:

First-Come, First-Served(FCFS), 先到先服务调度的算法,可以用FIFO队列来实现。不过,这种策略的平均等待时间通常相当长。是非抢占的。

shortest-job-first(SJF), 最短作业优先调度算法,一个更为恰当的表达方式是:最短下一个CPU区间。这个算法是最佳的。但困难是:如何知道下一个CPU请求的长度。对于批处理系统的长期调度,可以将用户提交作业时所指定的进程时间极限作为长度。SJF调度经常用于长期调度;但不能在短期CPU调度层次上加以实现。但是可以通过上一个CPU区间来预测下一个CPU区间的长度,只能“预测”。SJF算法可能是抢占的或非抢占的。当是抢占的时,新进程,与当前运行进程所产生的CPU区间相比,可能有一个更短的下一个CPU区间,可能会抢占当前运行的进程。可抢占SJF调度有时称为最短剩余时间优先(shortest-remaining-time-first)调度。

SJF算法可作为通用优先权调度算法(priority-scheduling algorithm)的一个特例。每个进程都有一个优先权与其关联,具有最高优先权的进程会被分配到CPU。具有相同优先权的进程按FCFS顺序调度。

低优先权进程无穷等待问题的解决方案之一是老化。它逐渐增加在系统中等待很长时间的进程的优先权。

Round-Robin(RR)轮转法调度算法,它类似于FCFS调度,但是增加了抢占以在进程间切换;专门为分时系统设计的。定义了一个时间片,通常为10ms到100ms。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭