본문 바로가기
Lecture/OS

멀티 프로세싱

by YUNZEE 2023. 10. 16.
728x90
멀티코어 시스템

CPU의 성능을 향상하기 위해 CPU의 핵심 기능을 가진 코어를 여러 개 만들거나 동시에  실행 가능한 명령의 개수를 늘리는 방법을 사용한다. 컴퓨터의 성능을 높이기 위해 프로세서를 여러 개 설치하여 사용하는 시스템을 멀티 프로세서 시스템

(multi processor system)이라 부른다. 예를 들어 볶음밥 하나를 만드는 시간은 40분이 걸린다면 한 주방에서 2개를 만드는데 80분이 걸린다. 시간을 단축시키고 싶다면 주방을 2개 만들면 된다. 

 

프로세서 하나만 있는 단일 프로세서 시스템을 멀티 프로세서 시스템으로 바꾸기 위해서는 보드의 설계 변경을 비롯해 많은 변화가 필요하다. 그런데 기존 시스템을 유지한 채 멀티 프로세싱을 할 수 있게 하는 시스템이 있다. 바로 멀티코어 (multi-core) 시스템이다. 멀티코어 시스템에서는 하나의 칩 chip에 CPU의 핵심이 되는 코어를 여러 개 만들어 여러 작업을 동시에 처리할 수 있다.

 

프로세스의 개요

프로세스의 개념

우리는 프로그램을 '짠다' 또는 '작성한다'라고 표현한다. 프로그램이란 어떤 데이터를 사용하여 어떤 작업을 할지 그 절차를 적어놓은 것이다. 반면에 프로세스에 대해서는 '실행한다'라고 표현하는데, 이는 프로그램으로 작성된 작업 절차를 실행에 옮긴다는 의미다. 따라서 누군가 작성한 프로그램이 실행되면 프로세스가 된다.

 

일괄 작업 방식의 요리

일괄 작업 시스템은 한 번에 하나의 작업만 처리하는 것으로, 테이블이 하나만 있는 원테이블 레스토랑이라 할 수 있다. 테이블이 하나뿐이니 그 테이블에만 손님을 받을 수 있고 손님이 식사를 마치고 나간 후에야 다음 손님을 받을 수 있다.

요리사는 주문서를 받은 순서대로 요리를 한다. 테이블이 하나밖에 없기 때문에 주문서에는 테이블의 번호가 없다. 한 번에 한가지 요리만 만들면 되기 때문에 요리를 제공하는 순서가 단순하고 손님이 식사하는 동안 쉬는 시간이 생기며 손님의 식사가 끝나야 다음 손님을 받을 수 있어 작업 효율이 떨어진다.

먼저 들어온 주문서가 먼저 처리되므로 주문 목록은 큐(queue)로 처리된다.

 

시분할 방식의 요리

요리사는 한 명이지만 시간을 적당히 배분하여 여러 가지 요리를 동시에 하는 시분할 방식은 효율적이다. 손님이 식사하는 시간을 충분히 활용하면 요리사 여러 명이 요리하는 효과를 내어 모든 테이블의 손님에게 지체 없이 요리를 제공할 수 있다. CPU가 한 개인 컴퓨터에서 여러 개의 프로세스를 동시에 실행하는 것도 같은 원리다. CPU가 시간을 쪼개어 여러 프로세스에 적당히 배분함으로써 프로세스가 동시에 실행되는 것처럼 느껴진다.

 

시분할 시스템에서는 주문서는 중요한 역할을 한다. 주문서에는 3개의 주문서를 동시에 처리한다 했을 때 먼저 식사를 끝낸 테이블부터 코스요리를 나간다고 생각하면 된다. 가. 테이블이 수프를 아직 먹고 있고 나. 테이블이 수프를 다 먹었다면 나. 테이블의 요리부터 시작해서 먼저 나가고 나. 주문서에서 먼저 나간 음식을 지운다. 그런 방식으로 진행하고 주문 목록에서 모든 요리가 끝났다면 주문 목록을 삭제하여 종료되었음을 의미한다.

 

시분할 방식에서의 예상치 못한 상황 처리

만약에 새우튀김을 하는데 새우 손질된 것을 다 사용했다고 가정해보자, 요리사는 보조 요리사에게  새우를 손질하라고 지시하고, 주문 순서를 중요시 생각하는 요리사라면 새우 손질이 끝날 때까지 다른 요리를 하지 않고 기다릴 것이다. 그럼 너무 비효율적인 방법이다. 그래서 이때 그 주문서를 '대기 목록'에 옮기고 다른 주문서를 가져와 요리를 할 것이다. 그리고 새우 손질이 끝난다면 다시 그 주문서를 가져와 새우튀김을 만들 것이다.

다른 경우도 있다. 손님이 개인적인 이유로 음식을 조금 늦게 달라고 요청한다면 그 주문서는 '보류 목록'으로 넘겨 언제 다시 시작될지 모르거나 중간에 그만둘지 모르는 것으로, 대기목록에 있는 작업과 구분된다.

 

프로그램에서 프로세스로 전환

앞서 소개한 레스토랑의 예를 통해서 시분할 방식 시스템에서 프로그램이 프로세스로 전환될 때 어떤 일이 일어나는지 살펴보자.

우선 운영체제는 프로그램을 메모리의 적당한 위치로 가져온다. 그와 동시에 주문서에 해당하는 작업 지시서를 만드는데, 이것이 프로세스 제어 블록PCB: process control block이다. 주문서에는 어떤 테이블에서 어떤 요리를 주문했는지, 손님의 특별 주문 사항은 무엇인지, 현재 어떤 단품 요리까지 제공되었는지 등과 같은 정보가 담겨있다. 마찬가지로 프로세스 제어 블록에도 프로세스를 처리하는 데 필요한 다양한 정보가 들어 있다. 주문서가 없으면 요리가 진행되지 않듯이 프로세스 제어 블록이 없으면 프로그램이 프로세스로 전환되지 못한다. 어떤 프로그램이 프로세스가 되었다는 것은 운영체제로부터 프로세스 제어 블록을 받았다는 의미다.

 

프로세스 구분자: 메모리에는 여러 개의 프로세스가 존재하므로 각 프로세스를 구분하는 구분자 ID; IDentification

가 필요하다. 레스토랑의 주문서에 일련번호가 있듯이 프로세스를 구분하기 위해 프로세스 구분자 PID; process IDentification

메모리 관련 정보: CPU는 실행하려는 프로세스가 메모리의 어디에 저장되오 있는지를 알아야 작업할 수 있다. 이를 위해 프로세스 제어 블록에는 프로세스의 메모리 위치 정보가 담겨 있다. 

각종 중간값: 프로세스 제어 블록에는 프로세스가 사용했던 중간값이 저장되는데, 이는 현재 어떤 단품 요리까지 손님에게 제공되었는지 주문서에 표시하는 것과 유사하다. 시분할 시스템에서는 여러 프로세스가 번갈아 가며 실행되기 때문에 각 프로세스는 일정 시간 작업을 한 후 다른 프로세스에 CPU를 넘겨준다.

 

프로세스와 프로그램의 관계

프로세스 = 프로그램 + 프로세스 제어 블록

프로그램 = 프로세스 - 프로세스 제어 블록

 

프로세스의 네 가지 상태

생성 상태 create status :프로세스가 메모리에 올라와 실행 준비를 완료한 상태다. 프로세스를 관리하는 데 필요한 프로세스 제어 블록이 생성된다.

 

준비 상태 ready status : 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태다. CPU가 하나인 컴퓨터에서는 한 번에 프로세스만 실행할 수 있기 때문에 자기 실행 순서가 될 때까지 준비 상태에서 기다려야 한다.

 

실행 상태 running status : 준비 상태에 있는 프로세스 중 하나가 CPU를 얻어 실제 작업을 수행하는 상태로 execute status라고 표현하기도 한다. 실행 상태에 들어간 프로세스는 일정 시간 동안 CPU를 사용할 권리를 갖는다. 만약 주어진 시간을 다 사용하고도 작업이 끝나지 않았다면 프로세스는 준비 상태로 돌아와 다음 차례를 기다린다. 프로세스는 자신의 작업이 끝날 때까지 준비 상태와 실행상태를 왔다 갔다 한다.

 

완료상태  terminate status : 실행 상태의 프로세스가 주어진 시간 동안 작업을 마치면 완료 상태로 진입한다. 완료 상태는 프로세스 제어 블록이 사라진 상태를 의미한다.

 

프로세스의 다섯 가지 상태

입출력을 요구한 프로세스가 입출력이 완료될 때까지 기다리는 상태를 대기 상태(blocking status)라고 한다. 이는 작업의 효율성을 높이기 위해 입출력을 요청한 프로세스를 실행 상태에 두지 않고 대기 상태로 옮기는 것이다. 입출력을 요청한 프로세스가 대기 상태로 옮겨지면 CPU스케줄러는 준비 상태에 있는 프로세스 중 하나를 가져다 실행 상태로 만든다.

 

대기 상태를 추가한 프로세스의 상태

대기 상태에서 입출력이 끝난 프로세스는 실행 상태로 가지 않고 준비 상태로 돌아가 자기 차례를 기다린다.

 

생성 상태 create status

생성 상태는 프로그램이 메모리에 올라오고 운영체제로부터 프로세스 제어 블록(PCB)을 할당받은 상태다. 생성된 프로세스는 바로 실행되는 것이 아니라 준비 상태에서 자기 순서를 기다리며, 프로세스 제어 블록도 같이 준비 상태로 옮겨진다. 

 

준비 상태 ready status

준비 상태는 실행 대기 중인 모든 플로세스가 자기 순서를 기다리는 상태다. 프로세스 제어 블록은 준비 큐(ready queue)에서 기다리며 CPU스케줄러에 의해 괸리된다. 지금까지는 준비 큐가 1개인 것처럼 설명했지만 실제로는 다수의 준비 큐가 운영된다. 

 

실행 상태 running status

실행상태에서 중요한 것은 실행 상태에 있는 프로세스가 입출력을 요청하면 CPU는 입출력 관리자에게 입출력을 요청하고 해당 프로세스를 대기 상태로 옮긴다. CPU스케줄러는 새로운 프로세스를 실행 상태로 가져온다.(디스패치)

 

대기상태 blocking status

대기 상태는 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태로 wait status라고도 한다. 대기 상태는 작업 효율을 높이기 위해 만들어진 것으로, 이 상태의 프로세스는 입출력장치별로 마련된 큐에서 기다린다.  입출력이 완료되면 인터럽트가 발생하고, 대기 상태에 있는 여러 프로세스 중 해당 인터럽트로 깨어날 프로세스를 찾는다. 그리고 찾아낸 프로세스의 프로세스 제어 블록(PCB)을 준비상태로 이동시킨다. 이처럼 어떤 프로세스가 대기 상태에서 준비 상태로 이동하는 것은 인터럽트 때문이다.

 

완료 상태 terminate status

완료 상태는 프르세스가 종료되는 상태다. 완료 상태에서는 코드와 사용했던 데이터를 메모리에서 삭제하고 프로세스 제어 블록을 폐기한다. 만약 오류나 다른 프로세스에 의해 비정상적으로 종료되는 강제종료 abort를 만나면 디버깅하기 위해 강제 종료 직전의 메모리 상태를 저장장치로 옮기는데 이를 코어 덤프 core dump라고 한다. 코어 덤프는 종료직전의 메모리 상태를 확인함으로써 오류를 수정할 수 있게 해 준다.

728x90

'Lecture > OS' 카테고리의 다른 글

프로세스의 연산  (2) 2023.10.17
프로세스 제어 블록과 문맥 교환  (0) 2023.10.16
컴퓨터 성능 향상 기술  (2) 2023.10.14
CPU와 메모리  (0) 2023.10.12
컴퓨터의 기본 구성  (0) 2023.10.10