이 글은 공부를 하면서 알게 된 내용들을 기록하는 글입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!
✅ 프로그램(Program)
프로세스와 스레드를 이야기하기 전에 먼저 프로그램(Program)에 대해 이야기해 보자.
🎯 프로그램(Program)이란?
먼저 프로그램(program)은 실행 파일(명령어 리스트들로 이루어진 파일)이 디스크에 저장된 수동적인 존재(passive entity)이다.
우리가 흔히 실행하는 ~~~. exe 파일이 바로 프로그램이다.
이 파일에 대해 어떤 행동을 취하지 않고 그대로 둔다면, 이 파일은 아무런 기능도 하지 않는다. 한 마디로 코드 덩어리이다.
이 파일이 사용되기 위해서는 실행이 되어 메모리에 적재되어야 한다.
✅ 프로세스(Process)
🎯 프로세스(Process)란?
반면 프로세스(process)는 반대로 능동적인 존재(active entity)라고 이야기한다.
프로세스는 프로그램이 가지고 있는 명령어 리스트들 뿐만 아니라, 전역 변수, 복귀 주소와 같이 프로그램 실행에 필요한 모든 정보들을 가지고 있기 때문이다.
프로세스는 실행 파일이 GUI 혹은 CLI를 통해 코드 덩어리인 프로그램이 실행되어 메모리에 적재되면(loaded into memory) 그것을 프로세스(process)라고 한다.
윈도우의 작업 관리자, 맥에서의 활성 상태 보기를 통해 실행되고 있는 프로세스의 정보에 대해 확인해볼 수 있다.
해당 프로세스에 사용되고 있는 메모리, 스레드(Thread)의 수 등을 확인할 수 있다.
만일 사용자가 동일한 프로그램을 여러 번 실행했다면, 여러 개의 프로세스가 만들어진다.
이 각각의 프로세스는 서로 다른 별도의 프로세스이며 프로세스 내부 공간에 들어가는 값들도 달라진다.
✅ 스레드(Thread)
위의 맥 활성 상태 보기 사진을 보면 스레드 항목이 있는 것을 확인할 수 있다. 적게는 2개부터 많게는 82개까지 다양한 수의 스레드가 할당되어 있는 것을 확인할 수 있다.
스레드란 무엇일까?
🎯 스레드(Thread)의 탄생 배경
먼저 스레드는 프로세스의 한계로 인해 탄생했다.
지금 웹 서핑을 할 때에는 파일을 다운받는 일과 youtube를 동시에 보는 멀티 작업이 가능한 것이 당연하다.
하지만 이전에 스레드를 사용하지 않았을 때에는, 프로그램을 실행할 때 프로세스 하나만을 사용해서 이용했다.
그렇다보니 파일을 다운받는 작업이 시작되면, 해당 프로세스는 파일 다운로드 작업을 해야하기 때문에 다운로드가 완료될 때까지 다른 작업을 하지 못했다.
그렇다고 동일한 프로그램을 여러 개의 프로세스로 만들기엔 비용이 많이 들기 때문에 탄생하게 된 것이 바로 스레드(Thread)이다.
🎯 스레드(Thread)란?
스레드(Thread)란, 하나의 Process 내에서 동시에 진행되는 흐름의 단위를 이야기한다.
밑의 이미지를 보면 제일 위에 있는 프로세스인 IntelliJ IDEA만해도 할당되어 있는 스레드의 수가 무려 82개이다.
이처럼 하나의 프로세스 안에 적게는 2개 많게는 82개의 스레드가 프로세스에 할당되어 있는 것을 확인할 수 있다.
프로세스가 생성될 때 기본적으로 main Thread가 하나 생성되기 때문에, 하나의 프로세스는 반드시 하나 이상의 스레드를 갖는다.
🎯 Thread의 장점
- 응답성(Responsiveness)
프로세스가 여러 개의 스레드를 가지고 있다고 가정하자. 한 스레드에게 시간이 오래 소요되는 작업을 부여하여도, 다른 스레드가 있기 때문에 사용자에게 끊기지 않는 사용성을 제공할 수 있다. - 자원 공유의 용이성(Resource sharing)
프로세스 간에 자원을 공유하기 위해서는 공유 메모리(shared memory) 혹은 메세지 전달 기법(message passing)과 같은 방법을 이용해야 한다.
반면에 스레드는 해당 스레드가 속한 프로세스의 자원들을 공유하기 때문에, 프로세스에 비해 자원 공유에 용이하다.
- 경제성(Economy)
위에서 언급했다시피 스레드는 자신이 속한 프로세스의 자원들을 공유한다.
그렇기 때문에 프로세스를 생성을 위해 메모리와 같은 자원을 할당하는 것보다, 스레드를 생성하고 Context switching을 하는 것이 오버헤드가 더 적게 발생한다.
- 규모 적응성(Scalability)
다중 처리기 구조(Multi processor architecture)에서는 각각의 스레드가 다른 처리기(Processor)에서 병렬로 수행될 수 있다.
이번 포스팅에서는 프로그램, 프로세스, 스레드에 대한 간단한 개념에 대해 간단하게 알아보았다.
프로세스, 스레드와 관련해서 공부하다보니 포스팅한 내용 외에도 많은 내용들이 있었다. 이에 대해 하나씩 차근차근 정리해보려고 한다.
✅ 참고 자료 & 링크
- Operating System Concepts 에센셜 2판
- https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4
- https://velog.io/@klm03025/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4