[개인공부] 멀티스레드와 프로세서

Walter Mitty·2024년 11월 10일
0

공부

목록 보기
1/1

멀티태스킹과 멀티프로세싱

단일 프로그램 실행

만약 코어가 1개인 CPU에서 프로그램 A, B를 동시에 실행한다고 가정하면 프로그램 A의 코드들이 먼저 실행(연산)되고, 그리고 나서 프로그램 B의 코드들이 실행된다.

  • 프로그램 실행 : CPU에서 프로그램을 구성하는 코드를 순서대로 연산(실행)하는 일이다.
    • 이 때 하나의 프로그램 안에 있는 코드를 모두 실행 후에야 다른 프로그램의 코드를 실행 할 수 있다.

이를 해결하기 위해 하나의 CPU 코어로 여러 프로그램을 동시에 실행하기 위해 등장한 기술이 바로 멀티태스킹 이다.

멀티태스킹

위에는 프로그램 A의 코드들이 모두 실행된 후에야 프로그램 B의 코드들이 실행되었지만, 멀티태스킹에서는 프로그램 A의 코드를 0.01초 정도 수행하다가 잠시 멈추고, 프로그램 B 코드를 0.01초 정도 수행, 다시 A 코드를 0.01초 ... 이런식으로 번갈아가면서 실행을 하는데 이 실행속도가 매우 빨라 동시에 실행되는 것 처럼 하는 기법을 시분할(Time Sharing, 시간 공유) 기법이라 한다.
이런 방식을 사용하면 CPU 코어가 하나만 있어도 여러 프로그램이 동시에 실행되는 것 처럼 느낄 수 있다.

스케줄링(Scheduling)은 CPU에 어떤 프로그램이 얼마만큼 실행될지 운영체제가 결정하는 것이다.
CPU를 퇴대한 활용할 수 있는 다양한 우선순위와 최적화 기법이 사용된다고 한다.

멀티프로세싱

위에 멀티 태스킹은 하나의 CPU에서 프로그램 A,B가 실행될 때 였다면 CPU 코어가 둘 이상일 땐 어떨까?
프로그램 A,B,C가 있고 CPU 코어는 2개라고 가정해보자.

CPU 코어가 2개이므로 물리적으로 동시에 2개의 프로그램을 처리할 수 있게 되는데,
CPU 2개의 코어를 각 각 CPU 코어1, CPU 코어2라고 생각해보자.
CPU 코어1에서 프로그램 A의 코드1을 실행함과 완전 동시에 프로그램 B의 코드1을 실행한다.
그리고 나서 프로그램 C의 코드 1, 프로그램 A의 코드 2 를 실행...

3개의 프로그램이 2개의 CPU에서 동시에 실행하는 것 처럼 보일 정도로 빠르게 연산이 되는게 아니라 완전 동시에 각 CPU에서 동시에 연산되어 더 많은 프로그램을 실행할 수 있다.

위에서 예시를 든대로, 멀티프로세싱(Multiprocessing) 은 컴퓨터 시스템에서 둘 이상의 프로세서(CPU 코어)를 사용하여 여러 작업을 동시에 처리하는 기술을 의미한다.
하나의 CPU 코어만을 사용하는 시스템보다 동시에 더 많은 작업을 처리할 수 있게된다!

멀티태스킹멀티프로세싱
단일 CPU(코어)가 여러 작업을 동시 수행하는 것 처럼 보임여러 CPU(코어)를 사용하여 동시에 여러 작업을 수행
소프트웨어 기반으로 CPU 시간을 분할하여 각 작업에 할당(스케줄링)하드웨어 기반으로 성능을 향상
예: 현태 운영 체제에서 여러 애플리케이션이 동시에 실행되는 환경예: 다중 코어 프로세서를 사용하는 현대 컴퓨터 시스템

참고오 이 예는 여러 CPU 코어를 사용하기 때문에 멀티프로세싱이다. 동시에 각각의 단일 CPU 코어에 여러 작업을 분할해서 수행하기 때문에 멀티태스킹.

프로세스와 스레드

프로세스

프로그램을 실제 실행하기 전까지는 프로세스는 단순한 파일에 불과하다. 프로그램을 실행하면 프로세스가 만들어지고, 프로그램이 실행되는것.

실제 운영체제 안에서 실행 중인 프로그램을 프로세스라 한다. 즉, 프로세스는 실행 중인 프로그램의 인스턴스다.
(자바로 비유하면 클래스 == 프로그램, 인스턴스 == 프로세스)

따라서 프로세스는 독립적인 메모리 공간을 갖고 있고 운영체제에서 별도의 작업 단위로 분리해서 관리된다.
각 프로세스는 별도의 메모리 공간을 가지고 있기 때문에 서로 간섭하지 않으며 서로의 메모리에 직접 접근할 수도 없다.
즉, 하나의 프로세스가 충돌해도 다른 프로세스에 영향을 미치지 않는다는 말.

프로세스의 메모리 구성

  • 코드 섹션: 실행할 프로그램의 코드가 저장되는 부분
  • 데이터 섹션: 전역 변수 및 정적 변수가 저장되는 부분
  • 힙(Heap): 동적으로 할당되는 메모리 영역
  • 스택(Stack): 메서드(함수) 호출 시 생성되는 지역 변수와 반환 주소가 저장도는 영역(스레드에 포함)

스레드

프로세스는 하나 이상의 스레드를 반드시 포함한다.

스레드는 프로세스 내에서 실행되는 작업의 단위라 한 프로세스 내에서 여러 스레드가 존재할 수 있다.
또한 이 스레드(들)은 프로세스가 제공하는 동일한 메모리 공간을 공유한다. (동시성에서 중요한 내용이니 잘 이해하고 가자)

메모리 구성

  • 공유 메모리: 같은 프로세스의 코드 섹션, 데이터 섹션, 힙(메모리)은 프로세스 안의 모든 스레드가 공유한다.
  • 개별 스택: 각 스레드는 자신의 스택을 갖고 있다.

하나의 프로세스 안에는 최소 하나의 스레드가 존재한다고 했는데, 그 이유는 그래야 프로그램이 실행될 수 있기 때문이다.
따라서 정리해보자면 프로세스는 실행 환경과 자원을 제공하는 컨테이너 역할을 하고, 스레드는 CPU를 사용해서 코드를 하나하나 실행한다.

그리고 단일 스레드란 한 프로세스 냐에 하나의 스레드만 존재하는 것을 말하며, 멀티 스레드는 한 프로세스 내에 여러 스레드가 존재하는 것을 말한다.

멀티 스레드가 필요한 이유는 우리가 유튜브 영상을 보면서 댓글도 달 수 있듯이 하나의 프로그램 안에서 동시에 여러 작업을 필요로 하기 때문이다.

스케줄링

CPU 코어는 1개이고, 프로세스는 2개라고 가정해보자.
프로세스 A는 단일 스레드(스레드A1)를 가지고있고, 프로세스 B는 스레드가 2개인 멀티 스레드(스레드B1, 스레드B2)를 가지고있다.

CPU 코어1이 스레드 프로세스 A에 있는 스레드A1을 실행한다.
그 다음 스레드A1 실행을 잠시 멈추고 프로세스 B의 스레드B1을 실행.
그 다음 스레드B1을 잠시 멈추고 스레드B2를 실행 ... 이 과정을 반복하게 된다.

0개의 댓글