텍스트 UI 프로그램과 UI 프로그램에서의 세그먼테이션

세그먼테이션은 EGL converse 문 및 시스템 자원 릴리스와 연관되어 있습니다. 여기에서 "대화"는 프로그램과 사용자 사이의 대화를 참조합니다. converse 문은 사용자에게 정보를 표시하고, 응답을 기다리며, 다음 지시를 사용하여 처리를 재개합니다.

세그먼트화되지 않은 프로그램은 사용자 응답을 기다리는 동안 메모리에 남게 됩니다. 세그먼트화된 프로그램은 converse 이후에 종료되고 사용자가 응답한 후에 다시 로드됩니다(IMS™ 환경은 예외. 여기서는 converse 후에 메시지 큐에서 읽기 위해 프로그램이 다시 돌아감). 세그먼테이션 뒤의 아이디어는 사용자가 즉시 응답하지 않는 경우 시스템 자원(예: 메모리 및 잠김 데이터베이스)을 사용 가능 상태로 만드는 것입니다.

일반적으로 세그먼테이션 문제는 CICS® 및 IMS와 같은 트랜잭션 환경의 핵심적인 부분입니다. 자세한 정보는 CICS 또는 IMS에서 세그먼트화된 프로그램의 동작을 참조하십시오. EGL은 이러한 구현 문제로부터 사용자를 보호합니다. 일부 사소한 예외에서는 프로그램이 항상 메모리에 있는 것처럼 EGL에서 사용자 코드를 작성합니다. 그런 다음 EGL이 필요에 따라 다음 조치를 수행하는 추가 코드를 포함하여 각 환경에 대해 적절한 명령을 생성합니다.
  • CICS 및 IMS과 같은 환경에서 세그먼트화된 프로그램을 관리합니다.
  • converse에서 데이터베이스 변경사항을 커미트하고 데이터베이스 잠금을 해제합니다.
  • converse 이후 특정 시스템 변수를 새로 고칩니다.
  • 메모리와 같은 시스템 자원을 사용 가능하게 합니다.
  • 프로그램이 사용 중인 데이터에 대한 정보를 저장하고 converse 후에 이를 다시 복원합니다.

UI 프로그램이 아닌 EGL 생성 Java™ 프로그램은 항상 세그먼트화되지 않으며 converse 이후에 메모리에 그대로 상주합니다. 그러나 Java와 COBOL 둘 다에서 프로그램을 생성하는 경우 세그먼트화할 프로그램을 선언하거나(프로그램 segmented 특성을 YES로 설정) converseVar.commitOnConverse 시스템 변수를 설정하는 데 아무 영향이 없습니다. 이는 데이터베이스에 변경사항을 커미트하고 converse 이후에 데이터베이스 잠금을 해제하는 것과 같이 Java 환경에서 일부 세그먼트화된 프로그램 동작을 모방합니다.

호출된 프로그램을 세그먼화할 수 있습니다. EGL에서 이를 알게 하려면 호출 체인에 있는 모든 프로그램에 대해 segmented 특성을 YES로 설정해야 합니다.

세그먼트화되지 않은 프로그램은 더 쉽게 코드할 수 있습니다. 예를 들어, converse 후에는 SQL 행을 다시 잠그지 않아도 됩니다. 사용자가 고려하는 동안 SQL 행이 보류된다는 사실과 동일한 SQL 행에 액세스해야 하는 다른 사용자에 대해 성능 문제점을 야기하는 동작이 포함된다는 약점이 있습니다.

세그먼트화되지 않은 프로그램에서 converse 문을 실행하기 전에 자원을 해제하거나 새로 고치기 위해 다음과 같은 두 가지 기법이 사용 가능합니다.
  • converseVar.commitOnConverse 시스템 변수를 1로 설정할 수 있습니다. 이 경우 EGL은 converse 이전에 다음 조치를 수행합니다.
    • 데이터베이스 및 기타 복구 가능한 자원이 커미트됩니다.
    • 잠금이 해제됩니다.
    • 데이터베이스 open 문에 hold 옵션이 포함될 때를 제외하고 파일과 데이터베이스 위치가 유지되지 않습니다. hold 옵션은 COBOL 프로그램에서만 사용할 수 있습니다.

    converseVar.commitOnConverse 설정은 시스템 변수 또는 EGL 테이블에 아무 영향을 미치지 않습니다.

  • converse를 핸들링하는 두 번째 기법은 텍스트 UI 프로그램의 segmented 특성을 YES로 설정하는 것입니다. 개발 시 이 프로그램 특성을 변경하거나 런타임 시 converseVar.segmentedMode 시스템 변수를 1로 설정할 수 있습니다. 이 경우 EGL은 converse 이전에 다음 조치를 수행합니다.
    • 데이터베이스 및 기타 복구 가능한 자원이 커미트됩니다.
    • 잠금이 해제됩니다.
    • 데이터베이스 open 문에 hold 옵션이 포함될 때에도 파일과 데이터베이스 위치가 유지되지 않습니다.
    • 단일 사용자 EGL 테이블을 새로 고칩니다. 해당 값은 프로그램이 시작될 때와 동일합니다.
    • 시스템 변수를 새로 고칩니다. 세그먼트에서 값이 저장되는 변수의 서브세트를 제외하고 해당 값은 프로그램이 시작될 때와 동일합니다.

    세그먼트 프로그램의 동작은 converseVar.commitOnConverse 시스템 변수의 값에 영향을 받지 않습니다.

호환성

표 1. 세그먼트화된 프로그램에 대한 호환성 고려사항
플랫폼 문제
IMS 또는 z/OS®용 CICS
IMS 또는 z/OS용 CICS에서 세그먼트화된 프로그램을 사용하는 경우의 이점은 다음과 같습니다.
  • EGL이 없을 때, 세그먼트화된 프로그램의 개발자는 매번 호출을 수행할 때마다 프로그램 상태를 분석하는 코드를 작성합니다. EGL을 사용하면, 개발자는 사용자가 메모리에 상주하는 프로그램과 현재 대화 중인 것처럼 코드를 작성하므로 애플리케이션 로직이 좀 더 간단합니다.
  • 보다 많은 수의 터미널이 EGL 프로그램을 동시에 실행할 수 있도록 메모리와 같은 제한된 자원을 보다 효율적으로 사용합니다.

IMS 또는 z/OS용 CICS에서 세그먼트화되지 않은 프로그램을 사용하는 경우의 이점은 프로그램 상태가 저장 및 복원되지 않으므로 각 사용자에 대한 응답 시간이 세그먼트화된 프로그램보다 적게 걸린다는 점입니다.

사용자가 먼저 호출하는 경우 EGL 세그먼트화된 프로그램은 다음 조치를 수행합니다.
  1. 호출이 사용자의 첫 번째 호출인지 여부에 대한 판별을 포함하여 초기화 태스크를 수행합니다.
  2. 프로그램 로직의 시작 부분에 제어를 부여합니다.
  3. 다음과 같은 방법으로 각 EGL converse 문을 구현합니다.
    1. 사용자 프로그램 대화의 현재 상태를 반영하는 사용자 특정 값 세트인 프로그램 상태를 저장하기 위해 작업 데이터베이스를 사용합니다. 모든 레코드 및 양식에 대한 데이터가 포함됩니다. 또한 적절한 행에서 프로그램을 실행하는 데 필요한 모든 정보가 포함됩니다.
    2. 데이터기본 과 회복 가능 자원을 커미트합니다.
    3. 모든 잠금을 릴리스합니다.
    4. 데이터베이스 열기 명령문에 hold 옵션이 있는 경우에도 데이터베이스 위치가 유지되지 않습니다.
    5. 양식을 대화(converse)합니다.
    6. 종료합니다.
IMS 또는 z/OS용 CICS(계속)
사용자가 조치(예: 비즈니스 데이터 갱신)를 수행할 때, 런타임 시스템이 프로그램을 메모리로 복원합니다. 프로그램이 처음부터 다시 시작됩니다. 세그먼트화된 프로그램이 다음 조치를 자동으로 수행합니다.
  1. 호출이 이 사용자의 계속된 처리인지 여부에 대한 판별을 포함하여 초기화 태스크를 수행합니다.
  2. 모든 양식과 레코드에 대한 데이터와 프로그램에서 실행되는 converse 문에 대한 정보를 포함하여 프로그램 상태를 복원합니다.
  3. 사용자 입력을 읽고 편집을 수행합니다.
  4. 다음 converse 문을 구현할 때 주기를 계속합니다.
    1. 프로그램 상태를 저장합니다.
    2. 데이터베이스 및 복구 가능 자원을 커미트합니다.
    3. 모든 잠금을 릴리스합니다.
    4. 데이터베이스 열기 명령문에 hold 옵션이 있는 경우에도 데이터베이스 위치가 유지되지 않습니다.
    5. 양식 또는 VGUI 레코드를 대화(converse)합니다.
    6. 종료합니다.