프로세스와 프로세서

컴퓨터에는 여러 프로그램이 있고 사용자가 그걸 실행할 수 있다.

이떄 이 프로그램이 돌아가고 있는 상태(컴퓨터가 어떤 일을 하고 있는상태)를 프로세스 라고 한다.

그리고 CPU(프로세서)는 여러개의 프로세스를 함께 진행할때 동시성, 병렬성 방식을 이용한다.

 

용어를 간단히 살펴보자. 프로그램 : 컴퓨터가 실행할 수 있는 명령어들의 집합 프로세스 : 컴퓨터에서 실행중 인 프로그램으로 각각 독립된 메모리공간을 할당받는다 CPU : 명령어를 실행하는 연산 장치 (메인)메모리: 프로세스가 CPU에서 실행대기 위해 대기하는곳 I/O : 파일을 읽고쓰거나 /네트워크에서 데이터를 주고받는것/ 입출력장치와 데이터를 주고받는 것

 

동시성과 병렬성

동시성(Concurrency)
동시성은 하나의 프로세서가 여러개의 프로세스를 조금씩 번갈아가면서 실행하여 결국 모든 작업을 마치는 방식이다.
이렇게 번갈아가는 방식이 Context-swiching 이고 내부적으로 다양한 방식과 알고리즘이 사용된다.
이때 사용자는 번갈아가는 속도가 너무 빠르기 때문에 마치 모든 프로세스가 동시에 진행되는것 처럼 느낀다.
하지만 프로세스가 독립적인 메모리를 가지기 때문에 이떄 프로세스간의 데이터공유가 힘들고 무엇보다 하나의 프로세서가 이 작업을 진행하기 때문에 부하가 걸리기 쉽다는 큰 단점이 있다.

 

병렬성(Parallelism)
병렬성은 하나의 프로세서(CPU)에 여러개의 코어가 달려있고, 이 여러개의 코어가 각각 다른 프로세스를 진행하여 실제로 동시에 작업을 진행한다.
(CPU 사양이 6코어 12스레드 => CPU안에 6개의 코어가 있고, 각각의 코어에 쓰레드를 두개씩 가지고 있다)

 

쓰레드

쓰레느는 하나의 코어에서 진행했던 작업을 여러개의 코어로 작업효율적으로 처리하기위해 등장했다.

프로세스는 한개 이상의 스레드를 가질 수 있고, 예전에는 프로세스가 CPU에서 실행되는 단위였지만 지금은 스레드가 그 의미를 가진다.

 

2개의 코어에서 각각 1개씩의 프로세스를 진행한다고 생각해보자. 인터넷브라우져와 카카오톡이라는 각각의 프로세스를 코어1과 코어2가 따로 작업하고 있다. 이때 인터넷브라우져는 게임을 다운로드받는 동시에 유투브영상을 재생할 수 있다. 즉 하나의 프로세스 내부에서도 여러 작업을 끊기지않게 진행해야 한다.

 

이떄 다운로드받는 작업, 영상을 재생하는 작업 같은 작은 갈래들을 Thread 라고 하며,
이렇게 하나의 프로세스가 동시에 여러 작업을 실행하는것이 멀티스레딩 이다.

즉 물리적으로는 하나인 코어가 실행하는 프로세스를 여러개의 쓰레드로 나누고, 마치 여러개의 코어가 일하는것처럼 작업을 처리할 수 있는것이다.

 

각각의 프로세스는 독립된 메모리공간을 할당받지만, 각 프로세스 내부의 쓰레드들은 자신이 포함된 프로세스가 메모리를 공유해서 사용한다.
(이는 프로세스간의 컨텍스트 스위칭은 어려웠지만, 스레드끼리는 매우 편리함을 의미한다)

하지만 만약 두개 이상의 Thread가 공유중인 자원에 동시에 손을대면 에러가 발생하는 큰 단점이 있다.

 

싱글스레드와 멀티스레드의 메모리구조비교

 

동기와 비동기

프로세스 내부에서 쓰레드가 진행되는 방식은 크게 동기와 비동기가 있다.

 

비동기(Async)
비동기는 여러개의 작업을 여러개의 쓰레드로 나누어 진행한다.
만약 작업이 세개 있다면 하나의 쓰레드에 일렬로 준비중이던 세개의 작업을 다른 쓰레드로 보내서 거기서 시작하도록 명령한다.

여기서 중요한건 작업을 다른쓰레드로 보내는순간 기존 쓰레드에서는 그 작업이 끝나던지 말던지 기다리지않고 바로 다른 작업을 시작한다.한마디로 작업이 여러개있으면 일단 다른쓰레드로 작업을 던져두고 바로 다음작업을 바로 시작해버리므로 비 동기적으로 일을 처리한다.

동기(Sync)
동기는 작업을 다른 쓰레드에서 하도록 시킨 후, 그 작업이 다른 쓰레드에서 끝나길 기다렸다가 다음작업을 진행한다.

 

직렬처리와 동시처리

동기/비동기는 쓰레드가 연산을 처리하는 방식이고
직렬/동시처리는 그럼 그 방식을 몇개의 쓰레드로 보낼지를 선택하는 것이다.

쓰레드에서 다른 쓰레드로 작업을 넘기는 방식에도 두가지가 있다.

직렬(Serial)처리는 메인 쓰레드에서 분산처리 시킨 작업을 한개의 쓰레드로 넘겨준다.

동시(Cocurrent)처리는 여러개의 쓰레드로 작업을 나누어 넘긴다.

이렇게보면 굳이 직렬처리를 사용할 필요가 있나? 싶을 수 있지만, 작업간의 순서가 중요할 때는 직렬처리를 사용하고 각각의 독립적인 작업을 빠르게 처리하려면 동시처리가 유리하다.

 

프로그램에서의 동기와 비동기

어떤 함수를 실행했을때, 해당 함수가 끝날때까지 기다렸다가 다른 작업을 진행하면 동기식이며 주로 한 함수의 결과값이 다음함수에 중요한 역할을 할 때 동기식 프로그래밍을 한다.

비동기식 프로그램은 한 함수가 끝나기도전에 다른 함수를 실행하는 형태인데, 이때는 먼저 실행한 기존의 함수가 끝났는지 여부를 알 수 없기때문에 콜백함수라는것을 이용해서 종료여부를 확인한다.

콜백함수도 어려운 개념이기 때문에 따로 정리해보겠지만, 아주 간단히 말하자면 어떤 함수안에 "끝낫습니다!" 라는 프린트를하는 함수를 만든다.

그럼 비동기로 진행중이더라도 중간에 끝났습니다! 라는 프린트가뜨면 '아 아까 2번쓰레드로 던져둔 함수가 끝났구나' 하고 알아차릴 수 있는것이다.

'TopicClipping' 카테고리의 다른 글

MSA  (0) 2022.11.04
UML 이란?  (0) 2022.10.13
파이썬의 TDD 훑어보기  (0) 2022.09.22
트랜잭션 겉핥기  (0) 2022.09.22
AWS & 클라우드 컴퓨팅 유형  (0) 2022.09.22

+ Recent posts