운영체제란 무엇인가?
운영체제는 윈도우, 맥, 안드로이드, IOS 등과 같이 실생활에서도 자주 들어볼 수 있는 단어와 밀접한 관계가 있다. 운영체제는 컴퓨터를 동작시키는 데 도움을 주는 소프트웨어인데 사실 운영체제가 없어도 컴퓨터를 동작시킬 수 있다. 하지만 컴퓨터 사용자가 하드웨어 자체를 다룬다는 것은 쉽지 않은 일이기 때문에 기본적으로 컴퓨터에 운영체제를 탑재하는 것이다.
운영체제는 컴퓨터 하드웨어 바로 윗단에 설치되는 소프트웨어로 하드웨어 + 운영체제를 컴퓨터 시스템이라고도 부른다. 우리가 사용하는 각종 소프트웨어들은 바로 이 컴퓨터 시스템 위에서 작동하게 된다.
즉, 운영체제는 하드웨어와 응용 프로그램 사이에서 중개역할을 하는 인터페이스로, 사용자 프로그램들을 실행하고, 문제점들을 쉽게 해결하며, 컴퓨터 시스템을 사용하기 쉽게 만들어주고, 효율적인 방법으로 컴퓨터 하드웨어를 사용할 수 있도록 관리해주는 것을 목표로 한다.
이때 운영 체제 자체도 하나의 소프트웨어로서 전원이 켜짐과 동시에 메모리에 올라간다. 하지만 운영 체제처럼 규모가 큰 프로그램이 모두 메모리에 올라간다면 한정된 메모리 공간의 낭비가 심할 것이다. 따라서 운영 체제 중 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려 놓고, 그렇지 않은 부분은 필요할 때 메모리로 올려서 사용하게 된다.
좁은 의미의 운영 체제
메모리에 상주하는 운영 체제의 부분을 커널(kernel)이라고 부르며 운영 체제의 핵심 부분이다.
넓은 의미의 운영 체제
커널 뿐 아니라 시스템을 위한 유틸리티 (파일 복사 프로그램 등) 등을 뜻한다. 이와 같은 유틸리티들은 항상 메모리에 올려져 있는 것이 아닌 필요할 때 올라가는 별도의 프로그램이다.
운영체제의 목적
운영체제의 목적에는 처리능력 향상, 사용 가능도 향상, 신뢰도 향상, 반환 시간 단축 등이 있다. 처리능력, 반환시간, 사용가능도, 신뢰도는 운영체제의 성능을 평가하는 기준이 된다.
용어 | 설명 |
처리능력(Throughput) | 일정 시간 내에 시스템이 처리하는 일의 양 |
반환시간(Turn Around Time) | 시스템에 작업을 의뢰한 시간부터 처리가 완료될 까지 걸린 시간 |
사용가능도(Availability) | 시스템을 사용할 필요가 있을 때 즉시 사용 가능한 정도 |
신뢰도(Reliabilty) | 시스템이 주어진 문제를 정확하게 해결하는 정도 |
운영체제의 역할은 무엇인가?
운영체제의 역할은 크게 두 가지로 나눌 수 있다. 사용자를 위한 역할, 하드웨어를 위한 역할이다.
1) 사용자를 위한 역할
운영체제는 사용자에게 컴퓨터 시스템을 편리하게 사용할 수 있는 인터페이스를 제공한다. GUI와 CLI가 대표적인 예시이다.
2) 하드웨어를 위한 역할 (주요 자원 관리)
운영체제의 가장 핵심적인 기능은 각종 하드웨어를 관리하는 것이다. 때문에 운영체제를 resource manager라고 부르기도 한다.
즉, 운영체제는 컴퓨터 시스템 내의 자원을 효율적으로 관리하는 역할을 한다.
(1) 프로세스 관리
컴퓨터를 사용할 때 브라우저를 쓰면서 노래를 듣고 게임까지 하는 경우를 생각해보자. 브라우저, 음악, 게임은 모두 프로세스에 해당한다. 컴퓨터의 CPU가 하나인 경우 CPU는 한 번에 한 프로세스만을 처리할 수 있는데도 불구하고 이를 동시에 하고 있다고 느낄 수 있는 이유는 운영체제에서 적절한 방식으로 프로세스들을 관리해주기 때문이다. 이와 관련된 내용으로는 시분할 방식, CPU 스케쥴링과 같은 개념들이 있다.
(2) 메모리 관리
메모리는 CPU가 직접 접근할 수 있는 컴퓨터 내부의 기억 장치이다. 모든 프로그램은 반드시 메모리에 적재되어 실행된다. 오늘날에는 여러 프로그램을 동시에 실행시키기 때문에 메모리 관리를 하지 않으면 프로그램끼리 메모리 침범 이슈와 같은 문제들이 발생하게된다. 따라서 이러한 문제 해결을 위해 운영체제에서 메모리를 관리해준다. 또한 한정된 메모리 공간을 가지고 어떤 프로그램에 얼마만큼 메모리를 할당해줄 것인지 역시 관리한다. 물리적 메모리 관리 방식으로는 고정 분할 방식, 가변 분할 방식, 가상 메모리 방식 등이 있다.
(3) 하드웨어 관리
운영체제는 사용자의 하드웨어에 대한 직접 접근을 차단한다. 예를 들어 사용자가 하드디스크의 특정 영역에 데이터를 직접 저장하려는 경우 중요한 데이터를 덮어씌워버릴 위험이 있다. 또한 누군가의 악의적인 공격으로 컴퓨터 시스템에 문제를 일으킬 수 있다. 따라서 운영체제는 하드웨어 관리를 직접 하여 사용자의 실수를 방지하고 고의적인 공격에 대한 방어를 한다. 또한 하드 디스크의 많은 파일들을 효율적으로 저장하고 관리해주는 역할도 수행한다.
운영체제의 상세 기능
운영체제는 위에서 언급했듯이 프로그램의 실행 환경을 제공한다. 운영체제가 제공하는 서비스는 크게 6가지가 있으며, 다음과 같다.
- User Interface: 우리가 잘 아는 CLI, GUI와 같은 인터페이스 이다.
- Program Execution: 프로그램을 불러(Load) 오고 실행(Run)하며, 성공이든 실패든 실행을 완료(Execute)할 수 있어야 한다.
- I/O Operation: 수행 중인 프로그램은 입출력을 요구할 수 있다. 대부분의 경우 효율과 보안 상의 문제로 직접 입출력 장치를 제어할 수 없기 때문에 운영체제가 입출력 장치를 제어할 수 있는 수단을 제공해주어야 한다.
- File-system manipulation: 파일을 읽고(Read), 쓰고(Write), 만들고(Create), 삭제하고(Delete), 검색하고(Search), 그 목록을 확인할 수(List) 있어야 한다.
- Communications: 서로 다른 두 process 간의 통신이 가능해야 한다.
- Error Detection: 하드웨어 레벨, 소프트웨어 레벨 모두에서 error를 탐지할 수 있어야 한다.
운영체제의 구조
위에서 살펴본 것처럼 다양한 기능을 수행하는 운영체제의 구조에 대해 알아보자.
위에서 언급했지만 운영체제처럼 큰 규모의 프로그램이 메모리에 모두 올라간다면 한정된 메모리 공간의 낭비가 심하게 된다. 따라서 항상 필요한 부분만을 컴퓨터 전원이 켜짐과 동시에 메모리에 올려놓고 그렇지 않은 부분은 필요할 때만 메모리에 올리게 된다.
이때 메모리에 항상 상주하는 운영체제의 부분을 커널이라고 했다. 커널은 운영체제 코드 중에서도 가장 핵심적인 부분이고 커널 자체를 좁은 의미에서의 운영체제라고 부르기도 한다. 반면 커널 뿐 아니라 각종 주변 시스템 유틸리티(파일 복사 기능 등)를 포함한 개념이 커다른 의미에서의 운영체제이다.
운영체제의 구조는 대략적으로 위 그림과 같고 크게는 인터페이스와 커널로 나눌 수 있다.
1) 인터페이스
사용자는 커널에 직접 접근할 수 없기 때문에 운영체제가 제공하는 인터페이스를 사용해 커널에 명령을 내려야 한다. 사용자와 애플리케이션은 인터페이스를 통해 커널에 명령을 전달하고, 인터페이스를 통해 실행결과를 전달받는다. 운영체제가 제공하는 대표적인 인터페이스가 GUI, CLI가 있다.
2) 커널
커널의 경우 프로세스, 메모리, 저장장치를 관리하는 핵심적인 기능을 한다. 또한 커널에는 시스템 호출(System Call)과 드라이버라는 것이 있다.
(1) 시스템 호출(System Call)
시스템 호출은 커널이 자신을 보호하기 위해 만든 인터페이스이다. System call은 일반적으로 함수처럼 사용된다. 그리고 System call은 Kernel로 들어갈 수 있는 유일한 통로이다. 서비스들을 필요로 하는 모든 프로그램들은 반드시 System call을 활용해서만 Kernel로부터 자신이 원하는 resource를 받아낼 수 있다.
즉, 애플리케이션이 하드웨어에 접근해야하거나 운영체제가 제공하는 서비스를 이용하기 위해서는 커널 함수를 호출하는 시스템 콜을 사용해야 한다.
이렇게 굳이 System call이라는 것을 사용하는 이유는 바로 보안(Protection)을 위해서이다. 프로그래머가 만든 프로그램들은 완벽하지 않고, 보안적으로 신뢰할 수 없을 수 있으며, Kernel에 악영향을 미칠수 있다. 이러한 프로그램들이 하드웨어나 Kernel의 Data sturcture들에 직접 접근을 할 수 없게 막음으로써 이들을 보호하는 역할을 수행하는 것이다.
하지만 System call을 호출하는 행위 자체가 현재 진행하고 있던 작업을 중지하고 Kernel에 요청을 하는 것이기 때문에 시스템 입장에서 굉장히 큰 overhead라는 단점이 있다. Overhead가 크다는 말은 성능적으로 큰 부담이 된다는 뜻으로 받아들일 수 있다.
System call의 수행을 위해 CPU는 두 가지 mode를 가지고 있으며, 필요에 따라 mode를 변경해가며 역할을 수행한다. 이 두 가지는 User mode와 Kernel mode이며, User mode는 평상시의 CPU의 상태이다. 일반적인 응용 프로그램들의 코드를 실행하고 있다가 System call이 호출되면 Kernel mode로 변화한다. 이 모드는 CPU Register 내에 있는 mode bit를 통해 구분한다.
현재 mode bit가 1이면 CPU의 상태가 User mode, 0이면 Kernel mode임을 뜻한다. Mode가 바뀔 때마다 Mode bit는 자동으로 업데이트된다.
System call의 호출은 최종적으로 아래의 그림과 같은 형태로 진행이 된다
시스템 호출은 후에 알아볼 인터럽트 중 하나인 소프트웨어 인터럽트(Trap)의 한 종류이다.
※ 참고
인터럽트(Interrupt)?
보통 프로세스가 작업 중 운영체제에게 CPU 제어권을 넘기기 위해 Interrupt를 사용한다. 인터럽트 당한 시점에 레지스터와 program counter를 save한 후 CPU의 제어를 운영체제에 넘기고 운영체제는 해당 인터럽트에 맞는 인터럽트 처리 루틴을 실행한다.
Interrupt
1. Interrupt (하드웨어 인터럽트)
➡ 하드웨어가 발생시킨 인터럽트
2. Trap (소프트웨어 인터럽트, 넓은 의미에서의 인터럽트 중 하나이다.)
➡ 프로그램이 스스로 자신의 CPU 자원을 운영체제에게 넘기는 것이라 엄밀히는 인터럽트가 아니다.
➡ Exception(프로그램이 오류를 범한 경우)과 System call(프로그램이 커널 함수를 호출한 경우)이 있다.
(2) 드라이버
커널과 하드웨어의 인터페이스를 드라이버라고 한다. 보통 커널은 입출력의 기본적인 부분만 제작하여 마우스, 키보드 같은 하드웨어는 꽂기만 해도 보통 작동하게 된다. 하지만 복잡한 하드웨어의 경우 하드웨어 제작사가 만든 소프트웨어를 따로 설치하여 사용해야한다. 이때 이 소프트웨어를 디바이스 드라이버라고 한다. 프린터나 스캐너 같은 장비를 구매하면 설치해야하는 디바이스 드라이버라는 프로그램을 본 적이 있을 것이다.
운영체제의 분류
동시 작업 가능 여부
단일 작업용 운영체제
- 한 번에 하나의 작업만 처리한다.
- 한 명령의 수행이 끝나기 전에 다른 명령을 수행할 수 없다.
- MS 윈도즈가 나오기 전 DOS 환경에서는 하나의 프로그램이 수행되는 동안 다른 프로그램을 수행시킬 수 있는 명령어 입력 라인이 뜨지 않아 한번에 하나의 작업만 할 수 있었다.
다중 작업용 운영체제
최근에는 대부분의 운영체제가 다중 작업을 지원한다.
MS 윈도즈나 유닉스 환경에서는 하나의 프로그램의 수행이 끝나기 전에 다른 프로그램을 수행시키는 것이 가능하다.
주의할 점으로는 다중 작업용 운영체제에서는 여러 프로그램이 CPU와 메모리를 공유하게 된다. 하지만 일반적으로 CPU는 하나밖에 없으며, 다중 작업용 운영체제라도 CPU에서는 매순간 하나의 프로그램만이 수행되는 것이다.
이는 CPU의 처리 속도가 워낙 빨라 수 ms 이내의 짧은 시간 규모로 여러 프로그램이 CPU에서 번걸아 수행되기 때문에 여러 프로그램이 동시에 수행되는 것처럼 보인다.
- 동시에 두 개 이상의 작업을 처리할 수 있다.
- 한 명령의 수행이 끝나기 전에 다른 명령을 수행할 수 있다.
분류
- 시분할 시스템 : CPU의 작업 시간을 여러 프로그램들이 조금씩 나누어 쓰는 시스템
- 다중 프로그래밍 시스템 : 메모리 공간을 분할해 여러 프로그램들을 동시에 메모리에 올려놓고 처리하는 시스템
- 다중처리기 시스템 : 하나의 컴퓨터 안에 CPU가 여러 개 설치된 시스템.
사용자 수
단일 사용자용 운영 체제
- 한 번에 한명의 사용자만이 사용하도록 허용
- ex) MS-DOS, MS Windows
다중 사용자용 운영 체제
- 여러 사용자가 동시에 접속해 사용할 수 있다.
- ex) UNIX, NT server
처리 방식
일괄 처리
- 작업 요청의 일정량을 모아서 한꺼번에 처리하는 방식.
- 따라서 모든 작업이 완전히 종료된 후에 결과를 얻을 수 있다.
- 응답 시간이 길다는 단점이 존재.
시분할 방식
- 여러 작업을 수행할 때 컴퓨터의 처리 능력을 일정한 시간 단위로 분할해 사용하는 방식
- 일괄 처리 방식에 비해 짧은 응답 시간을 갖는다.
- 평균적으로 사람이 길다고 느끼는 시간 전에 요청에 대한 응답을 얻으므로 사용자 측에서는 컴퓨터를 혼자 독점적으로 사용하는 것처럼 생각할 수 있다.
- 이와 같이 사용자의 요청에 대한 결과를 곧바로 얻을 수 있는 시스템을 대화형 시스템이라 부르며, 시분할 방식이 대표적인 예이다.
실시간 처리
- 정해진 시간 안에 어떠한 일이 반드시 종료됨이 보장되어야 하는 시스템
- 시간 제약의 중요성에 따라 아래와 같이 두 가지로 나뉜다.
- 경성 실시간 시스템 : 주어진 시간을 지키지 못할 경우, 매우 위험한 결과를 초래할 가능성이 있는 로켓, 원자로 제어 시스템 등을 말한다.
- 연성 실시간 시스템 : 멀티미디어 스트리밍 시스템과 같이 데이터가 시간을 맞추어 전달되어야 올바른 기능을 수행할 수 있는 시스템. (위험한 결과를 초래하지는 않는다.)
운영 체제의 자원 관리 기능
운영 체제의 가장 핵심적인 기능은 자원을 효율적으로 관리하는 것이다.
운영체제의 기능 요약
자원
- 하드웨어 자원 : CPU, 메모리 및 주변 장치, 입출력 장치 등.
- 소프트웨어 자원
CPU 관리
- CPU가 하나밖에 없지만 프로세스는 여러개가 동시에 실행된다. 그러므로 매 시점 어떠한 프로세스에게 CPU를 할당해 작업을 처리할 것인지 결정해야 한다. 이러한 일을 CPU 스케줄링이라 한다.
대표적인 스케줄링 기법으로 선입선출, 라운드 로빈, 우선순위 기법 등이 있다. - 목표 : CPU를 가장 효율적으로 사용하면서도 특정 프로세스가 불이익을 당하지 않도록 하는 것이다.
선입 선출(FCFS : First Come First Served)
- CPU를 사용하기 위해 먼저 도착한 프로세스를 먼저 처리하는 방식
- 일상 생활에서 줄서기와 유사하다.
- 단점
- CPU를 필요로 하는 프로세스가 여럿 있을 때 먼저 CPU를 요청한 프로세스가 원하는 작업을 완료할 때까지 다른 프로세스들이 CPU를 사용하지 못하게 된다. 따라서 장시간 CPU를 사용해야 하는 프로세스가 먼저 도착해 CPU를 사용하면 이후에 도착한 짧은 시간 CPU를 사용해야 하는 프로세스는 앞서 도착한 프로세스의 작업이 끝날 때까지 하염없이 기다리게 되어 비효율적인 결과를 초래할 가능성이 있다.
라운드 로빈 기법
- FCFS의 단점을 보완하고자 등장.
- CPU를 한 번 할당받아 사용할 수 있는 시간을 일정한 고정된 시간으로 제한한다.
- 그래서 긴 작업을 요하는 프로세스가 CPU를 할당받더라도 정해진 시간이 지나면 CPU를 내어놓고 CPU의 서비스를 기다리는 줄의 제일 뒤에 가서 기다려야 한다.
- 따라서 적어도 긴 작업을 수행하는 프로세스 때문에 짧은 작업을 가진 프로세스들이 무작정 오래 기다려야 하는 상황을 막을 수 있다.
- 일반적으로 1회 할당 시간은 수 밀리 세컨드(ms) 정도의 단위를 사용한다.
우선 순위 스케줄링
- 수행 대기 중인 프로세스들에게 우선 순위를 부여하고 우선순위가 높은 프로세스에게 CPU를 먼저 할당하게 된다.
- 또한, 지나치게 오래 기다리는 프로세스가 발생하지 않도록 기다린 시간이 늘어날수록 우선순위를 점차 높여주는 방안도 우선순위 스케줄링에 활용될 수 있다.
메모리 관리
메모리는 CPU가 직접 접근할 수 있는 컴퓨터 내부의 기억 장치이며, 프로그램이 CPU에서 실행되려면 해당 부분이 메모리에 올라가 있어야 한다. 이때 한정된 메모리 공간에 여러 프로그램을 수용하려면 메모리에 대한 효율적인 관리 메커니즘이 필요하다. 따라서 메모리 관리를 위해 운영 체제는 메모리의 어느 부분이 어떤 프로그램에 의해 사용되고 있는지를 파악하여 이를 유지하게 되는데, 이러한 정보는 주소를 통해 관리된다.
물리적 메모리는 관리하는 방식은 고정 분할 방식, 가변 분할 방식, 가상 메모리 방식 등이 있다.
고정 분할 방식
- 물리적 메모리를 몇 개의 영구적인 분할로 나눈다.
- 각각의 분할에는 하나의 프로그램이 적재된다.
- 분할의 크기보다 큰 프로그램은 적재가 불가능하며, 동시에 메모리에 적재되는 프로그램의 수는 분할 개수로 한정된다.
- 분할의 크기가 고정적이기 때문에 분할의 크기보다 작은 프로그램이 적재되는 경우 남는 영역이 발생하며 이를 내부 조각이라고 한다.
- 내부 조각 : 분할 영역에 올라온 프로그램에 의해서도 사용되지 않고, 다른 프로세스에게도 할당될 수 없으므로 비효율적으로 낭비되는 공간.
가변 분할 방식
- 매 시점 프로그램의 크기에 맞게 메모리를 분할해서 사용하는 방식.
- 물리적 메모리 크기보다 더 큰 프로그램의 실행은 여전히 불가능하다.
- 분할의 크기, 개수가 동적으로 변하므로 기술적 관리 기법이 필요하다.
- 외부 조각이 발생할 수 있다.
- 외부 조각 : 프로그램에게 할당되지 않은 메모리 영역이지만 그 크기가 작아 프로그램을 올리지 못하는 메모리 영역.
가상 메모리 방식
- 물리적 메모리보다 더 큰 프로그램이 실행되는 것을 지원한다.
- 자신만의 가상 메모리를 갖고 물리적 메모리 주소와 가상 메모리의 주소를 매핑하는 기술을 이용해 주소를 변환시킨 후 프로그램을 물리적 메모리에 올린다.
- 필요한 부분만을 메모리에 올리고 나머지는 스왑 영역(swap area)에 저장하여 사용한다.(스왑 영역 : 보조기억 장치)
- 프로그램을 구성하는 주소 공간은 페이지라는 동일한 크기의 작은 단위로 나뉘어 물리적 메모리와 스왑 영역에 일부분씩 저장한다.
- 페이징 : 동일한 단위로 메모리를 나누는 기법
디스크 관리
디스크의 용량도 한정적이다. 그래서 사용자가 필요로 하는 파일을 최대한 효율적이면서 많은 양의 파일을 저장해야 한다. 연속적인 공간에 저장하여 파일을 찾기 쉽게 저장할 것인지, 많은 양의 파일을 저장하기 위해서 파일을 조각 조각 잘라 여기 저기에 저장할지 판단한다.
디스크에서 파일을 읽어올 때는 디스크에 있는 헤더가 해당 파일을 찾아 읽어 온다. 이때 최소한의 움직임으로 최대한의 효율을 내기 위해 노력한다. 엘리베이터의 과정과 비슷한데, 엘리베이터가 1층에서 100층까지 가다가 도중에 15층이나 50층에 멈춰서 사람을 태울 수 있듯이, 디스크 헤더도 읽으려는 파일의 위치로 가는 도중 새로운 파일 리딩 요청이 들어오면 그 요청부터 수행한다.
주변 장치 및 입출력 관리
키보드, 마우스, 모니터 등 우리가 접하는 수많은 장치가 입출력 장치다. 이 I/O 디바이스들은 CPU에 비해 많이 느리다. 그래서 이 디바이스들과 컴퓨터가 어떠한 방식으로 정보를 주고 받는 지가 컴퓨터의 성능과 직결된다. I/O 디바이스들은 각각 I/O 디바이스 컨트롤러라는 독자적인 작은 CPU를 갖고 있으며, 인터럽트라는 요소를 중심으로 컴퓨터와 정보를 주고 받는다.
- CPU나 메모리와 달리 인터럽트라는 매커니즘을 통해 관리한다.
- 인터럽트 : CPU의 서비스가 필요한 경우에 신호를 발생시켜 서비스를 요청하게 되는데, 이때 발생시키는 신호를 의미한다.
- 인터럽트 발생시 직전 작업 상태를 저장해두고 인터럽트를 처리한다. 인터럽트 처리가 완료된 이후에는 인터럽트가 발생하기 직전 상태를 복구시켜 중단되었던 작업을 재개한다. (저장해둔 직접 작업을 불러와 이어서 수행한다.)
- 인터럽트 처리 루틴 : 인터럽트가 발생했을 때, 해주어야 할 작업을 정의한 프로그램 코드.
- 컨트롤러를 통해 주변 및 외부 장치를 관리한다.
- 컨트롤러는 해당 장치에 대한 업무를 처리하고 이를 메인 CPU에 인터럽트를 발생시켜 보고하는 역할을 한다.
- Ex) 키보드에 사용자가 입력을 하면 키보드 컨트롤러가 인터럽트를 발생시켜 CPU에게 그 사실을 알려준다. CPU는 현재 수행중이던 작업의 상태를 저장하고 인터럽트 요청을 처리하기 위해 운영 체제 내에 정의된 키보드 인터럽트 처리 루틴을 찾는다. 키보드 인터럽트 처리루틴을 실행하고 완료하게 된다. 인터럽트 처리가 끝나면 인터럽트가 발생하기 직전 상태를 복구시켜 중단되었던 작업을 재개한다.
헷갈리는 용어 정리
- Multitasking
- Multiprogramming
- Time Sharing
- Multiprocess
위의 용어들은 컴퓨터에서 여러 작업을 동시에 수행하는 것을 뜻한다. Multiprogramming은 여러 프로그램이 메모리에 올라가 있는 것을 강조하며, TIme Sharing은 CPU가 시간을 분할하여 작업을 처리한다는 것을 강조한다.
Multiprocessor
- 하나의 컴퓨터에 CPU (Processor)가 여러 개 붙어 있음을 의미한다.
참고
- https://github.com/WooVictory/Ready-For-Tech-Interview/blob/master/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%99%80%20%EC%A0%95%EB%B3%B4%EA%B8%B0%EC%88%A0%EC%9D%98%20%EC%9B%90%EB%A6%AC/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EB%9E%80.md
- https://steady-coding.tistory.com/510