컴퓨터는 어떻게 일 하나요? Process & Thread

yeseul kim·2021년 6월 3일
0

macOS의 작업 관리 프로그램

오늘날의 사용자는 컴퓨터로 동시에 여러가지 작업을 할 수 있다. 이런 편리함은 지금에야 굉장히 익숙하지만 시장에 개인용 컴퓨터가 처음으로 보급되고 발전해 나가던 무렵만해도 컴퓨터는 게임 하나를 다운로드 받거나 마우스,키보드를 이용해 무언가를 입력하는 순간, 말 그대로 먹통이 되어버렸다. 오직 한가지 일을 처리하느라 다른 일을 할 수 없었던 것이다. 그렇다면 지금의 컴퓨터는 어떻게 이런 멀티태스킹이 가능한 걸까? 우리가 컴퓨터를 이용해 동시다발적으로 여러가지 일을 하는 동안 내부에서는 어떤일이 벌어지고 있는지 살펴보자.

컴퓨터 안의 일꾼들
_컴퓨터를 구매해본적이 있다면 여러가지 제품들의 성능을 비교해 본 경험이 있을 것이다. 그 중에서도 CPU의 성능을 자세히 보면 코어/스레드에 대한 정보가 간략히 표시 되어있다.

컴퓨터의 입장에서 멀티태스킹이란 여러개의 프로세스가 CPU(이하 프로세서)나 메모리, 입출력 장치와 같은 공용자원을 나누어 사용하는 것을 말한다. 보통 개인용 컴퓨터는 하나의 프로세서를 가지고 있는데, 프로세서는 한번에 한가지 작업만 수행할 수 있다. 사용자가 동시다발적인듯한 작업 환경을 경험하는 것은 스케줄링이라는 방식을 이용하여 여러개의 프로세스를 빠르게 교체하며 실행하기 때문이다.

프로세서
중앙처리장치, CPU centeral processing unit,또는 CPU 안의 코어 core로 프로세스가 돌아가게 만드는 하드웨어이다.

프로세스
프로그램이 하드 디스크에 저장되어 있는 실행 코드를 뜻한다면, 프로세스란 프로그램이 메모리 상에서 실행되는 작업 단위를 말한다. 예를 들어, 하나의 프로그램을 여러 번 구동하면 여러 개의 프로세스가 메모리 상에서 실행된다.

프로세스의 여러가지 상태
운영체제의 핵심 프로그램인 커널의 역할 중 하나는 한정적인 컴퓨터 시스템의 자원을 효율적으로 관리하는 것인데, 이를 통해 프로그램의 실행을 보다 원활하게 해준다. 커널 내에는 준비 큐, 대기 큐, 실행 큐 등의 자료 구조가 있으며 커널은 이것들을 이용하여 프로세스의 상태를 관리한다.

생성 new : 프로세스가 생성되는 중
대기 ready : 프로세스가 CPU를 사용하고 있지는 않지만 언제든지 사용할 수 있는 상태로, CPU가 할당되기를 기다리고 있다. 일반적으로 준비 상태의 프로세스 중 우선순위가 높은 프로세스가 CPU를 할당받는다.
실행 running : 프로세스가 CPU를 차지하여 명령어들이 실행되고 있다.
보류 block : 프로세스가 입출력 완료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태를 말한다.
종료 terminated : 프로세스의 실행이 종료되었다.

프로세스는 종료되기 전까지 이러한 과정을 여러번 반복한다.

PCB process control block
운영체제가 여러개의 프로세스 사이를 전환해가며 운영하기 위해선 프로세스의 상태나 각각의 프로세스를 식별할 수 있는 정보 등이 필요하다. 프로세스를 생성하게되면 운영체제는 프로세스 제어에 필요한 정보를 담은 프로세스 제어 블록 PCB을 커널에 생성한다.

context switching

프로세스 전환이 있을때 작업의 상태와 이전 작업상태, 어디서 부터 작업이 시작되어야 하는지 등에 대한 정보가 필요하며 이런 정보를 로딩하는데에도 시간이 필요하다. 그러한 순간을 context switching 이라고 한다.

프로세스의 구조

어떤 데이터가 저장 되나요?
stack : 호출된 함수, 지역 변수 등 임시 데이터
Heap : 동적으로 생긴 데이터 ex) new Object(), malloc()
Data : 전역변수 ex) static 변수, global 변수
Code: 프로그램의 코드

멀티 프로세스
여러 개의 프로세스로 하나의 작업을 구성 할 수 있다. 이 경우, 각 프로세스가 각각의 메모리 영역을 따로 가지고 있기때문에 비효율적이다. 크게 두가지 단점이 있는데 하나는, 두개의 프로세스로 하나의 작업을 진행하게 되면 먼저 실행된 프로세스의 일부(heap, data, code, PCB)가 코어에 로딩되는데, 이때 다른 프로세스로 전환이 일어나면 코어에 먼저 로딩된 프로세스를 내리고 다른 프로세스를 다시 로딩해야 한다는 점(context switching)이고, 또 하나는 동일한 작업을 진행하기 위해 만든 프로세스인데 각각의 영역을 따로 가지기 때문에 다른 프로세스의 정보를 사용하기 위한 통신이 필요하다는 것이다.

스레드는 이러한 비효율성을 보완한다.

스레드 Thread

스레드는 프로세스 내에서 실행되는 흐름의 단위이다. 프로세스가 실행된다는 것은 한 단계 더 뜯어보면 그 안의 스레드가 실행되고 있다는 뜻이다. 하나의 프로세스 안의 스레드는 code, data, heap 영역을 공유한다. 그렇기 때문에 스레드 간의 작업 전환이 있을 경우 context switching비용이 적게 발생한다.

reference
[10분 테코톡] 쪼밀리와 오구의 process & thread

profile
hello, world

0개의 댓글