맨위로가기

프로세스

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

프로세스는 컴퓨터에서 실행되는 프로그램의 인스턴스로, 프로그램 코드, 메모리, 운영 체제 자원 등을 포함한다. 운영 체제는 프로세스를 관리하여 시스템 자원을 효율적으로 할당하고, 여러 프로세스가 동시에 실행되는 것처럼 보이게 한다. 프로세스는 생성, 실행, 준비, 대기, 종료 등의 상태를 가지며, 멀티태스킹 환경에서 각 프로세스는 독립적인 실행 흐름을 유지한다. 유닉스 계열 시스템에서는 처리를 완료했지만 프로세스 테이블 항목이 남아있는 좀비 프로세스가 발생할 수 있으며, 윈도우 운영 체제에서는 작업 관리자나 명령 프롬프트를 통해 프로세스를 관리할 수 있다.

더 읽어볼만한 페이지

  • 프로세스 - 문맥 교환
    문맥 교환은 운영 체제에서 CPU가 여러 프로세스나 스레드를 번갈아 실행하기 위해 현재 작업 상태를 저장하고 다른 작업 상태를 복원하는 과정으로, 멀티태스킹 환경에서 필수적인 기술이며 프로세스 제어 블록을 통해 관리된다.
  • 프로세스 - 데몬 (컴퓨팅)
    데몬은 운영 체제에서 사용자와 상호 작용 없이 백그라운드에서 실행되며 시스템의 다양한 작업을 처리하는 프로세스이다.
  • 병행 컴퓨팅 - 슈퍼컴퓨터
    슈퍼컴퓨터는 일반 컴퓨터보다 훨씬 높은 성능을 가진 컴퓨터로, 복잡한 계산과 시뮬레이션을 수행하며, 프로세서, 메모리, 스토리지, 네트워크 등으로 구성되어 병렬 처리를 통해 높은 성능을 구현하고, 군사, 기상 예측, 과학 기술 분야, 인공지능 등 다양한 분야에서 활용되고 있다.
  • 병행 컴퓨팅 - 코루틴
    코루틴은 실행을 멈췄다가 다시 시작할 수 있는 서브루틴의 특별한 형태로, 로컬 데이터를 보존하며 다양한 방식으로 구현되고 여러 프로그래밍 상황에서 유용하게 쓰인다.
  • 소프트웨어에 관한 - 크래프톤
    크래프톤은 배틀그라운드 시리즈의 성공을 기반으로 성장한 대한민국의 비디오 게임 개발 및 퍼블리싱 기업이자 지주회사로, 여러 자회사를 통해 다양한 게임을 개발 및 서비스하며 글로벌 시장에서 영향력을 확대하고 있다.
  • 소프트웨어에 관한 - 넷마블
    넷마블은 2000년 방준혁 의장이 설립하여 게임 서비스 사업으로 성장, CJ그룹 편입 및 유가증권시장 상장을 거쳐 '리니지2 레볼루션' 성공과 해외 시장 진출 확대를 이루었으나, 최근 메타버스 사업 실패 및 구조조정 등의 어려움 속에서 사업 다각화를 시도하며 향후 행보가 주목되는 대한민국의 게임 기업이다.
프로세스
지도
기본 정보
종류컴퓨터 프로그램의 실행
상태실행 중, 대기 중, 중단됨 등
구성 요소프로그램 코드
데이터
레지스터
스택
자원CPU
메모리
입출력 장치
파일
특징
동적시간이 지남에 따라 자원 사용량과 상태가 변경됨
독립적다른 프로세스와 독립적으로 실행됨 (운영체제 지원)
병행여러 프로세스가 동시에 실행될 수 있음 (병렬 처리)
운영체제
관리운영체제가 프로세스 생성, 실행, 종료 등을 관리함
통신프로세스 간 통신 (IPC) 지원
공유 메모리, 메시지 전달 등
스케줄링프로세스 실행 순서 및 시간 배정 (스케줄링 알고리즘)
추가 정보
관련 용어스레드
멀티태스킹
프로세스 관리
참고 문헌
저자아브라함 실버샤츠
그레그 칵네
피터 베어 갈빈
제목운영체제 개념 (자바 포함)
출판사존 와일리 앤 선즈
저자우레시 바할리아
제목유닉스 내부: 새로운 프런티어
출판사프렌티스 홀

2. 프로그램과 프로세스

프로그램은 보통 하드 디스크 등에 저장되어 있는 실행코드를 의미하고, 프로세스는 프로그램을 실행하여 프로그램 자체와 프로그램의 상태가 메모리에서 실행되는 작업 단위를 말한다.[6] 예를 들어, 하나의 프로그램을 여러 번 실행하면 여러 개의 프로세스가 메모리에서 실행된다.[6]

컴퓨터 프로그램은 명령어의 수동적인 집합체이며, 프로세스는 그 명령어들의 실제 실행이다. 같은 프로그램에 해당하는 여러 프로세스가 존재할 수 있는데, 예를 들어 같은 프로그램의 인스턴스를 여러 개 시작하는 것은 여러 프로세스의 실행을 의미하는 경우가 많다.

3. 프로세스의 상태

다양한 프로세스 상태


커널은 준비 큐, 대기 큐, 실행 큐 등의 자료 구조를 이용하여 프로세스의 상태를 관리한다. 프로세스는 다음과 같은 상태를 가질 수 있다.[1]

  • 생성(create): 프로세스가 생성되는 중이다.
  • 실행(running): 프로세스가 CPU를 차지하여 명령어들이 실행되고 있다.
  • 준비(ready): 프로세스가 CPU를 사용하고 있지는 않지만 언제든지 사용할 수 있는 상태로, CPU가 할당되기를 기다린다. 일반적으로 준비 상태의 프로세스 중 우선순위가 높은 프로세스가 CPU를 할당받는다.
  • 대기(waiting): 보류(block)라고도 부르며, 프로세스가 입출력 완료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태이다.
  • 종료(terminated): 프로세스의 실행이 종료되었다.


멀티태스킹을 지원하는 운영 체제에서는 프로세스가 특정 상태를 가져야 한다. 유닉스 계열 운영 체제에서 좀비 프로세스는 처리를 완료했지만 프로세스 제어 블록에 해당하는 프로세스 테이블이 남아 있어 종료 상태가 읽히기를 기다리는 프로세스이다.[4][9][10]

가상 메모리를 지원하는 시스템에서는 스왑아웃(일시 정지)된 준비 상태와 스왑아웃(일시 정지)된 블록 상태가 추가로 존재할 수 있다. 이 두 상태의 프로세스는 보조 기억 장치(하드 디스크 등)에 저장된다.

3. 1. 프로세스의 상태 전이

프로세스는 실행 중에 여러 상태를 거치며, 이를 상태 전이라고 한다. 주요 상태 전이는 다음과 같다:

  • 디스패치(dispatch): 준비 리스트의 맨 앞에 있던 프로세스가 CPU를 점유하여 실행 상태로 바뀌는 것이다.
  • `dispatch (프로세스 이름) : ready → running`
  • 보류(block): 실행 상태의 프로세스가 입출력 동작 등의 이유로 CPU를 스스로 반납하고 보류 상태로 가는 것이다.
  • `block (프로세스 이름) : running → blocked`
  • 깨움(wakeup): 입출력 작업 종료 등 기다리던 사건이 발생하여 보류 상태에서 준비 상태로 바뀌는 과정이다.
  • `wakeup (프로세스 이름) : blocked → ready`
  • 시간제한(timeout): 프로세스가 프로세서를 독점하지 못하도록 일정 시간 동안만 프로세서를 점유하게 하는 것이다.
  • `timeout(프로세스 이름) : running -> ready`


프로세스가 처음 생성되면 생성(created) 상태 또는 신규(new) 상태가 된다. 이 상태에서 프로세스는 실행 가능하기를 기다리며, 이 전이는 스케줄러에 의해 처리된다. 실시간 운영 체제에서는 이 전이가 지연될 수 있다.

실행 가능(ready) 상태의 프로세스는 메인 메모리에 로드되어 CPU에 의한 실행을 기다린다.

실행 중(running) 상태의 프로세스는 현재 CPU에서 실행되고 있으며, 할당된 시간을 다 사용하면 실행 가능 상태로 돌아가거나, 프로그램 실행이 종료되면 종료 상태, 자원이 필요하면 블록 상태가 된다.

대기(sleeping) 상태의 프로세스는 자원을 확보할 수 없어 프로그램 실행을 계속할 수 없게 되어 차단(blocked) 상태가 된다. 자원이 사용 가능해지면 다시 실행 가능 상태로 전환된다.

프로세스는 실행 완료 또는 명시적 종료로 종료(terminated) 상태가 된다. 메모리에서 삭제되지 않은 종료 상태를 좀비(zombie) 상태라고도 한다.

유닉스 계열 운영 체제에서, '''좀비 프로세스'''는 처리를 완료했지만 프로세스 제어 블록에 해당되는 프로세스 테이블이 남아 있어 종료 상태가 읽히기를 기다리는 프로세스이다.[4][9][10] 부모 프로세스는 자식 프로세스종료 상태를 읽어 좀비 프로세스를 제거해야 한다.

4. 프로세스의 표현

htop에 표시된 프로세스 목록


KDE 시스템 가드에 표시된 프로세스 테이블
KDE 시스템 가드에 표시된 프로세스 테이블


일반적으로 컴퓨터 시스템 프로세스는 다음과 같은 자원을 구성하거나 소유한다.

  • 프로그램과 연관된 실행 가능한 기계어의 ''이미지''.
  • 메모리(일반적으로 가상 메모리의 특정 영역)에는 실행 코드, 프로세스별 데이터(입력 및 출력), 활성 서브루틴 및/또는 기타 이벤트를 추적하기 위한 호출 스택, 그리고 런타임 중에 생성된 중간 계산 데이터를 보유하기 위한 힙이 포함된다.
  • 프로세스에 할당된 자원에 대한 운영 체제 설명자. 예를 들어 파일 설명자(유닉스) 또는 핸들(윈도우) 및 데이터 소스와 싱크가 있다.
  • 보안 속성, 예를 들어 프로세스 소유자 및 프로세스의 권한 집합(허용되는 작업)이 있다.
  • 프로세서 상태(컨텍스트), 예를 들어 레지스터의 내용과 물리적 메모리 주소 지정이 있다. 프로세스가 실행 중일 때는 ''상태''가 일반적으로 컴퓨터 레지스터에 저장되고, 그렇지 않으면 메모리에 저장된다.[1]


운영 체제는 활성 프로세스에 대한 이러한 정보의 대부분을 프로세스 제어 블록이라는 데이터 구조에 보관한다. 자원의 어떤 부분집합(일반적으로 최소한 프로세서 상태)이 스레드 또는 ''자식'' 프로세스를 지원하는 운영 체제에서 각 프로세스의 스레드와 연관될 수 있다.

5. 멀티태스킹과 프로세스 관리

멀티태스킹 운영 체제는 여러 프로세스가 동시에 실행되는 것처럼 보이게 하는 기술을 사용한다. 이는 프로세스 간 전환을 통해 가능한데, 실제 단일 CPU에서는 한 번에 하나의 프로세스만 실행될 수 있다. 하지만 CPU에 여러 코어가 있는 경우에는 멀티스레딩과 같은 기술을 통해 여러 프로세스를 동시에 실행할 수 있다.[7]

일반적으로 주 프로그램은 하나의 프로세스와 연결되며, 자식 프로세스는 비동기적으로 작동하는 서브루틴처럼 병렬 프로세스로 분리된다. 각 프로세스는 자원을 '소유'하며, 메모리 내 프로그램의 '이미지'도 이러한 자원 중 하나이다. 멀티프로세싱 시스템에서는 여러 프로세스가 동일한 재진입 가능 프로그램의 메모리 복사본을 공유할 수 있지만, 각 프로세스는 자체 '이미지'를 소유하는 것으로 간주된다.

임베디드 시스템 운영 체제에서는 프로세스를 '태스크'라고 부르기도 한다. "프로세스"(또는 태스크)는 "시간을 차지하는 것"을 의미하며, "메모리"는 "공간을 차지하는 것"과 대비된다.[8]

프로세스가 대기해야 하는 상황이 발생하면 차단(block)된다. 가상 메모리 시스템에서는 프로세스가 차단 상태에 있을 때 디스크로 스왑될 수 있지만, 이는 사용자에게 투명하게 처리된다. 활성 프로세스의 일부도 최근에 사용되지 않은 경우 디스크로 스왑될 수 있다.

멀티태스킹은 타임셰어링이라는 전형적인 형태로 나타난다. 타임셰어링은 빠른 응답 시간을 제공하여 여러 프로세스가 동시에 실행되는 것처럼 보이게 한다.

보안 및 안정성을 위해 현대 운영 체제는 프로세스 간 직접 통신을 제한하고, 엄격하게 제어되는 프로세스 간 통신 기능을 제공한다.

프로그램 버그나 하드웨어 문제로 인해 제어 불능 상태가 된 폭주 프로세스가 발생할 수 있다. kill 명령어[6] 등을 사용하여 강제로 정지시킬 수 있으며, 폭주 프로세스는 CPU 사용률을 100%까지 높여 컴퓨터에 장애를 일으킬 수 있다.

5. 1. 프로세스 상태 (상세)



커널은 준비 큐, 대기 큐, 실행 큐 등의 자료 구조를 이용하여 프로세스의 상태를 관리한다.

  • 생성(create): 프로세스가 생성되는 중이다.
  • 실행(running): 프로세스가 CPU를 차지하여 명령어들이 실행되고 있다.
  • 준비(ready): 프로세스가 CPU를 사용하고 있지는 않지만 언제든지 사용할 수 있는 상태로, CPU가 할당되기를 기다리고 있다. 일반적으로 준비 상태의 프로세스 중 우선순위가 높은 프로세스가 CPU를 할당받는다.
  • 대기(waiting): 보류(block)라고 부르기도 한다. 프로세스가 입출력 완료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태를 말한다.
  • 종료(terminated): 프로세스의 실행이 종료되었다.


하나의 프로그램이 실행되면 그 프로그램에 대응되는 프로세스가 생성되어 준비 리스트의 끝에 들어간다. 준비 리스트 상의 다른 프로세스들이 CPU를 할당받아 준비 리스트를 떠나면, 그 프로세스는 점차 준비 리스트의 앞으로 나가게 되고 언젠가 CPU를 사용할 수 있게 된다.

  • 디스패치(dispatch): 준비 리스트의 맨 앞에 있던 프로세스가 CPU를 점유하게 되는 것, 즉 준비 상태에서 실행 상태로 바뀌는 것을 디스패치라고 하며 다음과 같이 표시한다.




dispatch (processname) : ready → running

  • 보류(block): 실행 상태의 프로세스가 허가된 시간을 다 쓰기 전에 입출력 동작을 필요로 하는 경우 프로세스는 CPU를 스스로 반납하고 보류 상태로 넘어 간다. 이것을 보류라고 하며 다음과 같이 표시한다.




block (processname) : running → blocked

  • 깨움(wakeup): 입출력 작업 종료 등 기다리던 사건이 일어났을 때 보류 상태에서 준비 상태로 넘어가는 과정을 깨움이라고 하며 다음과 같이 표시한다.




wakeup (processname) : blocked → ready

  • 시간제한(timeout): 운영체제는 프로세스가 프로세서를 계속 독점해서 사용하지 못하게 하기 위해 clock interrupt를 두어서 프로세스가 일정 시간 동안만 (시분할 시스템의 time slice) 프로세서를 점유할 수 있게 한다.




timeout(processname) : running -> ready

멀티태스킹을 허용하는 운영 체제 커널에서는 프로세스가 특정 상태를 가진다. 이러한 상태의 이름은 표준화되어 있지 않지만, 유사한 기능을 한다.[1]

  • 먼저, 프로세스는 보조 기억 장치(하드 디스크 드라이브, CD-ROM 등)에서 주기억장치로 로드되어 "생성"된다. 그런 다음 프로세스 스케줄러가 "대기" 상태를 할당한다.
  • 프로세스가 "대기" 중인 동안, 프로세스는 컨텍스트 스위칭을 수행하는 스케줄러를 기다린다. 컨텍스트 스위칭은 프로세스를 프로세서에 로드하고 이전에 "실행 중"이던 프로세스가 "대기" 상태로 저장되는 동안 상태를 "실행 중"으로 변경한다.
  • "실행 중" 상태의 프로세스가 자원을 기다려야 하는 경우(예: 사용자 입력 또는 파일 열기를 기다리는 경우), "차단됨" 상태가 할당된다. 프로세스가 더 이상 기다릴 필요가 없을 때(차단된 상태에서), 프로세스 상태는 "대기" 상태로 다시 변경된다.
  • 프로세스가 실행을 완료하거나 운영 체제에 의해 종료되면 더 이상 필요하지 않다. 프로세스는 즉시 제거되거나 "종료됨" 상태로 이동한다. 제거될 때는 주기억장치에서 제거될 때까지 대기한다.[1][3]


가상 메모리를 지원하는 시스템에서는, 위에 언급된 상태 외에도 두 가지 상태가 존재한다. 두 상태 모두 프로세스는 보조 기억 장치(하드 디스크 등)에 저장된다.

  • 스왑아웃(또는 일시 정지)된 준비 상태: 가상 메모리를 지원하는 시스템에서는 프로세스가 스왑아웃될 수 있으며, 중기 스케줄러가 주기억장치에서 가상 메모리로 이동시킨다. 그 후, 중기 스케줄러에 의해 스왑인되어 일반적인 준비 상태가 된다.
  • 스왑아웃(또는 일시 정지)된 블록 상태: 블록된 프로세스도 스왑아웃될 수 있다. 이 상태에서는 프로세스가 스왑아웃된 상태에서 블록되어 있으므로, 먼저 스왑인되면 일반적인 블록 상태가 되고, 먼저 자원이 사용 가능해지면 스왑아웃된 준비 상태가 된다.

6. 프로세스 간 통신 (IPC)

Inter-process communication영어

프로세스 간 통신(IPC)은 프로세스들이 서로 통신하기 위해 주소 공간의 일부를 공유하거나 다른 형태의 통신 방식을 사용하는 것을 말한다. 예를 들어, 셸 파이프라인에서는 첫 번째 프로세스의 출력이 두 번째 프로세스로 전달되어야 하며, 이 과정이 반복된다. 또 다른 예로, 동시에 실행될 수 있는 여러 협력적이지만 부분적으로 독립적인 프로세스로 분해된 작업이 있다. 이때, 각 프로세스는 동시성 또는 진정한 병렬 처리를 통해 실행될 수 있다. (병렬 처리는 여러 CPU 코어가 실행 준비가 된 프로세스에 사용 가능할 때 실현 가능하다.)[6]

두 개 이상의 프로세스가 서로 다른 운영 체제(OS)를 실행할 수 있는 서로 다른 컴퓨터에서 실행되는 것도 가능하다. 이러한 경우, 통신 및 동기화를 위한 메커니즘, 즉 분산 컴퓨팅을 위한 통신 프로토콜(예: 메시지 전달 인터페이스(MPI))이 필요하다.[6]

현대의 OS는 보안과 안정성을 위해 개별 프로세스 간의 직접적인 통신을 제한하고, 엄격하게 통제·제어된 프로세스 간 통신 기능을 제공한다.[6]

7. 프로세스의 분류

프로세스는 그 역할에 따라 운영 체제(OS)의 기능을 구현하는 '''시스템 프로세스'''와 사용자 권한으로 실행되는 '''사용자 프로세스'''로 분류할 수 있다.

프로세스는 그 프로그램 부분의 성질에 따라 다음과 같이 분류된다.


  • 재배치 가능(리로케이터블(Relocatable)): 프로세스를 보조 기억 장치에서 주기억 장치로 읽어들일 때, 주기억 장치의 어느 위치에 읽어들여도 실행이 가능한 프로그램. 주소 지정이 프로세스의 시작 주소로부터의 상대 위치로 표현되어 있으면 된다. 리로케이터블 코드 중에서 특히 위치 독립 코드라고 불리는 것은, 링커나 로더의 기능에 의존하지 않고도 자유로운 위치에서 실행이 가능한 코드이며, 단순히 리로케이터블인 것과는 구분된다.
  • 재사용 가능(리유저블): 주기억 장치에 읽혀 실행을 마친 프로그램이, 다시 주기억 장치로 읽어들이는 과정 없이 재실행될 수 있는 것을 말한다. 여기에는, 실행을 마친 프로그램이 프로그램 자신을 덮어쓰지 않고, 실행 후 프로그램 내부 변수에 영향이 남아 있지 않아야 하는 등의 조건이 필요하다.
  • 재귀 가능(리커시브(Recursive)): 자신을 호출할 수 있는 것.
  • 재입 가능(리엔트런트(Reentrant)): 프로그램의 실행 중에 다른 프로세스가 같은 프로그램을 동시에 실행할 수 있는 것. 프로그램(코드) 부분과 데이터 부분이 다른 기억 영역으로 분리되어 있어 코드 부분만 공유할 수 있으면 된다. 동시 실행을 원하는 프로세스는 데이터 부분만 독자적으로 새로 준비한다. 리엔트런트 코드는 당연히 리커시브이자 리유저블이다.

8. 윈도의 프로세스

윈도우 운영 체제에서 프로세스를 제어하는 방법은 크게 두 가지이다. 작업 관리자를 이용하는 GUI 환경과 명령 프롬프트를 이용하는 방법이다. 작업 관리자에서는 프로세스 종료 및 우선 순위 설정을 할 수 있고, 명령 프롬프트에서는 `TASKLIST`, `TASKKILL` 명령어를 사용한다.[1]

8. 1. GUI 환경에서의 제어

작업 관리자를 통해 윈도우 프로세스를 제어할 수 있다. 작업 관리자는 ++ 단축키 조합으로 실행할 수 있다.[1] 작업 관리자의 프로세스 탭에서 프로세스를 마우스 오른쪽 단추로 눌러 "프로세스 끝내기", "우선 순위 설정" 등을 할 수 있다.[1] 윈도우 비스타에서는 "모든 사용자의 프로세스 표시"를 통해 보이지 않는 프로세스를 표시하고 "실시간" 우선 순위를 설정할 수 있다.[1]

8. 1. 1. 프로세스 끝내기

작업 관리자에서 ++ 단축키 조합을 사용하여 들어간 뒤, 프로세스 탭에서 원하는 프로세스를 마우스 오른쪽 단추로 누르면 나타나는 메뉴에서 "프로세스 끝내기"를 선택할 수 있다.[1] 이 기능은 해당 프로세스와 그와 연결된 모든 프로세스 트리를 종료한다.[1]

8. 1. 2. 우선 순위 설정

윈도우 작업 관리자에서 프로세스 탭을 열고, 관리할 프로세스에 마우스 오른쪽 단추를 누르면 "우선 순위 설정"을 할 수 있다.[1] 우선 순위는 "낮음"부터 "실시간"까지 조절할 수 있다.[1] 윈도우 비스타에서는 "모든 사용자의 프로세스 표시" 단추를 누르면 "실시간"을 선택할 수 있다.[1]

8. 2. 명령 프롬프트

명령 프롬프트에서 프로세스를 제어하기 위해 다음과 같은 명령어를 제공한다.[1]

  • '''TASKLIST''': 프로세스 목록을 표시한다.
  • '''TASKKILL''': 프로세스를 종료하거나 강제 종료한다.


자세한 내용은 도움말 매개변수 "/?"를 사용하여 명령어 도움말 정보를 확인할 수 있다.[1] "TASKKILL /F /IM explorer.exe"라고 입력하면 윈도우 탐색기 프로세스가 강제 종료된다.[1]

9. 역사

1960년대 초, 컴퓨터 제어 소프트웨어는 IBSYS와 같은 모니터 제어 소프트웨어에서 실행 제어 소프트웨어로 발전했다. 컴퓨터는 더 빨라졌지만, 컴퓨터 시간은 여전히 비쌌고 충분히 활용되지 못했다. 이러한 환경은 멀티프로그래밍을 가능하게 했고 필요하게 만들었다. 멀티프로그래밍은 여러 프로그램이 동시에 실행됨을 의미한다. 처음에는 단일 프로세서 컴퓨터 아키텍처의 결과로 여러 프로그램이 단일 프로세서에서 실행되었고, 이들은 부족하고 제한된 하드웨어 리소스를 공유했다. 결과적으로 동시성은 '직렬'(serial)적인 성격을 띠었다. 나중에 여러 프로세서를 갖춘 시스템에서는 여러 프로그램이 '병렬'로 동시에 실행될 수 있다.

프로그램은 프로세서에 대한 일련의 명령어로 구성된다. 단일 프로세서는 한 번에 하나의 명령어만 실행할 수 있다. 즉, 여러 프로그램을 동시에 실행하는 것은 불가능하다. 프로그램은 입력 장치와 같이 지연 시간이 큰 자원이 필요하거나 프린터로 출력을 보내는 것과 같은 느린 작업을 시작할 수 있다. 이로 인해 프로세서가 "유휴"(사용되지 않음) 상태가 될 수 있다. 프로세서를 항상 바쁘게 유지하기 위해 이러한 프로그램의 실행이 중지되고 운영 체제는 다른 프로그램을 실행하도록 프로세서를 전환한다. 사용자에게는 프로그램이 동시에 실행되는 것처럼 보인다(따라서 "병렬"이라는 용어가 사용됨).

그 후 곧 "프로그램"의 개념은 "실행 중인 프로그램과 그 컨텍스트"의 개념으로 확장되었다. 재진입 코드의 발명과 함께 프로세스의 개념이 탄생했다. 스레드는 다소 늦게 등장했다. 그러나 시분할, 컴퓨터 네트워크, 여러 CPU 공유 메모리 컴퓨터와 같은 개념이 등장하면서 기존의 "멀티프로그래밍"은 진정한 멀티태스킹, 멀티프로세싱, 그리고 나중에는 멀티스레딩으로 대체되었다.

10. 유닉스/리눅스에서의 프로세스 관리

프로세스는 실행 중 상태에서 프로그램 실행 완료나 명시적인 종료 명령에 따라 종료 상태가 된다. 프로세스가 종료 상태가 되어도 메모리에서 즉시 삭제되지 않고 좀비 상태로 남아있을 수 있다.

대기(sleeping) 상태는 프로세스가 파일, 세마포어, 주변 장치 등의 자원을 확보할 수 없어 CPU에서 제외되어 차단(blocked)되는 상태를 말한다. 이 상태는 데드락을 유발할 수 있다. 운영 체제는 인터럽트를 통해 자원 사용 가능 여부를 파악하고, 차단되지 않은 프로세스를 다시 실행 가능 상태로 만든 후 실행 중 상태로 디스패치하여 프로세스가 사용 가능해진 자원을 사용하게 한다.

10. 1. 좀비 프로세스

유닉스 계열 운영 체제에서, '''좀비 프로세스'''(Zombie Process)는 처리를 완료했지만 프로세스 테이블에 해당 항목이 남아 있어 종료 상태가 읽히기를 기다리는 프로세스이다.[4][9][10] 이 용어는 좀비 프로세스가 "죽었지만" 아직 "저승사자"가 도착하지 않은 상태라는 비유에서 나왔다.

프로세스는 종료될 때 사용하던 모든 메모리와 자원을 해제하여 다른 프로세스가 재사용할 수 있도록 한다. 그러나 프로세스 테이블의 항목은 남아있다. 부모 프로세스에는 자식 프로세스의 종료를 알리기 위해 SIGCHLD 시그널이 전송된다. 부모 프로세스는 SIGCHLD 시그널을 반드시 사용할 필요는 없으며, 사용 여부는 프로그래밍 상황에 따라 달라진다. 부모 프로세스가 자식 프로세스를 좀비 프로세스로 만들지 않으려면, 자식 프로세스의 종료 상태를 읽어 좀비를 삭제해야 한다.

일반적으로 프로그램에서 `waitpid` 시스템 콜을 WNOHANG 옵션과 함께 호출하거나, 시그널 핸들러에서 SIGCHLD를 포착하여 `wait`을 실행하거나, `signal`이나 `sigaction` 시스템 콜을 사용하여 SIGCHLD에 대해 SIG_IGN 시그널 핸들러를 설정하는 방법이 대표적이다. (SIGCHLD에 대해 SIG_IGN을 설정하는 방법은 POSIX.1-1990에서는 허용되지 않았지만, POSIX.1-2001에서 허용되었다). 이렇게 하면 좀비가 사용하는 프로세스 식별자와 프로세스 테이블 항목이 재사용 가능하게 된다. 이러한 처리를 하지 않으면 좀비 프로세스는 계속 남아있게 된다. 예를 들어, 부모 프로세스가 다른 자식 프로세스를 생성할 때 좀비가 된 프로세스와 같은 프로세스 식별자를 할당하고 싶지 않을 때는 좀비 프로세스를 남겨두는 것이 의미가 있을 수 있다.

좀비 프로세스는 고아 프로세스와 다르다. 고아 프로세스는 좀비 상태가 아니며, `init` 프로세스를 양부모로 두고 있으므로 반드시 `wait`이 실행된다.

좀비 프로세스는 UNIX의 `ps` 명령어의 STAT 열에 "Z"로 표시되어 식별된다. 좀비 프로세스는 일반적으로 매우 짧은 시간 동안만 존재하지만, 부모 프로세스 프로그램에 버그가 있으면 계속 남아 있을 수 있다. 메모리 누수와 마찬가지로, 좀비 프로세스가 약간 존재해도 문제는 없지만, 고부하 상태에서 좀비가 증가하면 프로세스를 생성할 수 없는 등의 문제가 발생하게 된다.

좀비 프로세스를 삭제하려면, 먼저 부모 프로세스에 kill 명령어로 SIGCHLD 시그널을 보낸다. 이것으로 부모 프로세스가 좀비를 처리하지 않으면, 다음으로 부모 프로세스를 종료시킨다. 프로세스는 부모 프로세스가 종료되면 init이 새로운 부모로 설정된다. init은 정기적으로 `wait` 시스템 콜을 실행하므로, 모든 좀비 프로세스를 처리한다.

참조

[1] 서적 Operating system concepts with Java John Wiley & Sons 2004
[2] 서적 UNIX Internals: The New Frontiers https://archive.org/[...] Prentice-Hall Inc. 1996
[3] 서적 Operating Systems: internals and design principles Prentice Hall 2005
[4] 서적 Operating system concepts with Java John Wiley & Sons, Inc. 2004
[5] 서적 UNIX Internals - The New Frontiers Prentice-Hall Inc. 1996
[6] 웹사이트 프로세스操作 https://www.stex.phy[...] 2024-12-05
[7] 문서 최근의 멀티코어 프로세서에서의 프로세스 실행
[8] 문서 'Task'와 'Process'의 의미 차이
[9] 서적 Operating Systems: internals and design principles (5th edition) Prentice Hall 2005
[10] 서적 プロフェッショナルUNIX 株式会社アスキー 1986-01-15



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com