[CS] 프로세스와 스레드

swing·2021년 1월 27일
0

[CS]

목록 보기
2/5

프로세스와 스레드는 무엇인가?

프로그램(Program)

  • 어떤 작업을 위해 실행할 수 있는 파일

프로세스(Process)

사전적 의미

  • 컴퓨터에서 연속적으로 실행되고 있는 프로그램
  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
  • 운영체제로부터 시스템 자원을 할당받는 작업 단위
  • 동적인 개념에선, 실행된 프로그램을 의미한다.

(참고) 할당받는 시스템 자원의 예

  • CPU 시간
  • 운영되기 위해 필요한 주소 공간

특징

  • Code , Data , Stack , Heap 구조로 되어있는 독립된 메모리 영역

  • 프로세스는 최소 1개의 메인 스레드를 가지고 있다 .

  • 각 프로세스는 별도 주소 공간에서 실행되며, 기본적으로 다른 프로세스의 변수나 자료구조에 접근 할 수 없다.

  • IPC(inter-process communication)을 사용해 프로세스간 통신이 가능하다.


프로세스 스케줄링

  • 프로세스 상태

  • 생성 -> 준비 -> 실행 <-> 대기 -> 종료 까지 크게 5가지의 상태가 있다.

  • 프로세스를 생성해서 계속 실행하지 않고, 다른 프로세스를 실행하는 동안 대기했다가 다시 실행하는 순서를 반복한다.


스레드(Thread)

사전적 의미

  • 프로세스 내에서 실행되는 여러 흐름(갈래)의 단위
  • 프로세스의 특정한 수행 경로
  • 프로세스가 할당 받은 자원을 이용하는 실행의 단위

특징

  • 프로세스 내에서 stack 만 따로 할당받고 다른 영역은 공유한다.

멀티 프로세스

멀티 프로세싱이란?

  • 하나의 프로그램을 여러 개의 프로세스로 구성하여 , 각 프로세스가 하나의 작업(Task)을 처리하는 것.

장점

  • 여러 개의 자식 프로세스 중 하나의 문제가 발생하면 그것만 죽는다.

단점

  • Context Swtiching 에서의 오버헤드

    Context Swtiching?

    • CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 것
    • 동작 중인 프로세스가 대기 하며, 해당 프로세스의 상태(Context)를 보관하고, 대기하던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업
  • Context Switching 과정에서 캐쉬 메모리 초기화 등 무거운 작업이 진행되고, 많은 시간이 소모되는 등의 오버헤드가 발생한다.
  • 프로세스는 각각의 독립된 메모리 영역을 할당 받는다. 즉 공유 메모리가 없어, Context Switching 이 발생하면 캐쉬에 있는 모든 데이터를 모두 리셋하고 다시 캐쉬 정보를 불러와야 한다.
  • 프로세스간 통신(IPC)이 어렵다.

멀티 스레드

멀티 스레딩이란?

  • 하나의 프로그램을 여러 개의 스레드로 구성하고, 하나의 작업을 같이 처리하는 것.
  • 많은 운영체제들이 멀티 프로세싱을 지원하지만, 멀티 스레딩을 기본으로 한다.
  • 웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.

장점

  • 시스템 자원 소모 감소(자원 효율성 증대)
    • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어, 자원을 효율적으로 관리할 수 있다.
  • 시스템 처리량 증가(처리 비용 감소)
    • 스레드 간 데이터를 주고 받는 것은 간단하다.
    • 스레드 사이의 작업량이 작아 Context Switching이 빠르다.

단점

  • 주의 깊은 설계가 필요하며, 디버깅이 까다롭다.
  • 단일 프로세스의 경우 효과 기대가 어렵다.
  • 다른 프로세스에서 스레드를 제어할 수 없다.
  • 자원 공유의 문제가 발생한다.(동기화 문제)

    스레드 간의 자원 공유는 전역 변수를 이용한다. 그러므로 함께 사용할때 시간 문제로 인한 에러가 발생할 수 있다.

  • 자식 스레드에 문제가 발생하면, 전체 프로세스가 영향을 받는다.

멀티 스레드 스케줄링 방식

동시성(Concurrency) , 병렬성(Parallelism)

  • 동시성 : 멀티 태스킹을 위해 싱글 코어에서 멀티 스레드가 번갈아가며 실행하는 성질
  • 병렬성 : 멀티 태스킹을 위해 멀티코어에서 개별 스레드를 동시에 실행하는 성질
  • 싱클 코어를 이용한 멀티 스레드 작업은, 워낙 빠르게 진행되 병렬적으로 실행되는 것처럼 보이지만, 사실은 빠른 속도로 번갈아가면서 실행하는 동시성 작업이다.

용어설명
- 멀티 태스킹 : 두개 이상의 작업을 동시 처리하는 것


스레드 스케줄링

  • 스레드의 개수가 코어보다 많을 경우, 스레드를 어떤 순서의 의해 동시성으로 실행할 것인가를 정하는 작업
  • 스레드 스케줄링에 의해 스레드들이 아주 짧은 시간에 번갈아가며 그들의 메소드를 조금씩 실행하는 것이다.

스케줄링 방식

  • 우선순위(Priority)방식
    : 우선순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케줄링 하는 것. 스레드 객체에 우선 순위를 부여 할 수 있어 코드 제어가 가능하다.
  • 순환(Round-Robin)방식
    : 시간 할당량을 정해서 하나의 스레드를 정해진 시간만큼 실행. 코드 제어 불가.
  • First-Come,First-Served(FCFS)방식
    : 먼저 온 프로세스가 먼저 코어를 점유하고 실행하는 방식. 다른 프로세스가 중간에 끼어들 수 없는 것이 단점.
  • Shortest-Job-First(SJF)방식
    : 가장 짧게 수행되는 프로세스가 가장 먼저 수행되는 방식. 프로세스는 많은 변수가 있기 때문에 시간 예측이 어려워 비현실적임.
  • Multilevel Queue 방식
    : 프로세스를 기준에 따라 여러 그룹으로 나눌 수 있다.
    그 그룹에 따라 큐를 두어 여러 개의 큐를 사용하는 방식.
    큐마다 우선순위를 지정할 수 있는 장점이있다.
  • Multilevel Feedback Queue 방식
    : 멀티레벨큐 방식과 비슷하다.
    가장 위의 큐부터 코어 점유를 대기한다.
    대기하는 큐에서 시간이 오래 걸린다면, 아래의 다른 큐로 프로세스를 옮기는 방식이다.

프로세스 그룹
- System Process : 운영체제 커널 수준의 프로세스
- Interactive Process : 유저 수준의 대화형 프로세스
- Batch Process : 대화형 프로세스의 반대. 일정량을 한번에 처리하는 프로세스(Ex. 컴파일러)
- Student Process :


각자 운영체제 스레드 동작 방식

  • 대부분 여러 개의 큐를 사용하는 Multilevel Queue 방식을 사용하며, 큐마다도 다른 스케줄링 방식을 사용한다. 프로세스 그룹별로 성격에 맞는 스케줄링 방식을 사용하여 효율성을 최대로 높이는 것이다!

스레드를 무제한으로 만들수 없다면, 프로세스가 많아질 때 성능 향상을 할 수 있는 방법이 무엇일까?

  • 멀티 스레드 방식으로 처리하면 성능향상이 될 것 같다.

setTimeout 내부 동작 방식


(setTimeout 제외하고) 플랫폼에서 정확도 높은 타이머Timer를 구현하기 위한 여러 방식

  • Interval 방식의 함수는 이전 콜백 실행 여부와 상관없이 세팅한 시간마다 실행을 시도한다. 정확도 높은 타이머 구현을 위해선 콜백 함수 실행주기를 지연시간 보다 짧게 하여 구현해 볼 수 있을 것 같다.

멀티 스레드가 공용 리소스에 접근할 때 임계구역을 다루는 방식(Semaphore, Mutex 등)과 어떤 경우에 각 방식을 사용해야 하는가?


참고!

- 실행할 수 있는 파일을 프로그램이라고 한다. (.exe)

- 프로그램이 실행되서 돌아가는 상태를 프로세스라고 한다.

- 현재의 컴퓨터는 여러개의 프로세스를 돌린다. 동시적, 병렬적, 또는 이 둘의 혼합으로 이루어짐

- 동시성 : 프로세스를 일부분씩 진행하는 것(Context switching)

- 병렬성 : 프로세스를 각각 수행하며, 프로세서 하나에 코어 여러개가 달린다. 멀티코어 프로세서가 달린 cpu에서 사용가능. (cpu의 물리적 한계때문에 코어를 여러개 달게됨.)

- 한 프로세스 안에도 여러 작업이 동시에 진행되야 함.

- 이 갈래를 스레드라고 표현함.

- 메모리 : 조리대
- 프로세서 : 요리사
- 프로세스 : 요리 메뉴
- 스레드 : 메뉴마다 조리하는 섹션 (프로세스에 할당된 자원을 사용한다.)

- 프로세스는 컴퓨터의 할당된 자원을 나눠서 사용 -> 스레드에서는 할당된 자원을 같이 사용
-> (문제점 : 속도와 효율에선 우수하지만, 프로세스 안에 공유되는 변수에 스레드가 동시 접근 하면 에러가 발생함. 시간 문제로 에러가 발생할 수 있다.)
- 이런 작업들을 보완하는 도구 or 프로그래밍 방식들이 있음.
(closure / lambda / FP / Actor)

  • 싱글코어는 최적 스레드 갯수가 있다.
  • 대부분 IO작업이라서 스위칭해서 작업을 바꾸는게 나은데 어느 순간 되면 컨텍스트 스위칭 오버헤드가 더커서 성능 하락
  • 스레드는 메모리를 공유해서 콘텍스트 스위칭에 들어가는 자원이 적음.
  • 하이퍼쓰레딩 (코어에 두개 쓰레드)
  • 싱글코어에 스레드가 여러개면 왜 성능이 좋아질까?
    타임쉐어링 : 여러 명의 유저가 혼자 쓰고 있다는 착각을 할 수 있다. // 멀티태스킹
    운영체제
    멀티프로세스 : 우리의 프로세스 (멀티 프로그램)
  • 코어가 하나라도 여러 프로그램이 돌아간다.
  • 가상 메모리 : 프로세스가 물리 메모리를 공유하면서 쓴다.(20칸 콘도를 100명이 나눠쓴다.)
    이로 인해 프로세스마다 주소 접근이 불가하다. 보안이 올라간다.
  • 컨텍스트 스위칭 : 멀티프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 레지스터 값(Context)을 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(Context)를 교체하는 작업
  • 가비지 컬렉터 : 메모리 관리 기법. 동적으로 할당된 메모리 중 필요없게 된 메모리 영역을 해제하는 기능이다.
  • 프로세스가 죽으면 좀비 프로세스가 된다. 모든 프로세스는 자식 프로세스를 만든다.
    자식이 죽으면 부모 프로세스가 메모리를 청소한다.
  • 80컬럼이 권장 코딩 폭이다.!!
profile
if(기록📝) 성장🌱

0개의 댓글