티스토리 뷰
멀티태스킹과 멀티프로세싱
단일 프로그램 실행
만약 프로그램을 2개 이상 동시에 실행한다고 가정해보자. 예를 들어서 음악 프로그램을 통해 음악을 들으면서, 동시에 워드 프로그램을 통해 문서를 작성하는 것이다. 여기서는 연산을 처리할 수 있는 CPU 코어가 1개만 있다고 가정하겠다.
프로그램의 실행이란, 프로그램을 구성하는 코드를 순서대로 CPU에서 연산(실행)하는 일이다. 위 이미지에서 CPU 코어는 하나이기 때문에 한 번에 하나의 프로그램 코드만 실행할 수 있다. 만약 하나의 프로그램 안에 있는 코드를 모두 완료한 후에야 다른 프로그램의 코드를 실행할 수 있다면 사용자는 매우 불편할 것이다. 바로 이러한 문제를 해결하기 위해 하나의 CPU 코어로 여러 프로그램을 동시에 실행하는 "멀티태스킹" 기술이 등장했다.
멀티태스킹
순서대로 촬영한 연속된 사진을 빠르게 교차해서 보여줄 경우 사람은 이를 움직이는 영상으로 인지한다. 우리가 애니메이션을 볼 때 1초에 30 ~ 60장의 사진이 지나가는데, 바로 이 원리를 이용한 것이다. 이 정도 속도면 사람은 사진이 아니라 연속해서 움직이는 영상으로 인지한다. 이렇듯 만약 CPU가 매우 빠르게 두 프로그램의 코드를 번갈아 수행한다면, 사람이 느낄 때 두 프로그램이 동시에 실행되는 것 처럼 느껴질 것이다
이 방식은 CPU 코어가 프로그램A의 코드를 0.01초 정도 수행하다가 잠시 멈추고, 프로그램B의 코드를 0.01초 정도 수행한다. 그리고 다시 프로그램A의 이전에 실행중인 코드로 돌아가서 0.01초 정도 코드를 수행하는 방식으로 반복 동작한다. 이렇게 각 프로그램의 실행 시간을 분할해서 마치 동시에 실행되는 것 처럼 하는 기법을 시분할(Time Sharing, 시간 공유) 기법이라 한다. 이런 방식을 사용하면 CPU 코어가 하나만 있어도 여러 프로그램이 동시에 실행되는 것 처럼 느낄 수 있다.
이렇게 하나의 컴퓨터 시스템이 동시에 여러 작업을 수행하는 능력을 멀티태스킹(Multitasking)이라 한다.
멀티 프로세싱
CPU 안에는 실제 연산을 처리할 수 있는 코어라는 것이 있다. 과거에는 하나의 CPU 안에 보통 하나의 코어만 들어 있었기 때문에 CPU와 코어를 따로 분리해서 이야기하지 않았으나, 최근에는 하나의 CPU 안에 보통 2개 이상의 코어가 들어있다.
- CPU 코어가 2개이므로 물리적으로 동시에 2개의 프로그램을 처리할 수 있다.
- 여기서는 CPU 코어가 먼저 프로그램A와 프로그램B를 실행한다.
- CPU 코어들이 프로그램A와 프로그램B를 실행하다가 잠시 멈추고, 프로그램C와 프로그램A를 수행한다. 이런식으로 코어가 2개여도 2개보다 더 많은 프로그램을 실행할 수 있다.
멀티프로세싱(Multiprocessing)은 컴퓨터 시스템에서 둘 이상의 프로세서(CPU 코어)를 사용하여, 여러 작업을 동시에 처리하는 기술을 의미한다. 멀티프로세싱 시스템은 하나의 CPU 코어만을 사용하는 시스템보다 동시에 더 많은 작업을 처리할 수 있다.
멀티프로세싱 vs. 멀티태스킹
멀티프로세싱은 하드웨어 장비의 관점이고, 멀티태스킹은 운영체제 소프트웨어의 관점이다.
- 멀티프로세싱
- 여러 CPU(여러 CPU 코어)를 사용하여 동시에 여러 작업을 수행하는 것을 의미한다. 하드웨어 기반으로 성능을 향상시킨다.
- 예: 다중 코어 프로세서를 사용하는 현대 컴퓨터 시스템
- 멀티태스킹
- 단일 CPU(단일 CPU 코어)가 여러 작업을 동시에 수행하는 것처럼 보이게 하는 것을 의미한다. 소프트웨어 기반으로 CPU 시간을 분할하여 각 작업에 할당한다.
- 예: 현대 운영 체제에서 여러 애플리케이션이 동시에 실행되는 환경
프로세스와 스레드
프로세스
프로세스는 실행 중인 프로그램의 인스턴스이다. 각 프로세스는 독립적인 메모리 공간을 갖고 있으며, 운영체제에서 별도의 작업 단위로 분리해서 관리된다. 각 프로세스는 별도의 메모리 공간을 갖고 있기 때문에 서로 간섭하지 않으며, 프로세스가 서로의 메모리에 직접 접근할 수 없다. 프로세스는 이렇듯 서로 격리되어 관리되기 때문에, 하나의 프로세스가 충돌해도 다른 프로세스에는 영향을 미치지 않는다. 특정 프로세스(프로그램)에 심각한 문제가 발생하면 해당 프로세스만 종료되고, 다른 프로세스는 정상적으로 동작하는 이유가 그 때문이다.
프로세스의 메모리 구성
- 코드 섹션: 실행할 프로그램의 코드가 저장되는 부분
- 데이터 섹션: 전역 변수 및 정적 변수가 저장되는 부분(그림에서 기타에 포함)
- 힙 (Heap): 동적으로 할당되는 메모리 영역
- 스택 (Stack): 메서드(함수) 호출 시 생성되는 지역 변수와 반환 주소가 저장되는 영역(스레드에 포함)
스레드
스레드는 프로세스 내에서 실행되는 작업의 단위이다. 한 프로세스 내에서 여러 스레드가 존재할 수 있으며, 이들은 프로세스가 제공하는 동일한 메모리 공간을 공유한다. 스레드는 프로세스보다 단순하므로 생성 및 관리가 단순하고 가볍다는 특징이 있다.
메모리 구성
- 공유 메모리: 같은 프로세스의 코드 섹션, 데이터 섹션, 힙(메모리)은 프로세스 안의 모든 스레드가 공유한다.
- 개별 스택: 각 스레드는 자신의 스택을 갖고 있다.
프로그램이 실행된다는 것은 어떤 의미일까?
프로그램을 실행하면 운영체제는 먼저 디스크에 있는 파일 덩어리인 프로그램을 메모리로 불러오면서 프로세스를 만든다. 프로그램이 실행된다는 것은 사실 프로세스 안에 있는 코드가 한 줄씩 실행되는 것이다. 자바에서의 코드는 보통 main()
부터 시작해서 하나씩 순서대로 내려가면서 실행된다.
public class Operator {
public static void main(String[] args) {
int sum1 = 1;
int sum2 = sum1 + 1;
System.out.println("sum1 = " + sum1);
System.out.println("sum2 = " + sum2);
}
}
스레드는 프로세스 내에서 실행되는 작업의 단위이다. 한 프로세스 내에 하나의 스레드가 존재할 수 있고, 한 프로세스 내에 여러 스레드가 존재할 수도 있다. 그리고 스레드는 프로세스가 제공하는 동일한 메모리 공간을 공유한다.
스레드와 스케줄링
좀 더 자세한 설명을 위해 CPU 코어는 1개이고, 프로세스가 2개라고 가정하겠다. 프로세스 A는 스레드 1개, 프로세스 B는 스레드가 2개라면 아래와 같이 실핼될 것이다.
- 프로세스 A에 있는 스레드 A1을 실행한다.
- 프로세스 A에 있는 스레드 A1의 실행을 잠시 멈추고 프로세스 B에 있는 스레드 B1을 실행한다.
- 프로세스 B에 있는 스레드 B1의 실행을 잠시 멈추고 같은 프로세스의 스레드 B2를 실행한다.
- 이후에 프로세스 A에 있는 스레드 A1을 실행한다.
- 이 과정을 반복한다.
단일 코어 스케줄링
운영체체가 스레드를 어떻게 스케줄링 하는지, 스케줄링 관점으로 알아보자. 운영체제는 내부에 스케줄링 큐를 가지고 있고, 각각의 스레드는 스케줄링 큐에서 대기한다.
- 스레드A1, 스레드B1, 스레드B2가 스케줄링 큐에 대기한다.
- 운영체제는 스레드 A1을 큐에서 꺼내고 CPU를 통해 실행한다.
- 이때 스레드 A1이 프로그램의 코드를 수행하고, CPU를 통한 연산도 일어난다.
- 운영체제는 스레드A1을 잠시 멈추고, 스케줄링 큐에 다시 넣는다.
- 운영체제는 스레드 B1을 큐에서 꺼내고 CPU를 통해 실행한다.
- 이런 과정을 반복해서 수행한다.
멀티 코어 스케줄링
CPU 코어가 2개 이상이면 한 번에 더 많은 스레드를 물리적으로 진짜 동시에 실행할 수 있다.
- 스레드A1, 스레드B1, 스레드B2가 스케줄링 큐에 대기한다.
- 스레드A1, 스레드B1을 병렬로 실행한다. 스레드B2는 스케줄링 큐에 대기한다.
- 스레드 A1의 수행을 잠시 멈추고, 스레드 A1을 스케줄링 큐에 다시 넣는다.
- 스케줄링 큐에 대기 중인 스레드 B1을 CPU 코어1에서 실행한다.
- 물론 조금 있다가 CPU 코어2에서 실행중인 스레드 B2도 수행을 멈추고, 스레드 스케줄링 큐에 있는 다른 스레드가 실행 될 것이다.
- 이런 과정을 반복해서 수행한다.
CPU에 어떤 프로그램이 얼마만큼 실행될지는 운영체제가 결정하는데 이것을 스케줄링(Scheduling)이라 한다. 이때 단순히 시간으로만 작업을 분할하지는 않고, CPU를 최대한 활용할 수 있는 다양한 우선순위와 최적화 기법을 사용한다.
멀티태스킹과 스케줄링
- 멀티태스킹이란 동시에 여러 작업을 수행하는 것을 말한다. 이를 위해 운영체제는 스케줄링이라는 기법을 사용한다. 스케줄링은 CPU 시간을 여러 작업에 나누어 배분하는 방법이다.
프로세스와 스레드
- 프로세스는 실행 중인 프로그램의 인스턴스이다. 각 프로세스는 독립적인 메모리 공간을 가지며, 운영체제에서 독립된 실행 단위로 취급된다.
- 스레드는 프로세스 내에서 실행되는 작은 단위이다. 여러 스레드는 하나의 프로세스 내에서 자원을 공유하며, 프로세스의 코드, 데이터, 시스템 자원등을 공유한다. 실제로 CPU에 의해 실행되는 단위는 스레드이다.
프로세스의 역할
- 프로세스는 실행 환경을 제공한다. 여기에는 메모리 공간, 파일 핸들, 시스템 자원(네트워크 연결) 등이 포함된다. 이는 프로세스가 컨테이너 역할을 한다는 의미이다.
- 프로세스 자체는 운영체제의 스케줄러에 의해 직접 실행되지 않으며, 프로세스 내의 스레드가 실행된다. 참고로 1개의 프로세스 안에 하나의 스레드만 실행되는 경우도 있고, 1개의 프로세스 안에 여러 스레드가 실행되는 경우도 있다.
'Study' 카테고리의 다른 글
[AWS] Solution Architect Associate(SAA-C03) 취득 (1) | 2023.06.12 |
---|---|
[Design Pattern] 옵저버 패턴 & 이터레이터 패턴 (0) | 2022.09.15 |
[데이터베이스] RDB와 NoSQL의 차이는? (0) | 2022.08.24 |
[운영체제] 가상 메모리 (Virtual Memory) (0) | 2022.08.22 |
[운영체제] 메모리 관리 기법 - 페이징 & 세그멘테이션 (0) | 2022.08.21 |
- Total
- Today
- Yesterday
- Spring
- leetcode
- 백준
- 스프링부트
- mysql 8.0
- 코테
- 정렬
- 노마드
- kotlin
- 문자열
- Algorithm
- 김영한
- spring boot
- 노마드코더
- 릿코드
- 구현
- Real MySQL
- 코틀린
- webflux
- 북클럽
- 스프링
- 알고리즘
- 그리디
- MySQL
- 데이터베이스
- 리팩토링
- 스프링 부트
- 자료구조
- 인프런
- 파이썬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |