일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- tailwind css
- Git
- frontend
- react
- route handler
- 개발자
- 오블완
- form
- monorepo
- 회고록
- github
- turporepo
- CSS
- JWT
- svelte
- typescript
- Study
- 티스토리챌린지
- js
- barrel export
- 개발
- SWR
- zustand
- 협업
- javascript
- 프레임 워크
- next.js
- Pr
- 비제어
- Fe
- Today
- Total
ougi FE
스레드와 프로세스에 대하여 본문
오늘은 평소에 많이 들어왔지만 제대로 몰랐던 스레드와 프로세스
그리고 멀티 스레드와 멀티 프로세스에 대해서 알아보려고 합니다
스레드와 프로세스 그게 무엇일까?
프로세스란 운영체제로부터 자원을 할당받은 작업의 단위입니다
쉽게 말하자면 프로그램이 실행되고 있는게 프로세스라고 할 수 있습니다
과거에는 하나의 프로세스만 가능해서 굉장히 불편함이 많았는데 그것을 보완하기 위해 생긴게 스레드라고 합니다
프로세스는 상태가 변경되면서 수행됩니다
- New: 프로세스가 생성되고 아직 준비되지 않은 상태입니다
- Ready: 프로세스가 실행을 위해 기다리는 상태입니다
- Running: 프로세스가 CPU를 할당 받아서 실행되는 상태입니다
- waiting: 프로세스가 이벤트가 발생해서 대기하는 상태입니다
- Terminated: 프로세스가 실행을 완료하고 종료된 상태입니다
스레드란 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위입니다
하나의 프로세스 안에 여러 작업들이 가능합니다 이를 스레드라고 할 수 있습니다
프로세스가 생성되면 기본적으로 하나의 main 스레드가 생성됩니다
스레드도 상태가 변경되면서 수행됩니다
- New: 스레드가 생성되고 아직 호출되지 않은 상태입니다
- Runnable: 스레드가 실행되기를 기다리는 상태입니다
- Blocked: 스레드가 특정 이벤트가 발생하여서 대기하는 상태입니다
- Terminated: 스레드가 실행을 완료하고 종료된 상태입니다
하나의 프로그램은 하나 이상의 프로세스를 가지고 있고, 하나의 프로세스에서는 반드시 하나 이상의 스레드를 갖습니다
프로세스 메모리
프로세스가 만들어지면 다음 4가지의 메모리 영역으로 구성되어 할당받게 됩니다
프로세스는 각각 독립되게 메모리영역을 할당받기 때문에 다른 프로세스의 변수나 자료에 접근이 불가합니다
- 코드 영역: 프로그래머가 작성한 프로그램 함수들의 코드가 CPU가 해석 가능한 기계어 형태로 저장되어 있습니다
- 데이터 영역: 코드가 실행되면서 사용하는 전역 변수나 각종 데이터들이 모여있습니다
- 스택 영역: 지역 변수같은 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 독립적인 공간입니다 함수가 호출되자마자 할당되며 함수 호출이 종료되면 소멸됩니다
- 힙 영역: 동적으로 할당되는 데이터들을 위한 공간입니다
스레드의 자원 공유
스레드는 프로세스와 다르게 스레드끼리 자원 공유가 가능합니다
위 그림을 보면 하나의 프로세스 안에서 두 스레드가 코드, 데이터, 힙 영역을 공유하는 것을 볼 수 있습니다
스레드는 이렇게 자원을 공유하기 때문에 스레드 하나에서 오류가 발생하면 같은 프로세스 내에
다른 스레드 모두가 강제로 종료됩니다
프로세스 컨텍스트 스위칭
컨텍스트 스위칭(Context Switching)이란 CPU가 한 프로세스에서 다른 프로세스로 전환할 때 발생하는 일련의 과정입니다
프로세스는 CPU에서 하나만 실행이 가능합니다
다른 코어에서 프로세스를 실행하거나 멀티 프로세스를 사용하면 가능합니다
그래서 여러 프로세스를 번갈아가면서 실행하기 때문에 컨텍스트 스위칭이 필요합니다
좀 더 컨텍스트 스위칭에 대해서 자세히 말하자면
동작중인 프로세스가 대기를 하면서 해당 프로세스의 상태를 보관하고
이전에 보관되고 있던 프로세스의 상태를 복구하는 작업이라고 할 수 있습니다
컨텍스트 스위칭을 하는 주체를 스케줄러라고 합니다
스레드 컨텍스트 스위칭
멀티 스레드 환경에서 스레드 간의 실행을 전환하는 기술입니다
프로세스 컨텍스트 스위칭과 다른 점은 스레드 컨텍스트 스위칭은 하나의 프로세스 내의 스레드들을 교환한다는 점입니다
멀티 프로세스
멀티 프로세스란 운영체제 하나에서 하나의 프로그램에 대해 동시에 여러 개의 프로세스를 실행할 수 있게 하는 기능을 말합니다
보통 하나의 프로그램 실행에 대해 하나의 프로세스가 메모리에 생성되지만 부가적인 기능을 위해 여러개의 프로세스를 생성하는 것입니다
멀티 프로세스 내부를 보면 하나의 부모 프로세스가 여러 개의 자식 프로세스를 생성함으로서 다중 프로세스를 구성합니다
각각 고유한 프로세스 아이디(PID)를 가지고 있습니다
자식 프로세스는 부모의 PID를 알고 있어서 이를 통해 부모 프로세스와 통신이 가능합니다
하지만 독립적인 메모리를 가지고 있습니다
멀티 프로세스 VS 멀티 프로세서
멀티프로세스는 하나의 컴퓨터에서 여러 개의 프로세스를 동시에 실행하는 것
멀티프로세서는 여러 개의 CPU(프로세서)를 가진 하드웨어 시스템
멀티 스레드
멀티 스레드는 하나의 프로세스 안에 있는 여러개의 스레드를 말합니다
하나의 스레드가 지연되더라도 다른 스레드는 작업을 지속 가능합니다
멀티 프로세스를 브라우저에서의 여러 탭이라고 하면 멀티 스레드는 탭 내부에서 네트워크 처리, 브라우저 이벤트 등 기타 작업을 관리하고 처리하는데 사용된다고 볼 수 있습니다
멀티 스레드 VS 멀티 프로세스
멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 컨텍스트 스위칭이 빠르다는 장점이 있습니다 하지만 멀티 스레드는 동기화 문제로 하나의 스레드에 장애가 생기면 전체 스레드가 종료될 위험이 있습니다
이렇게 서로 반대되는 장단점이 있어 둘을 적절하게 맞는 상황에 잘 활용해야 합니다
글을 마치며
이렇게 스레드와 프로세스에 대해서 알아보았는데 오랜만에 많은 개념들을 배우면서 머리가 아팠던거 같습니다
그리고 놓친 정보들도 많은거 같아서 더 공부를 해보면 좋을거 같습니다ㅠㅠ
그래도 이렇게 유용한 CS 지식을 알게 되어서 좋았던거 같습니다
글을 읽어주셔서 감사합니다!
