Computer Science/Operation System

[OS] 프로세스 & 쓰레드(Process & Thread)

검은 까마귀 2024. 1. 3. 14:54

#개요

 CS를 공부할때는 언어에 대해서 1차적인 고민을 해야한다. 우리는 PC를 사용할때 프로그램(Program)을 사용한다.

프로그램(Program)을 실행하여 원하는 동작을 구현하는데 우리는 이 단위를 프로세스(Process)라고 부른다.

즉, 실행중인 프로그램이 프로세스이다.(Process is a program in execution) 

 

 

 위키백과를 살펴보며 한번 해석해보자.

프로그램은 일반적으로 하드 디스크 등에 저장되어 있는 실행코드를 뜻하고, 프로세스는 프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위를 지칭한다. 예를 들어, 하나의 프로그램을 여러 번 구동하면 여러 개의 프로세스가 메모리 상에서 실행된다.


프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 종종 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰인다. 여러 개의 프로세서를 사용하는 것을 멀티프로세싱이라고 하며 같은 시간에 여러 개의 프로그램을 띄우는 시분할 방식을 멀티태스킹이라고 한다. 프로세스 관리 운영 체제의 중요한 부분이 되었다.

 

첫번째로는 위에서 정의한 내용이 똑같다. 프로그램(Program)과 프로세스(Process)의 차이점에 대해서 살펴보았다. 추가적인 내용으로는 프로그램은 일반적으로 하드 디스크에 저장되어 있다는 것이다. 하드디스크는 보조기억 장치를 말한다. 보조기억 저장장치는 사용자가 저장하지 않는 데이터와 프로그램을 저장하게 된다.

프로세스는 메모리 상에서 실행된다. 메모리 상에 실행된다는 것은 메모리 공간을 차지 한다는 것이고 각각에게 주소를 할당해준다는 것이다.

 

 

즉, 프로세스는 각각의 메모리를 할당 받아 독립적인 개체로 실행된다.

 

#Process의 Memory Structure(리눅스 기준)

그러면 할당받은 메모리에서 프로세스는 어떤 구조를 가질까? 리눅스는 단위를 세그먼트로 구분한다.

 

  • code 세그먼트
    • 사용자가 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어(Machine code)로 변환되어 저장되는 공간
    • Compile 타임에 결정되고 중간에 코드를 바꿀 수 없는  RO(Read Only)로 되어 있음
    • 실행권한이 주어짐
  • data 세그먼트
    • 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치하며 읽기 권한이 부여
    • 변수와 상수를 저장하는 세그먼트로 나누어져있느데 전역 변수는 쓰기 권한이 부여되어 있는 세그먼트에, 전역 상수에는 값이 변하면 안되는 rodata 세그먼트에 위치
  • BSS(Block Started By Symbol Segment) 세그먼트
    • 위에서 말한 전역 변수가 위치되어있는 메모리 영역
    • 읽기/쓰기 권한 부여
  • stack 세그먼트
    • 함수의 인자나 지역변수와 같은 임시 변수를 저장
    • Stack 프레임
      • 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터 저장하는 영역, 함수 호출 완료시 소멸
    • 커널 영역을 보호하기 위해 메모리의 높은 주소에서 낮은 주소의 메모리가 할당
  • heap 세그먼트
    • 프로그래머 필요할때마다 사용해서 동적으로 할당되고 해제
    • 커널 영역을 보호하기 위해 메모리의 낮은 주소에서 높은 주소의 메모리가 할당

heap & stack은 가변적인 세그먼트이다. 둘다, 쓰기 권한이 있고 heap 세그먼트인 경우는 프로그래가 필요한 만틈 메모리를 할당 받을 수 있다. 그래서 서로 메모리 영역을 침범할 수 있기에 반대 방향으로 메모리를 확장하게 된다.

 

 

(리눅스를 기준으로 메모리 영역의 구조를 살펴 보았는데,
UNIX와는 비슷하지만 다르다. )

#Thread

프로세스의 메모리 구조에 대해서 알아보았다. 그러면 Thread는 어디에 위치해 있는걸까?

Process의 메모리 구조에서 stack만 따로 할당 받고 Process의 모든 영역을 공유한다.

 

Thread가 stack만 따로 할당 받는 이유가 뭘까??

이유는 여러개가 있을 수 있지만, 우리가 위에서 살펴 보았듯이 Stack은 함수관련, 지역변수를 담당하는 영역이다. 그렇다는 말은 Thread가 고유의 Stack 영역을 통해서 독립적인 함수 호출과 로컬 변수의 관리가 가능해질 수 있다.

즉, 다시 말해 Stack영역을 각자 독립적으로 갖고 있음으로 서로 처리를 방해 받지 않는다.

 

우리가 자바 프로젝트를 새로 생성하면 main()함수가 바로 1개의 Thread가 된다.

함수안에 새로운 함수, 인자를 관리하면서 다른 Thread가 흐름을 방해 할 수 없다.

 

Thread는 쉬운 예시로 들면 은행에 창구 같은것이고 Process는 은행의 지점 같은 것이다.

 

창구에서 하는 작업을 다른 창구가 방해할 수 없는게 창구에서의 작업이 stack에 저장되어있으며

'돈' 이라는 프로세스(은행)의 자원을 공유하게 된다.

 

또한, Thread는 code 세그먼트와 data 세그먼트는 공유 한다. 같은 은행의 창구도 옆에서 말하면 바로 알아들을수 있는것 과 같다. 하지만, 비정상적으로 Thread가 동작한다면 다른 Thread까지 모두 강제로 종료되게 된다. 

반대로 Process는 앞단에 Process가 다른 Process이기때문에 비정상적인 동작을해도 앞에 동작만 종료되지 Thread처럼 모두 강제 종료되지 않는다.

 

이것이 면접에 자주 물어보는 Thread와 Process의 차이이다.

 

# Process의 스케듈링(1)

스케듈링에 대해서도 공부하겠지만, OS는 효율적인 작업을 위해 스케듈링이라는 작업을 한다. 스케듈링을 위한 작업 단위를 task(작업)이라도 부르며, task(작업)는 Process를 의미하게 된다.

 

CPU는 1코어라고 했을 때 결국 1개의 task(작업)를 처리할 수 밖에 없다. 그렇다면 뒤에 시작된 task(작업)들은 앞에 task(작업)들이 끝날때 까지 기다릴 수 밖에 없다. 그래서 효율적인 사용을 위해서 Context Switch를 실행한다.

 

(많은 레퍼런스에서는 Context"문맥"이라고 하지만, 나는 Context라는 용어로 하겠다.)

* Context

CS에서  Context는 작업을 중단하고 나중에 동일한 지점에서 계속 할 수 있도록 저장해야하는 작업에서 사용하는 최소한의 데이터 셋이다.

쉽게 풀어 설명하자면, Context 가 없이 Swith를 했다면, 내가 밥 한공기랑 김치를 먹고 있는데 밥 한 숟가락을 먹고 김치를 먹을려고 하는데 누가 내가 먹던 밥을 가져가게된다.
Context는 레지스터에 위치하게 된다.

https://ko.wikipedia.org/wiki/%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8_(%EC%BB%B4%ED%93%A8%ED%8C%85)

 

이렇게 Context에 대해서 알아볼 수 있었는데 이후에 나올 OverHead와도 관련이 되어있다.

 

#Process의 Context

Process의 Context는 아래와 같은 데이터 셋으로 맵핑되어 있다. 

  • Process ID(PID)
  • 레지스터 값
  • 프로세스 상태
  • 메모리 사이즈
  • 기타 등등

이를 PCB(Process Context/Control Block)이라고 부르는 운영체체 커널의 자료조이다.


PCB는 운영체제가 프로세스를 표현한 것이라고 볼 수 있다.


사실 해당 질문은 기술면접에서 빈번하게 등장하는 내용중 하나이다. OS 관련 CS들이기 때문에.

포스팅을 시작하면서 겁이났다. 언어만 해석하면 매우 어려워보이기 때문이다.

 

하지만 그렇게 어려운 내용은 아니였던거 같다. 물론 지금 Process와 관련된 포스팅은 1/3 밖에 안되어있다.

Process의 동작, Process의 스케듈링 기법 등등.... 그에 따른 교착상태, 세마포어 뮤텍스까지도.

 

OS는 공부할 수록 심오한 영역이다. 개인적으로 공부했을때 발명보다는 발견에 가까운 과학적 이론이 아닐까 싶다(내가 천재가 아니어서 그럴수도....)

 

은행과 같은 은행의 창구라는 예시가 가장 마음에 들었다. 저 예시가 모든 장단점을 설명해줄 수 있을거 같다.

다음번에 멀티 쓰레딩, 멀티 프로세싱으로 포스팅!

 

 

 

반응형