CS/OS

CLI 환경의 이해

dragonhyeon 2024. 9. 16. 00:37
728x90
반응형

CLI (Command-Line Interface)

CLI 는 Command-Line Interface 의 줄임말로 사용자와 컴퓨터 시스템 간의 상호작용을 텍스트 명령을 통해 수행하는 방식을 말합니다. 명령어를 입력하면 명령어의 결과를 텍스트로 표시합니다.

셸 (Shell)

셸은 사용자가 입력한 명령어를 해석하고 실행하는 프로그램으로 CLI 의 인터프리터 역할을 합니다. 명령어를 파싱하고, 필요한 작업을 수행하며, 결과를 터미널에 전달합니다.

일반적인 셸 (ex. bash, sh, zsh) 과 Python 셸은 약간의 차이점이 존재합니다. 일반적인 셸은 운영 체제 명령어를 해석하고 실행하는 인터프리터인 반면 Python 셸은 Python 코드를 해석하고 실행하는 인터프리터입니다.
엄밀히 말하면 셸은 해당 인터프리터가 제공하는 대화형 환경을 의미하며, 인터프리터는 대화형 명령어뿐만 아니라 스크립트 파일의 해석 및 실행을 담당하는 프로그램입니다.

터미널 (Terminal)

터미널은 CLI 를 제공하는 프로그램으로, 명령어를 입력하고 출력 결과를 표시하는 창을 제공합니다. 터미널은 명령어를 실행하는 프로그램 (셸 등) 과 상호작용합니다.

CLI 작동 원리

  1. 터미널에 명령어 (혹은 코드) 를 입력합니다.
  2. 셸은 명령어를 해석하고 명령어를 실행합니다.
    • 해당 작업이 셸 내부에서 수행할 수 있는 작업이라면 셸에서 직접 처리합니다.
    • 해당 작업이 파일 I/O, 프로세스 생성, 네트워크 I/O 등의 시스템 자원에 대한 접근이 필요한 작업이라면 커널에 작업 처리 요청을 보냅니다.
      1. 커널에서 프로그램을 실행하며 프로세스의 수행이 완료되면 exit status 를 셸에 리턴합니다.
      2. 셸은 커널에서 받은 exit status 에 따라 추가 작업을 수행하거나, 다음 명령을 대기합니다.
프로세스 실행 중에 생성된 출력 및 오류 데이터는 표준 출력 (stdout) 혹은 표준 에러 (stderr) 에 전달돼 터미널 혹은, 리다이렉션 된 경우 파일이나 다른 프로그램으로 전달됩니다.
부모 프로세스와 자식 프로세스는 새로운 터미널 세션을 열지 않는 한 동일한 터미널을 공유합니다.
커널이 작업 (프로세스) 완료 후에 부모 프로세스에 전달하는 것은 exit status 이며 실행 결과 자체를 전달하지는 않습니다. 여러 명령어를 연결해 실행할 때, 각 명령어의 결과는 다른 명령어의 입력으로 전달될 수 있지만, 이 역시 커널이 직접 처리하는 것이 아니라 프로세스 간 통신을 통해 처리됩니다. 커널은 IPC (Inter-Process Communication) 메커니즘을 제공하며, 프로세스는 이를 활용하여 서로 데이터를 주고받습니다.

커널의 역할

커널이 CLI 에서 처리하는 주요 작업은 프로그램 실행과 I/O 처리이며, 이 모든 작업은 시스템 호출 (System Call) 에 의해 수행됩니다.

  • 프로그램 실행:
    • 커널이 프로그램을 실행한다는 것의 의미는 해당 파일을 (프로그램을) 메모리에 로드하고, 새로운 프로세스를 생성한 후, 프로세스 제어 블록 (Process Control Block, PCB) 을 만들어 해당 프로세스가 CPU 에서 실행될 수 있도록 환경을 마련해 주는 것을 의미합니다.
    • 셔뱅 라인의 해석과 해석을 토대로 해당 인터프리터를 실행하는 것도 커널이 메모리에 파일을 로드하고 프로세스를 생성하는 과정의 일부로 포함됩니다.
  • 외부 I/O 처리:
    • 여기서 실행은 프로그램을 메모리에 올리고 프로세스를 실행하는 프로그램의 실행과는 조금 다르며 하드웨어와 직접 상호작용하여 해당 작업을 수행하고 그 결과를 프로세스에게 반환하는 과정을 말합니다.
    • 파일을 읽으려고 할 때, 커널이 디스크에서 데이터를 가져와 메모리의 특정 위치에 저장하거나 버퍼를 설정한 후 시스템 호출의 결과를 프로세스에게 반환하는 과정을 예로 들 수 있습니다.
728x90
반응형