windows作业的相关概念

windows作业的相关概念

什么是作业

Microsoft Windoss 2000 提供了一个新的作业内核对象,使你能够将进程组合在一起,并且创建一个“沙框”,以便限制进程能够进行的操作。最好将作业对象视为一个进程的容器。但是,创建包含单个进程的作业是有用的,因为这样一来,就可以对该进程加上通常情况下不能加的限制。

对作业进程的限制

可以给一个作业加上若干不同类型的限制:

  • 基本限制和扩展基本限制,用于防止作业中的进程垄断系统的资源。
  • 基本的U I限制,用于防止作业中的进程改变用户界面。
  • 安全性限制,用于防止作业中的进程访问保密资源(文件、注册表子关键字等)。

将进程放入作业

当调用 CreateProcess时,我使用了 CREATE_SUSPENDED标志。这样,创
建了一个新进程,但是不允许它执行任何代码。 当创建子进程之后,在我允许它开始运行之前,我必须显式地将该进程放入我新创建的作业。 方法是调用下面的代码:

BOOL WINAPI AssignProcessToJobObject(
  _In_ HANDLE hJob,
  _In_ HANDLE hProcess
);

该函数告诉系统,将该进程(由 h P r o c e s s标识)视为现有作业(由 h J o b标识)的一部分。注意,该函数只允许将尚未被赋予任何作业的进程赋予一个作业。一旦进程成为一个作业的组成部分,它就不能转到另一个作业,并且不能是无作业的进程。另外,当作为作业的一部分的进程生成另一个进程的时候,新进程将自动成为父作业的组成部分。不过可以改变它的行为特性。

当调用A s s i g n P r o c e s s To J o b O b j e c t后,新进程就成为受限制的作业的组成部分。然后调用 R e s u m e T h r e a d,这样,进程的线程就可以在作业的限制下执行代码。这时,也可以关闭线程的句柄,因为不再需要它了。

终止作业中所有进程的运行

想对作业进行的最经常的操作是撤消作业中的所有进程。 Developer Studio 没有配备任何便于使用的方法,来停止进程中的某个操作。 若要撤消作业中的进程,只需要调用下面的代码:

BOOL TerminateJobObject(
    HANDLE Hjob,
    UINT uExitCode);

这类似为作业中的每个进程调用 TerminateProcess函数,将它们的所有退出代码设置为uExitCode。

查询作业统计信息

使用 QueryInformationJobObject函数来获取对作业的当前限制信息,也可以使用它来获取关于作业的统计信息。

作业通知信息

已经知道了关于作业对象的基本知识,剩下要介绍的内容是关于通知的问题。例如,是否想知道作业中的所有进程何时终止运行或者分配的全部 C P U时间是否已经到期呢?也许想知道作业中何时生成新进程或者作业中的进程何时终止运行。 当作业中的进程尚未用完分配的 C P U时间时,作业对象就得不到通知。一旦分配的所有 C P U时间已经用完, Windows就强制撤消作业中的所有进程,并将情况通知作业对象。通过调用WaitForSingleObject (或类似的函数),可以很容易跟踪这个事件。有时,可以在晚些时候调用SetInformationJobObject函数,使作业对象恢复未通知状态,并为作业赋予更多的 CPU时间。

猜你喜欢

转载自blog.csdn.net/libing403/article/details/78282917
今日推荐