용어정리
프로그램(Program)
어떤 작업을 위해 운영체제 위에서 실행할 수 있는 파일
ex) 웹 브라우저, 워드 프로세서, 카카오톡 등
프로세스(Process)
운영 체제 위에서 실행중인 프로그램
프로그램 명령어와 데이터들이 메모리에 올라오고
실행 중 또는 실행 대기중인 상태
프로세서(Processor)
프로세스가 동작될 수 있도록 하는 하드웨어(=CPU)
동작
프로그램의 자원들이 메모리에 올라오고, 실행 되어야 할 코드의
메모리 주소를 CPU의 레지스터로 올리는 것
실행 단위
- cpu core에서 실행하는 하나의 단위로 프로세스와 스레드를 포괄하는 개념
하나의 cpu core에 한순간에 한개씩 적재되는 것
실행 단위는 프로세스일 때도 있고 쓰레드 일 수도 있습니다.
(부연 설명이 없는)프로세스
- 하나의 스레드만 가지고 있는 단일 스레드 프로세스
프로세스와 스레드는 완전히 다른 무엇인가가 아닙니다.
동시성
- 한 순간에 여러가지 일이 아니라, 짧은 전환으로 여러가지 일을
동시에 처리하는것처럼 보이는 것
멀티태스킹의 진실
CPU(프로세서)는 한순간에 하나의 프로세스만 실행할 수 있습니다.
하지만 위 사진에서 볼 수 있듯 작업관리자를 확인하면
현재 실행중인 스레드와 프로세스 수를 확인할 수 있습니다.
한순간에 여러가지의 작업을 하는것처럼 보입니다.
그 이유는 운영체제가 짧은 시간에 수십번에서 수천번
실행할 프로세스를 교체하고 있기 때문입니다.
우리는 동시에 여러 개의 작업이 실행되고 있다고 느끼는 것입니다.
프로세스 상태
운영 체제가 각 프로세스들을 스위칭 하면서 작업을 하기 위해서
프로세스의 상태들을 알 수 있어야 합니다.
이 그림은 프로세스가 가지는 상태들에 대해서 간략하게 나타냅니다.
프로세스가 실행되면 Ready 상태가 되고,
스케줄링에 의해서 작업이 할당되면 Run 상태가 되어 작업이 진행됩니다.
Run상태가 할당받은 시간이 끝나게되면 다시 Ready상태로 돌아가고
Run상태에서 작업도중 I/O작업을 만나게되면 I/O작업을 요청하고
Blocked 상태에 빠지게 됩니다.
PCB(Process Control Block)
운영체제가 스케줄링을 하면서 프로세스를 스위칭 하기위해서는
프로세스의 상태 뿐만 아니라 어떤 프로세스를 어디까지 실행했는지도
알아야 합니다. 그러한 프로세스를 제어하기 위한 정보 모음을 PCB라고 합니다.
Context Switching
아래와 같이 두가지 작업이 진행중이라고 가정해봅시다.
Task1에서 Task2로 Task2에서 Task1로 교체되는 시점마다
Task1이 Run상태에서 Ready상태로 돌아간다는 정보와
어디까지 진행되었는지, Task2에서 어디부터 시작하면 되는지에 대한
정보들을 로딩할 시간이 필요하게 됩니다.
이 순간을 바로 Context Switching이라고 합니다.
프로그램과 프로세스
프로세스와 스레드 설명 전 프로그램과 프로세스를 알아봅시다.
예를 들어 피자를 먹으러 피자집에 가서 피자를 주문하고
기다리고 있는데 갑자기 피자 레시피가 적힌 종이를 준다면?
말이 안되는 상황입니다.
여기서 이 레시피는 우리가 열심히 구현하고 있는 코드파일 입니다.
이것을 프로그램 이라고 합니다.
하지만, 이 프로그램 자체는 실행시키기 전에는 그저 코드가 구현 되어있는
파일일 뿐입니다. 이것을 사용하기 위해서는 실행이 되어서 사용할 수 있는
무언가가 되어야 합니다.
이것을 프로세스 라고합니다.
그렇다면 프로그램이 프로세스가 되면서 어떤일이 일어날까요?
총 두가지 일이 일어납니다. 간단하게 알아봅시다.
1. 프로세스가 필요로 하는 재료들이 메모리에 올라가야 합니다.
그 메모리는 Code, Data, Heap, Stack 영역으로 나누어집니다.
2. 해당 프로세스에 대한 정보를 담고 있는 PCB 블럭이
프로세스 생성시 함께 만들어집니다.
Pointer : 프로세스상태 중에 준비상태나 대기상태의 큐를 구현하기 위해 필요한 것
process State : 현재 프로세스 상태를 담는 역할
PID : 고유번호를 담는 역할
Program Counter : 다음 명령어를 가르키는 역할
Process & Thread
대부분의 사람들은 업무를 하며 PC카카오톡, Slack, IDE, 웹브라우저 등등
하나의 프로세스만 사용하기 보다는 여러 가지를 동시에 사용하고 싶어합니다.
하지만, 원래 한 프로세스가 실행되기 위해서 CPU를 점유하고 있다면
다른 프로세스는 실행상태에 있을 수가 없습니다.
다수의 프로세스를 동시에 실행하기 위해 여러 개의 프로세스를
시분할로, 즉 짧은 텀을 반복하면서 전환해서 실행을 시키도록 합니다.
이것이 바로 컨텍스트 스위칭 입니다.
단 두개의 프로세스 컨텍스트 스위칭을 보아도 굉장히 힘든 작업입니다.
그래서 등장을 하는게 경량화된 프로세스 버전인 Thread입니다.
Thread가 왜 경량화된 프로세스인가?
하나의 프로세스 안에 다수의 스레드가 있을 때
공유되는 자원이 있기때문입니다.
여기서 스레드는 코드, 데이터, 힙 영역을 공통된 자원으로 사용합니다.
즉, 각 스레드는 스택 부분만을 따로 가지고 있습니다.
공유되는 자원이 있기때문에 컨텍스트 스위칭이 일어날 때
캐싱 적중률이 올라갑니다.
쉽게 말하면, 모조리 다 빼고 다시 다 넣을 필요가 없다는 뜻입니다.
예를들면, 하나의 회의실을 사용하기 위해
A팀은 스피커, 모니터, 리모콘 등등을 사용합니다.
이후 다음 회의가 예정된 B팀이 들어오게 됩니다.
여기서 이전에 프로세스 컨텍스트 스위칭 같은 경우는
어차피 사용할 자원인 스피커, 모니터, 리모콘을 모두 챙겨서
나가버리는것과 같습니다.
B팀은 다시 스피커 등을 챙겨와야지만 사용할 수 있게됩니다.
하지만 스레드 컨텍스트 스위칭 같은 경우는
공용으로 사용할 것들은 두고 개인 노트북만 가지고와서 연결하면 됩니다.
훨씬 간단하고 부담이 적은 과정입니다.
Multi - Process & Multi - Thread
멀티프로세스와 멀티스레드 두가지 개념 모두
처리방식의 일종입니다.
즉, 한 어플리케이션에 대한 처리방식이라고 생각하면 됩니다.
단순히 여러 프로그램을 띄워 놓은 것을 멀티프로세스 라고 이야기를 한다면
멀티스레드와 비교하여 이해하기 힘들어집니다.
멀티 프로세스와 멀티 스레드는 한 어플리케이션에 대한
두 가지 다른 처리방식 입니다.
한 어플리케이션이 여러가지 일을 처리할 때가 있습니다.
예를들어 여러 사용자가 로그인을 요청하는 상황에서
한 프로세스는 매번 하나의 로그인만 처리할 수 있기 때문에
동시에 처리할 수 없습니다.
그래서 부모 프로세스가 fork하여 자식프로세스를 여러 개 만들어서
일을 처리하도록 만듭니다.
이 때 자식 프로세스는 부모와 별개의 메모리 영역을 확보하게 됩니다.
Multi - Thread
한 프로세스 내에서 구분지어진 실행 단위입니다.
만약 프로세스가 다수의 스레드로 구분되어 있지 않으면
단일스레드 하나로 프로세스가 실행됩니다.
이때 실행 단위는 프로세스 그 자체가 됩니다.
즉, 해당 프로세스의 하나밖에 없는 스레드가 실행 단위가 됩니다.
프로세스 내에서 분리해서 여러 스레드로 나뉘어서 실행단위가 나누어지면
그것이 멀티 스레드가 됩니다.
ex) 코드를 수정하는 동시에 IDE가 추천 코드를 보여줍니다.
테스트 코드를 실행 중 소스코드를 수정할 수 있습니다.
이렇게 한 어플리케이션에 대한 작업의 단위가 나누어질 때가 많습니다.
이때 각각의 스레드가 그 작업들을 담당합니다.
Multi - Process와 Multi - Thread의 차이점
Multi - Process
1. 각 프로세스는 독립적이다.
2. IPC를 사용한 통신을 해야한다.
3. 자원 소모적, 개별 메모리 차지
4. Context Switching 비용이 크다.
5. 동기화 작업이 필요하지 않다.
각 프로세스는 독립적이기 떄문에 IPC를 사용하여 통신해야 합니다.
같은 작업을 두명이 두개의 다른 회의실에서 진행하다가
논의할 일이 생기면 밖으로 나와서 이야기하고 다시 들어가는 것입니다.
Multi - Thread
1. 스레드끼리 긴밀하게 연결되어 있다.
2. 공유된 자원으로 통신 비용이 절감된다.
3. 공유된 자원으로 메모리가 효율적이다.
4. Context Switching 비용이 적다.
5. 공유 자원 관리를 해야한다.
두명이 한 회의실에서 일을 처리하고 있기 때문에
논의할 일이 생기면 그냥 말만걸면 됩니다.
이렇게 차이점을 비교하면 멀티프로세스보다 멀티스레드가 훨씬 더 좋아 보이는데
왜 멀티프로세스를 사용하는 것일까요?
Multi - Process는 왜 사용하는가?
여러 개의 탭에 중요한 정보들을 띄워놓고 작업을 하다보면
해당 이미지와 같은 오류 화면을 만나기도 합니다.
가만히 기다리다 보면 창 전체가 꺼지게 됩니다.
이것은 멀티스레드를 사용했기 때문입니다.
긴밀하게 연결되어 있기 때문에 하나의 스레드에 문제가 생기면
전체 프로세스에 영향이 가게됩니다.
반면, 구글 크롬은 멀티프로세스를 이용하기 때문에
영향을 덜 받게됩니다.
Multi - Core
멀티프로세스와 멀티스레드는 '처리방식'의 일종이기 때문에
소프트웨어 분야에 가깝고
멀티코어는 조금 더 하드웨어 측면에 가깝습니다.
멀티코어와 관련된 키워드는 동시성과 병렬처리 입니다.
싱글 코어를 가진 CPU가 실행 단위를 처리 할 때는
동시에 여러 가지가 진행되기 위해서 빠른 텀으로 전환되면서
실행됩니다. 이것이 동시성 입니다.
동시성은 짧은 순간에 CPU의 시간을 분할하여
여러 실행 단위를 번갈아 실행하면서 동시에 일어나는것처럼 보이게 합니다.
하지만 멀티코어는 병렬처리 즉, 물리적으로 여러 코어를 사용하여
다수의 실행단위를 한순간에 동시에 처리할 수 있게 해주는것입니다.
다수의 프로세스로 여러가지 일을 각 코어에서 진행합니다.
요약
1. 프로세스는 프로그램이 실행된 것이다.
2. 스레드는 한 프로세스 내에서 나뉘어진 하나 이상의 실행 단위이다.
3. 한 어플리케이션에 대한 작업을 동시에 하기 위해서는
2가지 처리방식(멀티 프로세스, 멀티 스레드)이 있다.
4.동시에 실행이 되는 것처럼 보이기 위해서 실행 단위는 시분할로
CPU를 점유하여 context switching을 한다.
5. 멀티 프로세스는 독립적인 메모리를 가지고 있지만
멀티 스레드는 자원을 공유한다. 그것에 따른 장단점이 존재한다.
6. 멀티 코어는 하드웨어 측면에서 실행 단위를
병렬적으로 처리할 수 있도록 여러 프로세서가 있는 것이다.
우리가 구현화한 코드(프로그램)들이 실행되면 그것이 프로세스가 됩니다.
그걸 경량화 해야합니다 왜냐? 하나가 처리하면 자원이 많이 듭니다.
그래서 그걸 분산해서 처리합니다.
프로세스가 (자원,메모리) 리소스 낭비를 줄이기 위해
순서를 가지도록 한게 스레드입니다.
정리
프로세스 : 구현된 코드를 실행했을때 메모리에서 수행하는 것
즉, 프로그램이 실행된 것
쓰레드 : 프로세스가 동작 할 때 그것을 할당 받아 자원을 사용하는 것 ( 리소스 낭비를 줄임 )
출처 : 테코톡 유튜브
https://www.youtube.com/watch?v=1grtWKqTn50&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=57
https://www.youtube.com/watch?v=DmZnOg5Ced8
'프로그래밍 공부 > 컴퓨터공학 기초' 카테고리의 다른 글
쿠키(Cookie), 세션(Session), 토큰(Token) (0) | 2022.01.18 |
---|---|
인증(Authentication)과 인가(Authorization)란 무엇인가? (0) | 2022.01.17 |
TCP/IP, 3, 4Way HandShaking (0) | 2022.01.06 |
XML, JSON, YAML이 무엇인가? (0) | 2021.12.19 |
OSI 7 Layer (계층) (0) | 2021.12.19 |