운영 체제(OS)와 스레드

Rosevilleage·2023년 3월 28일
0

운영 체제 (Operating System)

하드웨어와 시스템 리소스를 제어하고 프로그램에 대한 서비스를 지원하는 소프트웨어로 2가지 요소로 구성되어 있다.

  • 커널 : OS의 핵심으로 하드웨어와 시스템의 관리를 담당한다.

  • 인터페이스 : 사용자의 명령을 전달하고, 실행 결과를 알려주는 역할을 하며, CLI(shell)나 GUI의 형태를 지닌다.

목적

  • 사용자가 컴퓨터를 쉽고 효율적으로 실행할 수 있는 환경 제공

  • 컴퓨터 시스템 하드웨어 및 소프트웨어 리소스를 여러 사용자 간에 효율적으로 할당, 관리, 보호

  • 사용자 프로그램의 오류나 잘못된 리소스 사용을 감시하고, 입출력 장치 등의 자원에 대한 연산과 제어를 관리

시스템 리소스 관리

운영체제는 프로그램이 실행될 수 있도록 하며, CPU, 메모리, 입출력장치 등의 시스템 리소를 관리하는 주체로서 동작한다.

또한 리소스의 효율적인 관리를 위해 스케줄링 기능 제공한다.
스케줄링이란 간단하게 말하자면 CPU에게 어떤 프로세스를 할당시켜야 효율이 좋은지 계산하여, 프로세스들을 일정 시간동안 적절한 순서대로 CPU에 할당시키는 것을 의미한다.

응용 프로그램 관리

응용 프로그램이 실행될 때 시스템 리소스가 적절히 사용될 수 있도록 응용 프로그램의 시스템 리소스 사용 권한을 관리한다.

응용 프로그램이 실행되기 위해서는 OS를 통해 권한을 부여받아야 한다. 이렇게 응용 프로그램이 OS에 요청을 보내 권한을 받기 위해서는 OS가 API를 제공해야 하는데, 이를 커널이 제공하고, 시스템 콜(system call) 이라고 부른다.

프로세스 (process)

프로그램이 실행되어, 프로그램 코드가 메모리에 위치하고 CPU가 해당 코드를 수행하고 있는 상태를 의미한다.
실행중인 하나의 프로그램을 프로세스라고 부르며, 프로세스각각 독립적이기 때문에 같은 종류의 프로그램이 실행되었다고 하더라도, 프로세스는 실행된 만큼 존재한다.

다음과 같은 요소로 구성되어 있다.

  • code(or text) : 실행 파일의 명령어들이 적재되는 영역

  • data : 전역 변수, static변수의 할당

  • heap : 동적 할당을 위한 영역

  • thread : 프로세스 내에서 실제로 작업을 수행하는 주체

    • stack : 지역변수, 함수 호출시 전달되는 인자를 위한 영역

특징

다음과 같은 특징을 가진다.

  • 자원 소유
    각각의 프로세스는 자신의 실행 이미지 로드와 실행에 필요한 추가적인 메모리 공간을 가지고 있어야 하며, 각 프로세스마다 구별되어야 한다. 해당 프로세스가 접근하고자 하는 파일, I/O 장치들에 대해서 프로세서 단위로 할당 받아 관리되어야 한다.

  • 디스패칭
    OS는 여러 개의 프로세스가 병렬적으로 실행되게 하기 위해서 CPU(프로세서)의 사용 시간을 각각의 프로세스에 골고루 나누어 주어야 한다. 하나의 프로세스에서 여러 개의 디스패칭 단위가 실행될 수 있으며, 이러한 디스패칭 단위를 스레드라 부른다.

상태

프로세스는 다음과 같은 세가지 상태를 지닌다.

  • 실행(run) : 프로세스가 프로세서를 차지하여 서비스를 받고 있는 상태

  • 준비(ready) : 실행 될 수 있도록 준비되는 상태

  • 대기(waiting) : 프로세서가 아닌 입출력을 기다리는 상태

스레드 (thread)

프로세스 내에서 실행되는 흐름의 단위로 정의 되기도 하며, 프로세스에서 실직적으로 작업이 수행되는 주체로 볼 수 있다. 프로세스에 최소 하나의 스레드가 존재하며, 다음과 같은 구성 요소를 가진다.

  • 가상 CPU : 인터프리터, 컴파일러에 의해 내부적으로 처리되는 가상코드

  • 수행 코드 : Thread Class에 구현되어 있는 run() Method 코드

  • 처리 데이터 : Thread에서 처리하는 데이터

특징

  • 하나의 스레드는 종료할 때까지 한번에 하나씩의 명령을 수행한다.

  • 스레드는 각자의 call stack를 소유하며, code, data, heap은 서로 공유할 수 있다.

  • 스레드는 각자 독립적으로 동작한다.

싱글 스레드, 멀티 스레드

프로세스 내에 스레드의 수가 하나일 경우 싱글 스레드, 복수일 경우 멀티 스레드라 칭한다.

싱글 스레드

레지스터와 스택이 하나다.

  • 장점

    • 리소스에 동시에 접근할 다른 스레드가 없기에 리소스 접근 동기화를 신경쓰지 않아도 된다.

    • 문맥 교환(context seitch)이 필요 없다.

    • 프로그래밍 난이도가 낮고, CPU 메모리를 적게 사용한다.

  • 단점

    • 여러개의 코어를 사용할 수 없기에 멀티 코어 머신에서 CPU 사용을 최적화 할 수 없다. cluster 모듈을 통해 여러 프로세스를 사용할 수 있으나, 자원 공유를 위해 redis 같은 부가 인프라가 필요하다.

    • 연산량이 많은 작업을 하는 경우, 그 작업이 완료되어야 다른 작업을 수행할 수 있다.

    • 에러를 처리하지 못하는 경우 멈춰버린다.

멀티 스레드

하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미한다.

  • 장점

    • 작업을 분리해서 수행하므로 실시간으로 사용자에게 응답할 수 있다.

    • 한 프로세스를 여러 프로세서(코어)에서 수행할 수 있으므로 효율적이다.

  • 단점

    • 주의 깊은 설계가 필요하며, 디버깅이 까다롭다.

    • 단일 프로세스 시스템의 경우 효과를 기대하기 어려우며 다른 프로세스에서 스레드를 제어할 수 없다.

    • 자원 공유 문제가 발생한다. 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받는다.

    • 문맥 교환(context switch) 작업을 요구한다. CPU에서 여러 프로세스를 돌아가면서 작업을 처리할 때 실행중이던 태스크를 멈추고 다른 태스크를 연결하는 것을 의미한다.

동시성

멀티 스레드라고 해도 무조건적인 병렬 실행을 보장하지는 않는다.

기본적으로 CPU가 멀티 코어 이상이어야 복수의 스레드를 동시에 처리할 수 있고, 추가적으로 소프트웨어가 병렬적으로 구성 되어 있어야 하기 때문이다.

일반적으로 컴퓨터에서 동시에 처리할 수 있는 스레드의 갯수는 코어의 갯수에 의해 결정된다.

  • 싱글 코어 + 멀티 스레드
    Concurrency(동시성, 병행성) : context switch를 통해 여러개의 스레드가 일정 시간의 코어 점유권을 가진다. 매우 짧은 시간에 여러번 일어나기 때문에 동시에 처리되는 것처럼 보인다. 이를 시분할이라고 한다.

    1111과 2222라는 동작이 주어진다고 했을 때
    = 12121212
    의 형태로 실행된다.

    만약 순차적으로 실행된다면
    1111
    2222
    의 형태로 실행 되었을 것이다.

  • 멀티 코어 + 멀티 스레드
    Parallelism(병렬성) : 하나의 코어가 하나의 스레드를 처리할 수 있기 때문에 동작이 실제로 동시에 실행된다.

    1111과 222라는 동작이 주어진다고 했을 때
    = 1111 2222
    의 형태로 실행된다.


Reference

코드스테이츠

github.io-박성범-2018.05.03-공룡책으로 정리하는 운영체제 Ch.3

wikipedia-운영체제

0개의 댓글