발표 시작하겠습니다.
프로세스와 스레드 발표를 맡은 개발오조 이서이 입니다.
저희 개발오조가 선정한 주제는 프로세스 vs 스레드이며 조장은 김남수님, 조원은 김소영님,저,한대희님,홍성우님 으로 구성되어있습니다.
그럼 지금부터 발표를 시작하겠습니다.
다들 한 번쯤 들어보셨을 단어일겁니다. 그치만 누군가가 이 단어들에 대해 질문하였을 때 정확하게 설명하기 모호하셨을겁니다.
면접에서도 단골 질문이라는 프로세스와 스레드!
그 개념을 확실히 짚어드리겠습니다.
일단 들어가기에 앞서 저희는 여러분들의 충분한 이해를 돕기 위해 적절한 예시를 들어서 설명을 드려보려합니다.
<호텔의 부서 사진들>
보시는바와 같이 호텔에는 여러가지 부서들이 존재하고, 그 부서들 안에는 여러 직원들이 존재합니다.
<사람 이모지가 나타나는 이모션>
한 고객이 호텔을 방문하였을 때 여러가지 일들을 요청할테고,
그 일들을 최대한 빠른 시간에 해결하기 위해 호텔은 열심히 노력할겁니다.
여기서 호텔이 운영체제(OS),
부서가 프로세스,
직원이 스레드라고 가정하고 들어가 봅시다.
자, 프로세스를 설명드리기 전에, 일단 프로그램이 무엇인지 짚고 넘어가겠습니다.
프로그램이란,
어떤 작업을 위해 운영체제(OS) 위에서 실행할 수 있는 파일을 말합니다.
파일이 저장 장치에 저장되어 있지만 메모리에 올라가 있지 않아 실행되고 있지 않고 정적인 상태입니다.
예를 들어 '웹 브라우저', '카카오톡' 과 같이 저희가 마우스로 더블클릭해서 실행할 수 있는 모든 파일들을 말합니다.
이 프로그램(파일)을 마우스로 더블클릭해서 실행하는 상태를 '프로세스' 라고 합니다.
프로그램 실행순서는 보시는 바와 같이 이런 식으로 흘러갑니다.
1) 사용자가 프로그램의 실행을 요청하면
2) 보조 기억장치에 저장되어 있는 프로그램의 정보를 읽어 메모리에 이를 로드합니다.
3) CPU는 메모리에 로드된 프로그램 코드를 가져와 메모리를 관리하고 명령어들을 실행하는데
4) 동적 메모리가 할당되면 FreeStore 영역을 위에서 아래로 할당하며 사용하고
5) 지역변수, 매개변수 등의 스택 메모리가 할당되면 Free Store 영역을 아래에서 위로 할당하며 사용합니다.
추가로 메모리 영역에 대해 설명드리겠습니다.
메모리 영역은 Code영역, Data영역, Heap영역, Stack영역 이렇게 4영역으로 구성되어있습니다.
1) 코드영역에는
프로그래머가 작성한 프로그램 코드들이, 프로세스가 종료될 때까지 유지되는 영역입니다.
2) 데이터 영역은
코드들이 실행되면서 사용한 변수, 배열,구조체 등 파일들의 각종 데이터들을 저장한 공간이며, 이 영역 또한 프로세스의 종료까지 유지됩니다.
3) 힙영역은
사용자가 직접 관리하는 영역입니다. 사용자에 의해 메모리 공간이 동적으로 할당되고 해제되는 영역입니다.
4) 마지막으로 스택영역은
함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역입니다.
스택영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸됩니다.
메모리 영역에 대해 간략하게 알아보았습니다.
드디어 다음으로 프로세스에 대해 알아보겠습니다.
프로세스란,
운영체제(OS) 위에서 실행중인 프로그램,
프로그램 명령어와 데이터들이 메모리에 올라오고, 실행 중 또는 실행 대기중인 상태를 말합니다.
프로세스는 각각 독립된 메모리 영역을 갖고 있고,
기본적으로 최소 1개의 메인스레드를 가지고 있습니다.
그리고, 코어당 하나의 프로세스만이 실행될 수 있는데,
여기서 코어란, 각종 연산을 하는 CPU의 핵심요소입니다.
프로세스의 특성으로는
동시성과 병렬성이 있습니다.
동시성을 설명 드리자면,
프로세서가 여러가지 작업을 돌아가면서 진행될 때, 매우 짧은 시간동안 context switching이 일어나면서 번갈아서 실행이 됩니다. 그 속도가 매우 빨라서 '마치 동시에 작업하는 것처럼' 보이기 때문에 이러한 특성을 가진다고 생각하시면 될것 같습니다.
실제로 단일 코어에선 동시에 작업이 이루이지지 않습니다.
처음 말씀드렸던 호텔로 예를 들어 말씀 드리자면,
오로지 부서가 하나 존재하고, 그 부서 직원이 한명인 호텔이 있다고 가정해봅시다.
고객 한 명이 이 호텔을 방문해, 체크인과 음식주문을 하려고 합니다.
직원이 한 명 밖에 없기 때문에, 직원 혼자 고객의 체크인을 도와드리고 음식제조를 한 뒤, 음식을 딜리버리 하겠죠?
그치만 이 직원이 멍청한 직원이 아니라면, 위의 일들을 순차적으로 진행하기보다는 체크인을 도와드리고 방 키를 가지러가는길에 음식제조를 위해 가스불을 키고, 다시 손님께 키를 가져다 드린 다음에 음식제조를 마무리하고 딜리버리를 할겁니다.
스레드는 위에서 언급한 프로세스 특성의 한계를 해결하기 위해 만들어진 개념이기 때문에 스레드의 특성은 쉽게 유추해낼 수 있을 것이다. 스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다. 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되는 것이다. 아까 프로그램이 코드 덩어리라고 했는데, 스레드도 코드에 비유하자면 스레드는 코드 내에 선언된 함수들이 되고 따라서 main 함수 또한 일종의 스레드라고 볼 수 있게 되는 것이다.
한 줄 요약: 스레드는 프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행 경로다.
운영체제 호텔
프로세스 = 부서
프로세스에서의 공유되지 않는 메모리 = 부서의 고유 자료들
프로세스에서 컨텍스트 스위칭이 일어날 때는 현재까지 진행되었던 진행사항을 PCB 에 저장하는거다.
스레드 = 부서의 직원
스레드에서의 공유되는 메모리 = 메모장
스레드에서 stack영역 메모리 = 각자 사람의 재능.