OS

프로세스와 스레드

Debin 2021. 9. 17.
반응형

2022. 6. 15. 22:17 수정 시작

중요한 프로세스와 스레드를 복습해보겠습니다.

프로세스

프로세스란 실행 프로그램이 실행을 위해 메모리에 올라온 동적인 상태이다.

프로세스는 즉 실행 중인 프로그램, 메모리에 로딩된 형태이다. 프로세스는 컴퓨터 시스템의 작업 단위로 태스크라고도 부른다.

우선 운영체제는 프로그램을 메모리의 적당한 위치로 가져온다.

그와 동시에 주문서에 해당하는 작업 지시서를 만드는데, 이 작업 지시서가 프로세스 제어 블록이다.

일명 프로세스 제어 블록은 PCB라고 한다.

 

PCB에는 대표적으로 세 가지 큰 정보가 있다.

  • 프로세스 구분자
    메모리에는 여러 개의 프로세스가 존재하므로 각 프로세스를 구분하는 구분자다.
  • 메모리 관련 정보
    CPU는 실행하려는 프로세스가 메모리의 어디에 저장되어 있는지를 알아야 한다. 프로세스의 메모리 위치 정보가 담겨 있다. 
    또한 메모리를 보호하기 위한 경계 레지스터와 한계 레지스터도 포함된다.
  • 각종 중간 값
    프로세스가 작업 한 중간 값들을 저장한다.

하나의 프로세스를 실행하려면 프로세스 구분자, 메모리 관련 정보, 프로그램 카운터와 각종 레지스터 같은 중간 값을 관리해야 하며,

이러한 정보를 보관하는 데이터 구조가 프로세스 제어 블록이다.

프로그램이 프로세스가 되려면 메모리에 올라오는 것과 동시에 프로세스 제어 블록, PCB가 생성되어야 한다.

  • 프로세스 = 프로그램 + 프로세스 제어 블록
  • 프로그램 = 프로세스 - 프로세스 제어 블록

컴퓨터에서는 사용자가 실행한 프로세스만 있는 것이 아니다. 부트스트랩이 많은 운영체제 관련 프로세스를 실행한 후,

일반 프로세스가 실행되므로 컴퓨터에는 일반 사용자의 사용자 프로세스와 운영체제의 커널 프로세스가 섞여서 실행된다.

프로세스의 다섯 가지 상태

  • 생성 상태
    프로세스가 메모리에 올라와 실행 준비를 완료한 상태이다. 프로세스를 관리하는 데 필요한 프로세스 제어 블록이 생성된다.
  • 준비 상태
    생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태다. Ready Queue에 들어가 CPU의 선택을 기다린다.
    CPU가 하나인 컴퓨터에서는 한 번에 하나의 프로세스만 실행할 수 있기 때문에
    자기 실행 순서가 될 때까지 준비 상태에서 기다려야 한다. 
  • 실행 상태
    준비 상태에 있는 프로세스 중 하나가 CPU를 얻어 실제 작업을 수행하는 상태로 execute status라고도 표현한다. 실행 상태에 들어간 프로세스는 일정 시간 동안 CPU를 사용할 권리를 갖는다.
    만약 주어진 시간을 다 사용하고도 작업이 끝나지 않았다면 프로세스는 준비 상태로 돌아와 다음 차례를 기다린다.
    프로세스는 자신의 작업이 끝날 때까지 준비 상태와 실행 상태를 왔다 갔다 한다. 프로세스 사이의 문맥 교환이 일어난다.
  • 완료 상태
    실행 상태의 프로세스가 주어진 시간 동안 작업을 마치면 완료 상태로 진입한다. PCB가 사라진 상태를 의미한다.
    사용한 모든 데이터가 정리된다.
  • 대기 상태
    대기 상태는 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태로 라고도 한다.
    입출력이 완료되면 준비 상태로 간다. wait status라고도 한다. 입출력이 완료되면 인터럽트가 발생하고, 대기 상태에 있는 여러 프로세스 중 해당 인터럽트로 깨어날 프로세스를 찾는데 이것이 wakeup(PID)이다.
    PID로 해당 프로세스의 PCB가 준비 상태로 이동한다. 어떤 프로세스가 대기 상태에서 준비 상태로 이동하는 것은 인터럽트 때문이다. 인터럽트는 입출력으로 발생하지만 어떤 이벤트에 의해 발생하기도 한다.

준비 상태에 있는 여러 프로세스 중 다음에 실행할 프로세스를 선정하는 일은 CPU 스케줄러가 담당한다.

CPU 스케줄러는 준비 상태의 맨 앞에서 기다리고 있는 PCB를 CPU에 전달해 작업이 이루어지게 한다.

준비 상태의 프로세스 중 하나를 골라 실행 상태로 바꾸는 CPU 스케줄러의 작업을 디스패치라고 한다.

 

(참고)

디스패처는 프로세스 스케줄러이다. CPU 스케줄러 내부에 포함되어 있으며 준비 큐 맨 앞에 있던 프로세스가 프로세서를 선택한다.

 

CPU 스케줄러에 의해 선택된 프로세스는 실행 상태에서 일정 시간 동안 작업을 하는데,

프로세스에 배당된 작업 시간을 타임 슬라이스 또는 타임 퀀텀이라고 부른다.

프로세스는 자신에게 주어진 하나의 타임 슬라이스 동안 작업을 끝내지 못하면 다시 준비 상태로 돌아가는데 이를 타임아웃이라고 한다.

 

5가지 상태 말고 특별한 몇 가지 상태가 있다.

  • 휴식 상태 : 휴식 상태는 프로세스가 작업을 일시적으로 쉬고 있는 상태다. 사용하던 데이터가 메모리에 그대로 있고 프로세스 제어블록도 유지되므로 프로세스는 멈춘 지점에서부터 재시작할 수 있다.
  • 보류 상태 : 보류 상태는 프로세스가 메모리에서 잠시 쫓겨난 상태로 휴식 상태와 차이가 있다. 보류 상태는 '일시 정지 상태'라고도 불리며, 보류 상태와 비교하여 일반적인 프로세스 상태를 활성 상태라고 한다. 프로세스는 다음과 같은 상태에 보류 상태가 된다.
  1. 메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 내보낼 때
  2. 프로그램에 오류가 있어서 실행을 미루어야 할 때
  3. 바이러스와 같이 악의적인 공격을 하는 프로세스라고 판단될 때
  4. 매우 긴 주기로 반복되는 프로세스라 메모리 밖으로 쫓아내도 큰 문제가 없을 때
  5. 입출력을 기다리는 프로세스의 입출력이 계속 지연될 때

보류 상태에 들어간 프로세스는 메모리 밖으로 쫓겨난 스왑 영역에 보관된다.

스왑 영역은 메모리에서 쫓겨난 데이터가 임시로 보관되는 곳이다. 보류 상태와 휴식 상태를 구분하자면,

보류 상태는 스왑 영역에 있는 상태이고 휴식 상태는 프로세스가 메모리에 있으나 멈춘 상태이다.

보류 상태는 대기 상태에서 옮겨진 보류 대기 상태와 준비 상태에서 옮겨진 보류 준비 상태로 구분된다.

각 상태에서 재시작하면 원래의 활성 상태로 돌아간다.

또한 보류 대기 상태에서 입출력이 완료되면 활성 상태가 아닌 보류 준비 상태로 옮겨 간다.

프로세스 제어 블록 PCB

이제 프로세스 제어 블록 PCB를 더 자세히 알아보겠다. TASK CONTROL BLOCK라고도 하며 TCB라고도 부른다.

모든 프로세스는 고유의 프로세스 제어 블록을 가지며,

프로세스 제어 블록은 프로세스 생성 시 만들어져서 프로세스가 실행을 완료하면 폐기된다.

먼저 프로세스 제어 블록 구성에 대해 알아보겠다.

  • 포인터
    PCB 첫 번째 블록에는 포인터가 저장된다.
    준비 상태나 대기 상태는 큐로 운영되는데, PCB를 연결하여 준비 상태나 대기 상태의 큐를 구현할 때 포인터를 사용한다.
  • 프로세스 상태
    프로세스가 현재 어떤 상태에 있는지를 나타내며, 프로세스 제어 블록의 두 번째 블록에 저장된다.
  • 프로세스 구분자
    운영체제 내에 있는 여러 프로세스를 구별하기 위한 구분자를 저장한다.
  • 프로세스 우선순위
    앞서 설명한 바에 따르면 대기 큐에 들어가서 모든 프로세스가 한 줄로 기다리고 순서대로 실행한다고 얘기를 했다.
    그러나 실제로는 프로세스의 중요도가 각각 다르다.
    사용자 프로세스보다 중요도가 큰 커널 프로세스는 우선순위가 높고, 사용자 프로세스끼리도 우선순위가 다르다.
  • 각종 레지스터 정보
    PCB에는 프로세스가 실행되는 중에 사용하던 다양한 레지스터 값이 저장된다.
    이전에 실행할 때 사용한 레지스터의 값을 보관해야 다음에 실행할 수 있기 때문에 자신이 사용하던 레지스터의 중간값을 보관한다.
  • 메모리 관리 정보
    PCB에는 프로세스가 메모리의 어디에 있는지 나타내는 메모리 위치 정보, 메모리 보호를 위한 레지스터 값 등이 저장된다.
  • 할당된 자원 정보
    프로세스를 실행하기 위해 사용되는 입출력 자원이나 오픈 파일 등에 대한 정보를 말한다.
  • 계정 정보
    계정 번호, CPU 할당 시간, CPU 사용 시간 등으로, 이러한 정보는 PCB에 저장된다.
  • 부모 프로세스 구분자와 자식 프로세스 구분자
    PCB에는 PPID와 CPID 가 저장된다. 전자는 부모 프로세스를 가리키는 정보고 후자는 자식 프로세스를 가리키는 정보다.

문맥 교환 (Context Switching)

문맥 교환은 CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업을 말한다. 이때 두 PCB의 내용이 변경된다.

실행상태에서 나가는 PCB에는 지금까지의 작업을 저장하고, 반대로 실행 상태로 들어오는 PCB의 내용으로 CPU가 다시 세팅된다.

이와 같이 두 프로세스의 PCB를 교환하는 작업이 문맥 교환이다.

문맥 교환이 일어나는 경우는 인터럽트, 트랩( 하드웨어 부분 : EX 0으로 나눈다), 시스템 콜(유저 모드에서 커널 모드로 전환),

자신에게 주어진 시간을 다 사용했을 때 발생한다.

프로세스 구조

  • 실행 스택 (STACK)
  • 실행 힙 (HEAP)
  • 데이터 영역, 메소드 영역, 스태틱 영역 (정적 변수)
  • 코드 영역 (프로그램 코드가 들어간다.)

프로세스 생성

프로세스 생성에 관해서는 fork() 시스템 호출에 대해 알아보겠다.

fork() 시스템 호출은 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수다.

커널에서 제공하는 이 함수는 프로세스를 복사하는 일종의 시스템 호출이다.

fork 시스템 호출을 사용하면 실행 중인 프로세스와 똑같은 프로세스가 하나 더 만들어진다.

이때 실행하던 프로세스는 부모 프로세스, 새로 생긴 프로세스는 자식 프로세스로서 부모-자식 관계가 된다.

즉 계층적인 구조를 이루게 된다.

 

fork 시스템 콜 함수는 PCB 메모리에 생성해준다.

fork 시스템 콜 함수를 통해 PCB의 내용이 일부 변경되는데 다음과 같다.

  1. 프로세스 구분자가 바뀐다. 부모 프로세스의 구분자와 자식 프로세스의 구분자는 당연히 다르다.
  2. 부모 프로세스와 자식 프로세스가 차지하는 메모리의 위치가 다르므로 메모리 관련 정보가 바뀐다.
  • Child 프로세스가 생성되면 Parent 프로세스에게 PID(프로세스 구분자) 값을 넘김.
  • Parent 프로세스는 PID값으로 Child 프로세스를 구분함.

fork 시스템 호출의 장점이다.

  • 프로세스의 생성 속도가 빠르다.
  • 추가 작업 없이 자원을 상속할 수 있다.
  • 시스템 관리를 효율적으로 할 수 있다.

프로세스 종료

  • 정상적인 종료 : 프로그램의 정상종료, exit(), Parent 프로세스가 abort() 로 종료하게 되면, 같이 종료됨
  • 비정상적인 종료 : 1) Timeout 2) 파일 입출력 실패 (파일조회실패, 파일 열기 최대 횟수 초과)
    3) 오류 발생(산술 오류, 보호 오류, 데이터 오류) 4) 메모리 부족, 메모리 접근 불가 지역의 접근 시도
  • 프로세스가 종료 -> 프로세스 제거 (PCB 제거 및 관련 자원 회수)

여러 운영체제의 프로세스 종료 로직

  • VMS OS : OS가 Child 프로세스들을 모두 강제 종료
  • UNIX OS : Child의 새 부모는 Parent - Parent  (부모의 부모)
  • Linix : Child의 새부모는 최상위 프로세스
  • Mobile OS (Android OS) : 자원을 많이 사용하는 덜 주요한 프로세스부터 종료.

프로세스 계층 구조의 장점 

  1. 여러 작업의 동시 처리
  2. 용이한 자원 회수

부모 프로세스는 자원을 회수하기 위해 자식 프로세스가 끝날 때까지 기다려야 한다.

그런데 부모 프로세스가 먼저 종료되거나 자식 프로세스가 비정상적으로 종료되어 부모 프로세스에 연락이 안 되는 경우도 있다.

이런 문제가 발생하면 자식 프로세스가 종료되지 않거나, 종료되었는데도 사용하던 자원이 그대로 남게 된다.

프로세스가 종료된 후에도 비정상적으로 남아 있는 프로세스를 고아 프로세스, 좀비 프로세스라고 한다.

스레드

스레드는 프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행 단위이다.

또한 프로그램 명령을 실행하는 프로세스 내의 개체이다.

 

프로세스 단위에서 작업의 단위를 스레드 단위로 작업처리 단위를 변경한다.

1개 프로세스 내의 스레드가 모두 완료되면 프로세스가 완료된다.

서로 독립적인 프로세스와 다르게 스레드는 서로 강하게 연결되어 있다. 같은 프로세스의 스레드들은 동일한 주소공간을 공유한다.

스레드들은 스레드마다 별도의 레지스터와 스택 영역을 생성하지만, 동일한 프로세스 내의 스레드들은

힙 영역, 코드 영역, 메소드 영역을 공유한다.

 

스레드와 관련된 몇가지 중심 용어들을 정리하겠다.

  • 멀티스레드 - 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영 기법.
  • 멀티태스킹 - 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법이다. 이렇게 여러 스레드에 시간을 잘게 나누어주는 시스템을 시분할 시스템이라고 한다. 시분할 시스템에서 운영체제가 CPU에 전달하는 작업은 프로세스가 아니라 스레드이다.
  • 멀티프로세싱 : CPU를 여러 개 사용하여 여러 개의 스레드를 동시에 처리하는 작업 환경.
  • CPU 멀티스레드 : CPU 멀티스레드는 한 번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법이다.

멀티 스레드

멀티스레드란 프로세스 하나에 포함된 스레드들이 공동의 목적 달성을 위해 병렬 수행하는것이다.

또한 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미합니다.

멀티 스레드의 장점

  • 사용자 응답성 향상
  • 프로세스 자원과 메모리 공유 가능(자원 공유)
  • 경제성 좋음 (효율 향상)
  • 다중처리로 성능과 효율 향상

멀티 스레드의 단점

멀티 스레드의 경우 모든 스레드가 자원을 공유하기 때문에 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미친다.

단일 스레드와 멀티 스레드는 구조에 차이가 있다. 

스레드에는 스레드 실행 환경 정보, 지역 데이터, 스택 등이 담겨있다.

  • 단일 스레드 프로세스 모델 : 프로세스 = 코드 + 전역 데이터 + 힙 + 1개 스레드 
  • 다중 스레드 프로세스 모델 : 프로세스 = 코드 + 전역 데이터 + 힙 + n개 스레드

스레드의 4가지 상태

  • 준비 : 스레드가 프로세서에 의해 실행될 수 있는 상태. 스레드는 준비 리스트에 삽입됨.
  • 실행 : 스레드가 프로세서를 점유하여 실행 중인 활성화 상태.
  • 대기 : 스레드가 이벤트를 기다릴 때. (입출력 작업 등이 완료될 때 까지 대기(보류) 상태)
  • 종료 : 스레드의 작업이 종료되면 지원해제, 레지스터 문맥과 스택 할당 제거.

스레드 제어 블록

프로세스처럼 스레드도 제어 블록이 있다. Thread Control Block 이다. TCB라고 부른다

TCB의 구성을 살짝 알아보겠다. PCB와 유사한 구성을 보인다.

  • 실행 상태
  • 프로세서 레지스터
  • 프로그램 카운터
  • 스택 포인터
  • 스케줄링 정보
  • 우선 순위
  • 프로세서 시간
  • 계정 정보
  • PCB 포인터

프로세스는 커널 프로세스와 사용자 프로세스로 나뉜다. 스레드도 마찬가지로 커널 스레드와 사용자 스레드가 있다.

사용자 스레드

스레드가 커널영역의 개입없이 사용자 영역에서 실행된고 커널 스레드보다 성능이 좋다.

라이브러리에 의해 구현된 일반적인 스레드다.

사용자 스레드는 커널의 입장에서는 일반 프로세스이지만 커널이 하는 일을 라이브러리가 대신 처리하여 여러 개의 스레드를 작동한다.

따라서 사용자 프로세스 내에 여러 개의 스레드가 존재하지만 커널의 스레드 하나와 연결되기 때문에 1 to N 모델이라고 부른다.

사용자 스레드는 라이브러리가 직접 스케줄링을 하고 작업에 필요한 정보를 처리하기 때문에 문맥 교환이 필요 없다.

사용자 스레드의 단점

여러 개의 스레드가 하나의 커널 스레드와 연결되기 때문에

커널 스레드가 입출력 작업을 위해 대기 상태에 들어가면 모든 사용자 스레드가 같이 대기한다.

한 프로세스의 타임 슬라이스를 여러 스레드가 공유하기 때문에 여러 개의 CPU를 동시에 사용할 수 없다.

또한 보안에 취약하다.

커널 스레드

커널이 멀티 스레드를 지원하는 방식으로, 하나의 사용자 스레드가 하나의 커널 스레드와 연결되기 때문에 1 to 1 모델이라고 부른다.

커널 스레드는 독립적으로 스케줄링이 되므로 특정 스레드가 대기 상태에 들어가도 다른 스레드는 작업을 계속할 수 있다.

또한 커널이 제공하는 보호기능과 같은 모든 기능을 사용할 수도 있다.

사용자 스레드와 장단점이 반대다. 멀티 CPU 사용가능하고 강하고 안정적이다.

그러나 문맥 교환을 할 때 오버헤드 때문에 느리게 작동한다.

사용자 스레드가 요구하는 트랩과 정지 상태의 시스템 호출 등 비동기적인 실행 -> 다른 실행 가능한 스레드의 실해 방해 (속도 향상 어려움)

멀티레벨 스레드

멀티레벨 스레드 또는 하이브리드 스레드는 사용자 스레드와 커널 스레드를 혼합한 방식이므로 M to N 모델이라고 부른다.

사용자 스레드에서는 커널 스레드의 개수가 사용자 스레드보다 적기 때문에

멀티레벨 스레드에서는 커널 스레드의 개수가 사용자 스레드보다 같거나 적다. 

스레드 생성은 사용자 영역에서 시작하며 사용자 스레드에서 커널 스레드로 매핑한다.

 

이상으로 포스팅을 마칩니다. 감사합니다.

2022. 6. 16. 00 : 15 수정 완료

복습 완료!

 

참고 자료

쉽게 배우는 운영체제 (저자 : 조성호)

https://www.kyobobook.co.kr/product/detailViewKor.laf?barcode=9791156644071 

 

운영체제 - 교보문고

명쾌한 비유와 사례로 쉽게 배우는 운영체제의 구조와 원리 컴퓨터 관련 학과 학생을 대상으로 운영체제의 구조와 원리를 설명한 책입니다. 주요 개념은 일상생활의 사례를 통해 쉽게 이해하고

www.kyobobook.co.kr

 

반응형

댓글