한 걸음씩 기록하며
[프로세스와 스레드]란 무엇인가 본문
0. 선행지식
CPU : 중앙처리장치
코어(core) : 각종 연산을 하는 CPU의 핵심 요소 (CPU 안에서 일하는 실무진이라 보면 된다..)
프로세서 (processor) : 컴퓨터 운영을 위해 기본적인 명령어들을 처리하고 반응하기 위한 논리 회로, 컴퓨터 내에서 프로그램을 수행하는 하드웨어 유닛
- 초기의 컴퓨터는 멀티 태스킹이 불가능했다. 그러나 CPU 성능이 개선됨에 따라 Context Switching을 통해서 동시성을 구현하는 것이 가능해졌다.
동시성(Concurrency) : 동시에 실행되는 것 같이 보이는 것
- 2000년대 초반, 한계치 이상까지 CPU의 쿨럭을 끌어올리던 CPU 제조회사들은 2002년에 3Ghz 쿨럭을 돌파했다.
- 그러나 이로 인해 발생하는 발열, 엄청난 전력 소모로 인해 CPU의 작업 속도를 높이는데에 한계가 있음을 발견한다.
- 이에 쿨럭을 올리는 방향이 아닌, 코어의 면적을 넓히는 방향, 즉 멀티 코어 프로세서의 방향으로 나아가기 시작한다.
- 즉 코어 하나를 극한까지 끌어올리는 것이 아닌, 코어의 수를 늘려서 더 쉽게 CPU 전체의 성능 향상을 도모하는 쪽으로 발전하게 된 것이다.
- 그리고 이러한 발전은 프로세서의 숫자를 늘리는 것에서 그치지 않고, 스레드까지 나아가게된다.
[Context Switching]
- CPU는 한번에 하나의 프로세스만 실행 가능하다.
- 그렇기에 CPU는 여러 프로세스를 돌아가면서 작업을 처리하는데 이를 Context Switching이라고 한다.
*이를 통해서 CPU는 동시성을 구현한다!
- 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구한다.
- 프로세스 간의 Context Switching시 단순히 CPU 레지스터 교체 뿐만 아니라 RAM과 CPU 사이의 캐쉬 메모리에 대한 데이터까지 초기화되므로 오버헤드가 크다.
1. 프로세스(Process)
1.1 프로그램(Program)
- 프로세스를 이해하려면 먼저 프로그램의 정의를 알아야한다.
프로그램(Program) : 작업을 위해서 실행할 수 있는 파일 (An executable file)
*일반적으로는 어플리케이션이라고 표현한다.
- 프로그램은 바이너리 파일로 되어있다. 그렇다면 이 프로그램을 어떻게 실행시킬까?
- 바로 프로세스로 프로그램을 실행한다.
1.2 프로세스(Process)
프로세스(Process) : 실행되고 있는 컴퓨터 프로그램 (computer program in execution)
- 프로그램(실행 가능한 파일)을 실행 시킨 것이 바로 프로세스이다.
- 프로세스는 메모리에 올라와 실행되고 있는 프로그램의 인스턴스이다.(독립적인 개체)
- 운영체제(OS)로부터 시스템 자원을 할당 받는다.
- 각 프로세스는 최소 1개의 스레드를 가지고 있다.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 만약 한 프로세스가 다른 프로세스의 자원에 접근하려면, 프로세스 간의 통신(IPC, inter process communication)을 사용해야한다.
1.3 프로세스 구성 요소
OS로부터 할당받는 자원(메모리 영역) /프로세스의 구성 요소
- 하나의 프로세스는 각각 독립된 메모리 영역을 할당받는다.
- Code
- 실행할 프로그램의 코드 및 매크로 상수가 기계어 형태로 저장되는 영역이다.
- CPU는 코드 영역에 저장된 명령어를 하나씩 처리한다.
- Data
- 코드에서 선언한 전역 변수와 정적(static) 변수가 저장되는 영역이다.
- 데이터 영역은 프로그램의 시작과 함께 할당되어 종료될 때 소멸된다.
- Stack
- 함수 안에서 선언된 지역 변수, 매개변수, 리턴 값 등이 저장되고 함수 호출 시 기록하고 종료되면 제거한다.
- 스택은 LIFO(후입선출) 매커니즘을 따른다.
- Heap
- 관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 공간(Free Space)이다.
- 이 공간은 동적 메모리 할당 공간이므로 끝나면 운영체제가 쓸 수 있도록 반납해야한다.
- Code
2. 스레드(Thread)
스레드(Thread) : 프로세스 내의 실행 단위 (The unit of execution within a process)
- 프로세스 안에는 여러개의 스레드가 있을 수 있다.
- 스레드는 프로세스 내에서 Stack만 할당 받고, 나머지는 스레드들끼리 공유한다.
- 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드도 그 변경 결과를 즉시 볼 수 있다.
- 독립적인 스택을 가졌다는 것은, 독립적인 함수 호출이 가능하다는 뜻이다. 그리고 독립적인 함수 호출이 가능하다는 것은, 독립적인 실행 흐름이 추가된다는 것이다.
- 즉 스레드는 스택을 가짐으로서 독립적인 실행 흐름을 갖는다.
3. 멀티 프로세스 (Multi Process)
- 하나의 어플리케이션을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 병렬적으로 수행하는 것을 의미한다.
- 부모 프로세스가 fork하여 자식 프로세스를 생성하면, 자식 프로세스는 독립적인 메모리 영역을 가지면서 하나의 프로그램을 처리할 수 있다.
- 장점
- 독립된 구조로 높은 안정성 : 각 프로세스가 독립된 영역(Code,Data, Stack, Heap)을 가지고 있기 때문에, 여러 자식 프로세스 중 하나에 문제가 발생하여도 해당 프로세스에만 영향을 미친다.
- 메모리 침범 문제를 OS 차원에서 해결하므로 안전하다.
- 단점
- 독립된 메모리 영역이기 때문에, 작업량이 많을수록 더 많은 Context Switching이 일어난다.
- Context Switching 과정에서 캐쉬 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생하여 성능 저하를 불러올 수 있다.
- 프로세스 간의 복잡한 통신(IPC)가 필요하다.
4. 멀티 스레드(Multi Thread)
- 하나의 어플리케이션을, 한 프로세스 안에 여러 스레드로 자원을 공유하여 작업을 처리하는 것을 의미한다.
- 장점
- 자원의 효율성 증대
- 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
- Context Switching시 스레드는 Stack 영역만 처리하면 되기 때문에, 전환 속도가 빠르고 이를 위한 시스템 자우너 소모가 줄어든다.
- 쓰레드들은 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적고, 프로그램 응답 시간이 단축된다.
- 자원의 효율성 증대
- 단점
- 서로 다른 스레드가 Stack을 제외한 메모리 공간을 공유하기 때문에 동기화 문제가 발생할 수 있다.
- 스레드 간의 자원 공유는 전역 변수(Data)를 이용하므로 다른 스레드가 동시에 사용할 때 충돌이 발생 할 수 있다.
- 이는 하나의 스레드에 문제가 생기면 전체 스레드가 영향을 받는다는 것을 의미하고, 이로 인해 디버깅이 어려울 수 있다.
- 디버깅이 잘 안되는 정도가 아니라, 공유하는 데이터 공간이 망가질 수도 있다..
- 리스크 부담으로 인하여 주의 깊은 설계가 필요하다.
[프로세스 & 스레드 정리]
[참고]
https://www.youtube.com/watch?v=RrfASw-jfZ4
https://kyun2da.dev/CS/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C/
https://steady-coding.tistory.com/502
https://charlezz.medium.com/process%EC%99%80-thread-%EC%9D%B4%EC%95%BC%EA%B8%B0-5b96d0d43e37
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
'CS & SW & IT 용어' 카테고리의 다른 글
[메모리 계층과 성능, 코프로세서] (0) | 2022.03.21 |
---|---|
[Clean Architecture]란 무엇인가 (0) | 2022.02.27 |
[동적 메모리 할당, 가비지 컬렉션, 이중 연결 리스트] (0) | 2022.02.18 |
[아날로그 처리 방법] (0) | 2022.02.11 |
[양방향, 단방향 암호화]란 무엇인가 (0) | 2022.01.30 |
Comments