[ OS ] Process vs Thread

이숭인·2021년 7월 20일
0

[ OS ] 운영체제

목록 보기
1/9

Program

사전적 정의

  • 파일이 저장 장치에(하드디스크, ssd 등..) 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태

Process

사전적 의미

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

  • 컴퓨터에서 연속적으로 실행되고 있는 프로그램

  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스

특징

  • 프로세스는 각각 독립된 메모리 영역(code, data, stack, heap)을 할당받는다.

  • 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.

  • 각각의 프로세스는 별도의 주소 공간에서 실행되기 때문에 다른 프로세스의 변수나 자료구조에 접근할 수 없다.


Program -> Process

프로그램 실행 -> 메모리에 올라감 -> 실행중인 프로그램(동적인)을 프로세스라고 한다

프로그램은 보조 기억장치에 저장되어 있는 단순 코드 덩어리!

프로그램을 실행시켜 운영체제에게 메모리 공간을 할당받아 실행되어지는것이 프로세스!


Process -> Thread

프로그램이 점점 복잡해지고 단순히 한 가지 작업만을 하는 경우가 없어짐에 따라 프로세스 하나만을 사용해서 프로그램을 실행하기에는 힘들게 되었다.

그러면 어떻게 해야할까?

쉽게 생각해볼 수 있는 방법은 여러개의 프로세스로 하나의 프로그램을 실행시키는 것이다.

하지만 프로세스는 자신에게 할당되어진 공간에만 접근할 수 있어, 프로세스간 정보 접근이 어렵기 때문에 옳지 못한 방법이다.

그렇기 때문에 프로세스보다 더 작은 실행 단위 개념이 필요하게 되었고, 그게 바로 스레드 다.


Thread

사전적 의미

  • 프로세스 내에서 실행되는 여러 흐름의 단위

특징

  • 스레드는 프로세스 내에서 동작되는 여러 실행의 흐름

  • 같은 프로세스 내의 스레드들은 주소 공간이나 자원들을 공유할 수 있다

  • 프로세스끼리는 직접적으로 접근할 수 없지만, 같은 프로세스 안에 있는 스레드들은 스레드 간 메모리를 공유하며 작동한다.

프로그램을 코드 덩어리 라고 비유했다면, 스레드는 코드 내에 선언된 함수 로 비유할 수 있겠다.

스레드는 프로세스의코드에 정의된 절차에 따라 실행되는 특정한 수행 경로다.


프로세스와 스레드의 작동 방식

프로세스는 운영체제에게 시스템 자원을 할당받아 메모리에 올라갈때 독립된 영역을 배정받는다고 했다.

이때 프로세스마다 data/code/heap/stack의 형식으로 할당받는다.

각각 독립된 영역을 할당받기 때문에 프로세스가 다른 프로세스의 변수나 자료에 접근할 수 없는것이다.

반면, 스레드는 프로세스 내에서 stack형식의 메모리 영역을 제외하고, code/data/heap형식의 메모리 영역들을 공유한다.

따라서 stack영역을 제외한 나머지 메모리 영역들을 공유하고 있어 다른 스레드의 자료에 접근할 수 있다.

여기서 나타나는 프로세스스레드의 중요한 차이가 존재한다.

프로세스는 각각이 독립된 인스턴스이기 때문에 서로에게 주는 영향이 미미하다.
따라서 한 프로세스에 오류가 발생해 강제 종료가 되어도 다른 프로세스에는 아무런 영향을 주지 않는다.

하지만 스레드같은 경우에는 code/heap/data 형식의 메모리 영역을 공유하고 있기 때문에 하나에서 오류가 발생한다면,
같은 프로세스 내의 모든 스레드가 강제 종료된다.

이해를 돕기위해 예를 들자면,
스레드코드(프로세스) 내에서의 함수(스레드) 에 빗대어 표현해보면 이해하기 훨씬 쉬워진다. 코딩을 해 본 경험이 있다면, 코드 내 어떤 함수 하나에서 Segmentation Fault 등의 오류가 발생한 경험이 있을 것이다. 이 오류가 어떤 함수에서 발생했든 간에 해당 코드는 다른 함수 모두에 대한 작업을 중단하고 프로세스 실행을 끝내버린다.

왜 프로세스와 스레드는 서로 다른 방식으로 메모리를 공유할까?

스레드는 프로세스 내에서 실행되는 여러 흐름의 단위라고 했다.

정확히는 CPU 입장에서의 최소 작업 단위이다.
CPU는 작업을 처리할 때 스레드최소 작업 단위 로 삼고 작업을 한다.
반면 운영체제는 이렇게 작은 단위까지 직접적으로 작업하지 않기 때문에 운영체제 관점에서는 프로세스최소 작업 단위 가 된다.
운영체제가 프로세스에 자원을 할당하여 어떤 작업을 수행하는데, 이때 프로세스는 여러 작업을 수행하기 위해 내부에서 여러 스레드가 각각의 작업을 수행한다.
따라서 운영체제 입장에서는 프로세스가 아닌 스레드에 직접 자원을 할당할 수 없다. 자원을 할당받지 못한다면 주어진 역할을 수행할 수 없으므로 스레드들은 자신이 속한 프로세스의 자원을 공유하며 각자 맡은 작업을 수행하게 되는 것이다.

요약:
1. 프로세스는 직접적으로 운영체제에게서 자원을 할당받음
2. 운영체제 입장에서 최소 작업 단위는 프로세스. 스레드는 프로세스의 내부에 존재하고, 자원을 직접적으로 할당받지 못하므로 프로세스가 할당받은 메모리 영역들을 공유하여 작업을 수행하는 것.


멀티 프로세스 vs 멀티 스레드

멀티 프로세스

  • 하나의 운영체제 안에서 여러 프로세스가 실행되는 것을 의미한다.

멀티 프로세스 장점

  • 프로세스 구조상 안정성이 높다.

멀티 프로세스 단점

  1. Context Switching이 자주 일어나 캐시 메모리 초기화 같은 무거운 작업이 진행되고, 시간이 소모되는 등 오버헤드가 발생함

멀티 스레드

  • 하나의 프로세스 안의 스레드들이 여러 작업을 동시에 처리하는것을 의미한다.

Context Switching 이란
다른 프로세스가 동작하는 동안 프로세스의 상태(Context)를 보관하고, 운영체제에서 자원을 할당받게 되면 보관하고 있던 프로세스의 상태(Context)를 복구하는 작업을 말한다.

멀티 스레드 장점

  1. Context Switching 할 때 공유하고 있는 메모리만큼의 자원을 아낄 수 있다.
  2. 프로세스간의 통신은 시간이 오래 걸리거나 메모리를 초기화하는 등의 자원이 많이 드는 반면, 스레드는 stact 영역을 제외한 다른 메모리 영역을 공유하므로 스레드간 데이터 공유가 원할하기 때문에 응답시간이 빠르다.

멀티 스레드 단점

  1. 하나의 스레드가 프로세스 실행의 흐름에 영향을 미치기 때문에 하나의 스레드에서 오류가 발생한다면 프로세스 실행이 강제 종료가 될 위험이 있다.
  2. 같은 메모리 자원을 공유하고 있기 때문에 동기화 문제(Synchronization Issue) 가 발생할 가능성이 높다.

동기화 문제(Synchronization Issue)란?
멀티스레드를 사용하면 각각의 스레드 중 어떤 것이 어떤 순서로 실행될 지 그 순서를 알 수 없다.
만약 A 스레드가 어떤 자원을 사용하다가 B 스레드로 제어권이 넘어간 후 B 스레드가 해당 자원을 수정했을 때, 다시 제어권을 받은 A 스레드가 해당 자원에 접근하지 못하거나 바뀐 자원에 접근하게 되는 오류가 발생할 수 있다.

여러 스레드가 함께 전역 변수를 사용할 경우 발생할 수 있는 충돌을 동기화 문제라고 한다. 그렇기 때문에 멀티 스레드를 사용하려면 신중해야함.


다른 프로세스의 정보에 접근하는 방법

이 부분은 나중에 자세히 짚고 넘어가자.

  1. IPC(Inter-Process Communication)을 사용한다.
  2. LPC(Local inter-Process Communication)을 사용한다.
  3. 별도로 공유 메모리를 만들어서 정보를 주고받도록 설정해주면 된다.

정도의 방법들이 존재한다 ~ 라고만 기억하기로.


마무리

프로세스는 다른 프로세스와 정보를 공유하려면 IPC를 사용하는 등의 번거로운 과정들 거쳐야 하지만, 스레드는 애초에 프로세스 내의 자원들을 공유하는 구조이기 때문에 스레드끼리의 정보공유가 원할하다.
때문에 멀티 태스킹보다 멀티 스레드가 자원을 아낄 수 있다. 하지만 스레드의 스케줄링은 운영체제가 처리하지 않기 때문에 개발자가 직접 동기화 문제에 대응할 수 있어야 한다.

참조

개발장님 블로그

profile
iOS Developer

0개의 댓글