TIL 38. Process & Thread?

Drageon Lee·2022년 2월 19일
0

CS

목록 보기
8/9

Today's topic

운영체제에 대해 공부하다 보면 Multi process & thread에 대해서 만나게 된다. 멀티 프로세스, 멀티 쓰레드... 대강의 느낌은 알겠는데... 설명하려면 힘들다...
그래서 이 포스팅을 통해 정리를 해 보고자 한다.

👉 What is "Process"?

운영체제로 부터 자원을 할당 받은 작업의 단위

정의는 위에 나와있는 대로 이나, process는 program과의 관계가 있다.
프로그램 이란,

파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태를 의미한다.

위의 프로그램에 대한 내용도 함께 알고 가야 한다. 왜냐하면, 프로그램은 실행되지 않은 파일 그 자체를 가리키지만, 실행이 된 프로그램을 프로세스라고 하기 때문이다.

  • 메모리에 올라가 있지 않은 : 운영체제가 아직 프로그램에 독립적인 메모리를 할당해 주지 않았다는 뜻이다. 모든 프로그램은 운영체제로 부터 메모리를 따로 할당 받아야 실행이 된다.
  • 정적인 상태 : 움직이지 않는 상태로, 실행이 되지 않는 것을 뜻한다.

아래 그림은 프로그램과 프로세스 사이의 관계를 간단하게 나타내었다.

👉 Process 구성요소

Program이 메모리에 올라가 실행이 되어 process가 될 때, 운영체제로 부터 자원을 할당 받는다. 이 때 운영체제는 process에 각각 독립된 메모리를 할당해 주는데 Code/Data/Stack/Heap 형식으로 할당된다.
구조는 아래 그림과 같다.
각각 독립된 구조의 메모리를 할당 받기 때문에 process는 다른 process의 변수나 자료에 접근할 수 없다.(process들간 통신을 하기 위해서는 특별한 설비가 필요로 한다.)
Process 내에는 기본적으로 최소 1개의 thread(main thread)가 있다.

👉 다른 process간 통신은 어떻게 할까?

Process간 정보를 공유하는 방법에는 아래와 같은 방법이 있다. 이 경우 CPU register 교체 뿐만이 아니라 RAM과 CPU 사이의 cache memory까지 초기화되기에 자원 부담이 크다. 하지만 알아보자!
1. IPC(Inter-Process Communication)을 사용한다.
2. LPC(Local inter-Process Communication)을 사용한다.
3. 별도 공유 메모리를 만들어서 정보를 주고 받을 수 있도록 설정 한다.

👉 What is "Thread"?

프로세스가 할당 받은 자원을 이용하는 실행 흐름의 단위

Thread는 왜 필요할까? 예전에는 프로그램을 시작할 때 process 하나로만 순차적으로 진행했었다. 하지만 시간이 흐르면서 프로그램이 복잡해지고, 하나의 process로만 처리하기는 힘들어지게 되었다.
이러한 문제를 해결하기 위해 더 작은 단위의 실행 단위를 필요로 하게 되었고, 그로 인해 thread란 실행 단위의 개념이 생겨나게 되었다.

  • 프로세스가 진행되는 동안 스레드의 실행 과정

Thread는 process와는 다르게 thread간 메모리를 공유하며 작동한다. Thread 끼리 process의 자원을 공유하면서 process의 실행 흐름 일부가 된다.
즉, thread는 process의 code에 정의된 절차에 따라 실행되는 특정한 수행 경로이다.

👉 Thread 구성요소

Thread는 위에서 언급했듯 process 내에서 메모리를 공유한다. 자세히 말하면 각 thread는 stack 형식으로 할당된 메모리 영역을 할당 받고, code/data/heap 형식으로 할당된 메모리 형태를 공유하며 작동한다.

Thread는 process와 달리 메모리를 공유하기 때문에 한 thread에 오류가 발생했을 때 전체 thread가 영향을 받아 같은 process 내의 모든 thread가 종료가 된다.

👉 왜 process와 thread의 memory 공유 방식은 다를까?

CPU(Central processing unit)과 운영체제의 최소 단위는 다르다. CPU는 작업을 처리할 때 최소 단위가 thread이다. 하지만 운영체제의 관점에서는 process가 최소 단위 이다. 그렇기 때문에 thread는 process에 할당된 메모리를 공유해서 작동할 수 밖에 없다.

그럼 여러 개의 process와 여러 개의 thread가 작동할 때는 어떻게 될까?

👉 Multi-tasking & Multi-threading

Multi-tasking

하나의 운영체제 안에서 여러 process가 실행되는 것을 의미한다.
각 process는 동시에 실행되는 것은 아니며, scheduling 방식에 따라 순차적으로 진행되어 동시에 진행되는 것처럼 보이게 효율적으로 진행된다.

Multi-threading

하나의 process 내에서 여러 thread로 작업을 하여 효율적으로 하나의 작업을 처리하는 것을 의미한다.

  • 장점
  1. Stack을 제외한 나머지 메모리를 공유하고 있기에 통신의 부담이 적어서 통신의 부담이 적다.
  2. Context switching 시에 응답 시간이 빠르다.(메모리를 공유하고 있으므로...)
  • 단점
  1. 메모리들을 공유하고 있기에, 하나의 thread가 문제가 생기면 전체가 영향을 받고 process가 종료될 수 있다.
  2. 메모리와 자원을 공유하고 있기에 동기화 문제가 생길 수 있다.(여러 thread에서 공용으로 사용하는 메모리 내의 전역 변수를 사용할 때 충돌을 할 수가 있다.)
  3. 위의 경우를 방지하기 위해 scheduling을 작업자가 직접 설정을 해주어야 하는데, 디버깅 시 까다로울 수 있기에 신중하게 setting을 하여야 한다.

👉 What is "context switching"?

현재 진행하고 있는 task(process, thread)의 상태를 저장하고 다음 진행할 task의 값을 읽어 적용하는 과정을 말한다.

📖 출처 :

My opinion

이번 posting을 통해서 process와 thread에 대해서 알아보았다. 이 요소들을 알아보면서 멀티 프로세싱, 멀티 프로그래밍, 멀티 태스킹 그리고 멀티 스레딩에 대해서도 알게 되었다. 이 개념들에 대해 다음 포스팅에서 정리해 보도록 해야겠다!

profile
운동하는 개발자

0개의 댓글