一些补充资料,组织框架比较随意~
进程的引入:多道程序系统出现后,静态程序概念描述能力不够。为了刻画系统内部出现的情况,描述系统内部各种作业的活动规律而引进的一个新的概念。
进程控制
进程的控制原语
为了对系统中的进程进行有效的管理,通常系统都提供了若干基本操作,这些操作被称为原语。常用的进程控制原语有:
建立进程原语
该原语的主要工作是为被建立进程建立起一个进程控制块PCB,并填入相应的初始值。其主要操作过程是先向系统的PCB空间申请分给一个空闲的PCB,而后根据父进程所提供的参数,将子进程的PCB表目初始化,最后返回一个进程内部名。
通常提供的参数:进程名(外部标识符)n,处理器的初始状态(或进程运行现场的初始值,主要指各寄存器和程序状态字初始值)S0,优先数k0,父进程分给子进程的初始主存区M0和其他资源清单(多种资源表)R0等。
建立进程原语的工作大致描述为:
procedure Create(n,S0,k0,M0,R0,acc)
begin
i:=Get New Internal Name(n); // 调用查找进程名过程,参数为进程外部名。查找对象为PCB集合,如果同名则返回出错信息
Id(i):=n;
Priority(i):=k0;
Cpustate(i):=S0;
Main Store(i):=M0;
Resources(i):=R0;
Status(i):='Readys'; // 设置为‘挂起就绪’
Parent(i):=*;
Set Accounting Data; // 在PCB中(或其他相应表中)建立记账信息,这也是调用‘记账过程’
Insert(RL,i);
end.
挂起进程原语
只能挂起自己或自己的子孙。
命令过程描述如下:
procedure Suspend(n,a);
begin
i:=Get Internal Name(n);
S:=Status(i);
if S="Running" then STOP(i);
a:=COPY PCB(i)
Status(i):=if a="Blockeda" then "blockeds" else "Readys";
if S="Running" then SCHEDULER // 调用调用程序SCHEDULER
end.
解除挂起原语
解挂过程描述如下:
procedure Resume(n);
begin
i:=Get Internal Name(n);
Status(i):=if Status(i)='Readys' then 'Readys' else 'Blockeda';
if Status(i)='Readya' then SCHEDULER
end.
撤销进程原语
撤销原语可采用两种策略:1)只撤销一个具有指定标识符的进程(其子进程);2)撤销它的一个子进程及该进程的所有子孙。
1)会破坏进程树的层次关系,导致系统留下一些孤立隔绝的进程,从而失去对它们的控制。因此一般采用2)。
撤销原语一般由父进程或祖先发出,不会自己撤销自己。
该原语的大致描述:
procedure Destroy(n);
begin
Sched:=false;
i:=Get Internal Name(n);
KILL(i);
if Sched=true then SCHEDULER;
end(Destroy)
procedure KILL(i);
begin
if Status(i)='Running' then
begin STOP(I);
Sched:=true
end
REMOVE(Queue(i),i);
for all S<- progeny(i) do KILL(S); //<-是数学集合元素中的属于
for all r<- Resources(i) do RELEASE(r);
RELEASE(PCB(i));
end(KILL)
改变进程优先数原语
略
操作系统与进程控制的执行
略
多线程
用户级线程KLT和内核级线程ULT
要克服纯KLT和纯ULT方法中的缺点,并得到这两种方法中的好处,就要把两种方法结合起来。这就是基于多线程的操作系统。内核支持多线程的建立、调度和管理。同时系统中又提供线程库的便利,允许用户应用程序建立、调度和管理用户级的线程。
课文讨论中,常出现用户级线程、内核级线程、用户线程和内核线程。实际上用户级线程ULT和内核级线程KLT两者是一个管理上的概念,是说明有关线程由用户还是内核所创建和管理。通俗的说是有关线程户头是在内核还是在用户应用程序中。
系统中每一个具体的线程只有两类:
(1)用户线程:指运行在用户地址空间的线程,大多数线程都是用户线程。
(2)内核线程:指运行在内核空间的线程,例如内核子程序或所有中断和异常处理程序用线程来实现的话,都是内核线程。
所有的用户级线程都是用户线程。所有的内核级线程,既可以是用户线程又可以是内核线程,具体要看它运行的地址空间。
或所有中断和异常处理程序用线程来实现的话,都是内核线程。
所有的用户级线程都是用户线程。所有的内核级线程,既可以是用户线程又可以是内核线程,具体要看它运行的地址空间。