프로세스와 스래드

황상익·2024년 9월 13일

Inflearn JAVA

목록 보기
41/61

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

단일 프로그램 실행

프로그램 2개 이상 동시에 실행

프로그램의 실행이란 프로그램을 구성하는 코드를 순서대로 CPU 연산하는 일
CPU 코어는 하나로 가정, 한번에 하나의 프로그램 코드만 실행 가능
하나의 프로그램 안에 있는 코드를 모두 실행 -> 다른 프로그램의 코드를 실행 ?? -> 답답
CPU 코어로 여러 프로그램을 동시 실행 -> 멀티태스킹 기술 등장

멀티태스킹



각 프로그램의 실행 시간을 분할해서 동시에 실행되는 것 처럼 하는 기법 -> 시분할 기법
CPU 코어가 하나만 있어도 여러 프로그램이 동시 실행되는 것 처럼 느낄 수 있음
+) CPU에 어떤 프로그램이 얼마만큼 실행될지는 운영체제가 결정, -> 스케줄링
단순히 시간으로만 직업을 분할 X, CPU를 최대한 활용할 수 있는 다양한 우선순위와 최적화

멀티프로세싱




멀티프로세싱이란 컴퓨터 시스탬에서 둘 이상의 프로세서를 사용하여 여러 작업들 동시에 처리하는 기술, 멀티프로세싱은 하나의 CPU 코어만을 사용하는 시스탬보다 동시에 더 많은 작업을 처리

멀티프로세싱 vs. 멀티태스킹

멀티프로세싱

  • 여러 CPU를 사용하영 동시에 여러 작업을 수행
  • 하드웨어 기반으로 성능을 향상
    멀티태스킹
  • 단일 CPU가 여러 작업을 동시에 수행하는 것 처럼 보이게 하는 것
  • 소프트웨어 기반으로 CPU 시간을 분할하여 각 작업에 할당

프로세스와 스레드

프로세스
프로그램은 실제 실행하기전 단순 파일 -실행-> 프로세스 생성, 실행
운영체제 안에서 실행중인 프로그램을 프로세스 함
프로세스는 실행중인 프로그램의 인스턴스

프로세스는 실행중인 프로그램의 인스턴스, 각 프로세스는 독립적 메모리 공간을 소유, 운영체제에서 별도의 작업 단위로 분리해서 관리. 각 프로세스는 별도이 메모리 공간을 갖고 있기 때문에, 서로 간섭하지 않는다.
프로세스가 서로의 메모리 영역 접근 x.
하나의 프로세스 충돌, 다른 프로세스에는 영향 X, 문제 있는 프로세스만 종료, 다른 프로세스는 돌아감

프로세스의 메모리 구성
코드섹션 : 실행할 프로그램의 코디가 저장되는 부분
데이터 섹션 : 전역변수 정적변수가 저장되는 부분
Heap : 동시적으로 할당되는 메모리 영역
Stack : 메서드 호출 시 생성되는 지역 변수와 반환 주소가 저장되는 영역

Thread

프로세스는 하나 이상의 스레드를 반드시 포함
스레드는 프로세스 내에서 실행되는 작업의 단위. 한 프로세스 내에서 여러 스레드가 존재할 수 있으며, 프로세스가 제공하는 동일한 메모리 공간을 공유. 스레드는 프로세스보다 단순, 생성 관리가 단순, 가볍다

메모리 구성

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

프로그램이 실행된다는 것은 어떤 의미 ??
프로그램을 실행하면 운영체제는 디스크에 있는 파일 덩어리인 프로그램을 메모리로 불러오면서 프로세스를 만든다.

코드를 하나씩 순서대로 실행하기 떄문에 프로그램이 작동하고 계산도 하고, 출력도 할 수 있음
프로세스의 코드를 실행하는 흐름을 스레드(thread)라 한다. 스레드는 번역하면 "실", "실을 꿰다"라는 뜻

스레드는 프로세스 내에서 실행되는 작업의 단위. 한 프로세스 내에 하나의 스레드가 존재. 한 프로세스 내에 여러 스레드가 존재 할 수 있다.

하나의 프로세스 안에는 최소 하나의 스레드가 존재.

멀티스레드가 필요한 이유
하나의 프로그램도 그 안에서 동시에 여러 작업이 필요하다.

운영체제 관점에서 보면 다음과 같이 구분 가능
워드 프로그램 - 프로세스A
스레드1: 문서 편집
스레드2: 자동 저장
스레드3: 맞춤법 검사

Thread와 스케줄링

CPU 코어는 1개이고, 프로세스는 2개이다. 프로세스 A는 스레드1개 프로세스B는 스레드가 2개


프로세스A에 있는 스레드A1을 실행한다.


로세스A에 있는 스레드A1의 실행을 잠시 멈추고 프로세스B에 있는 스레드 B1을 실행


프로세스B에 있는 스레드 B1의 실행을 잠시 멈추고 같은 프로세스의 스레드 B2를 실행한다. 이후에 프로세스A에 있는 스레드A1을 실행한다.
이 과정을 반복한다.

단일 코어 스케줄링

운영체체가 스레드를 어떻게 스케줄링 하는지, 스케줄링 관점운영체제는 내부에 스케줄링 큐를 가지고 있고, 각각의 스레드는 스케줄링 큐에서 대기


멀티 코어 스케줄링

CPU에 어떤 프로그램이 얼마만큼 실행될지 운영체제가 결정하는데, -> 스케줄링이라고 한다.
단순히 시간으로만 작업을 분할하지 않고, CPU를 최대한 활용할 수 잇는 다양한 우선순위와 최적화 기법
운영체제가 스케줄링을 수행하고, CPU를 최대한 사용하면서 작업이 고루 수행될 수 있게 최적화 한다는 정도로 이해.

프로세스, 스레드와 스케줄링

멀티태스킹과 스케줄링
멀티태스킹이랑 동시에 여러 작업을 수행. 이를 위해 운영체제는 스케줄링이라는 기법을 사용

프로세스와 스레드
프로세는 실행 중인 프로그램의 인스턴스. 각 프로세스는 독립적인 메모리 공간을 소유, 운영체제는 독립된 실행 단위로 취급

스레드는 프로세스 내에서 실행되는 작은단위. 여러 스레드는 하나의 프로세스 내에서 자원을 공유.
프로세스의 코드, 데아터, 시스템 자원 등을 공유

프로세스의 역할
프로세스는 실행 환경을 제공, 여기에는 메모리 공간, 파일 핸들, 시스탬 지원 등이 포함
프로세스 자체는 운영체제의 스케줄러에 의해 직접 실행되지 않으며, 프로세스 내의 스레드가 실행된다. 참고로 1 개의 프로세스 안에 하나의 스레드만 실행되는 경우도 있고, 1개의 프로세스 안에 여러 스레드가 실행되는 경우도 있다.

컨텍스트 스위칭

컴퓨터의 멀티태스킹
멀티태스킹을 생각해보자. CPU 코어는 하나만 있다고 가정하자.
스레드A, 스레드B가 있다.
운영체제는 먼저 스레드A를 실행한다. 멀티태스킹을 해야 하기 때문에 스레드A를 계속 실행할 수 없다. 스레드A를 잠시 멈추고, 스레드B를 실행한다. 이후에 스레드A로 그냥 돌아갈 수 없다. CPU에서 스레드를 실행하는데, 스레드A의 코드가 어디까지 수행되었는지 위치를 찾아야 한다. 그리고 계산하던 변수들의 값을 CPU에 다시 불러들여야 한다. 따라서 스레드A를 멈추는 시점에 CPU에서 사용하던 이런 값들을 메모리에 저장해두어야 한다. 그리고 이후에 스레드A 를 다시 실행할 때 이 값들을 CPU에 다시 불러와야 한다.--> 컨텍스트 스위칭

컨텍스트 스위칭 과정에서 이전에 실행 중인 값을 메모리에 잠깐 저장하고, 이후에 다시 실행하는 시점에 저장한 값을 CPU에 다시 불러와야 한다. 결과적으로 컨텍스트 스위칭 과정에는 약간의 비용이 발생

I/O-바운드 작업 (I/O-bound tasks)
디스크, 네트워크, 파일 시스템 등과 같은 입출력(I/O) 작업을 많이 요구하는 작업을 의미한다.
이러한 작업은 I/O 작업이 완료될 때까지 대기 시간이 많이 발생하며, CPU는 상대적으로 유휴(대기) 상태 에 있는 경우가 많다. 쉽게 이야기해서 스레드가 CPU를 사용하지 않고 I/O 작업이 완료될 때 까지 대기한다.

I/O-바운드 작업: CPU 코어 수 보다 많은 스레드를 생성, CPU를 최대한 사용할 수 있는 숫자까지 스레드 생성 CPU를 많이 사용하지 않으므로 성능 테스트를 통해 CPU를 최대한 활용하는 숫자까지 스레드 생성
단 너무 많은 스레드를 생성하면 컨텍스트 스위칭 비용도 함께 증가 - 적절한 성능 테스트 필요

profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글