개발자는 “프로그램”을 개발하는 사람이고, 영어로는 Programmer이다.
(디벨로퍼나 엔지니어나 테크니션 등등의 호칭은 잠시 잊자)
그렇다면 여기서 “프로그램” 이란 무엇일까?
무언가 수행할 수 있는 기능이 탑재된 어플리케이션, 혹은 실행할 수 있는 exe 파일 같은 것을 떠올렸다면 실제 정의와 거의 비슷하다!
- 프로세스(실행중인 프로그램)의 생성 및 실행 규칙들로 엮어진 파일
- 컴퓨터가 무엇을 하도록, 구체적으로 알려주는 명령문(명령어)들의 집합
1번 정의는 “프로세스”에 대해 알아야 할 것만 같으니 잠시 잊어두고
2번 정의에 대해 생각해보자.
컴퓨터가 어떤 동작을 하도록 구체적으로 알려주는 명령문, 즉 코드들의 집합이 곧 프로그램이라고 할 수 있다.
프로그램은 사용자가 더블 클릭을 하든 어떠한 방법으로든 실행 시킬 수 있는 동작 되기 전의 소스 코드인 것이다.
그렇다면 1번 정의에서 언급한 “프로세스”란 무엇일까?
(Windows 사용자의 경우 Ctrl + Alt + Delete 키, Mac 사용자의 경우 Cmd + Option + Esc 를 누르면 작업 관리자 창에서 현재 작업중인 프로세스 목록을 확인할 수 있다.)
- 실행중인 프로그램(메모리에 올려져, 실행중인 프로그램)
- 운영체제 커널이 정의하는 추상적인 존재
1번 정의는 굉장히 직관적이고 납득하기 쉽다!
프로그램이 실행된 상태를 프로세스라고 부른다는 심플한 정의이다.
그리고 프로세스는 실행된 프로그램의 인스턴스 이기때문에 프로그램이 실행되면 하나 이상의 프로세스가 생성됨을 기억하자.
하지만, 운영체제 및 프로그램 실행 방법에 따라서는 프로세스가 단 하나도 생성되지 않을 수도 있다.
2번 정의를 이해하기 위해서는 “커널”이라는 것에 대해 알아야 할 것 같다.
여기서 언급된 “커널”이란건 무엇일까?
커널 : 리소스 관리, 메모리 관리, 프로세스 관리, 인터럽트 처리 및 시스템 호출을 포함하여 운영 체제의 다른 부분과 응용 프로그램에 기본 서비스를 제공하는 운영 체제의 중심 구성 요소
커널은 한마디로 시스템 리소스를 관리하는 운영 체제의 핵심 요소이다.
특히 커널은 프로세스 생성 및 관리를 담당하는데, 그렇기에 2번 정의에서 프로세스가 커널이 정의하는 추상적인 존재라는 결론이 합당한 것이다.
프로그램이 실행되면 운영체제 내에 존재하는 커널이 프로세스를 생성하게 되고,
프로세스에는 프로세스 ID(PID)라고 하는 고유한 식별자와 고유의 메모리 공간과 시스템 리소스가 할당된다. 또한, 커널은 명령이 실행될 수 있도록 프로세스에 CPU 시간을 할당한다. 프로세스가 리소스를 효율적으로 사용하고 문제를 일으키지 않는지 확인하기 위해 모니터링 하는 역할도 한다.
프로세스가 실행을 완료하면 커널은 프로세스에 할당된 리소스를 할당 해제하고 프로세스를 종료한다.
완벽히 맞는 비유라 할 수는 없지만, 이해를 돕기 위해 현실 세계에 존재하는 것에 비유해보겠다.
실제로 커널은 프로세스만을 전담해서 관리하는 요소가 아님에 주의해서 읽어보자.
커널은 마치 헬스장 회원을 관리해주는 개인 전담 헬스 트레이너처럼 동작한다. 라고 비유할수도 있다.
헬스장 회원(프로세스)이 PT 등록을 하면(생성되면) 헬스 트레이너(커널)는 헬스장 회원(프로세스)에게 개인 락커(메모리 공간)를 부여하고 회원 고유 정보(PID)를 기록해둔다.
그리고 운동을 효율적으로 할 수 있도록(명령이 실행될 수 있도록) 식단과 운동 방법을 제공해준다.(CPU시간을 할당한다)
헬스 트레이너(커널)가 제공한 식단과 운동을 헬스장 회원(프로세스)이 잘 지키고 있는지(리소스를 효율적으로 사용하고 문제를 일으키지 않는지) 모니터링 하는 역할도 한다.
PT 기간이 끝나면(프로세스가 실행을 완료하면) 헬스 트레이너(커널)는 헬스장 회원(프로세스)에게 할당된 식단과 운동 방법에 대한 서비스(할당된 리소스)를 더이상 제공하지 않는다.(할당 해제하고 프로세스를 종료한다.)
스레드는 영어로 실, 줄기 등을 의미하는데 이것은 하나의 프로세스 내에서 하나의 흐름으로 동작하는 형태를 의미한다.
- 프로세스 내의 실행 단위
- 하나의 프로세스 내에서 더 작은 단위들로 각각 독립적으로 실행되며, 각각 제어가 가능한 흐름
스레드의 정의를 포함하고 앞서 언급했던 프로그램과 프로세스의 정의에 대해 정리하자면 위 그림과 같다.
프로그램을 실행하면 커널에 의해 프로세스가 생성되고 프로그램 코드가 스레딩 라이브러리 함수(Linux의 pthread_create() 또는 Windows의 CreateThread() )를 호출하여 프로세스 내부에 스레드가 생성되는 것이다.
프로세스 내에는 반드시 스레드가 하나 이상 존재한다.
그림과 같이 한 프로세스 내에 스레드가 1개 존재할 경우 싱글 스레드라고 불린다.
싱글 스레드는 다른 스레드에 의해 작업이 중단되지 않고 연속적으로 실행되며 싱글 스레드 내에 존재하는 실행 컨텍스트가 모든 작업을 받은 순서대로 순차적으로 수행하게 된다.
시스템과 아키텍처에 따라 싱글 스레드는 한 번에 하나의 작업만 수행할 수 있고 수행 중인 작업이 아무리 오래 걸린다 해도 해당 작업이 완료되기 전에는 다른 작업이 수행되지 않을 수 있다.
그렇지만 경우에 따라서는 작고 덜 복잡한 작업을 수행할 경우에는 싱글 스레드 방식이 간단하고 디버그하기 쉬우며 *오버헤드가 적다는 장점을 가질 수도 있다.
오버헤드 : 작업을 완료하는 데 꼭 필요한 것 이상으로 작업을 수행하는 데 필요한 추가 리소스 또는 시간
그렇다면 스레드, 프로세스 등이 여러 개인 경우는 어떻게 되는 것일까?
상상하자면 한 개일 때보다 일의 효율이 증대될 것 같은데 실제로는 어떨지 살펴보자.
멀티프로세스와 멀티스레드에 대한 개념을 알아보기 전에 멀티태스킹의 개념을 알고 넘어가자.
멀티태스킹 : 동시에 여러 작업을 실행하는 컴퓨터 시스템의 기능
멀티태스킹은 동시에 실행되어 “보이는” 것이지 같은 시간에 반드시 병렬로 실행되는 것이 아니라는 사실에 유의해야 한다.
우리는 평소에 컴퓨터를 사용할 때 크롬 브라우저, 유튜브, 카카오톡, vscode 같은 여러 프로그램을 동시에 실행할 수 있다.
멀티프로세스는 컴퓨터 시스템에서 동시에 실행되는 여러 프로세스와 관련된 멀티태스킹의 한 형태이다.
위 그림과 같이 컴퓨터에서 다양한 프로그램을 실행할 경우 작업관리자 창의 프로세스 탭에서 현재 실행중인 프로세스들을 확인할 수 있는데, 이와 같이 1개 이상의 프로세스들이 있는것을 멀티 프로세스라고 한다.
위 그림과 같이 각 프로세스에는 자체 메모리 공간과 시스템 리소스가 있으며 다른 프로세스와 독립적으로 실행할 수 있다.
이 접근 방식에서 각 프로세스는 별도의 프로세서 코어에서 실행될 수 있고 동시에 실행될 수 있으므로 시스템 성능과 응답성이 향상된다. 여러 프로세스가 여러 CPU 코어에서 병렬로 실행될 수 있으므로 CPU 시간을 효율적으로 사용할 수 있다.
멀티태스킹은 실제로 병렬 수행되는 것이 아니라 동시에 수행되는 것처럼 보이는 현상이지만
멀티프로세스는 1. 실제로 병렬 수행됨 2. 동시에 실행되는 것처럼 보임 모두를 포함하는 것이다.
1번의 실제로 병렬 수행되는 것은 두 개 이상의 프로세서(CPU 코어)가 동시에 하나 이상의 작업(Task)을 공동으로 처리하는 것을 의미한다.
(Windows 사용자라면 내 컴퓨터의 코어 수를 window키 → 시스템 정보 메뉴에서 확인 가능하다.)
2번의 동시에 실행되는 것처럼 보임은 컨텍스트 스위칭과 시분할 시스템에 의한것이기 때문에 이 개념들을 알아야 이해할 수 있으므로 컨텍스트 스위칭과 시분할 시스템에 대해 알아보도록 하자.
컨텍스트 스위칭 : 실행 중인 프로세스 또는 스레드의 상태를 저장하고 복원하여 나중에 동일한 지점에서 실행을 재개할 수 있도록 하는 프로세스
멀티태스킹 운영 체제에서 컨텍스트 스위칭은 CPU의 실행을 한 프로세스나 스레드에서 다른 프로세스나 스레드로 전환하는 데 사용된다. 즉, 멀티프로세스 뿐만 아니라 멀티스레드에서도 적용되는 동작 원리 인 것이다.
프로세스 또는 스레드가 CPU에서 실행 중일 때 레지스터 세트, 프로그램 카운터 및 스택 포인터의 값을 포함하는 실행 컨텍스트가 메모리에 저장된다.
레지스터 세트, 프로그램 카운터 및 스택 포인터에 대한 자세한 개념은 다루지 않겠지만 실행 컨텍스트가 무엇인지는 알아두면 좋으니 이전에 작성한 실행 컨텍스트 글을 참고하길 바란다.
그런 다음 다른 프로세스나 스레드의 실행 컨텍스트가 로드되어 CPU에서 실행될 수 있다.
이러한 프로세스를 컨텍스트 스위칭이라고 한다.
컨텍스트 스위칭은 멀티프로세스 또는 멀티스레드가 CPU를 공유하고 동시에 실행할 수 있게 하므로 멀티태스킹 운영 체제에서 중요한 메커니즘이다. 프로세스 및 스레드의 스케줄링을 관리하는 운영 체제의 커널에 의해 수행되며, 실행 컨텍스트가 저장되는것과 다음 프로세스/스레드가 로드되는 과정을 모두 포함하여 동작한다.
컨텍스트 스위칭은 프로세스나 스레드의 컨텍스트를 저장하고 복원하는 작업을 포함하므로 상대적으로 비용(실행 컨텍스트를 복원하는 데 필요한 시간과 시스템 리소스)이 많이 드는 작업이다. 일정량의 시간과 CPU 주기가 필요하므로 운영 체제는 스케줄링 알고리즘을 최적화하여 컨텍스트 스위칭의 수를 최소화하려고 한다.
요약하면 컨텍스트 스위칭은 실행 중인 프로세스 또는 스레드의 상태를 저장 및 복원하는 프로세스로, 여러 프로세스 또는 스레드가 CPU를 공유하고 멀티태스킹 운영 체제에서 동시에 실행할 수 있다.
CPU의 처리 시간을 아주 짧게 세분화하여 각 사용자의 프로그램에 할당하여 차례 차례로 복수의 처리를 실행한다. 각 사용자는 마치 컴퓨터를 독점하고 있는 것처럼 사용한다.
시간을 매우 작게 분할해서 사용하기 때문에 시분할 이라는 이름이 붙었다.
이제 멀티프로세스는 1. 실제로 병렬 수행됨 2. 동시에 실행되는 것처럼 보임 모두를 포함하는 개념이라는 사실을 온전히 이해할 수 있게 되었다!
한마디로 압축하자면 프로그램 내에서 발생하는 프로세스의 멀티태스킹이라고 할 수 있다.
멀티스레드란 하나의 프로세스 내에서 실행되는 여러 스레드를 포함하는 멀티태스킹의 한 형태이다.
각 스레드는 프로세스 내에서 별도의 실행 경로이며 다른 스레드와 동시에 실행할 수 있다.
여러 스레드가 여러 CPU 코어에서 병렬로 실행될 수 있으므로 CPU 시간을 효율적으로 사용할 수 있다.
멀티스레드는 실제로 여러 CPU 코어에서 병렬로 실행될 수 있으며 각 스레드는 별도의 코어에서 동시에 실행된다.
하지만 싱글 코어 시스템에서 멀티스레드는 시분할 시스템 및 컨텍스트 스위칭을 사용하여 동시에 실행되는 것처럼 보일 수 있다. 여기서의 CPU는 여러 스레드 사이를 전환하여 병렬 실행인 것처럼 보이게 해준다.
프로그램(Program) : 컴퓨터가 어떤 동작을 하도록 구체적으로 알려주는 명령문, 즉 코드들의 집합
프로세스(Process) : 메모리에 올려져 실행 중인 프로그램
스레드(Thread) : 프로세스 내의 실행 단위이며, 하나의 프로세스 내에서 더 작은 단위들로 각각 독립적으로 실행되는 각각 제어가 가능한 흐름
멀티프로세스
멀티스레드
-끝
참고한 자료
https://hanamon.kr/프로그램-프로세스-스레드-멀티스레드/
https://velog.io/@gparkkii/ProgramProcessThread
https://learn.microsoft.com/ko-kr/windows/win32/procthread/processes-and-threads
http://www.ktword.co.kr/test/view/view.php?m_temp1=2299 [스레드]
http://www.ktword.co.kr/test/view/view.php?no=5061 [프로세스]
http://www.ktword.co.kr/test/view/view.php?m_temp1=408&id=522 [커널]
http://terms.tta.or.kr/dictionary/dictionaryView.do?subject=시분할+시스템 [시분할 시스템]
http://www.ktword.co.kr/test/view/view.php?m_temp1=5710&id=500 [프로그램]
http://www.ktword.co.kr/test/view/view.php?m_temp1=302&id=1208 [IPC]
http://www.ktword.co.kr/test/view/view.php?m_temp1=6402&id=1157 [프로세스 메모리]
https://inpa.tistory.com/entry/👩💻-프로세스-⚔️-쓰레드-차이
https://livenow14.tistory.com/67