본문 바로가기

Computer Science/Computer Systems

[Lecture 4] Implementing Job Control Shells

#Job Control

Job control, 작업 제어란, 유닉스 및 유닉스 계열 운영 체제에서 셸(shell)에 의한 작업 제어, 특히 인터랙티브(interactive)에 의한 작업 제어를 가리킨다. 기본 작업 제어 기능은 작업/프로세스 그룹의 모든 프로세스를 일시 중단, 재개 또는 종료하는 것이다. 작업 제어의 고급 기능으로는 작업에 signal을 전송하여 수행할 수 있다.

리눅스에서 모든 프로세스들은 시그널이 전달되면 종료되게 돼있다. 

#Job Control Shells

작업 제어 Shell은 사용자가 command-line에서 프로그램을 시작하고 관리할 수 있도록 하는 제어 프로그램이다.

  • 작업 제어의 코어는 "read-evel" loop을 포함한다
  • Shell은 내장 명령 (built-in commands)을 지원하지만 기본적으로 사용자가 새 프로세스에서 임의 프로그램을 실행할 수 있도록 한다.
  • Shell은 파이프에 프로세스를 배치하는 것을 지원한다(일반적으로 | 을 통해).
  • Shell은 사용자가 원하는 경우 작업을 종료하고 중지할 수 있도록 한다. 
  • Shell은 사용자의 foreground 대 background 작업 개념을 지원하고 OS에 사용자의 의도를 알린다.
  • Shell은 OS와 상호 작용하여 사용자를 대신하여 시작한 작업의 운명을 파악하고 사용자에게 파악한 내용을 알려준다.

#Foreground vs Background vs Stopped Jobs

포그라운드: 명령 프롬프트 또는 터미널에 사용자가 명령어를 입력하면, 출력된 결과를 보고 다시 명령어를  입력하는 대화식 작업. 입력한 명령어 실행의 결과가 나올 때까지 기다리는 방식이다.

 

 

백그라운드: 하나의 프로세스가 실행되는 동안 다른 프로세스를 동시에 실행 시킬수있다. 그렇기 때문에 하나의 쉘에서 여러개의 프로세스와 작업을 실행할 수 있다. 또한 여러개의 프로세스를 실행시키면서 포그라운드 작업까지 진행할 수 있다. 다시 말해, 포그라운드 프로세스가 진행되는 동안, 다른 프로세스들을 실행하여 한 터미널, 또는 쉘에서 여러개의 프로세스를 동시에 실행 가능하다. 

  • User Expectations:
    • 셸은 새 프롬프트를 출력하기 전에 포그라운드 작업을 기다린다.
    • 포그라운드 작업이 사용자 입력을 받음
    • 포그라운드 작업은 터미널을 완전히 제어할 수 있다. (예: vim)
    • 백그라운드 작업이 실행되지만 셸과의 추가 사용자 상호 작용을 차단하지는 않는다.
    • Stopped Jobs는 foreground도 background 프로세스도 아니다
  • OS Support:
    • OS 내부의 fg/bg에 대한 최소한의 개념을 지원한다
    • OS는 각 터미널에 대해 foreground 프로세스 그룹 (process group) ID를 유지한다.
      • 제어 키(Ctrl-Z, Ctrl-C)는 foreground 프로세스 그룹 (process group)으로 전송되는 신호로 변환된다.
      • 프로세스의 그룹이 포그라운드 그룹이 아닌 동안 호출하려고 하면 특정 터미널 작업으로 인해 프로세스가 SIGTTOU/SIGTTIN으로 중지된다.
      • Linux에서 더하기 +를 찾아 fg 프로세스 그룹을 확인할 수 있다.

참고: 셸의 임무는 사용자가 원하는 것을 OS에 전달하고, 각 작업의 상태를 정확하게 반영하는 내부 상태를 유지하면서 발생하는 모든 event를 사용자에게 알리는 것이다

 

#Process Groups

Process group은 신호 전달을 목적으로 프로세스를 그룹화한다. Signal을 보내면 프로세스 그룹의 일부인 모든 프로세스가 전송된다. 이는 시스템 호출 (system call)을 통해 전송되는 신호(kill(2) 또는 killpg(3))와 커널에 의해 전송되는 신호(예: SIGTSTP, SIGINT 등) 모두에 적용된다.

 

Process group의 장점은 단순하고 협력적인 관리 체계에 있다. 

  • 모든 프로세스는 항상 정확히 하나의 프로세스 그룹의 일부이다.
  • 각 그룹에는 프로세스 그룹 ID를 결정하는 데 사용되는 PID를 가진 리더가 있다.
  • 리더 프로세스가 이미 종료된 경우에도 구성원이 아직 살아있는 한 프로세스 그룹이 지속될 수 있다 ***
  • 모든 프로세스는 스스로를 리더라고 선언하는 새로운 프로세스 그룹을 생성할 수 있다.
  • 모든 프로세스는 기존 프로세스 그룹에 가입 또는 할당할 수 있다.
  • 위 모든 상황은 permission restrition에 제약 된다

Process group의 사용 목적

  • API는 모든 프로세스에 열려 있지만 일반적으로 제어 프로그램(셸)에서 셸이 관리하는 작업에 해당하는 그룹으로 프로세스를 정렬하여 사용자가 전체 그룹을 kill하고 Ctrl-Z/Ctrl-C를 전체 그룹으로 보낼 수 있도록 한다.
  • 기본 동작: fork()된 자녀 프로세스가 부모의 프로세스 그룹을 상속하여 그룹에 전달된 모든 signal에 자동으로 상속되도록 한다.

#Job Control Process Group Arrangement Example

Job Control Process Group Arrangement