JCL 面试问题

2025年3月17日 | 阅读 10 分钟
JCL Interview Questions

以下是最常问的 JCL 面试问题及其答案。

1) 什么是 JCL?

JCL 是 Job Control Language (作业控制语言) 的缩写。JCL 是一种在 IBM 大型机操作系统上使用的脚本语言,用于指示系统执行批处理作业。它是一组语句,你编写这些语句来告诉操作系统你想执行的任务。有时这组语句相当庞大,但大多数作业都可以使用最少的一部分语句来运行。

JCL Interview Questions

JCL 语句告诉操作系统在哪里找到所需的输入,如何处理这些输入,以及如何处理产生的输出。


2) JCL 如何作用于 COBOL 代码?

COBOL 代码中有特定的分区处理 JCL。

标识分部 (Identification Division)

作为 JCL 的介绍部分。它介绍程序名称、作者、日期等,没有与 JCL 交互的代码。

环境分部 (Environment Division)

环境分区允许 JCL 与操作系统交互。操作系统会发送文件操作下的文件请求。

数据分区

它根据操作(读取或打印文件,在操作系统的帮助下)处理访问到的文件。

过程分部 (Procedure Division)

它包含对文件采取的各种操作,例如关闭正在使用的文件。


3) JCL 中的条件检查是什么?这可能吗?

JCL 支持条件检查。条件检查可以在作业级别和代码级别进行。它是通过 COND 关键字和 JCL 中预定义的返回码和操作数来完成的。因此在 JCL 中是可行的。


4) JCL 支持自动重启吗?

通过一些预定义的关键字参数,JCL 可以实现自动重启。RD 关键字就是其中之一,用于重启。它通常在程序异常终止后成功。除了自动重启,我们还需要考虑检查点的重要性,它们用于定义程序在不同点的作业执行情况。


5) 解释 JCL 中的 JOB 语句?

JOB 语句在假脱机(spool)和调度器(scheduler)中为操作系统 (OS) 提供作业标识。它是 JCL 中的第一个控制语句。JOB 语句中可用的参数帮助操作系统分配正确的调度器。它还可用于分析所需的 CPU 时间并向用户发出通知。

语法

JCL JOB 语句的基本语法如下。


6) 解释 JCL EXEC 语句?

一个 JCL 可以由多个作业步骤组成,一个作业步骤可以直接执行一个程序,也可以调用一个过程。因此,JCL 可以执行一个或多个程序(作业步骤)。

包含作业步骤程序信息的语句称为 EXEC 语句

EXEC 语句的目的是提供所需的信息。这些信息被转发到在作业步骤中执行的程序。

语法

JCL EXEC 语句的基本语法如下。


7) EXEC 语句中 ADDRSPC 参数的意义是什么?

ADDRSPC 参数用于指定系统所需的存储空间。

关于 ADDRSPC 参数的一些重要点如下。

  • 它是一个可选参数。
  • 存储可以是虚拟的或中央的。
  • REGION 参数为单个步骤请求存储空间。
  • ADDRSPC 阻止页面调度。
  • ADDRSPC=VIRT 用于页面调度。
  • 一旦 ADDRSPC 设置为 REAL (ADDRSPC=REAL),该步骤在执行时将被锁定在实际存储中。
  • 它的效果对系统性能不利。

8) JCL 如何向操作系统指定 JOB?

JCL 通过 JCL 组向操作系统指定作业。这些组根据它们产生的工作来定义。确定作业的步骤如下。

  • 识别作业。
  • 执行用户命名的程序。
  • 定义所用文件的多个 DD。
  • 前一个工作应为关闭操作、退出操作。

9) 解释 JCL 中的 DD 语句?

数据集是包含特定格式记录的大型机文件。这些文件存储在大型机的直接访问存储设备 (DASD) 或磁带上,是基本数据存储区域。如果需要在批处理程序中操作这些数据,则在 JCL 中编码物理数据集名称和文件格式。

DD 语句用于提供 JCL 中使用的数据集定义。作业步骤所需的输入和输出资源需要在 DD 语句中描述。这些资源必须指定信息,例如数据集组织、存储要求和记录长度。

语法

JCL DD 的基本语法如下。


10) 如何在不运行 JCL 的情况下检查其语法?

我们可以在 JOB 卡上写入 TYPERUN=SCAN 或使用 JSCAN 来在不运行 JCL 的情况下检查其语法。


11) JCL 过程中不允许使用哪些 JCL 语句?

过程中不允许使用的一些 JCL 语句如下。

  • JOB、分隔符(/*) 或空语句
  • JOBLIB 或 JOBCAT DD 语句
  • DD * 或 DATA 语句
  • 任何 JES2 或 JES3 控制语句

12) JCL 中为什么使用 include 语句?

它用作 STEPLIB 的替代方案。当我们在 include 语句中指定数据集名称时,它会在包含的数据集中定义的所有数据集中进行搜索。


13) 区分 JOBLIB 和 STEPLIB 语句?

JOBLIB 和 STEPLIB 的比较如下

JOBLIBSTEPLIB
JOBLIB 语句用于识别 JCL 中要执行程序的所在位置。STEPLIB 语句用于识别作业步骤中要执行程序的所在位置。
它在 JOB 语句之后,EXEC 语句之前指定。它在 EXEC 语句之后,作业步骤的 DD 语句之前指定。
它不能放在编目过程中它可以放在编目过程中
其语法为
	//JOBLIB DD DSN=dsnname,DISP=SHR
其语法为
	//STEPLIB DD DSN=dsnname,DISP=SHR

14) JCL 中符号 // 的用途是什么?

它是 JCL 语句中使用的重要符号。每个 JCL 语句都必须以这个符号开头。这是一个预定义规则,用于执行 JCL 语句;否则,JCL 语句会抛出错误。

JCL 执行系统首先检查 JCL 语句开头的符号 (//)。它避免了运行时异常。


15) 解释 JCL 中的层级?

层级是根据其操作描述 JCL 语句的步骤。

JCL 的每个语句都包含以下关键字

  • 姓名
  • 字段
  • 操作
  • 操作数
  • 参数
  • 位置
  • 关键字
  • 如果有注释

16) 区分寻址模式和运行模式。

寻址模式和运行模式之间的主要区别如下。

寻址模式或访问模式运行模式或驻留模式
AMODE(24) 表示在内存线下进行 24 位寻址。RMODE(24) 表示程序需要加载到内存线下。
AMODE(31) 表示在内存线上和线下进行 31 位寻址。RMODE(31) 指定程序需要加载到内存线上或线下。
AMODE=ANY,它指定 24 位或 31 位寻址方法。RMODE=ANY,它指定程序加载到 24 位或 31 位内存中。

17) 哪个实用程序用于运行 COBOL-DB2 程序?

IKJEFT01 实用程序用于运行 COBOL-DB2 程序。


18) 哪个语句用于识别 JOB 中的私有库?

JCLLIB 语句用于定义作业中使用的私有库。它可用于编目过程和流内过程。

语法

JCL JCLLIB 语句的基本语法如下。


19) JCL 中的实用程序有哪些?

实用程序是预先编写好的程序。这些程序被系统程序员和应用程序开发人员广泛用于大型机,以满足一般需求,维护和组织数据。其中一些列举如下。

  • IEHMOVE
  • IEHPROGM
  • IEHCOMPR
  • IEBCOPY
  • IEFBR14
  • IEBEDIT
  • IDCAMS

20) 解释 DFSORT 实用程序?

DFSORT 是一个强大的 IBM 实用程序。它用于复制、排序和合并数据集。SORTINSORTINnn DD 语句用于指定输入数据集。SORTOUTOUTFIL 语句用于确定输出数据。

DFSORT 纯粹是一个与大型机相关的实用程序,用于借助 JCL 处理或操作顺序文件。


21) 什么是 DISP=(NEW,PASS,DELETE)?

为了创建临时数据集,我们使用 disp = (new,pass,delete)。New 创建一个新的数据集并将其传递给下一步。成功执行后,它会传递数据集并从系统中删除数据集。


22) 如何使用 SORT 程序将 FB 文件转换为 VB 文件?

可以通过 SORT 程序中的 FTOV 选项将 FB 文件转换为 VB 文件。


23) 如何使用 JCL 运行 COBOL 程序?

程序需要编译,并创建包含所有子程序的加载模块,以便在批处理模式下执行 COBOL 程序。JCL 在执行时使用加载模块而不是实际程序。加载库在执行时通过 JCLLIBSTEPLIB 打补丁并提供给 JCL。

下面我将举例说明一个 JCL,其中程序 MYPROG 使用输入文件 MYDATA.URMI.INPUT 执行。此程序将生成两个输出文件写入假脱机。


24) 什么是世代数据组 (GDG)?

世代数据组是一组顺序或功能相关的数据集。它们通过添加新世代、丢弃最旧世代以及有时保留以前世代来定期处理。


25) 如何创建临时数据集?你会在哪里使用它们?

临时数据集可以通过指定临时文件指示符 DSN=&&TEMP 或不指定任何 DSNAME 来创建。我们使用它们将一个步骤的输出转发到同一作业中的另一个步骤。作业完成后,数据集将不会被保留。


26) 什么是 NOTCAT 2 - GS?

NOTCAT 2-GS 是一条 MVS 消息,表示存在重复的编目条目。例如,如果我们已经有一个数据集 dsn = 'xxxx.yyyy',并且我们想创建一个带有 disp new, catlg 的数据集,我们会得到这个错误。

当程序打开并写入时,它会通过,在步骤结束时,系统会尝试将其放入系统目录中。此时,由于我们已经有一个存在的条目,catlg 将失败并给出此消息。

我们可以通过删除第一个数据集并转到新数据集所在的卷并对其进行编目来解决问题。


27) 什么是 JCL 过程?

JCL 过程是 JCL 内部的语句集合。这些语句被分组以执行特定功能。JCL 的固定部分编码在过程中,作业的可变部分编码在 JCL 内部。

我们可以使用过程在多个输入文件的帮助下实现程序的并行执行。可以为每个输入文件创建一个 JCL,并通过将输入文件名作为符号参数传递,同时调用单个过程。

语法

JCL 过程定义的基本语法

过程的内容由 JCL 保存,用于流内过程。


28) 如何提交作业以执行?

在大型机上,当我们想要执行任何任务时,我们必须编写一个作业并将其转发给大型机计算机进行处理。这称为提交作业。

您可以通过多种方式从 CICS 应用程序程序提交作业。我们可以通过使用 CICS Spool 接口命令直接将 JCL 写入 JES Spool 来完成此操作。


29) 如何从 CICS 提交 JCL?

CICS 提供了一个到 MVS 的 JES(作业入口子系统)的编程接口。JES 接口允许 CICS 应用程序创建和检索假脱机文件。要使用 JES 接口,您应该在 CICS 安装中将 DHFSIT SPOOL 参数设置为 YES (DFHSIT SPOOL=YES)

CICS 提供 4 个用于作业提交的 SPOOL 接口命令。它们如下。

  • SPOOLOPEN (INPUT|OUTPUT)
  • SPOOLREAD
  • SPOOLWRITE
  • SPOOLCLOSE

对 JES 假脱机文件的所有访问必须在 CICS 程序中的一个任务中完成。应注意,任何处理超过 1000 条记录进行 I/O 的数据集的作业都可能对 CICS 的其余部分产生性能影响。


30) 假设我有七个作业要做,但我只想保留一个,那我该怎么做?

在可用的作业中保留一个作业是一个简单的过程。为此有一套预定义的规则。根据 JCL 关于作业的预定义规则,每个作业中都有一个关键字。我们可以保留一个作业以供稍后执行,并在作业语句上指定 TYPRUNTYPRUN 用于保留一个作业,并将其变量名设置为 HOLD。

语法

示例

对于您想要保留的作业