ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 운영체제, 프로세스, 스레드, 멀티 스레드, 가비지 컬렉션
    Topic/CS 2022. 2. 11. 15:19
    반응형

    프로세스, 스레드, 멀티 스레드 ✔️

     

    1. 프로세스 (process)
      운영체제에서는 실행 중인 하나의 애플리케이션을 프로세스라고 부른다.
      사용자가 애플리케이션을 실행하면, 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행한다.
      이때 실행되는 애플리케이션을 프로세스라고 부른다.
      Ex.크롬 브라우저를 두 개 실행하면, 두 개의 프로세스가 생성된다.(하나의 애플리케이션이 여러 프로세스(다중 프로세스)가 되기도함)
      -> MacOS에서는 활성 상태창, Windows에서는 작업관리자에서 확인 가능

    2. 스레드 (Thread)
      한 가지 작업을 실행하기 위해 순차적으로 실행한 코드를 실처럼 이어 놓았다고 해서 스레드 라고 부른다.
      하나의 스레드는 코드가 실행되는 하나의 흐름이기 때문에,
      한 프로세스 내에 스레드가 두 개라면 코드가 실행되는 흐름이 두 개 생긴다.

    3. 멀티 스레드 (Multi-Thread)
      멀티 프로세스가 애플리케이션 단위의 멀티 태스킹이라면 멀티 스레드는 애플리케이션 내부에서의 멀티 태스킹이다.
      다양한 곳에서 멀티 스레드가 사용된다. 
      대용량 데이터 처리시간을 단축하기 위해 데이터를 분할하여 병렬로 처리하는데 사용하거나
      UI를 가지고 있는 애플리케이션에서 네크워크 통신을 하기 위해 사용하거나
      여러 클라이언트의 요청을 처리하는 서버를 개발할 때에도 사용된다.

    멀티 스레드 👥

     

    멀티 스레드의 장점

    멀티 스레드로 처리하면 프로세스를 이용하여 동시에 처리하던 일보다 메모리 공간과 시스템 자원의 소모가 줄어든다.
    스레드 간의 통신이 필요한 경우에도 별도의 자원을 이용하는 것이 아니라, 전역 변수의 공간 또는 동적으로 할당된 공간인
    Heap 영역을 이용한다. 따라서 프로세스 간 통신 방법에 비해 스레드 간의 통신 방법이 훨씬 간단하다.
    시스템 당 처리량도 향상되고 자원 소모가 줄어들어 프로그램의 응답 시간이 단축된다.
    이러한 장점때문에 여러 프로세스로 할 수 있는 작업하나의 프로세스에서 스레드로 나눠 수행한다.

     

    멀티 스레딩의 문제점

    멀티 프로세스 기반으로 프로그래밍할 때는 프로세스 간 공유하는 자원이 없어서 동일한 자원에 동시 접근하는 일이 없지만,
    멀티 스레딩을 기반으로 프로그래밍할 때는 공유하는 자원에 대하여 문제가 발생할 수 있다.

    서로 다른 스레드가 같은 데이터에 접근하고, 힙 영역을 공유하기 때문에 서로 다른 스레드가 서로 사용 중인 변수나 자료구조에
    접근하여 엉뚱한 값을 읽어오거나 수정하는 일이 발생할 수 있다.

    그래서 멀티 스레딩 환경에서는 동기화 작업을 통해 작업 처리 순서를 제어하고, 공유 자원에 대한 접근을 제어해야 한다.

    동시에 돌릴 수 있는 스레드 수는 컴퓨터에 있는 코어 개수로 제한된다.
    운영체제는 각 스레드를 시간에 따라 분할하여, 여러 스레드가 일정 시간마다 돌아가면서 실행되도록 하는 시분할이 있다.

    Concurrency(동시성, 병행성): 여러 개의 스레드가 시분할 방식으로 동시에 수행되는 것처럼 착각을 불러일으킴.

    Parallelism(병렬성): 멀티 코어 환경에서 여러 개의 스레드가 실제로 동시에 수행됨.

     

    Context Switching이란?

    Context Switching은 다른 태스크(프로세스, 스레드)가 시작할 수 있도록 이미 실행 중인 태스크를 멈추는 것이다.

     

    가비지 컬렉션 ✔️

     

    가비지 컬렉션은 프로그램에서 더 이상 사용하지 않는 메모리를 자동으로 정리하는 것이다.
    (이 기능을 가진 언어(혹은 엔진)는 자바, C#, 자바스크립트 등이 있다.)

     

    대표적인 가비지 컬렉션

    트레이싱:
    한 객체에 flag를 두고, 가비지 컬렉션 사이클마다 flag에 표시 후 삭제하는 mark and sweep 방법이다.
    객체에 in-use flag를 두고, 사이클마다 메모리 관리자가 모든 객체를 추적해서 사용중인지를 표시(mark)한다.
    그 후 표시되지 않은 객체를 삭제(sweep)하는 단계를 통해 메모리를 해제한다.

    레퍼런스 카운팅:
    한 객체를 참조하는 변수의 수를 추적하는 방법이다.
    객체를 참조하는 변수는 처음에는 특정 메모리에 대해 레퍼런스가 하나뿐이지만, 변수의 레퍼런스가 복사될 때마다 레퍼런스 카운트가 늘어난다.
    객체를 참조하고 있던 변수값이 바뀌거나, 변수 스코프를 벗어나면 레퍼런스 카운트는 줄어든다.
    레퍼런스 카운트가 0이 되면, 그 객체와 관련한 메모리는 비울 수 있다.
    레퍼런스 카운트가 0이 된다는 뜻은 아무도 그 객체에 대한 레퍼런스를 가지고 있지 않다는 말과 같다.

     

    웹 서비스에서의 캐시  ✔️

     

    캐시: 많은 시간이나 연산이 필요한 작업의 결과를 저장해두는 것

     

    컴퓨팅에서 일반적으로 캐시는 일시적인 데이터를 저장하기 위한 목적으로 존재하는 고속의 데이터 저장 공간이다.
    첫 작업 이후 다시 이 데이터에 대한 요청이 있을 경우, 데이터의 기본 저장 공간에 접근할 때보다 빠르게 요청을 처리할 수 있다.
    캐싱을 사용하면 이전에 검색하거나 계산한 데이터를 효율적으로 재사용할 수 있다.

    캐시 데이터는 일반적으로 RAM(Random Access Memory)과 같이 빠르게 액세스할 수 있는 하드웨어에 저장되며
    소프트웨어 구성 요소와 함께 사용될 수도 있다.

    캐시는 기본 스토리리 계층(SSD, HDD)에 액세스하여 데이터를 가져오는 더 느린 작업의 요구를 줄이고,
    데이터 검색의 성능을 높인다.

     

    캐시의 장점

    애플리케이션 성능 개선
    데이터베이스 비용 절감
    백엔드 부하 감소
    예측 가능한 성능
    데이터베이스 핫스팟 제거
    읽기 처리량 증가

    캐시의 예시

    클라이언트: HTTP 캐시 헤더, 브라우저
    네트워크: DNS 서버, HTTP 캐시 헤더, CDN, 리버스 프록시
    서버 및 데이터베이스: 키-값 데이터 스토어(e.g. Redis), 로컬 캐시(인-메모리, 디스크)

     


     

    반응형
Designed by LEO.