program / process / thread

Seongmin·2022년 11월 1일
0

CS

목록 보기
1/6

프로그램과 프로세스

프로그램

저장공간(HDD)에 저장되어 있는 코드와 리소스 등이 집합되어 있는 파일

프로세스

  • 프로그램이 실행되어 메모리에 올라간 것
  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
  • 운영체제로부터 시스템 자원(CPU, 주소 공간, 메모리 영역(Code, Data, Stack, Heap))을 할당받아 작업한다.


  • 프로그램이 실행되어 메모리에 올라가면 프로세스로 동작한다.
  • 프로세스마다 최소 1개의 스레드가 만들어진다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료 구조에 접근할 수 없다.

프로그램 실행 과정

  1. 프로그램 실행 파일 실행

  2. 디스크에서 해당 프로그램을 실행하여 프로세스를 사용자 메모리 공간에 비치하고,
    2-1. 해당 프로세스의 메타데이터를 담은 PCB를 만들어 커널 메모리 공간에 배치

  3. 운영 체제의 프로세스 스케줄러는 PCB를 읽으면서, 높은 우선순위가 주어진 프로세스를 적절한 순위에 맞춰 준비큐에 배치

  4. 기존에 실행중이던 프로세스의 시간할당량이 끝나면 CPU를 실행하고자 하는 프로세스에 할당하여 실행

  5. 프로그램 실행


스레드

프로세스가 할당받은 자원을 이용하는 실행의 단위

스레드의 필요성

하나의 프로그램에서 복잡한 동시 작업을 요구할 경우, 여러개의 프로세스가 동시 작업을 수행할 경우 각 프로세스의 메모리를 모두 공유해야 하며 Context Switching 부담이 상당해진다.

스레드의 장점

하나의 프로세스에서 여러개의 스레드가 메모리를 공유하여 작동할 수 있으며, 그래서 생성과 속도가 빠르고, 적은 메모리를 점유하며 정보 교환이 쉽고 Context Switching 부하가 적다.
→ 멀티 스레드를 사용하는 이유

스레드의 단점

자원 선점과 자원 공유(동기화)의 문제가 발생한다. 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받는다.
→ 멀티 프로세스를 사용하는 이유

Context Switching

프로세스의 상태 정보를 저장하고 복원하는 일련의 과정

CPU에서는 한 번에 하나의 프로세스만 실행 가능 하므로, 여러 프로세스를 실행할 경우 각각 하나씩 돌아가면서 작업을 하게 된다.
이 경우, 동작 중인 프로세스가 대기하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스를 복구하는데 이 과정을 Context Switching이라고 한다.

자바 스레드

  • 일반 스레드와 거의 차이가 없으며, JVM가 운영체제의 역할을 한다.
  • 자바에는 프로세스가 존재하지 않고 스레드만 존재하며, 자바 스레드는 JVM에 의해 스케줄되는 실행 단위 코드 블록이다.
  • JVM의 역할
    • 스레드가 몇 개 존재하는지
    • 스레드로 실행되는 프로그램 코드의 메모리 위치는 어디인지
    • 스레드의 상태는 무엇인지
    • 스레드 우선순위는 얼마인지
  • 즉, 개발자는 자바 스레드로 작동할 스레드 코드를 작성하고, 스레드 코드가 생명을 가지고 실행을 시작하도록 JVM에 요청하는 일 뿐이다.

멀티 스레드와 멀티 프로세스

멀티 프로세스

두 개 이상 다수의 프로세서(CPU)가 협력적으로 하나 이상의 작업(Task)을 동시에 처리하는 것 (병렬처리)
각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용한다.

  • fork()를 통해 프로세스를 복사한다.
  • 각 프로세스는 별도의 주소공간에서 실행되므로 프로세스간의 통신을 위해서는 IPC(Inter Process Communication)를 사용해야 한다.
장점
  • 독립된 구조로 인한 높은 안정성
  • 프로세스 하나에 문제가 생겨도 다른 프로세스에 영향을 주지 않는다.(속도의 문제는 발생하지만, 안정성에 있어서는 괜찮음)
단점
  • 독립된 메모리 영역이기 때문에 작업량이 많을 수록(Context Switching 과정에서) 오버헤드가 발생한다.

멀티 스레드

하나의 프로세스를 여러 개의 스레드로 구성하고 각 스레드로 하여금 자원을 공유하며 작업을 처리하는 것

장점
  • 자원의 효율성 증대 : 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리한다.
  • 처리 비용 감소 : 스레드 사이 작업량이 적어 Context Switching이 빠르다.(프로세스 내의 Stack 영역을 제외한 모든 메모리 공유)
단점
  • 동기화 문제(병목현상, 데드락)가 발생할 수 있는다.
  • 하나의 스레드에 문제가 생기면 프로세스 전체가 영향을 받는다.

대세는 멀티 스레드

  • 프로세스 간의 통신(IPC)보다 스레드 간의 통신의 비용이 적으므로 작업들 간의 통신의 부담이 줄어든다.

    • 프로세스 간의 Context Switching시 단순히 CPU 레지스터 교체 뿐만이 아니라 RAM과 CPU사이의 캐쉬메모리에 대한 데이터 까지 초기화 되므로 상당한 부담이 발생한다.
  • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.

  • Stack을 제외한 모든 메모리를 공유하기 때문에 global(전역), static(정적) 변수 그리고 new, malloc에 의한 모든 자료를 공유할 수가 있다.

    • 이는 프로세스간 통신(ex.pipe)과 같이 복잡한 과정을 거치지 않고 보다 효율적인 일처리가 가능하다

주의점 : 다만, 스레드 간의 자원 공유는 전역 변수를 이용하므로 함께 상용할 때 충돌이 발생할 수 있다.



Reference


https://namu.wiki/w/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4
https://mamu2830.blogspot.com/2020/02/blog-post_18.html
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
https://you9010.tistory.com/136
https://gyoogle.dev/blog/computer-science/operating-system/Process%20vs%20Thread.html
https://livenow14.tistory.com/67

0개의 댓글