CS/OS

📌프로세스와 스레드

ಠಿ_ಠ 💻 2021. 6. 12. 02:52

OS 공부할 때 빠지지 않는! 프로세스와 스레드를 공부해보겠당. 완전 면접 단골 질문이라고 한다!

혹시 잘못된 내용이 있다면, 알려주세요. 저로 인해 잘못된 내용이 전해지는걸 원하지 않습니다.🤣

 

프로세스와 스레드의 정의는 앞 글(2021.06.12 - [CS/OS] - 👊프로세스 주소 공간)에서 작성했다.

 

이 글에서는 전제 조건으로, 하나의 프로그램을 실행하는 과정이라고 생각하고 읽으면 좋을 것 같다!

 

우리가 만약에 이클립스를 실행한다고 해보자. 우리는 화면에 코드를 띄워놓고, 키보드로 코드를 작성하면서, 빌드해보고 console 창에다가 인풋값을 넣어보기도 하고 .. 다양한 흐름이 실행되고 있음을 알 수 있다.

 

어떻게 이것들이 동시에 진행될 수 있는걸까? 사실 동시에 진행될 순 없다. CPU는 한 번에 하나의 프로세스/스레드만 다룰 수 있기 때문이다.

그럼에도 불구하고, 얘네가 빠른 속도 그리고 짧은 시간마다 전환되면서 수행되고 있기 때문에 마치 동시에 모든 일이 진행되는 것처럼 착각하게 만든다! 이를 Context Switching이라고 하는데, 이는 다음에 알아보겠다.

 

이 때, 멀티 프로세스 방식과 멀티 스레드 방식을 이야기할 수 있다.

말만 들어도 여러 개의 프로세스로 실행하는 것과 여러개의 스레드로 실행하는 것의 차이가 있겠다.

이전에, 먼저 프로세스와 스레드의 차이에 대해서 알아보자.

 

프로세스 vs 스레드

프로세스 스레드
- 각 프로세스는 별도에서 실행됨(독립된 메모리 영역)
- 코드, 데이터, 힙, 스택 
- 스택영역만 할당 받고 나머지는 공유하며 실행

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

맨처음에 말했듯이!!! 앞으로 볼 내용에서는 헷갈리지 않도록 하나의 CPU가 하나의 프로그램을 실행할 때를 기준으로 설명하겠다.

멀티 프로세스 = 하나의 CPU에서 하나의 프로세스가 실행 중인데, 이를 fork하여 멀티 프로세스가 되어 프로그램 실행

멀티 스레드 = 하나의 CPU에서 프로세스가 실행 중인데, 이 프로세스는 멀티 스레드를 갖고 프로그램을 실행함

위 사진은 멀티 프로세스에 대한 것이다. 완전한 하나의 프로그램을 여러 개의 프로세스로 실행하기 위해서 fork를 통해 프로세스를 생성한다. 이때 각 프로세스는 원래의 프로세스와 똑같이 코드, 데이터, 스택, 힙을 갖게 되겠다. 뭔가 불필요하게 많은 메모리를 잡아먹을 것 같지 않은가? 사실 코드 영역에서만 생각해도 다 같기 때문에 메모리도 그렇고 나중에 Context Swithcing 작업에서도 성능 저하를 우려할 수 있게 된다. 또한, 프로세스가 다른 프로세스의 자원에 접근하려고 하면 통신을 해야 한다. 이러한 문제를 해결 하기 위해, 멀티 스레드가 나오게 되었다.

 

이는 멀티 스레드를 설명하는 사진이다. 위와 다르게 Code, Data, Heap 영역은 공유하고 각 스레드는 Stack과 Register만 갖고 있는 걸 볼 수 있다. 그로 인해 멀티 프로세스와 달리 자원의 효율성이 증가한다. 자원 공유로 인해 통신이 필요했던 멀티 프로세스와는 달리 그냥 직접 메모리에 접근할 수 있다. 하지만 스레드가 영역을 공유함으로 인해 잘못된 값을 읽어올 수 있어서 다른 스레드에까지 영향을 미칠 수도 있다는 단점이 있다.

 

  멀티 프로세스 멀티 스레드
장점 - 안정성(메모리 침범 문제에 대해)
- 구현이 간단함
- 자원의 효율성
- 통신 비용 감소
- 컨텍스트 스위칭 시간 감소
단점 - 통신 필요
- 메모리 사용량 많음 -> 그로 인한 오버헤드와 성능저하 가능성 있음
- 문제 발생시, 전체 프로세스에 영향을 미칠 수 있음 

어떤 스레드가 다른 스레드에서 사용 중인 변수를 읽을 때 잘못된 값을 읽어 올 수 있고 그 문제가 다른 스레드에도 영향을 미칠 수 있다. -> Critical Section 이를 위해 동기화가 필요함(나중에..)

 

이러한 특징들을 보면, "아!!! 멀티스레드가 더 좋네 그럼" 할 수도 있다. 그치만 이건 케바케이다.

멀티프로세스를 사용하면 좋은 점이 있는거고 멀티스레드를 사용하면 걔만의 좋은 점이 있는것이다.

멀티스레드는 그냥 봐도 좋아보이니까 멀티 프로세스가 어디서 쓰였는지 간단히 보자.

 

크롬 브라우저에서 다음과 같은 아키텍쳐를 볼 수 있다. 웹사이트가 보여질 때 렌더러 프로세스, 웹사이트의 플러그인을 담당하는 프로세스와 같이 나누어져 있다. 또한 각 탭은 여러 렌더러 프로세스로 구동된다.

 

🧨잠깐! 내가 궁금한 것. 자바에서도 스레드 어쩌구 저쩌구 했던 것 같은데... 알고보니 나는 멀티스레드를 경험해봤..

저번에 자바로 채팅 프로그램을 만들 때, 스레드 ... 어쩌구 저쩌구 했었는데 .. 다시 봐서 추가해놓겠당.....

 

🧨우리가 사용하는 Tomcat 웹서버는 멀티 프로세스일까 멀티 스레드일까?

정답은 멀티 스레드! Tomcat은 multi thread된 servlet container이다. 원래는 클라이언트의 요청이 도착할 때마다, 스레드를 생성해서 요청을 처리했는데 이는 부하를 일으켜서 thread pool이란 것을 사용하게 되었다.

Thread pool이란 스레드를 제한된 개수만큼 정해 놓고 작업 큐에 들어오는 작업들을 하나씩 스레드가 맡아서 처리하는 것을 말한다.

출처 

https://www.charlezz.com/?p=44590 

 

운영체제의 Process와 Thread 이야기 | 찰스의 안드로이드

Process와 Thread 이야기 프로세스(Process) 다음과 같이 위키에서 프로세스의 정의를 발췌했다. In computing, a process is the instance of a computer program that is being executed by one or many threads. 컴퓨터 분야에서 프

www.charlezz.com

https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

 

[OS] 프로세스와 스레드의 차이 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

http://wiki.kldp.org/KoreanDoc/html/Tomcat-KLDP/Tomcat-KLDP-12.html

 

Tomcat On Linux: Thread Pool 지원 (Tomcat3.2.1)

다음 이전 차례 Tomact 은 multi-thread 된 servlet container로서 이는 클라이언트측의 각각의 요청이 쓰레드에 의해 실행됨을 의미한다. Tomcat 3.2 이전 버젼에서는 클라이언트측의 각 요청이 도착할 때마

wiki.kldp.org

https://developers.google.com/web/updates/2018/09/inside-browser-part1?hl=ko 

 

모던 웹 브라우저 들여다보기 (파트 1)  |  Web  |  Google Developers

브라우저에서 사용자 코드를 하이레벨 아키텍처부터 렌더링 파이프라인 세부 기능에 이르는 기능성 웹사이트로 전환하는 방법

developers.google.com

 

 

다짐

음,,공부하는것도 좋은데 면접 답변도 정리하자~~~~~~~

'CS > OS' 카테고리의 다른 글

👊프로세스 주소 공간  (0) 2021.06.12