[스터디] 프로세스와 스레드

MSK·2022년 4월 11일
0

질문

프로세스와 스레드의 차이점에 대하여 말해 보세요

  • 프로세스: 실행 중인 프로그램, 자원과 스레드로 구성
  • 스레드: 프로세스 내에서 실제 작업을 수행하는 단위, 모든 프로세스는 하나 이상의 쓰레드를 가지고 있다.
  • 다중 스레드 하나의 프로세스(프로그램)에 하나 이상의 스레드를 생성하여 실행

프로세스

컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다.


프로그램은 일반적으로 하드 디스크 등에 저장되어 있는 실행코드를 뜻하고, 프로세스는 프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위를 지칭한다.
메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
운영체제로부터 시스템 자원을 할당받는 작업의 단위
즉, 동적인 개념으로는 실행된 프로그램을 의미한다.

프로세스의 구조

코드 영역 : 사용자가 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 부분
데이터 영역 : 전역 변수 등 프로그램이 사용하는 데이터를 저장하는 부분
스택 영역 : 함수가 호출될 때 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터를 임시로 저장하는 공간이다.
힙 영역 : 동적으로 할당되는 데이터들을 위해 존재하는 공간 (new(), mallock() 등)

멀티 태스킹

OS를 통해 CPU가 작업하는데 필요한 자원을 프로세스 또는 스레드 간에 나누는 행위를 멀티 태스킹이라고 한다.
이를 통해 여러 응용 프로그램을 동시에 열고 작업할 수 있다는 장점이 있다.

여러 프로세스가 동시에 실행되고 관리되는 것처럼 보이지만, 사실 CPU는 한번에 한 가지 명령어 밖에 처리하지 못한다.

CPU가 상상 이상으로 빠르기 때문에 프로세스들을 번갈아가며 실행하고 관리하는 것이 마치 동시에 하는 것처럼 보일 뿐이다.(Context Switching)

Context Switching
하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 상태를 적재하는 작업.

스레드(Thread)

어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.

프로세스 내의 특정한 수행 경로를 말한다.
일반적으로 하나의 애플리케이션(프로그램)은 하나 이상의 프로세스를 가지고 있다.
하나의 프로세스는 반드시 하나 이상의 스레드를 갖는다.
즉, 프로세스를 생성하면 기본적으로 하나의 (메인)스레드가 생성된다고 생각하자.
하나의 프로세스를 구성하는 스레드들은 프로세스에 할당된 메모리, 자원 등을 공유한다.

멀티스레드

하나의 프로세스는 여러 개의 스레드로 구성이 가능하다.
하나의 스레드는 코드가 실행되는 하나의 흐름이기 때문에, 한 프로세스 내에 스레드가 두 개라면 코드가 실행되는 흐름이 두 개 생긴다는 의미다.


즉, 프로세스내에서 자식 스레드들을 서로 주소 공간이나 자원들을 공유하면서 실행될 수 있다.

장점

  1. 시스템 자원 소모 감소(자원의 효율성 증대)
  2. 시스템 처리량 증가(처리 비용 감소) - 스레드 사이의 작업량이 작아 Context Switching이 빠름
  3. 간단한 통신 방법으로 인한 프로그램 응답 시간 단축 - 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담의 적음

단점

  1. 주의 깊은 설계가 필요
  2. 디버깅이 까다롭다.
  3. 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.
  4. 멀티 스레드의 경우 자원 공유의 문제가 발생한다.(동기화 문제)

참고
멀티 프로세스 : 하나의 프로그램을 여러 프로그램으로 구성하여 각 프로세스가 하나의 작업 처리(병렬 처리)
장점 : 자식 프로세스 중 하나에 문제가 발생해도 다른 프로세스에는 영향이 없어 안정성이 높다.
단점
문맥 교환에서의 오버헤드 : 캐시 메모리 리셋 등 무거운 작업 발생
프로세스 간 복잡하고 어려운 IPC : 독자적인 메모리 공간으로 변수 공유가 안됨

(+) Java Thread(자바 스레드)란

일반 스레드와 거의 차이가 없으며, JVM이 운영체제의 역할을 함. 자바에는 프로세스가 존재하지 않고 스레드만 존재하며, 자바 스레드는 JVM에 의해 스케쥴링 되는 실행 단위 코드 블록.

  • JDK에서 지원하는 java.lang.Thread 제공

<예제 소스코드1 - ThreadTest.class>

public class ThreadTest extends Thread
{
    public void run()
    {
        // 인터럽트 됬을때 예외처리
        try
        {
            for(int i = 0 ; i < 10 ; i++)
            {
                // 스레드 0.5초동안 대기
                Thread.sleep(500);
                System.out.println("Thread : " + i);
            }
        }catch(InterruptedException e)
        {
            System.out.println(e);
        }
    }
}

<예제 소스코드2 - Thread1.class>

public class Thread1 
{
    public static void main(String args[])
    {
        ThreadTest t1 = new ThreadTest();
        ThreadTest t2 = new ThreadTest();
        
        // 1. 동시에 똑같은 숫자가 나오고(start)
        /*t1.start();
        t2.start();*/
        
        // 2. 번갈아가면서 나옴(run)
        t1.run();
        t2.run();
    }
}

<결과1 - .start()>

<결과2 - .run()>

정리

프로세스란 자원과 스레드로 구성된, 현재 실행되고 있는 프로그램을 말한다. 스레드는 프로세스의 수행경로를 말한다. 한 프로세스 내의 자원을 공유한 2개 이상의 스레드를 가진 것을 멀티스레드라고 한다.

참고자료

profile
여긴어디나는누구

0개의 댓글