[TIL] 프로세스 / 스레드

river·2022년 9월 27일
0

스터디

목록 보기
8/9

🚩기본 용어

  • 프로그램
    : 운영체제 위에서 실행시킬 수 있는 파일
  • 프로세스
    : 현재 실행중인 프로그램, 작업 상태
  • 프로세서
    : 그 작업(프로세스)을 실제로 실행하는 장치(=CPU)

🚩 동시성에 관하여

‘동시’ 라는 말 때문에 한 순간에 여러가지 작업이 함께 진행되고 있다고 이해하기 쉽다. 그러나 실제로 CPU는 한 순간에 하나의 프로세스만을 실행할 수 있음.

실제로 프로세서는 아주 짧은 시간동안 수십~수천번씩 실행할 프로세스를 계속 교체해가며 작업하고 있기 때문에 우리는 동시에 여러개의 작업이 실행되고 있다고 느끼게 된다.

❓ 한 번에 여러가지 요리를 만들 때 보통 동시에 n가지 요리를 만든다고 말하지만, 실제로는 이 요리 살폈다가, 저 요리에 소금 넣고, 또 이 요리 간 보고… 이렇게 번갈아가면서 작업을 하고 있는 것과 비슷하다.

🚩 PCB (Process Control Block)

프로세스를 제어하기 위한 정보 모음

프로세서가 프로세스를 스위칭하면서 작업을 하기 위해선 어느 작업을 어디까지 진행했는지를 매번 불러와야 함. 이 불러올 정보들을 저장해놓는 공간.

  • PCB에 담기는 정보
    • 프로세스 식별자 (process id)
    • 프로세스 상태
    • 다음에 실행할 명령의 주소
    • 이전에 작업하던 작업 내용(레지스터)
    • CPU 스케줄링 정보(우선 순위, 최종 실행시각, CPU 점유 시간 등)
    • 프로세스의 주소 공간 등

💡 Context Switching ?

프로세서가 작업(task)을 교체하는 시점마다 어느 작업을 어디까지 진행했는지 저장도 하고, 어디서부터 시작해야 하는지 새로 로딩해오는 시간이 필요한데, 이 순간을 컨텍스트 스위칭이라고 한다.

🚩 프로세스의 구조

  • Stack - 호출된 함수, 지역변수 등 임시 데이터
  • Heap - 동적으로 생긴 데이터 예) new Object(), malloc() 등...
  • Data - 전역변수 예) static 변수, global 변수
  • Code - 프로그램의 코드

🚩 멀티 프로세스

작업 흐름에 여러 갈래가 생기는 경우 여러개의 프로세스로 하나의 작업을 구성할 수 있다.

그러나 이렇게 여러개의 프로세스로 나누어 한 작업을 진행할 경우, 비슷한 작업임에도 불구하고

  1. CPU가 각 프로세스를 교체하며 작업할때마다 컨텍스트 스위칭이 발생하게 되고,
  2. 같은 작업을 진행중인 또 다른 프로세스의 정보를 함께 이용하기 위해 각 프로세스간의 통신도 필요하다.

이런 비효율을 개선하기 위해 스레드 라는 개념이 탄생하게 됨.

🚩 멀티 스레드

  • 스레드
    : 프로세스의 실행 단위. 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 같은 프로세스에 속한 다른 스레드와 Code, Data, Heap을 공유한다.

멀티 스레드의 경우 하나의 프로세스 내에서 다수의 실행 단위로 구분하여 작업을 수행하는 방식으로, Code, Data, Heap을 공유하기 때문에 캐시 메모리에 적재된 것들을 스위칭하는 과정이 필요치 않으며, PCB의 레지스터 블록들만 교체하면 되어 멀티 프로세스에 비해 컨텍스트 스위칭 시간이 훨씬 절약된다.

왜 Stack은 공유하지 않는가?
스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값, 함수 내에 선언하는 변수 등을 저장하기 위한 메모리 공간이다. 스택 메모리 공간이 독립적으로 존재해야 독립적인 함수 호출이 가능하고, 독립적인 실행 흐름이 추가되게 된다. 즉 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 각 스레드마다 스택이 할당 되는 것.

왜 PCB의 레지스터 블록은 공유하지 않는가?
같은 프로세스 내에서 작업이 이루어지더라도 각 스레드별 CPU 스케줄링이 필요하며, 어느 부분까지 작업을 수행하였는지 기억할 필요가 있기 때문.

  • 멀티 스레딩의 장점 멀티 프로세스의 통신에 비해 훨신 간단하며 빠르다. 굳이 캐시 메모리를 비웠다가 다시 적재시킬 필요가 없고, 자연스럽게 자원 소모가 줄어들게 되어 프로그램의 응답 시간이 단축된다.
  • 멀티 스레딩의 단점 서로 다른 스레드가 같은 데이터, 힙 영역을 공유하기 때문에 갑자기 다른 스레드의 변수나 자료구조에 접근해 데이터가 꼬일 수 있다. 이는 동기화 작업을 통해 작업 처리 순서와 공유 자원에 대한 접근을 컨트롤하여 개선할 수 있으나, 과도한 락으로 병목현상이 발생해 성능이 저하될 가능성이 있다.

멀티 스레딩의 경우 자원 소모, 속도 측면에서는 절약적이나, 하나의 스레드가 종료될 경우 연계된 모든 스레드가 종료될 수 있다는 위험성이 있고, 멀티 프로세스의 경우 한 프로세스가 종료되어도 다른 프로세스에 영향을 미치지 않지만 자원 소모, 속도 측면에서 뒤떨어진다. 적용해야 하는 시스템에 따라 적합/부적합이 구분되므로, 대상 시스템의 특징에 따라 선택과 적용이 필요하다.

[10분 테코톡] 👩‍💻👨‍💻 쪼밀리와 오구의 Process vs Thread
https://youtu.be/DmZnOg5Ced8

profile
가보자고

0개의 댓글