[CS]프로세스와 스레드의 동시 실행원리

이정우·2023년 12월 10일
0

CS지식

목록 보기
2/5
post-thumbnail

벨하~
벨로그 여러분 안녕하세요

저번2주동안 주말에도 출근을 하느라 포스팅을 못했습니다 ㅜ

오늘은 지난 시간에 이어서 프로세스와 스레드에 대해서 알아보겠습니다.

지난시간에 프로세스와 스레드의 차이 그리고 프로세스와 스레드가 어떤 방식으로 자원을 공유하는지에 대해서 알아보았습니다.

오늘은 가장 자주 사용되고 중요한 개념인 병렬성과 동시성을 설명드리면서 프로세스와 스레드가 어떻게 동시 실행되는지 까지 알아보겠습니다.

먼저 알아볼것은
제목에서와 같이 프로세스와 스레드의 동시 실행원리에 대해서 알아보겠습니다.

1. 프로세스와 스레드의 동시 실행원리

여러분들이 컴퓨터를 사용할때 게임을 켜놓고 유튜브를 시청하고 또한 파일을 다운로드할 수 있죠?

그런데 이러한 것들이 가능하게 된 것은 바로
멀티 태스킹이라는 기술 덕분입니다.
(* 멀티태스킹 : 컴퓨터에서 작업을 동시에 실행하는 능력)

즉 작업을 "동시에"실행시킨다는게 중요합니다.
간단하게만 생각해서는 CPU프로세서가 프로그램들을 한꺼번에 돌린다라고도 생각할 수 있지만, 조금만 자세히 보게되면 훨씩 복잡한 원리에 의해 처리가 되는것을 알 수 있습니다.
그리고 이것이 바로 운영체제 이론의 핵심이기도 합니다.

그럼 도대체 어떻게 CPU프로세서가 프로그램들을 한번에 동시에 처리할 수 있을까요?

이것에 대해서 설명하기 이전에 잠깐 컴퓨터쪽 지식을 봐보겠습니다

여러분들이 노트북을 구매하거나 컴퓨터를 구매할때
CPU코어 라던가 00쓰레드라는것을 보신적이 있으실 겁니다.

여기서 말하는 CPU코어는 물리적인 코어 갯수가 됩니다.
반면에 쓰레드는 논리적 코어 개수를 의미합니다
다시 말해서,
실제 존재하지는 않지만 스레드의 개수만큼 코어가 존재하는 것 처럼 물리적 코어가 스레드의 개수만큼 작업을 동시에 처리할 수 있다는 의미라고도 할 수 있습니다.

이러한 기술을 하이퍼 스레딩 기술이라고 합니다.

(주의 : CPU의 스레드는 프로세스와의 스레드와 다릅니다!)

그런데 문득 이런 의문이 듭니다.
아니 물리적 코어가 스레드의 개수만큼 작업을 동시에 처리할 수 있다고 했는데 저는 8스레드인데 작업을 10개이상 동시에 돌릴 수 있는데요?

도대체 어떻게 이런일이 가능할까요??

이러한 일이 가능하게 된것은 바로 병렬성과 동시성이라는 것들 덕분입니다.

2. CPU의 작업 처리 방식

  • 병렬성

    병렬성이란 무엇일까요?
    병렬성이란 실제로 동시에 여러 작업이 처리되는것을 의미합니다. 흔히 멀티코어(4코어,8코어)에서 멀티 스레드를 동작시키는 방식이기도 합니다.
    동시성과의 가장 큰차이는 이 병렬성이라는것은 물리적인 개념이라는 것입니다.
    그래서 병렬적으로 어떤 작업을 한다는 의미는 각각의 작업이 별도의 프로세스나 별도의 스레드에서 동시적으로 처리된다는 것입니다.
    이러한 특징 덕분에 작업들이 독립적으로 실행되고 한개의 프로세스가 실패를 하더라도 다른 프로세스에 영향을 주지않게 됩니다.

그럼 이 병렬성은 주로 어디에 사용될까요??
멀티코어 컴퓨터에서 사용되며, 실행시간을 줄이거나 처리량을 늘리는데 사용됩니다.
예를 들어 대규모 데이터를 처리해야할 경우
병렬적으로 여러 코어에서 나누어 효율적으로 처리할 수 있게 됩니다.

이렇게 병렬성에 대해서 알아봤는데

이번엔 동시성에 대해서 알아보겠습니다.

  • 동시성

    동시성이란 무엇일까요?
    이름만 들었을때는 동시에 작업을 처리하는것과 비슷한거 아닌가? 라는 생각이 듭니다.
    하지만 IT용어에서의 동시성은

    동시성은 하나의 시스템이 여러 작업을 동시에 처리하는 것처럼 보이게 하는것이다.

즉 이말은 실질적으로는 동시에 처리하는게 아니라는것을 알 수있습니다.
예를들어
2개의 코어가 있고 4개의 작업이 있다고 가정하면 프로세스들을 번갈아 가면서 조금씩 처리함으로 마치 프로그램이 동시에 실행되는것처럼 보이게 되는것입니다.
이것을 사람이 느끼기 어려운 이유는 프로세스들을 매우 빠르게 번갈아가며 처리하기 때문에 마치 동시에 돌아가는것 처럼 보입니다.
그렇기에 실제 처리하는 시간 자체는 한개를 끝내고 다른 프로세스를 실행하는것과는 큰 차이가 없을 수 있습니다.
하지만 그럼에도 불구하고 이렇게 처리하는 이유는 무엇일까요?

그 이유는 바로
사용자에게 빠른 반응성을 제공하기 위함입니다.

한번 상상을 해보겠습니다.
수십 수백개의 프로세스를 돌리려고하는데 한개가 끝날때까지 기다리고 있으면 유저가 느끼기에는 작업이 너무나 오래 걸리겠구나 라는 생각이 듭니다.

물론 이러한 문제를 해결하기 위해서 CPU 코어의 성능 늘리는 방안도 생각할 수 있습니다.

하지만 코어의 성능을 늘리는데 한계가 존재합니다.
CPU발열로 인해 클럭으로 성능을 올리기에는 한계가 명확합니다. 이러한 문제를 해결하기위해 코어의 성능을 올리는 대신 코어를 여러개 탑재하여 쿼드코어, 옥타코어등의 다중 CPU를 사용할 수 있지만,
아무리 코어가 많아도 수십 수백개의 코어를 넣을 수 없게되는 하드웨어적인 제한이 걸리게 되고 결국 수십 수백개의 프로세스를 돌리기 위해서는 동시성이 필요하게 된 것입니다.

그 다음으로는 논리적인 효율적인 측면입니다.
예를들어
20개의 작업이 있는데 이중 18개는 짧게 끝나는 작업이고 나머지 2개는 오래걸리는 작업이라고 가정해 보겠습니다
2개의 논리적 스레드가 있는데 이때 가장 오래걸리는 2개의 작업을 먼저 처리하게 된다면 어떻게 될까요?
빨리끝나는 작업들이 있음에도 불구하고 오래걸리는 2개의 작업으로 인하여 이 작업들이 끝날때까지 다른 작업을 하지 못한 상태로 기다려야 할 것입니다.
이러한 비효율적인 측면을 극복하기 위해 작업을 아주 잘게 나눠 번갈아가면서 처리하는 동시성을 사용하게 되는겁니다 .

참고
https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4

문득 이런생각이 듭니다.

그럼 처음부터 CPU가 자체적으로 작업을 선택해서 빨리끝나거나 우선순위가 높은것을 해주면 안돼? 라는 생각입니다.

이러한 생각을 해결해주는게 바로
스케줄링(Sheduling) 입니다.

3. 프로세스 스케쥴링

스케줄링이란 무엇일까요?

스케줄러란

언제,어떤 프로세스를 선택해서 CPU에서 실행시키는지 선택하는 모듈(Module)입니다.

이러한 스케줄러를 사용한다면 CPU효율을 극대화 시킬 수 있습니다.

이 스케줄러는 운영체제에서 CPU를 사용할 수 있는 프로세스를 선택하고, CPU(자원)을 할당하는 작업을 의미합니다.

프로세스 스케줄러는 프로세스의 우선순위, 작업량 등을 고려하여 효율적으로 프로세스를 배치하고, 이를 통해 운영체제는 CPU를 효율적으로 사용하며 시스템 전반적인 성능을 향상 시킬수 있습니다.
이러한 스케줄링은 앞서 잠깐 설명드렸던 멀티태스킹작업을 만드는데 있어서 핵심적인 부분이라고 할 수 있습니다.

조금 더 깊에 스케줄링에 대해서 알아보겠습니다.

기본적으로 프로세스는 CPU만 사용하는 단계와 I/O작업만 하는 단계의 반복으로 구성된 사이클의 형태로 수행이 됩니다.

CPU만 사용하는 단계에 걸리는 시간과 I/O작업만 사용하는 단계에 걸리는 시간에 따라 프로그램의 특성을 나타낼 수있는데
이때 짧고 많은 CPU만 사용하는 단계가 존재하는 프로그램을 I/O-bound Job
반대로 길고적은 CPU만 사용하는 단계가 존재하는 프로그램을 CPU-bound Job이라고 부릅니다.

즉 I/O-bound Job은 CPU를 잡고 계산하는 시간보다 I/O에 많은 시간이 필요한 Job이고,

CPU-bound Job은 계산위주의 Job이라고 할 수 있습니다.

이러한 여러 Job들이 섞여있기 때문에
저희는 CPU스케쥴링이 필요하게 됩니다.

CPU스케쥴러는 메모리에서 Ready상태의 프로세스중 어떤 프로세스에 CPU를 할당해줄지 선택을 하게 됩니다.

스케줄링의 방식에는 2가지가 존재합니다.
하나는

  • 비선점 방식이고
    다른 하나는
  • 선점 방식입니다

선점 방식은
운영체제가 강제로 프로세스의 사용권을 통제하는 방식입니다.

반대로
비선점 방식은
프로세스가 스스로 다음 프로세스에게 자리를 넘겨주는 방식입니다.

여기서 CPU스케줄러가 프로세스를 선택하는 방식이 있는데 이는 다양한 알고리즘을 통해서 동작이 되게 됩니다.
대표적으로는 FCFS,SJF,Priority,RR등이 존재합니다.
각각의 알고리즘은 성능이 서로 다릅니다.

자세한 알고리즘의 성능에 대해서는 다음 포스팅때 작성해보도록 하겠습니다.

오늘은 프로세스와 스레드의 동시 실행원리를 메인으로 알아봤습니다.

중요한 개념인 동시성과 병렬성 그리고 동시성이 왜 나오게 되었고 사용할때의 장점이 무엇인지 또한도 알아보았습니다.
그리고 마지막으로 스케줄링에 대해서 간단히 알아보았는데요

다음시간에는 스케줄링 알고리즘의 성능 척도와 어떤알고리즘이 어떤경우에 효율적인지 등에 대해서 알아보겠습니다.

회사에서 하는 업무가 현재는 스케줄링에 대해서 자세히연구하고 있다보니 당분간의 포스팅은 프론트엔드 개발보다는 CS측면으로 더 나아갈것 같습니다.

긴글 읽어주셔서 감사합니다!

벨~바!

profile
주니어 프론트엔드 개발자

0개의 댓글