04_프로세스와 스레드

Lukaid·2023년 9월 10일
0

boostcamp

목록 보기
4/20

Process와 Thread

OS, Process, Thread, Scheduling... 워낙 많이 들어봐서 익숙하지만, 또 막상 마주하면 어려운 친구들이다. 이 친구들 하나하나가 정말 깊게 파고들면 끝이 없을 것 같다. 간단하게만 정리해보자.


운영체제 (Operating System - OS)

운영체제는 컴퓨터 하드웨어와 소프트웨어 사이에서 중재자 역할을 하는 시스템 소프트웨어라고한다. OS는 워낙 많이 들어봤고, 주변에서도 다양한 운영체제들을 직접 사용하고 있을것이다. (TMI: 나도 워낙 전자제품을 좋아하는 테크충인데, 이걸 정리하면서 주변에 운영체제를 가지고있는 머신이 얼마나 있는지 세어보니까, mac os, pad os, android, windows x2, ubuntu, xbox, tizen... 엄청 많네...)

운영체제는 하드웨어 자원 (CPU, 메모리, 디스크, 네트워크 등)을 관리하고, 사용자 및 응용 프로그램에 서비스를 제공한다. 주요 기능에는 프로세스 관리, 파일 시스템 관리, 메모리 관리, 입출력 관리 등이 있다.


프로세스 (Process)

프로세스는 실행 중인 프로그램의 인스턴스를 나타낸다. 각 프로세스는 독립적으로 실행되며, 자체 메모리 공간 및 자원을 할당받는다. 운영체제는 프로세스를 생성, 제어, 스케줄링하며, 다른 프로세스와 통신할 수 있는 메커니즘을 제공한다.

말이 어렵다... 프로세스는 CPU가 처리하는 작업(Task)라고 생각할 수 있고, 실행중인 프로그램이라고 생각 할 수 도 있다. 프로세스는 프로그램을 실행하면 생성되고, 프로그램을 종료하면 소멸한다. 프로세스는 프로그램을 실행하는데 필요한 데이터와 메모리 등의 자원, 쓰레드로 구성되어 있다. 좀 더 구체적으로 디스크에 저장되어 있던 실행 가능한 프로그램이 메모리에 적재되어 운영체제가 관리하는 상태를 의미한다.

근데 컴퓨터에는 하나의 프로세스만 있는게 아니다. 수십 수백 수천 수만개의 프로세스가 동시에 실행되고 있다. 이 프로세스들은 각각 독립된 메모리 영역을 가지고 있어, 서로 영향을 주지 않는다. 그래서 프로세스는 독립적인 실행 흐름을 가지고 있다고 볼 수 있다. 근데 컴퓨터의 CPU의 자원은 한정되어 있다. 그래서 이를 조금 더 효율적으로 사용하기 위해 프로세스들을 스케줄링한다.


스케줄링 (Scheduling)

프로세스 스케줄링은 CPU가 여러 프로세스를 실행하는데 있어서 어떤 프로세스를 먼저 실행할지, 얼마나 실행할지 등을 결정하는 것이다. 프로세스 스케줄링은 프로세스의 상태 변화에 따라서 이루어진다. 프로세스는 생성 -> 준비 -> 실행 <-> 대기 -> 종료까지 크게 5가지 상태가 있다. 프로세스 스케줄링은 이런 상태 변화에 따라서 이루어진다. 스케줄링 기법은 다음과 같다.

  1. 기한부 스케줄링 (deadline scheduling)

    작업들을 동작 시간을 주어진 마감 시간까지 완성하도록 계획한 스케줄링이다.

  2. 우선순위 스케줄링 (priority scheduling)

    프로세스 실행 중에 우선순위가 높은 프로세스를 먼저 실행하는 방식으로 낮은 우선순위가 계속 밀릴 수 있다.
    우선순위가 동적으로 바뀌는 방법도 있고, 고정적인 우선순위로 운영되기도 한다.

  3. FIFO 스케줄링 (FIFO scheduling)

    비선점 스케줄링으로 프로세스가 생성된 순서대로 대기큐에 넣어놓고 순서대로 스케줄링하는 방식이다.

  4. SJF 스케줄링 (Shortest Job scheduling)

    비선점 스케줄링 방법으로 작업이 끝날 때까지 실행 시간이 가장 작은 것부터 먼저 스케줄링하는 방식이다.

  5. 라운드로빈 스케줄링 (Round Robin scheduling)

    선점 스케줄링 방식으로 FIFO처럼 순차적으로 실행하지만, CPU에서 제어하는 시간을 일정하게 나눠서 스케줄링하는 방식이다.
    CPU 시간이 마무리될 때까지 작업이 끝나지 않으면 다음 프로세스로 넘어간다.


스레드 (Thread)

스레드는 하나의 프로세스 내에서 실행되는 작은 실행 단위이다. (우리가 컴퓨터를 살때 보는 8코어 16스레드 이거랑은 다른 개념이다.) 하나의 프로세스에는 여러 개의 스레드가 존재할 수 있으며, 스레드는 같은 프로세스의 자원을 공유한다. 스레드를 사용하면 병렬 처리와 다중 작업이 효과적으로 구현될 수 있다.

스레드는 경량 프로세스 (Light Weight Process)라고 부르기도 하며, 프로세스에서 실행 제어만 분리해서 처리하는 단위를 말한다.
스레드는 같은 그룹의 스레드와 코드, 메모리 주소 공간, 운영체제 리소스를 공유한다. 프로세스는 하나 이상의 스레드를 가지고 각 스레드는 다음 같은 동작을 담당한다.

  • 스레드 실행에 대한 상태 관리
  • 실행을 위한 별도 스택
  • 지역 변수와 스레드 특정 데이터를 저장하는 데이터 저장소
  • 프로세스의 메모리와 자원에 대한 접근을 기록하는 컨텍스트 정보

특징

  • 스레드를 사용하면 사용자에 대한 응답성을 증가시킬 수 있다.
  • 프로세스 자원과 메모리를 공유할 수 있다.
  • 자원을 공유하기 때문에 경제적이다.
  • 다중 프로세서와 다중 스레드를 혼합해서 병렬 실행이 가능하다.

정리

어렵다... 너무 어렵다... 공부한 내용은 더 많은데 이걸 정리하는건 진짜 너무 어렵다... 내용도 어렵고 정리하는 것은 더 어려운 것 같다.

아무튼 프로세스와 스레드에 대한 간단한 개념을 정리해봤다. python과 node에서 코드를 짤때, 이러한 개념들을 머리에 담고 있다면, 조금 더 효율적인 코드를 작성 할 수 있을 것 같다.

profile
풀스택 지향 웹개발자 이성우입니다.

0개의 댓글