OS #2 Process & Thread

김태준·2023년 3월 2일
0

CS & OS Study

목록 보기
5/12
post-thumbnail

프로그램이란, 파일이 저장 장치에는 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태를 의미하고 즉 실행되기 전의 파일, 코드 덩어리를 의미한다. 윈도우 상에선 exe 파일들을 의미한다. 해당 프로그램을 실행한다면, 이를 프로세스라고 한다.
프로그램 하나가 단순히 하나의 작업만을 수행하는 경우는 거의 없고 여러 프로세스를 만들어야 한다. 그러나, OS는 안정성을 위해 프로세스마다 독립적으로 할당된 메모리 영역이 있기에 프로세스 간 접근이 불가능하다. 이를 해결하고자 프로세스와는 다른 더 작은 실행 단위 개념이 필요하게 되었고 이러한 개념이 바로 스레드이다. 스레드는 프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행 경로를 의미한다.

이어서 프로세스, 스레드의 기본개념에 대해 알아보고자 한다.

✅ 프로세스 & 스레드

🎈 프로세스

  • 프로그램을 메모리 상에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
  • OS로부터 시스템 자원을 할당받는 작업 단위
  • 프로세스 1개마다 최소 1개 이상의 스레드를 보유하게 된다.
  • 프로세스는 별도의 주소 공간에서 실행되며 타 프로세스에 독립적이기에 접근 X
  • 다른 프로세스 자원에 접근하기 위해선 IPC(프로세스 간 통신)을 사용해야 한다.
    ex) CPU 시간, 운영되기 위해 필요한 주소 공간, Code, Data, Stack, Heap 구조로 된 독립된 메모리 영역
    Code : 코드 자체를 구성하는 메모리 영역 (프로그램 명령)
    Data : 전역변수, 정적변수, 배열 등 (초기화 된 데이터만 저장, 초기화 X 데이터는 bss영역에 저장)
    Heap : 동적 할당 시 사용 (new(), malloc())
    Stack : 지역변수, 매개변수, 리턴 값 (임시 메모리 영역)

🎈 스레드 : 프로세스 내에서 실행되는 여러 흐름 단위


한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내 주소 공간, 자원들을 같은 프로세스 내 타 스레드와 (힙 공간)공유하며 실행

  • 각 스레드는 별도의 레지스터, stack만 따로 할당받고 나머지 code, data, heap 영역은 서로 공유한다. 특히 힙 메모리는 서로 읽고 쓰기 가능
    하나의 스레드에서 프로세스 자원 변경 시 다른 sibling 스레드도 변경 결과를 즉시 볼 수 있음

🎈 JAVA 스레드?

앞서 학습한 스레드와 큰 차이가 없고, JVM가 OS 역할을 한다.

  • 자바에는 프로세스 존재 X, 스레드만 존재해 자바스레드는 JVM에 의해 스케줄되는 실행 단위 코드 블록
  • 자바에서 스레드 스케줄링은 전적으로 JVM에 의해 이루어지고 스레드가 관리된다.
    (스레드 개수, 스레드로 실행되는 프로그램의 메모리 위치, 스레드 상태 및 우선순위 등)

💯 프로세스 vs 스레드 차이점

  1. 프로세스는 메모리 상에 올라온 작업 단위를, 스레드는 프로세스 내 실행되는 흐름을 의미
  2. 프로세스는 독립된 공간으로 자신만의 자원을 할당받아 사용하는 반면, 스레드는 타 스레드와 공간, 자원을 공유하며 사용

✅ 멀티 프로세스 & 멀티 스레드

🎈 멀티 프로세스

: 하나의 응용 프로그램을 여러 프로세스로 구성해 각 프로세스가 하나의 작업을 처리하도록 하는 것
💡 장점 )
1. 여러 자식 프로세스 중 하나에 문제가 발생하면 해당 프로세스만 죽이면 영향 X (안정성이 높다)
💡 단점 )
1. Context Switching에서의 오버헤드

  • 독립적이라는 프로세스 특성 상, 해당 Context 전환 문제가 발생하면 캐시 내 모든 데이터를 리셋하는 초기화를 진행해야하는데, 이때 작업량이 대체로 많게 진행되고 시간도 많이 소모되며 오버헤드 발생
  • Context Switching란?
    : CPU에서 여러 프로세스를 돌아가며 작업을 처리하는 과정, 구체적으로 살펴보면 동작 중인 프로세스가 대기하며 해당 프로세스의 상태(Context)를 보관하고 대기 중인 다음 순서의 프로세스가 동작하며 이전의 보관된 프로세스 Context를 복구하는 작업을 의미
  1. 프로세스 간 어렵고 복잡한 통신 기법(IPC)
  • 프로세스는 각각 독립된 메모리 영역을 할당받기에 하나의 프로그램에 속하는 여러 프로세스 간 변수 공유가 불가능하다.

🎈 멀티 스레드

: 하나의 응용 프로그램을 여러 스레드로 구성해 각 스레드로 하여금 하나의 작업을 처리하도록 함.
윈도우, 리눅스 등 많은 OS들이 멀티 프로세싱을 지원하므로 자연스럽게 멀티 스레드도 기본적 지원
웹 서버가 대표적인 멀티 스레드

💡장점 )
1. 시스템 자원 소모 감소 (자원 효율성 증대)

  • 프로세스를 생성하여 자원 할당하는 시스템 콜이 줄어들어 자원 효율적으로 관리 가능
  1. 시스템 처리량 증가(처리 비용 감소)
  • 스레드 간 데이터 공유 간단, 자원 소모 줄어들게 되고 스레드 사이의 작업량이 적어 Convert Switching 빠름.
  1. 간단한 통신 방법으로 프로그램 응답시간 단축
  • 스레드는 프로세스 내 stack 제외한 나머지 영역의 메모리를 공유하기에 통신 부담 줄어든다.

💡 단점 )
1. 주의 깊은 설계 필요
2. 디버깅 까다롭고, 단일 프로세스 시스템의 경우 효과를 못 느낌
3. 다른 프로세스에서 스레드 제어 불가능
4. 멀티 스레드의 경우 동기화 문제(자원 공유 문제) 발생
5. 하나의 스레드에 문제 발생 시 전체 스레드가 피해 영향

💯 멀티 프로세스 대신 멀티 스레드를 쓰는 이유?

프로그램 하나에서 여러 스레드로 나누어 작업을 해결하자는 것
1) 자원의 효율성 증대

  • 멀티 스레드로 실행 시 프로세스 생성이 없으므로 프로세스에 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
  • 프로세스는 독립적이기에 공유가 불가능한 반면, 스레드 간 데이터 주고 받는 것이 간단하므로 시스템 자원 소모가 줄어듬
    2) 처리 비용 감소 및 응답 시간 단축
  • IPC 통신보다 스레드 간 통신 비용이 적어 작업 간 통신 부담 줄어듬
    (스레드는 stack 제외 나머지 모든 영역 메모리 공유)
  • 프로세스 간 전환 속도보다 스레드 간 전환속도가 더 빠름
    Context Switching시 스레드는 stack만 처리

그러나, 동기화 문제(자원 공유 시 전역변수(데이터 세그먼트)를 이용하므로 충돌이 발생할 수 있다.)

참고사항

링크텍스트
링크텍스트

✅ 프로세스와 주소 공간


1) stack 영역

  • 함수 호출과 관계되는 매개변수와 지역 변수가 저장되는 영역, 값은 함수 호출과 함께 할당되며 함수 호출 완료 시 소멸
  • 메모리의 높은 주소에서 낮은 주소로 할당
  • 재귀함수가 너무 깊다면, stack overflow 발생
    2) Heap 영역
  • 런타임의 크기가 결정되는 영역
  • 사용자가 직접 제어 가능하며 공간을 동적으로 할당(malloc()) 및 해제 (free())
  • 주로 참조형 데이터(클래스) 등의 객체 데이터가 할당
  • 메모리의 낮은 주소에서 높은 주소로 할당
  • deepcopy시 바라보는 객체가 바뀌고, 얉은 복사 진행 시 바라보는 객체는 동일
    3) Data 영역
  • 전역변수, static 변수 등 프로그램이 사용할 수 있는 데이터 저장 영역
  • 어떤 프로그램에 해당 변수를 참조하는 코드가 있다면, 컴파일 후 data 영역을 참조
  • (초기화 된 데이터만 저장, 초기화 X 데이터는 bss영역에 저장)
    4) Text(Code) 영역
  • 프로그램이 실행될 수 있도록 CPU가 해석 가능한 기계어 코드가 저장되어 있는 공간.
    프로그램이 수정되면 안되기에 ReadOnly 상태로 저장, 가상 메모리 간의 공유가 가능하다.

프로그램이 CPU에 의해 실행되고 메모리에 "프로세스 주소 공간"이 할당된다.
프로세스 주소 공간은 코드, 데이터, 스택으로 이루어져 있고 사적공간이라 부른다.

  • 코드 세그먼트 : 프로그램 소스 코드 저장
  • 데이터 세그먼트 : 전역 변수 저장 (함수 내 공동으로 사용하는 변수)
  • 스택 세그먼트 : 함수, 지역 변수 저장 (LIFO 특성)
    공유 공간으로는 데이터 공간, 힙 공간, 그리고 커널 스택이 존재한다.

구역을 나눈 이유는 ?
최대한 데이터를 공유해 메모리 사용량을 줄여야 하기 때문이다.

코드의 경우 동일 프로그램 자체에서는 모두 내용이 동일하므로 따로 관리해 공유하고, stack 구조와 전역 변수의 활용성으로 인해 data 영역과 stack 영역을 따로 나누어두게 되었다. 전역변수는 어떤 함수에서도 접근할 수 있기에 Data로 따로 관리해주고, 함수외부와 함수(지역변수 포함)에 따라 stack 구조 활용을 위해 나누어 주었다.

참고사항

링크텍스트

profile
To be a DataScientist

0개의 댓글