프로세스와 스레드

inzZoo·2023년 2월 5일
0

CS 공부

목록 보기
1/1

🌴프로세스와 스레드

🌱 프로세스 (Process)

프로세스 : 실행 중인 프로그램으로 디스크로부터 메모리에 적재되어 CPU의 할당을 받을 수 있는 것 (운영체제로부터 주소 공간, 파일, 메모리 등을 할당 받음)

프로세스는 각각 별도의 주소 공간을 할당받아서 독립적이다. 따라서 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다. 접근하려면 프로세스 간 통신(IPC)을 사용해야 한다. (ex : 파이프, 파일, 소켓 등을 이용한 통신 방법)

🍀 프로세스의 구성

프로세스에 대한 정보(메타데이터)는 프로세스 제어블록(PCB, Process Control Block)이라고 불리는 운영체제 커널의 자료구조에 저장된다. 여기에는 다음과 같은 정보들을 담고 있다.

  • 프로세스 식별자(PID, Process ID) :

    운영체제가 각 프로세스를 식별하기 위해 부여된 식별 번호

  • 프로세스 상태 :

    new, ready, running, waiting, terminated 등의 상태를 저장

  • 프로그램 카운터(Program Counter) :

    프로세스가 다음에 실행할 명령어의 주소

  • CPU 레지스터

  • CPU 스케줄링 정보 :

    프로세스의 우선순위, 스케줄 큐에 대한 포인터, 최종 실행 시각 등

  • 메모리 관리 정보 :

    페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함

  • 입출력 상태 정보 :

    프로세스에 할당된 입출력 장치들과 열린 파일 목록

  • 어카운팅 정보 :

    사용된 CPU 시간, 시간제한, 계정번호 등


PCB는 Linked List 방식으로 관리한다. PCB List Head에 PCB들이 생성될 때마다 붙게 된다. 주소값으로 연결이 이루어져 있는 연결리스트이기 때문에 삽입 삭제가 용이하다. 즉, 프로세스가 생성되면 해당 PCB가 생성되고 프로세스 완료시 제거된다.

💡 CPU에서는 프로세스의 상태에 따라 교체작업이 이루어진다. (interrupt가 발생해서 할당받은 프로세스가 waiting 상태가 되고 다른 프로세스를 running으로 바꿔 올릴 때) 이때, 앞으로 다시 수행할 대기 중인 프로세스에 관한 저장 값을 PCB에 저장해두는 것이 필요하다.

따라서 프로세스는 CPU가 처리하던 작업의 내용들을 자신의 PCB에 저장하고 다음에 다시 CPU를 점유해서 작업을 수행할 때 PCB로부터 해당 정보들을 CPU에 넘겨와서 계속해서 하던 작업을 진행할 수 있게 된다.


🍀 프로세스 메모리 구조

  • Code :

    프로그램을 실행시키는 실행 파일 내의 명령어들이 위치하는 공간

    코드 자체를 구성하는 메모리 영역

  • Data :

    전역변수, static 변수들이 위치하는 공간

    초기화된 데이터는 data영역에, 초기화 되지 않으면 bss영역에 저장

    ( bss영역 : 초기화되지 않은 전역 데이터를 위한 영역 )

  • Heap :

    동적 할당을 위한 메모리 영역(malloc(), new 등)

  • Stack :

    로컬 변수, 파라미터, 리턴 값이 위치하는 공간 (임시 메모리 공간)


🍀 멀티 프로세스

하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것을 말한다.

  • 장점
    • 독립된 구조로 안정성이 높다 → 메모리 침범 문제를 OS차원에서 해결
    • 여러 프로세스가 작동 중이라 하나의 프로세스가 죽는다 해도 문제가 확산되지 않는다(대신 다른 프로세스의 일을 본인이 해야하기 때문에 느려질 수는 있다)
  • 단점
    • 멀티스레드보다 많은 메모리 공간과 CPU시간을 차지
    • 작업량이 많을수록 오버헤드가 발생하여 성능 저하가 발생할 수 있음 Context Switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 시간이 소모되는 등 성능 저하 발생)



🌱 스레드 (Thread)

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

기본적으로 한 프로세스는 최소 1개의 스레드를 소유하고 있다. 스레드는 프로세스 내에서 stack만 따로 할당 받고 Code, Data, Heap영역은 서로 공유한다. 따라서 스레드들은 프로세스 내의 주소 공간이나 자원(힙 공간)을 공유할 수 있다. 즉, 각각의 스레드들은 별도의 스레드 ID, 프로그램 카운터, 레지스터와 스택을 가지고 있지만 Heap메모리는 서로 읽고 쓸 수 있다.

  • 스레드마다 stack을 독립적으로 할당하는 이유

    스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이다. 따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.

  • 스레드마다 프로그램 카운터(PC)를 독립적으로 할당하는 이유

    PC 값은 스레드가 명령어의 어디까지 수행하였는지를 나타나게 된다. 스레드는 CPU 를 할당받았다가 스케줄러에 의해 다시 선점당한다. 그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다. 따라서 PC 레지스터를 독립적으로 할당한다.


🍀 자바 스레드

  • 일반 스레드와 차이가 거의 없고 JVM이 운영체제의 역할을 함
  • JVM에 의해 스케줄되는 실행 단위 코드 블럭

🍀 멀티 스레드

하나의 작업을 위해 프로세스에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것을 말한다.

프로세스를 다수의 실행 단위(스레드)로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키위해 사용한다.

  • 장점
    • 메모리 공간과 시스템 자원 소모가 감소 → 자원 효율성⬆️
    • 스레드 간 데이터를 주고받는 것이 Heap 영역을 이용하여 간단해지고 시스템 자원 소모가 줄어든다
    • 스레드 사이 Context Switching이 캐시 메모리를 비울 필요가 없어서 프로세스 Context Switching보다 빠름 → 시스템 처리율(throughput)⬆️ → 자원 소모⬇️ → 프로그램 응답시간 단축

  • 단점
    • 자원을 공유하기에 동기화 문제가 발생할 수 있음 (병목현상, 데드락(DeadLock, 교착상태) 등)

    • 하나의 스레드에 문제가 발생하면 전체 프로세스에 영향을 끼친다

    • 동기화를 통해 작업 처리 순서를 컨트롤 하고 공유 자원에 대한 접근을 컨트롤 하는 것이 필요함


멀티 스레드의 안전성에 대한 단점 극복 방법
공유 자원에 접근하는 임계영역(critical section)을 동기화 기법으로 제어!
이를 ‘상호 배제’라고 하며 동기화 기법으로는 Mutex, Semaphore등이 있다.



🌱 프로세스와 스레드 차이

프로세스는 자신만의 고유 공간과 자원을 할당 받아 사용하는데 반해, 스레드는 다른 스레드와 공간, 자원을 공유하면서 사용하는 차이가 존재한다.

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

  • 멀티 스레드는 멀티 프로세스보다 작은 메모리 공간을 차지하고 Context Switching이 빠른 장점이 있지만, 동기화 문제와 하나의 스레드 장애로 전체 스레드가 종료될 위험을 갖고 있음
  • 멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티 스레드보다 많은 메모리 공간과 CPU시간을 차지하는 단점이 있음

두 방법은 동시에 여러 작업을 수행하는 점에서 동일하지만, 각각의 장단이 있으므로 적용하는 시스템에 따라 적합한 동작 방식을 선택하고 적용해야 한다.




참고 :

PCB(Process Control Block)란?

[운영체제] 프로세스가 뭐지?

스레드(Thread)

멀티 스레드(Multi Thread) & 멀티 프로세스(Multi process)

profile
달리는 두치~뿌꾸뿌꾸 빵빵

0개의 댓글