第一次作业:基于对Linux的理解

时间:2022-07-03 08:18:48

1.进程

    进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元。

2.进程的组织

2.1 线性方式

把所有PCB组织在一张线性表中,将该表的首地址存放在内存的一个专用区域中,每次查找是需要扫描全表,适用于系统中进程数目不多的情况。

2.2 链接方式

把具有同一状态的 PCB,用其中 的链接字链接成一个队列,PCB存储在一个连续的存区。

2.3 索引方式

各个索引表在内存单元中的首地址也记录在内存中的专用单元中,用添加索引表的方式记录具有相应状态下的某个PCB在PCB表中的地址。

3.进程的转换

3.1 三态模型

一个进程从创建而产生至撤销而消亡的整个生命周期,可以用一组状态加以刻划,根据三态模型,进程的生命周期可分为如下三种进程状态: 
1. 运行态(running):占有处理器正在运行 
2. 就绪态(ready):具备运行条件,等待系统分配处理器以便运行 
3. 等待态(blocked):不具备运行条件,正在等待某个事件的完成

第一次作业:基于对Linux的理解

运行状态的进程将由于出现等待事件而进入等待状态,当等待事件结束之后等待状态的进程将进入就绪状态,而处理器的调度策略又会引起运行状态和就绪状态之间的切换。

引起进程状态转换的具体原因如下:

  • 运行态—→等待态:等待使用资源;如等待外设传输;等待人工干预。
  • 等待态—→就绪态:资源得到满足;如外设传输结束;人工干预完成。
  • 运行态—→就绪态:运行时间片到;出现有更高优先权进程。
  • 就绪态—→运行态:CPU 空闲时选择一个就绪进程。

3.2 五态模型

在一个实际的系统里进程的状态及其转换比上节叙述的会复杂一些,例如引入专门的新
建态(new)和终止态(exit ) 


状态转换图如下所示: 


第一次作业:基于对Linux的理解

 

建态对应于进程刚刚被创建的状态。创建一个进程要通过两个步骤, 
1. 为一个新进程创建必要的管理信息, 
2. 让该进程进入就绪态。此时进程将处于新建态,它并没有被提交执行,而是在等待操作系统完成创建进程的必要操作。需要注意的是,操作系统有时将根据系统性能或主存容量的限制推迟新建态进程的提交

引起进程状态转换的具体原因如下:

  • NULL—→新建态:执行一个程序,创建一个子进程。
  • 新建态—→就绪态:当操作系统完成了进程创建的必要操作,并且当前系统的性能和虚拟内存的容量均允许。
  • 运行态—→终止态:当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结。
  • 终止态—→NULL:完成善后操作。
  • 就绪态—→终止态:未在状态转换图中显示,但某些操作系统允许父进程终结子进程。
  • 等待态—→终止态:未在状态转换图中显示,但某些操作系统允许父进程终结子进程。

 4.进程是如何调度的

4.1 轮转调度
 
每个进程被分配一个时间片(quantum),即允许该进程在该时间段中运行,如果时间片结束时该进程还在运行,则剥夺CPU并分配给另外一个进程。如果该进程在时间片结束前阻塞或者结束,则CPU立刻进行切换。
 
时间片长度的设置在轮转调度里面非常重要,因为从一个进程切换到另一个进程是需要一定的时间的——包括保存和装入寄存器的值以及内存映像。更新各种表格和列表,清除和重新调入内存高速缓存等。进程切换有时候也被称为上下文切换。时间片设置得太短会导致过多的进程切换。降低了CPU的效率;而设置得太长又会可能对短的交互请求的响应时间变长。
 
4.2 优先级调度
轮转调度隐含的假设是所有的进程都是相同的优先级的,通过动态地或者静态地对进程设立优先级,我们可以实现优先级调度,优先级高的进程优先运行。
 
为了防止高优先级的进程无休止地运行下去,调度程序可以在每个时钟周期结束时降低当前进程的优先级。如果这个动作导致该进程的优先级低于次高优先级的进程。则进行进程切换。一个可采用的方法是,每个进程可以赋予一个允许运行的最大时间片。当这个时间片用完时,下一个次高优先级的优先级进程可以获得机会运行。
 
 
5.对linux的理解
由于Linux 的内核大部分是用C 语言编写的,并采用了可移植的Unix标准应用程序接口,所以它支持如i386、Alpha、AMD和Sparc等系统平台,以及从个人电脑到大型主机,甚至包括嵌入式系统在内的各种硬件设备。

与其他的操作系统不同的是,安装了Linux系统后,用户常用的一些办公软件、图形处理工具、多媒体播放软件和网络工具等都已无需安装。而对于程序开发人员来说,Linux更是一个很好的操作平台,在Linux 的软件包中,包含了多种程序语言与开发工具,如gcc、cc、C++、Tcl/Tk、Perl、Fortran77 等。