Process 와 Thread

박경현·2022년 9월 9일
0

프로세스와 스레드 면접준비

이 내용 관련 면접은
운영체제가 시스템의 자원을 어떤 단위(프로세스)로 할당하고, 프로세스와 스레드는 자원을
어떻게 사용 하느냐를 아는지 물어보는거

https://charlezz.medium.com/process%EC%99%80-thread-%EC%9D%B4%EC%95%BC%EA%B8%B0-5b96d0d43e37

프로세스

프로세스에 대한 정의 -> (컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램)

프로세스에 대한 나의 정의

프로그램은 하드디스크에 올라간 정적인 상태이다

프로세스는 프로그램을 하드디스크 => 메모리로 옮긴거! (그래야 CPU를 통해 실행이 가능해서!)
여기서 프로그램이 직접 H/W부분에 들어갈 수 없어서 O/S가 중간에서 옮겨줘야한다!!

O/S 가 옮겨줄 때 커널이 이따 나올 스케줄링을 위해
프로그램에 PCB(process control block)를 붙여서 독립적인 메모리 공간을 할당 해준다!!

운영체제로부터 프로세서, 필요한 주소공간, 메모리 등을 할당받습니다.

스케줄러의 입장에서 "task(작업)"라고 부르기도 한다.

프로세스 구조

운영체제에 의해서 코드, 데이터 스택, 힙구조로 되어있는 독립된 메모리 영역을 할당받습니다.

코드

  • 코드 영역은 실행할 프로그램의 코드 및 매크로 상수가 기계어 형태로 저장되는 영역이다.
    CPU는 코드영역에 저장된 명령어를 하나씩 처리한다.

데이터

  • 데이터 영역은 코드에서 선언한 전역 변수와 정적(static) 변수가 저장되는 영역이다.
    데이터 영역은 프로그램의 시작과 함께 할당되어 종료될 때 소멸된다.

스택

  • 스택 영역은 함수 안에서 선언된 지역변수, 매개변수, 리턴값, 등이 저장되고 함수 호출시 기록하고 종료되면 제거한다. 스택이라는 자료구조 명칭에서도 알 수 있듯이 후위선출(LIFO) 메커니즘을 따른다.

  • 흔히 재귀함수를 통해 너무 많은 함수를 호출하게 되는 경우 스택 영역이 초과하면서

    Stack Overflow(스택오버플로우)에러가 발생한다. (여러분이 잘 아는 그 스택오버플로우가 여기서 따온것이다)

  • 힙 영역은 관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 공간(Free Space)이다.
    이 공간은 동적 메모리 할당 공간이므로 사용이 끝나면 운영체제가 쓸수 있도록 반납해야 한다.
    프로그램이 실행하는 순간 프로그램이 사용할 메모리 크기를 고려하여 메모리의 할당이 이루어지는 데이터 또는 스택과 같은 정적 메모리 할당과는 대조적이다.

    동적 메모리 할당은 어느 시점에 어느 정도의 공간을 할당할 수 있을지 정확히게 예측할 수 없으므로, 런타임에 확인가능하다.

IPC (Inter-Process Commnuication)

프로세스는 각각 독립된 메모리 공간을 할당 받기 때문에 서로 데이터 공유를 원칙적으로는 할 수가 없다

만약 프로세스가 다른 프로세스 자원에 접근하려면 IPC(Inter-Process Commnuication)를 사용해야 한다.

IPC의 종류로는 메일슬롯, 파이프, 소켓, 시그널, 공유메모리 등이 있다.

스레드는

프로세스내에 실행되는 여러 흐름의 단위
스레드란 한 프로세스 내에서 동작되는 여러 실행의 흐름으로 프로세스 내의 주소 공간이나
자원들을 같은 프로세스 내에 스레드끼리 공유하면서 실행

스택(stack)에 저장되는 정보는 함수 호출과 관련된 내용이다. (Scope)

함수는 기능이다. 하나의 프로세스에서 여러 개의 스레드를 가진다는 것은 여러 개의 기능을 가진다는 것이다.

네트워크, 입출력, 작업 처리 등등 프로세스가 해야 할 일들이 많은데 해당 기능들을 스레드로 처리하게 되는 것이다.

이는 멀티 스레드의 강력한 배경이 되어준다.

해당 글에서는 프로세스와 스레드의 차이점만 살펴보았다. 다음의 글에서 멀티 프로세스와 멀티 스레드를
비교해볼 생각이다.

Context Switching은 사실 프로세스가 가지고 있는 스레드를 처리하는 과정
각각 스택만 따로 할당을 받고 코드 데이터 힙 영역을 프로세스내에 각각의 스레드가 내용을 공유한다!

멀티스레드를 사용시 장점

메모리를 공유하다보니 스레드간 데이터 주고받는게 간단해지고 시스템 자원 소모도 줄게 됩니다	
응답시간 또한 단축
Context Switching의 오버헤드 부분을 해결


단점
서로 데이터를 사용하다가 충돌이 일어날 가능성이 있습니다 - 동기화 문제

멀티 프로세스로 할 수 있는 작업을 멀티 스레드로 실행할 경우 ->
프로세스를 생성하여 자원을 할당하는
시스템콜이 줄어들어 자원을 효율적으로 관리 가능, 또한 프로세스간 통신보다
스레드 간의 통신의 비용이 적으므로 통신의 부담이 줄어든다

스케쥴링 알고리즘
멀티 프로세싱의 방식은 CPU에서 여러 프로세스를 로테이션으로 돌면서 처리를 하게 됩니다.

동작중인 프로세스가 대기를 타면서 해당 프로세스의 상태(Context)를 보관하고,
대기하고 있던 다음 순번의 프로세스가 동작하면서 이전에 보관했던
프로세스의 상태(Context)를 복구하게 됩니다.
이러한 일련의 과정을 Context Switching 이라고 하는데 프로세스는 각각 독립된 메모리 영역이다
보니 캐쉬 메모리 초기화 등 꽤나 무거운 작업이 진행되고 오버헤드가 발생하게 됩니다.

프로세스 상태변화
프로세스는 종료되어서 메모리를 반납할때 까지 준비 실행 대기 를 반복

운영체제는 프로세스 스케줄러를 이용해 프로세스 상태변화를 관리

멀티 스레드(Multi Thread)

  • 하나의 프로세스가 다수 개의 작업을 각각 스레드를 이용하여 동시에 작동 시킬 수 있다.
  • 스레드는 다음과 같은 공유 메모리를 가진다
    Stack을 제외한 모든 메모리를 공유하기 때문에
    global(전역), static(정적) 변수 그리고 new, malloc에 의한 모든 자료를 공유할 수가 있다.
    : 이는 프로세스간 통신(ex.pipe)과 같이 복잡한 과정을 거치지 않고 보다 효율적인 일처리가 가능하다는 것을 뜻한다. (핸들 테이블과 환경변수는 덤이다.)

결국 계산기와 메모장 처럼 서로 완전히 별개의 프로그램이라면 독립적인 프로세스를 구성해야겠지만
서로 관련된 기능들은 멀티스레드로 구현하는것이 이득이다

스레드 단점

 지금까지만 봤을 때는 스레드가 프로세스에 비해 탁월한 기능을 가지고 있어보이지만, 스레드에도 단점이 존재한다. 바로, 동기화(Synchronize)이슈이다. 스레드1이 공유 자원 내의 어떤 데이터를 조작하다가, 스레드2에 제어권을 넘겨준 이후 스레드2가 그 데이터를 변경한다면 스레드1이 다시 제어권을 받아 남은 작업을 계속할 때 원치 않는 결과가 나올 수 있다. 
출처: https://preamtree.tistory.com/10 [Preamtree의 행복로그:티스토리]

뮤텍스(Mutex)

  • 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 것

세마포어(Semaphore)

  • 공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 것

Context Switching이란?
Context Switching은 운영체제의 CPU자원을 할당하는 스케줄러(Scheuler)에 의해 발생한다. CPU를 적절하고 효율적으로 사용할 수 있도록 하는 작업을 스케줄링이라 한다..

  • Context Switching 과정
    • Task의 대부분 정보는 Register에 저장되고 PCB(Process Control Block)로 관리된다.
    • 현재 실행하고 있는 Task의 PCB 정보를 저장한다. (Process Stack, Ready Queue)
    • 다음 실행할 Task의 PCB 정보를 읽어 Register에 적재하고 CPU가 이전에 진행했던 과정을 연속적으로 수행할 수 있다.
  • Context Switching Cost (Process vs Thread)
    • Process Context Switching 비용 > Thread Context Switching 비용
    • Thread는 Stack 영역을 제외한 모든 메모리를 공유하므로 Context Switching 수행 시 Stack 영역만 변경하면 되기 때문에 비용이 적게 든다.

교착상태(데드락, Deadlock) 란

, 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다릴 때 무한 대기에 빠지는 상황을 일컫습니다.

  • 첫 번째 스레드는 두 번째 스레드가 들고 있는 객체의 락이 풀리기를 기다리고 있고, 두 번째 스레드 역시 첫 번째 스레드가 들고 있는 객체의 락이 풀리기를 기다리는 상황을 일컷는다.

  • 모든 스레드가 락이 풀리기를 기다리고 있기 때문에, 무한 대기 상태에 빠지게 된다. 이런 스레드를 교착상태에 빠졌다고 한다.

교착상태 방지

  • 대기 상태의 사이클(circular wait) = 순환대기
  • 두 개 이상의 프로세스가 자원 접근을 기다리는데, 그 관계에 사이클이 존재한다.
profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글