操作系统学习笔记——进程(1)进程的调度

操作系统学习笔记——进程(1)进程的调度

1. 进程概论

一般的,在称呼cpu活动时,批量处理操作系统执行作业(job),而分时系统使用用户程序(user program),或任务(task)…
以上种种类似的活动,我们都可统称为进程
总得来说,进程的范围较大:可是是执行的程序,也可是当前活动,以及进程堆栈(Stack)(包括临时数据,如函数参数、返回地址和局部变量等等),以及数据段(比如局部变量),甚至是堆(Heap)(在进程运行时动态分配的内存);
进程在运行时会产生许多进程;
进程本身也可作为一个环境,来运行其他代码,以大家比较熟悉的Java运行机制来举例:
我们都知道,Java程序是先编译为一个class文件,然后在JVM上运行的,比如编译一个Java程序java1.class,我们一般输入:

java java1//java是命令,java1是主类名

命令java将JVM作为一个普通程序来运行,而这一进程将会在JVM中执行Java程序java1.

2.进程的相关概念

2.1进程状态
进程的状态一共有五种:
新的 new :进程正在创建;
运行 running:指令正在执行;
等待 waiting:进程正在等待某个事件
就绪 ready:进程等待分配处理器;
终止 terminated:进程已经完成执行。
其相互间关系可用如下图表示:

在这里插入图片描述其中最重要的便是:一次只有一个进程处于running,但是可以有多个进程同时waiting或者ready
2.2PCB
即进程块控制(Process Control Block )。PCB可以理解为一个存储信息的仓库,且这些信息随着进程的不同而不同。
下面就是一个典型的PCB例子:

在这里插入图片描述
2.3线程 Thread
相信许多人第一次接触线程这个概念是在Java的多线程编程中,那么究竟何为线程?
前文已经提及,操作系统中只能同时有一个进程处于Running的状态,但由于现代操作系统的扩展,使得在只有一个进程的同时,又能有多个线程在运行。
例如:在打字输入时,只有输入一个进程,但同时又有出错检查、保存的线程在同步执行。
简而言之,线程就是能同时运行的程序。且在支持线程的os中,PCB被扩展到包括每个线程的信息。

3.进程的调度

我们都知道,设计一个分时操作系统的目标便是能最大程度的利用CPU的性能,这便需要在进程间快速切换CPU。为实现这个目标,我们需要用到进程调度器(Process Scheduler)。调度器的实现依靠队列这一数据结构来实现。
3.1调度队列 Process Queue
一般地,调度队列有三种:
1)作业队列 Job Queue
当进程进入系统后会被加入该队列中;
2)就绪队列 Ready Queue
内存中的、就绪状态的、等待运行的队列放置于此。这个队列的实现一般用链式存储结构:每个头结点含有两个指针,用于指向链表的第一个和最后一个PCB块;同时每个PCB还有一个指针,指向就绪队列的下一个PCB。
在这里插入图片描述3)设备队列
用于等待特定I/O设备的队列。每个设备都有自己的设备队列。
(所以说,如果数据结构没学好学OS真的很吃亏。。。)
3.2进程调度的进程
先加入就绪队列,等待被选中执行或者分派(Dispatched)。当CPU执行进程时,有以下几种情况:

  • 进程发出I/O请求,并被放入这一队列;
  • 进程可能创建了一个子进程,并等待其终止;
  • 进程可能由于中断而强制释放CPU,并回到就绪队列。

3.3调度程序方式 Scheduler
前面提及了调度队列,而不同调度队列间的迁移实现依靠调度器或调度程序来执行。
调度程序一般被保存到大容量存储设备(磁盘)的缓冲池中等待执行,一般有以下五种:
1)长期调度程序 Long-term Scheduler
控制多道控制程序的,且由于每次执行之间有较长的时间间隔,使用长期调度程序可承担更多的事件负担,做进程的选择。该程序从进程池中选择进程.有的系统受于物理性质,可能极少或没有采用长期调动,比如UNIX或WINDOWS的分时系统;
2)段期调度程序 Short-term Scheduler
与长期调度程序相对应,其执行较为快速。该程序从准备执行的进程中选择进程;
3)I/O密集型进程 I/O-bound Process
顾名思义,执行I/O比执行计算花费的时间要长;
4)CPU密集型进程 CPU-bound Process
与I/O的相对应,更多时候用于执行计算任务;
5)中期调度程序 Medium-term Scheduler
某些操作系统额外引入。其核心思想是将进程从内存或CPU竞争中移出,从而降低多道程序的调度;之后又再次调入内存,并从中断处继续执行。这种方案被称作交换(swap)。当然,这有涉及到了内存的释放问题,此处不作讨论。
需要指出的是:I/O密集型进程与CPU密集型进程并非两个独立的概念,大多数进程都可归入这两类。
3.4上下文切换
由于操作系统中中断机制的存在,当中断发生时,系统需要保存当前运行在CPU上的进程的上下文,以便在处理后执行恢复/挂起。上下文切换涉及以下几个概念:

  • 状态保存 state saving,保存CPU当前状态(包括内核和用户模式)
  • 状态恢复 state restore,重新运行中断的进程
  • 上下文切换 context switch,切换CPU到另外一个进程,即同时执行以上两个任务。上下文切换涉及到的只是时间的开销,其快慢视处理器的性能而定(如寄存速度、寄存器数量)

4.总结

进程是计算机操作系统中一个宏观的概念,可用作许多活动的描述。进程在执行时,只能有一个进程处于Runinng状态,但可有多个进程Wating及Ready,同时在现代OS中,还引入了多线程的概念。进程的调度和存储依靠的是队列这种数据结构,保证了进程调度的有序性。在主流的操作系统中的调度程序,最常用的是短期调度程序,且可视其对I/O设备和CPU设备的使用率分为I/O密集型进程和CPU密集型进程。而上下文的切换,涉及到了中断操作(我会在日后的博客中补上这一部分笔记),其效率也视寄存器的性能而定。
(第一篇OS博客,感谢阅读)

发布了15 篇原创文章 · 获赞 16 · 访问量 1094

猜你喜欢

转载自blog.csdn.net/weixin_44522586/article/details/103089866