一般的,在称呼cpu活动时,批量处理操作系统执行作业(job),而分时系统使用用户程序(user program),或任务(task)…
以上种种类似的活动,我们都可统称为进程。
总得来说,进程的范围较大:可是是执行的程序,也可是当前活动,以及进程堆栈(Stack)(包括临时数据,如函数参数、返回地址和局部变量等等),以及数据段(比如局部变量),甚至是堆(Heap)(在进程运行时动态分配的内存);
进程在运行时会产生许多进程;
进程本身也可作为一个环境,来运行其他代码,以大家比较熟悉的Java运行机制来举例:
我们都知道,Java程序是先编译为一个class文件,然后在JVM上运行的,比如编译一个Java程序java1.class,我们一般输入:
java java1//java是命令,java1是主类名
命令java将JVM作为一个普通程序来运行,而这一进程将会在JVM中执行Java程序java1.
2.1进程状态
进程的状态一共有五种:
新的 new :进程正在创建;
运行 running:指令正在执行;
等待 waiting:进程正在等待某个事件;
就绪 ready:进程等待分配处理器;
终止 terminated:进程已经完成执行。
其相互间关系可用如下图表示:
其中最重要的便是:一次只有一个进程处于running,但是可以有多个进程同时waiting或者ready
2.2PCB
即进程块控制(Process Control Block )。PCB可以理解为一个存储信息的仓库,且这些信息随着进程的不同而不同。
下面就是一个典型的PCB例子:
2.3线程 Thread
相信许多人第一次接触线程这个概念是在Java的多线程编程中,那么究竟何为线程?
前文已经提及,操作系统中只能同时有一个进程处于Running的状态,但由于现代操作系统的扩展,使得在只有一个进程的同时,又能有多个线程在运行。
例如:在打字输入时,只有输入一个进程,但同时又有出错检查、保存的线程在同步执行。
简而言之,线程就是能同时运行的程序。且在支持线程的os中,PCB被扩展到包括每个线程的信息。
我们都知道,设计一个分时操作系统的目标便是能最大程度的利用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执行进程时,有以下几种情况:
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上的进程的上下文,以便在处理后执行恢复/挂起。上下文切换涉及以下几个概念:
进程是计算机操作系统中一个宏观的概念,可用作许多活动的描述。进程在执行时,只能有一个进程处于Runinng状态,但可有多个进程Wating及Ready,同时在现代OS中,还引入了多线程的概念。进程的调度和存储依靠的是队列这种数据结构,保证了进程调度的有序性。在主流的操作系统中的调度程序,最常用的是短期调度程序,且可视其对I/O设备和CPU设备的使用率分为I/O密集型进程和CPU密集型进程。而上下文的切换,涉及到了中断操作(我会在日后的博客中补上这一部分笔记),其效率也视寄存器的性能而定。
(第一篇OS博客,感谢阅读)
本文发布于:2024-01-28 10:09:03,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064077456672.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |