프로세스와 스레드

김광훈·2022년 8월 25일
0

기록

목록 보기
2/3

Objective

  • 프로세스가 무엇인지 설명할 수 있다.
  • 스레드가 무엇인지 설명할 수 있다.
  • 프로세스와 스레드의 차이에 대해 섦명할 수 있다.

프로세스(Process)

프로세스는 컴퓨터에서 연속적으로 실행되고 있는 프로그램을 말한다. 종종 스케쥴링의 대상이 되는 작업이라는 용어와 거의 같은 의미로 사용된다. 여러 개의 프로세스를 사용하는 것을 멀티 프로세싱이라고 하고 같은 시간에 여러 개의 프로그램을 띄우는 시분할 방식을 멀티테스킹이라고 한다.

프로그램과 프로세스의 차이

프로그램은 보조기억장치(SSD, HDD)에 존재하며 실행되기를 기다리는 명령어와 정적인 데이터의 묶음이고 명령어와 정적인 데이터가 메모리 위에 적재되면 실행되고 있는 동적인 상태의 프로세스가 된다.

프로세스 구성

프로세스의 정보는 프로세스 제어블록(PCB, Process Control Block) 또는 프로세스 기술자(process descriptor)라고 불리우는 자료 구조에 저장된다.

  • PID
    운영체제에서 프로세스를 식별하기 위해 부여하는 식별번호이다.

  • 프로세스 상태
    CPU는 프로세스를 빠르게 교체하며 실행하기 때문에, 실행중인 프로세스도 존재하고 대기중인 프로세스도 존재한다 이런 상태를 저장한다.

  • 프로그램 카운터
    CPU가 다음으로 실행할 명령어를 가르키는 값이다. CPU가 기계어를 한 단위씩 읽어서 처리하는데 프로세스를 실행하기 위해 다음으로 실행할 기계어가 저장된 주소를 가르키는 값이다.

  • 스케줄링 우선순위
    운영체제는 여러 프로세스를 실행하고 관리하는데 이때, 우선적으로 실행되야 하는 정보를 담고 있다. 높을 수록 우선순위가 높다.

  • 권한
    프로세스가 접근할 수 있는 자원에 대한 정보를 담고 있다.

  • 프로세스의 부모와 자식 프로세스
    최초로 생성되는 프로세스를 제외하고 모든 프로세스는 부모 자식 관계를 갖는 트리구조이다. 이 때, 부모와 자식 프로세스에 대한 정보를 담고 있다.

  • 프로세스의 데이터와 명령어가 있는 메모리 위치를 가르키는 포인터
    프로세스는 실행중인 프로그램이기 때문에, 프로그램 정보를 가지고 있어야 한다. 프로그램에 대한 정보는 프로세스가 메모리에 가지는 자신만의 주소 공간에 저장된다. 이 공간에 대한 포인터 값을 갖는다.

  • 실행문맥
    프로세스가 실행상태에서 마지막으로 실행한 프로세스의 레지스터 내용을 갖고있다. CPU에 의해 실행되는 프로세스는 운영체제에 의해 계속 교체되는데 교체되었다가 다시 자신의 차례가 되어서 실행될때 중단된적 없고 마치 연속적으로 실행된것처럼 하기위해 이 레지스터 정보를 갖고 있다.

프로세스가 접근 할 수 있는 메모리 공간

PCB의 자료구조 중 프로세스의 데이터와 명령어가 있는 메모리 위치를 가르키는 포인터를 저장한다고 한다라고 했는데 프로세스의 데이터와 명령어가 있는 메모리에 대해 알아보자.

이 메모리 주소 공간은 Text, Data, BSS, Heap, Stack 영역으로 구성되어 있다.

위 순서대로 메모리에 할당되는 주소 값이 증가되고 Heap과 Stack의 경우 컴파일 시 메모리를 얼마나 할당할지 계산할 수 없기 때문에, Heap과 Stack 사이의 메모리 공간을 두고 Heap은 아래쪽으로 주소를 매기고 Stack은 위쪽으로 주소값을 매긴다.

프로세스 관리

프로세스 관리는 운영체제에 의해 되는데 이때 운영체제는 프로세스를 교체하고 재시작할 때 오류가 발생하지 않도록 관리한다. 이를 위해 프로세스의 상태를 실행, 준비, 블록 상태로 분류하고 프로세스들을 상태전이를 통해 관리한다.

  • 동작과정
    a. 사용자가 프로그램을 실행하면 프로세스가 생성되고 준비리스트에 추가된다.
    b. 프로세스는 프로세서(CPU)가 사용가능한 상태가 되면 CPU를 할당받는다. 이를 준비상태에서 실행 상태로 상태전이된다고 한다. 이 과정을 디스패칭이라고 하며 디스패처가 이 일을 수행한다.
    c. 프로세스는 실행상태에서 CPU를 이용해 연산한 후 CPU를 자발적으로 반납하고 작업이 끝나지 않았으면 다시 준비상태에 들어간다.
    d. 운영체제는 다시 준비리스트의 첫 번째에 있는 프로세스를 실행상태로 바꾸고 이 과정을 반복한다.
    e. 만일 프로세스를 다시 사용하기 전에 입출력이 완료대기를 기다려야 하는 상황이라면 상황이 완료될 때까지 자신을 블록한다. 입출력이 완료되면 운영체제가 프로세스를 블록상태에서 준비상태로 다시 상태전이 시킨다.

스레드(Thread)

스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다.

스레드 구조

스레드는 ID, PC, 레지스터 집합, 그리고 각각의 Stack으로 그성된다. 이를 이용해 하나의 프로세스에 여러개의 실행단위(스레드)로 나누어서 자원을 공유하며 자원의 생성과 관리의 중복을 줄여 수행능력을 높인다.

  • Heap, Data, Code 영역을 공유한다.
  • 스레드는 하나의 실행 Context이고 각각의 실행 Context내에서 간단하게 여러개의 지역변수, 파라미터, 반환값, 복귀주소 등을 갖는다. 이 스레드들이 서로의 스택을 공유하면 이런 Context가 섞이게 된다. 이런 이유로 하나의 메모리 공간을 Stack Pointer를 이용해 분리한다.
  • 스레드가 프로그램 카운터(PC)와 레지스트를 갖는 이유는 프로세스와 동일한데 스레드는 CPU를 할당 받을 때 프로세스처럼 스케쥴러에 의해 결정되는데 그렇기에 명령어가 연속적으로 실행됨을 보장하지 못하기 때문에 어디까지 실행되었는지 기록할 필요가 있고 이를 위해 PC와 레지스트를 갖는다.

장,단점

  • 장점
    a. 특정 스레드가 긴 작업을 수행중이여도 다른 스레드는 본인의 일을 계속할 수 있다.
    b. 스레드는 프로세스와 다르게 스레드끼리 프로세스의 자원을 서로 공유한다.
    c. 프로세스의 자원을 공유하기 때문에 새로운 메모리 주소공간을 할당받을 필요가 없어 생성에 자원이 적게 들어가고 컨텍스트 스위칭 시 캐시 메모리를 비우지 않아도 된다.

  • 단점
    a. 공유 자원을 사용하기 때문에 동기화 문제를 항상 생각해야한다.

Context Switching

현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정을 말한다. 이때, Task는 Register에 저장된다.

Reference

profile
잘 부탁드려요

0개의 댓글