ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로세스(process)와 스레드(thread)
    컴퓨터 기초 2020. 10. 28. 13:11

    프로세스, 스레드를 알기 전에 프로그램에 대해 알아보자.

    프로그램(program)이란?

    "컴퓨터에서 특정 작업을 수행하는 실행 가능한 명령어의 집합"이다.

     

    코드가 복잡한 게임, 응용 프로그램 뿐 아니라 간단한 사칙 연산이 가능한 코드도 프로그램의 범주에 든다.

     

    그리고 이러한 프로그램을 실행에서 프로세스와 스레드를 알 수 있다.

    프로세스란(process)란?

    프로세스란 "프로그램이 실행을 위해 메모리에 적재되어 실행 중인 프로그램"을 말한다.

     

    즉 프로그램이 정적이고 단순한 코드의 집합이라면, 프로세스는 동적이고 코드를 실행 중인 프로그램이다.

     

    각 프로세스는 독립적으로 실행되고 독자적인 스택과 데이터 공간을 가지게 된다.

    프로세스의 멀티 프로세스

    우리는 컴퓨터를 할 때 흔히 여러 작업을 동시에 진행한다.

     

    글을 쓰다가 유튜브 영상을 볼 때도 있고 게임을 하다가 영화를 보기도 한다.

     

    이는 동시에 이뤄지는 것 같지만 실제로는 CPU는 한 가지 일만 처리할 뿐이고

     

    나머지는 사람이 눈치 못 챌 정도로 빠르게 화면이 교체되는 것이다.

     

    즉 사람이 보고 있는 화면 밖의 프로그램들은 화면에서 실행 중인 프로그램에 우선 순위가 밀린다.

     

    하지만 사용자가 갑자기 화면을 전환하면 컴퓨터는 대기중인 프로그램을 빠르게 바꿔서 실행하는 것이다.

     

    즉 전부 동시에 돌아가는 것과 같은 착각을 일으키는 것이다.

     

    그리고 이러한 프로세스끼리의 전환 작업을 문맥 교환(Context Switch)이라고 한다.

    프로세스의 구성

    앞서 프로세스는 운영체제에서 여러개가 동시에 돌아가는 것처럼 착각을 일으킨다고 했다.

     

    그렇다면 이러한 일은 어떻게 이뤄지는 것일까?

     

    사용자가 화면을 바꿀때마다 프로그램을 켜고 끈다면 너무 오랜 시간이 걸릴 것이다.

     

    그래서 실행 중인 프로세스의 정보는 프로세스 제어 블록(PCB, Process Control Block)이라는

     

    자료 구조에 저장된다.

     

    그리고 화면이 전환될 때 컴퓨터는 빠르게 PCB에 저장된 데이터를 불러와서 실행한다.

     

    그리고 이 전환 과정이 위에서 말한 문맥 교환(Context Switch)이다.

     

    PCB는 다음과 같은 정보를 가진다.

     

    - PID: 프로세스 고유 식별 번호

    - 프로세스 스케줄링 상태: 프로세스 상태 및 스케줄링 정보

    - 프로그램 카운터(PC): CPU가 다음으로 실행할 명령어의 주소에 대한 포인터

    - 권한: 프로세스가 접근할 수 있는 자원을 결정

    - 프로세스 상태: 현재 프로세스의 상태

    - 메모리 관리 정보: 페이지 테이블, 메모리 제한, 세그먼트 테이블

     

    즉 PCB는 프로세스 전반에 대한 데이터를 저장해뒀다가 빠르게 교체하는 것이다.

     

    그리고 이 중에서 우리가 눈여겨 볼 만한 부분은 각 프로세스의 메모리 구조다.

     

     

     

    프로세스는 위와 같은 메모리 구조를 가진다.

     

    각 프로세스는 독립적으로 실행되며 크게 각 프로세스는 각자의 메모리 공간을 갖는다.

     

    다만 같은 프로그램을 여러 번 켤 경우 즉 같은 프로그램의 프로세서가 여러개일 땐 한 개의 코드를 공유한다.

    스레드(thread)란?

    스레드란 정의하면 "프로세스 내에서 이뤄지는 하나의 실행 흐름"이라 할 수 있다.

     

    스레드는 프로세스 내에서 이뤄지며 하나만 실행할 수도 있고 여러개가 동시에 실행 가능하다.

     

    그리고 이러한 스레드가 동시에 실행되는 것을 멀티 스레딩이라고 한다.

     

    멀티 스레딩을 할 경우에는 단일 스레드에 비해 병목 현상을 줄이고 전체 작업 시간을 줄일 수 있다.

     

    다만 스레드는 프로세스와 구조가 다르다.

     

     

     

    프로세스가 운영체제에서 실행될 때 각자 독립적인 구조를 가진데 반해서 스레드는 그렇지 못하다.

     

    스레드는 실행될 때 스택 영역만 따로 존재하고 나머지는 Code, Date, Heap은 같이 공유한다.

     

    스레드는 프로세스 종속적이며 여러 영역을 다른 스레드와 공유하게 된다.

     

    다만 이것은 꼭 나쁜 것이 아니다.

     

    프로세스는 각자 독립적으로 실행되므로 영역을 공유하지 않기 때문에 프로세스 간의 통신이 어렵다.

     

    반면 스레드는 공유 영역 덕분에 프로세스 내 스레드끼리 통신이 수월하다.

     

    또한 기존 한 가지 자원을 두고 여러 스레드가 공유하므로 자원 소모가 줄고 응답 시간도 짧아진다.

     

    물론 단점도 있다.

     

    공유영역 덕분에 통신이 쉽지만 그만큼 여러 스레드가 하나의 메모리를 공유함으로써 신경쓸게 많다.

     

    또한 그에 따른 디버깅도 쉽지 않다.

    프로세스와 스레드 정리

    정리하자면 다음과 같다.

     

    - 프로세스: 운영체제 안에서 독립된 공간, 실행을 보장받고 실행된다.

    - 스레드: 프로세스 안에서 다른 스레드와 자원을 공유하며 병렬적으로 실행된다.

     

    각 통신 면에선 다음과 같다.

     

    - 프로세스: IPC 방식으로 프로세스 간 통신이 이뤄진다. 통신 자체는 번거롭지만 안정적이다.

    - 스레드: 스레드간 통신이 쉽고 빠르다. 다만 공유 영역의 존재로 디버깅이 어렵다.

Designed by Tistory.