서론
**운영체제(Operating System)**는 컴퓨터 하드웨어를 관리하는 소프트웨어이다. 운영체제는 응용 프로그램을 위한 기반을 제공하며 컴퓨터 사용자와 컴퓨터 하드웨어 사이에서 중재자 역할을 한다.
운영체제의 목적은 사용자가 프로그램을 편리하고 효율적으로 수행할 수 있는 환경을 제공하는데 있다.
운영체제가 할 일(What Operating Systems Do)
컴퓨터 시스템은 대게 네 가지 구성요소인 하드웨어, 운영체제, 응용 프로그램 및 사용자로 구분할 수 있다.
하드웨어는 중앙 처리 장치(CPU), 메모리 및 입출력(I/O) 장치로 구성되어,기본 계산용 자원을 제공한다.
운영체제는 다양한 사용자를 위해 다양한 응용 프로그램 간의 하드웨어 사용을 제어하고 조정한다.
컴퓨터 시스템은 하드웨어, 소프트웨어 및 데이터로 구성되어 있다고 볼 수 있다. 운영체제는 컴퓨터 시스템이 동작할 때 이들 자원을 적절하게 사용할 수 있는 방법을 제공한다.
운영체제의 역할을 좀 더 완전히 이해하기 위해 사용자 관점과 시스템 관점에서 살펴볼 수 있다.
사용자 관점(User View)
컴퓨터를 사용하는데 있어서 사용자 관점에서의 목표는 손쉬운 사용이다. 많은 컴퓨터 사용자는 랩톱 혹은 모니터, 키보드, 마우스로 구성된 PC 앞에서 작업한다. 이러한 시스템은 한 사용자가 자원을 독점하도록 설 계되었으며 목표는 사용자가 수행하는 작업을 최대화하는 것이다. 다양한 하드웨어와 소프트웨어 자원이 어떻게 공유되느냐의 **자원의 이용(Resource Utilization)**에는 전혀 신경을 쓰지 않는다.
시스템 관점(System View)
컴퓨터 관점에서 운영체제는 하드웨어와 가장 밀접하게 연관된 프로그램이다. 따라서 우리는 운영체제를 **자원 할당자(Resource Allocator)**로 볼 수 있다. 컴퓨터 시스템은 문제를 해결하기 위해 요구되는 여러 가지 자원들(하드웨어와 소프트웨어), 즉 CPU 시간, 메모리 공간, 저장장치 공간, 입출력 장치등을 가진다. 운영체제는 이들 자원의 관리자로서 동작한다. 자원에 대해 서로 상충할 수도 있는 많은 요청이 있으므로, 운영체제는 컴퓨터 시스템을 효율적이고 공정하게 운영할 수 있도록 어느 요청에 자원을 할당할지 결정해야 한다.
운영체제는 여러가지 입출력 장치와 사용자 프로그램을 제어해야한다. 따라서 운영체제는 **제어 프로그램(Control Program)**이다. 제어 프로그램은 컴퓨터의 부적절한 사용을 방지하기 위해 사용자 프로그램의 수행을 제어한다. 운영체제는 특히 입출력 장치의 제어와 작동에 깊게 관여한다.
운영체제의 정의
일반적으로 운영체제에 대한 적합한 정의는 없 다. 운영체제는 유용한 컴퓨팅 시스템을 만드는 문제를 해결할 수 있는 합리적인 방법을 제공하기 때문에 존재한다. 컴퓨터 시스템의 기본 목표는 프로그램을 실행하고 사용자 문제를 더욱 쉽게 해결할 수 있게 하는 것이다. 컴퓨터 하드웨어는 이 목표를 가지고 구성된다. 오로지 하드웨어만으로는 사용하기가 쉽지 않으므로 응용 프로그램이 개발된다. 이러한 프로그램에는 입출력 장치 제어와 같은 특정 공통 작업이 필요하다. 자원을 제어하고 할당하는 일반적인 기능은 운영체제라는 하나의 소프트웨어로 통합된다.
운영체제는 컴퓨터에서 항상 실행되는 프로그램(일반적으로 커널이라고 함)이다. 커널과 함께
두 가지 다른 유형의 프로그램이 있다. 운영체제와 관련되어 있지만 반드시 커널의 일부일 필요는 없는
시스템 프로그램과 시스템 작동과 관련되지 않은 모든 프로그램을 포함하는 응용 프로그램이다.
컴퓨터 시스템의 구성(Computer System Organization)
현대의 범용 컴퓨터 시스템은 하나 이상의 CPU와 구성요소와 공유 메모리 사이의 엑세스를 제공하는 공통 버스를 통해 연결된 여러 장치 컨트롤러로 구성된다.
일반적으로 운영체제는 각 장치 컨트롤러마다 장치 드라이버가 있다. 이 장치 드라이버는 장치 컨트롤러의 작동을 잘 알고 있고 나머지 운영체제 장치에 대한 일관된 인터페이스를 제공한다. CPU와 장치 컨트롤러는 병렬로 실행되어 메모리 사이클을 놓고 경쟁한다. 공유 메모리를 질서 있게 엑세스하기 위해 메모리 컨트롤러는 메모리에 대한 엑세스를 동기화한다.
인터럽트(Interrupts)
하드웨어는 어느 순간이든 시스템 버스를 통해 CPU에 신호를 보내 인터럽트를 발생시킬 수 있다. (컴퓨터 시스템에는 많은 버스가 있을 수 있지만 시스템 버스는 주요 구성요소 사이의 주요 통신 경로디.) 인터럽트는 다른 많은 목적으로도 사용되며 운영체제와 하드웨어의 상호 작용 방식의 핵심 부분이다.
CPU가 인터럽트 되면, CPU는 하던 일을 중단하고 즉시 고정된 위치로 실행을 옮긴다. 이러한 고정된 위치는 일반적으로 인터럽트를 위한 서비스 루틴이 위치한 시작 주소를 가지고 있다. 그리고 인터럽트 서비스 루틴이 실행된다. 인터럽트 서비스 루틴의 실행이 완료되면, CPU는 인터럽트 되었던 연산을 재개한다.
각 컴퓨터 설계는 자신의 인터럽트 메커니즘을 가지고 있으며, 몇 가지 기능은 공통적이다.
인터럽트는 적절한 서비스 루틴으로 제어를 전달한다. 이러한 전달을 관리하는 직선적인 방법은 인터럽트 정보를
조사하는 일반적인 루틴을 호출하는 방법이다. 이 루틴은 이어 인터럽트 고유의 핸들러(handler)를 호출한다.
그러나, 인터럽트는 매우 빈번하게 발생하기 때문에 빠르게 처리되어야 한다. 필요한 속도를 제공하기 위해
인터럽트 서비스 루틴에 대한 포인터들의 테이블을 대신 이용할 수 있다. 이 경우 중간 루틴을 돌 필요 없이,
테이블을 통하여 간접적으로 인터럽트 루틴이 호출될 수 있다. 일반적으로 포인터들의 테이블은 하위 메모리에
저장된다. 이들 위치에서는 여러 장치에 대한 인터럽트 서비스 루틴의 주소가 들어있다.
인터럽트가 요청되면, 인터럽트를 유발한 장치를 위한 인터럽트 서비스 루틴의 주소를 제공하기 위해
이 주소의 배열, 즉 인터럽트 벡터가 인터럽트 요청과 함께 주어진 고유의 유일한 장치 번호로 색인된다.
인터럽트 구조는 또한 인터럽트된 모든 정보를 저장해야 인터럽트를 처리한 후 이 정보를 복원할 수 있다. 만약 만약 인터럽트 루틴이 처리기의 상태를 변경할 필요(예를 들어 레지스터의 값을 변경하여)가 있다면, 인터럽트 루틴은 반드시 명 시적으로 현재의 상태를 저장하여야 하며, 복귀하기 전에 상태를 복원해야 한다. 인터럽트를 서비스한 후, 저장되어 있던 복귀 주소를 프로그램 카운터에 적재하고, 인터럽트에 의해 중단되었던 연산이 인터럽트가 발생되지 않았던 것처럼 다시 시작된다.
구현(Implementation)
CPU 하드웨어는 인터럽트 요청 라인(interrupt request line)이라는 선이 있는데, 하나의 명령어의
실행을 완료할 때마다 CPU가 이 선을 감지한다. CPU가 컨트롤러가 인터럽트 요청 라인에 신호를 보낸 것을
감지하면, 인터럽트 번호를 읽고 이 번호를 인터럽트 벡터의 인덱스로 사용하여
인터럽트 핸들러 루틴(interrupt-handler routine)으로 점프한다. 그런 다음 해당 인덱스와 관련된
주소에서 실행을 시작한다. 인터럽트 처리기는 작업 중에 변경될 상태를 저장하고, 언터럽트 원인을 확인하고,
필요한 처리를 수행하고, 상태 복원을 수행하고, return_from_interrupt 명령어를 실행하여 CPU를
인터럽트 전 실행 상태로 되돌린다. 장치 컨트롤러가 인터럽트 요청 라인에 신호를 선언하여 인터럽트를
발생시키고 CPU는 인터럽트를 포착(catch)하여 인터럽트 핸들러로 디스패치(dipatch)하고 핸들러는
장치를 서비스하여 인터럽트를 지운다(clear).
최신 운영체제에서는 더욱 정교한 인터럽트 처리 기능이 필요하다.
- 중요한 처리 중에 인터럽트 처리를 연기할 수 있어야 한다.
- 장치의 적절한 인터럽트 핸들러로 효율적으로 디스패치 할 방법이 필요하다.
- 운영체제가 우선순위가 높은 인터럽트와 우선순위가 낮은 인터럽트를 구분하고 적절한 긴급도로 대응할 수 있도록 다단계 인터럽트가 필요하다.
최신 컴퓨터 하드웨어에서 이 세가지 기능은 CPU 및 인터럽트 컨트롤러 하드웨어에 의해 제공된다.
대부분의 CPU에는 2개의 인터럽트 요청 라인이 있다. 하나는 복구할 수 없는 메모리 오류와 같은 이벤트를
위해 예약된 마스크 불가능 인터럽트(nonmaskable interrupt)이다. 두 번째 인터럽트 라인은
마스킹 가능(maskable)이다. 인터럽트 되어서는 안되는 ㅈ둥요한 명령 시퀀스를 싱행하기 전에 CPU에 의해
꺼질 수 있다.
벡터 방식 인터럽트 기법의 목적은 서비스가 필요한 장치를 결정하기 위해 하나의 인터럽트 핸들러가 가능한
모든 인터럽트 소스를 검색할 필요를 줄이기 위한 것이다. 그러나 실제로 컴퓨터에는 인터럽트 벡터의 주소
개수보다 많은 장치가 있다. 이 문제를 해결하는 일반적인 방법은 인터럽트 체인을 사용하는 것이다.
인터럽트 벡터의 각 원소는 인터럽트 핸들러 리스트의 헤드를 가리킨다. 인터럽트가 발생하면 요청을
처리할 수 있는 핸들러가 발견될 때까지 상응하는 리스트의 핸들러가 하나씩 호출된다. 이러한 구조는
큰 크기의 인터럽트 테이블의 오버헤드와 하나의 인터럽트 핸들러로 디스패치 하는 비효율성의 절충안이다.
위 사진은 인텔 프로세스의 인터럽트 벡터 설계를 보여준다. 마스크 불가능한 0에서 31까지의 이벤트는 다양한 오류 조건을 알리는데 사용된다. 마스크 가능한 32에서 255까지의 이벤트는 장치가 생성한 인터럽트 같은 그 외 인터럽트를 처리하기 위해서 사용된다.
인터럽트 기법은 또한 인터럽트 우선순위 레벨(interrupt priority level)을 구현한다. 이러한 레벨을 통해 CPU는 모든 인터럽트를 마스킹하지 않고도 우선순위가 낮은 인터럽트 처리를 연기할 수 있고, 우선순위가 높은 인터럽트가 우선순위가 낮은 인터럽트의 실행을 선점할 수 있다.
요약하면, 인터럽트는 최신 운영체제에서 비동기 이벤트를 처리하기 위해 사용된다. 장치 컨트롤러 및 하드웨어 오류로 인해 인터럽트가 발생한다. 가장 긴급한 작업을 먼저 수행하기 위해 최신 컴퓨터는 인터럽트 우선순위 시스템을 사용한다. 인터럽트는 시간에 민감한 처리에 빈번하게 사용되므로 시스템 성능을 좋게 하려면 효율적인 인터럽트 처리가 필요하다.
저장장치 구조(Storage Structure)
CPU는 메모리에서만 명령을 적재할 수 있으므로 실행하려면 프로그램을 먼저 메모리에 적재해야 한다.
범용 컴퓨터는 프로그램 대부분을 메인 메모리(random-access memory, 또는 RAM이라 불린다)라 불리는
재기록 가능한 메모리에서 가져온다. 메인 메모리는 dynamic random-access memory(DRAM)라 불리는
반도체 기술로 구현된다.
컴퓨터는 다른 형태의 메모리도 사용한다. 예를 들어, 컴퓨터 전원을 켤 때 가장 먼저 실행되는 프로그램은
부트스트랩 프로그램이며 운영체제를 적재한다. RAM은 휘발성(전원이 꺼지거나 손실될 때 내용이 손실됨)이므로
부트스트랩 프로그램을 유지하는 용도로 사용할 수 없다. 대신 이 목적과 다른 목적으로, 컴퓨터는 전기적으로
소거 가능한 프로그램 가능 읽기 전용 메모리(EEPROM) 및 기타 형태의 펌웨어(쓰기 작업이 자주 발생하지 않고
비휘발성인 저장장치)를 사용한다. EEPROM은 변경할 수는 있지만 자주 변경할 수는 없다. 또한 속도가 느리므로
주로 사용되지 않는 정적 프로그램과 데이터가 포함되어 있다. 예를 들어, iPhone은 EEPROM을 사용하여 장치의
일련 번호 및 하드웨어 정보를 저장한다.
모든 형태의 메모리는 바이트 배열을 제공한다. 각 바이트는 자신의 주소를 가지고 있다. 상호 작용은 특정 메모리 주소들에 대한 일련의 적재(load), 또는 저장(store)명령을 통해 이루어진다. 적재 명령은 메인 메모리로부터 CPU 내부의 레지스터로 한 바이트 또는 한 워드를 옮기는 것이다. 반대로 저장 명령은 한 레지스 터의 내용을 메인 메모리로 옮긴다. 명시적인 적재, 저장 명령 외에, CPU는 프로그램 카운터에 저장된 위치부터 실행하기 위해 메인 메모리에서 명령을 자동으로 적재한다.
폰 노이만 구조 시스템에서 실행되는 전형적인 명령-실행 사이클은 먼저 메모리로부터 명령을 인출해, 그 명령을 명령 레지스터(instruction register)에 저장한다. 이어서 명령을 해독하고, 이는 메모리로부터 피연산자를 인출하여 내부 레지스터에 저장하도록 유발할 수 있다. 피연산자에 대해 명령을 실행한 후에 결과가 메모리에 다시 저장될 수 있다.
저장 장치와 표기
한 바이트는 8비트이고 대부분 컴퓨터에서는 가장 작은 편리한 저장 단위이다. 예를 들면 대부분의 컴퓨터들은
하나의 비트를 이동하는 명령어는 제공하지 않지만 한 바이트를 이동하는 명령어는 제공한다. 약간 덜 알려진
용어가 워드이다. 워드는 그 컴퓨터 구조의 본연의 데이터 단위이다. 한 워드는 하나 이상의 바이트로
구성된다. 예를 들면 64비트 레지스터들과 64비트 메모리 주소지정을 가지는 컴퓨터는 전형적으로
64비트(8바이트) 워드를 가진다. 컴퓨터는 많은 연산을 한 번에 한 바이트 단위가 아니라 본연의 워드 단위로
실행한다.
컴퓨터 저장장치는 대부분의 컴퓨터 처리량과 마찬가지로 바이트 단위 및 바이트의 집합 단위로 측정되며 조작된다.
1킬로바이트 또는 KB는 1024바이트이고, 1메가바이트 또는 MB는 1024^2바이트, 1기가바이트 또는 GB는
1024^3바이트, 1테라바이트 또는 TB는 1024^4바이트, 1페타바이트 또는 PB는 1024^5바이트이다.
이상적으로는, 프로그램과 데이터가 메인 메모리에 영구히 존재하기를 원한다. 그러나 이는 대부분의 시스템에서 두 가지 이유로 불가능하다.
- 메인 메모리는 모든 필요한 프로그램과 데이터를 영구히 저장하기에는 너무 작다.
- 메인 메모리는 이미 언급한 것처럼 전원이 공급되지 않으면 그 내용을 잃어버리는 휘발성 저장장치이다.
그러므로 대부분의 컴퓨터 시스템은 메인 메모리의 확장으로 보조저장장치를 제공한다. 보조저장장치의 주요 요건은 대량의 데이터를 영구히 보존할 수 있어야 한다는 점이다.
가장 일반적인 보조저장장치는 하드 디스크 드라이브(HDD)와 비휘발성 메모리(NVM) 장치로, 프로그램과 데이터 모두를 위한 저장소를 제공한다. 대부분의 프로그램(시스템 및 응용 프로그램)은 메모리에 적재될 때까지 보조저장장치에 저장된다. 그런 후 많은 프로그램이 보조저장장치를 처리 소스 및 대상으로 모두 사용한다. 보조저장장치도 메인 메모리보다 훨씬 느리다.
다른 저장 장치에 저장된 자료의 백업 사본을 저장하기 위해 특수 목적으로만 사용하기에 매우 느리고 충분히 큰 장치를 3차 저장장치라고 한다.
다양한 저장장치 시스템은 저장 용량 및 엑세스 시간에 따라 계층 구조로 구성될 수 있다. 일반적으로 크기와 속도 사이에는 상충하는 측면이 있어서 메모리가 작고 빠를수록 CPU에 더 가깝다.
위 그림에서 최상위 4단계 메모리는 반도체 기반 전자회로로 구성된 반도체 메모리를 사용하여 구성된다. 네 번째 수준의 NVM 장치에는 여러가지 변형이 있지만 일반적으로 하드 디스크보다 빠르다. NVM 장치의 가장 일반적인 형태는 스마트폰 및 태블릿과 같은 모바일 장치에서 널리 사용되는 플래시 메모리이다. 점차 랩톱, 데스크톱과 서버에서의 장기 저장에도 플래시 메모리가 사용되고 있다.
비휘발성 저장장치는 전원이 꺼졌을 때 내용을 유지한다. 이를 NVS라고 한다. 대부분의 NVS의 경우 보조저장장치를 가리킨다. 이 유형의 저장장치는 다음 두가지 유형으로 분류될 수 있다.
- 기계적: 이러한 저장장치 시스템의 몇 가지 예는 HDD, 광디스크, 홀로그램 저장장치 및 자기 테이프이다. 특정 유형의 기계식 저장장치(예: 자기 테이프)를 강조해야 하는 경우 명시적으로 그 용어를 사용할 것이다.
- 전기적: 이러한 저장장치 시스템의 몇 가지 예를 플래시 메모리, FRAM, NRAM 및 SSD이다. 전기적 저장장치를 NVM으로 부른다.
일반적으로 전기적 저장장치보다 용량이 크고 바이트당 비용이 저렴하다. 반대로, 전기적 저장장치는 일반적으로 기계적 저장장치보다 비싸고 용량이 적으며 빠르다.
완전한 저장장치 시스템의 설계는 모든 요소의 균형을 맞춰야 한다. 가능한 한 많은 저렴한 비휘발성 저장장치를 제공하는 동시에 필요한 만큼만 비싼 메모리를 사용해야 한다. 캐시는 두 구성요소 간에 엑세스 시간이나 전송 속도의 차이가 큰 경우 성능을 향상하기 위해 설치할 수 있다.
입출력 구조(I/O Structure)
운영체제 코드의 상당 부분은 시스템의 안정성과 성능에 대한 중요성과 장치에 다양한 특성으로 인해 I/O 관리에 할애된다.
인터럽트 구동 I/O의 형태는 소량의 데이터를 이동하는데 좋지만 NVS I/O와 같이 대량 데이터 이동에 사용될 때 높은 오버헤드를 유발할 수 있다. 이 문제를 해결하기 위해 직접 메모리 액세스(DMA)가 사용된다. 장치에 대한 버퍼 및 포인터, 입출력 카운트를 세팅한 후 장치 제어기는 CPU의 개입없이 메모리로부터 자신의 버퍼 장치로 또는 버퍼로부터 메모리로 데이터 블록 전체를 전송한다. 속도가 느린 장치처럼 한 바이트마다 인터럽트가 발생하는 것이 아니라 블록 전송이 완료될 때마다 인터럽트가 발생한다. 장치 컨트롤러가 전송 작업을 수행하고 있는 동안 CPU는 다른 작업을 수행할 수 있다.
컴퓨터 시스템 구조(Computer System Architecture)
컴퓨터 시스템은 사용된 범용 처리기의 수에 따라 분류 가능한 다양한 방식으로 구성될 수 있다.
단일 처리기 시스템(Single Processor Systems)
몇 년 전, 대부분의 컴퓨터 시스템은 단일 처리 코어를 가진 하나의 CPU를 포함하는 단일 프로세서를 사용했다. 코어는 명령을 실행하고 로컬로 데이터를 저장하기 위한 레지스터를 포함하는 구성요소이다. 코어를 가진 하나의 메인 CPU는 프로세스의 명령어를 포함하여 범용 명령어 세트를 실행할 수 있다. 이 시스템에는 다른 특수 목적 프로세서도 있다. 디스크, 키보드 및 그래픽 컨트롤러와 같은 장치별 프로세서 형태로 제공 될 수도 있다. 이 모든 전용 처리기들은 제한된 명령어 집합을 실행하고 사용자 프로세스를 싱행하지는 않는다. 때로 이 처리기들은 운영체제에 의해 관리되기도 하는데, 운영체제는 처리기들이 수행할 다음 태스크에 대한 정보를 보내고 처리기들의 상태를 감시한다. 예를 들면 디스크 컨트롤러 마이크로프로세서는 주 CPU로부터 연속된 요청을 받아들여 자기 고유의 디스크 큐와 스케줄링 알고리즘을 구현한다. 이 배합은 CPU가 직접 디스크 스케줄링을 해야 하는 오버헤드를 감소시킨다.
다중 처리기 시스템(Multiprocessor Systems)
모바일 장치에서 서버에 이르기까지 최신 컴퓨터에서는 다중 처리기 시스템이 컴퓨팅 환경을 지배하고 있다. 일반적으로 이러한 시스템에는 각각 단일코어 CPU가 있는 두개 이상의 프로세서가 있다. 프로세서는 컴퓨터 버스 및 때때로 클록, 메모리 및 주변 장치를 공유한다. 다중 처리기 시스템의 주요 장점은 처리량 증가이다. 즉 프로세서 수를 늘리면 더 적은 시간에 더 많은 작업을 수행할 수 있다. 그러나 N 프로세서의 속도 향상 비율은 N이 아니다. 여러 프로세서가 하나의 작업에 협력할 때 모든 프로세서가 올바르게 작동하게 유지하는 데 일정한 양의 오버헤드가 발생한다. 이 오버헤드와 공유 자원에 대한 경합은 추가 프로세서의 예상 이득을 낮춘다.
가장 일반적인 다중 처리기 시스템은 각 피어 CPU 프로세서가 운영체제 기능 및 사용자 프로세스를 포함한
모든 작업을 수행하는 SMP(symmetric multiprocessing)를 사용한다.
위 그림은 각각 자체 CPU를 가지는 두 개의 프로세서가 있는 일반적인 SMP 구조를 보여준다. 각 CPU 처리기에는 개별 또는 로컬 캐시뿐만 아니라 자체 레지스터 세트가 있다. 그러나 모든 프로세서는 시스템 버스를 통해 물리 메모리를 공유한다. 이 모델의 장점은 많은 프로세스를 동시에 실행할 수 있다는 것이다. N개의 CPU가 독립적이기 때문에 하나는 유휴 상태이고 다른 하나는 과부하가 걸려 비효율적일 수 있다. 프로세서가 특정 자료구조를 공유하는 경우 이러한 비효율성을 피할 수 있다. 이 형식의 다중 처리기 시스템을 사용하면 프로세스 및 메모리와 같은 자원을 다양한 프로세서 간에 동적으로 공유할 수 있으며 프로세서 간의 작업 부하 분산을 낮출 수 있다.
다중 처리기의 정의는 시간이 지남에 따라 발전해왔으며 이제는 여러 개의 컴퓨팅 코어가 단일 칩에 상주하는 다중 코어 시스템을 포함한다. 칩 내 통신이 칩 간 통신보다 빠르므로 다중 코어 시스템은 단일 코어를 가지는 여러 칩보다 효율적일 수 있다. 또한 여러개의 코어를 가지는 하나의 칩은 여러 개의 단일 코어 칩보다 훨씬 적은 전력을 사용하는데, 이는 노트북뿐만 아니라 모바일 장치의 중요한 문 제이다.
컴퓨터 시스템 구성요소의 정의
- CPU: 명령을 실행하는 하드웨어
- 프로세서(processor): 하나 이상의 CPU를 포함하는 물리적 칩
- 코어(core): CPU의 기본 계산 단위
- 다중 코어(multicore): 동일한 CPU에 여러 컴퓨팅 코어를 포함함
- 다중 처리기(multiprocessor): 여러 프로세서를 포함함
다중 처리기 시스템에 CPU를 추가하면 컴퓨팅 성능이 향상된다. 그러나 앞에서 제안한 것처럼 이러한 개념은 그다지 확장성이 좋지 않고, CPU를 너무 많이 추가하면 시스템 버스에 대한 경합이 병목 현상이 되어 성능이 저하되기 시작한다. 다른 방법은 각 CPU(또는 CPU 그룹)에 작고 빠른 로컬 버스를 통해 액세스 되는 자체 로컬 메모리를 제공하는 것이다. 모든 CPU가 공유 시스템 연결로 연결되어 모든 CPU가 하나의 물리 주소 공간을 공유한다. **NUMA(non-uniform memory access)**라고 하는 이 방법은 CPU가 로컬 메모리에 액세스 할 때 빠를 뿐만 아니라 시스템 상호 연결에 대한 경합도 없다는 것이다.
CPU가 로컬 메모리에 액세스 할 때 빠를 뿐만 아니라 시스템 상호 연결에 대한 경합도 없다. 따라서 NUMA 시스템은 더 많은 프로세서가 추가될수록 더 효과적으로 확장할 수 있다.
클러스터형 시스템(Clustered Systems)
여러 CPU를 가진 시스템의 또 다른 유형은 클러스터형 시스템이다. 일반적으로 받아들여지는 정의에 의하면 클러스터 컴퓨터는 저장장치를 공유하고 근거리 통신망(local area network, LAN)이나 InfiniBand와 같은 고속의 상호 연결망(interconnect)으로 연결된다.
클러스터링은 통상 높은 가용성(availability)를 제공하기 위해 사용된다. 즉 클러스터 내 하나 이상의 컴퓨터 시스템이 고장나더라도 서비스는 계속 제공된다. 일반적으로 높은 가용성은 시스템에 중복 기능을 추가함으로써 얻어진다. 클러스터 소프트웨어 중 한 층이 클러스터 노드에서 실행된다. 각 노드는 하나 이상의 다른 노드 (네트워크로 연결 되어 있는)들을 감시한다. 만일 감시받던 노드가 고장나면 감시하던 노드가 고장난 노드의 저장장치에 대한 소유권을 넘겨받고, 그 노드에서 실행 중이던 응용 프로그램을 다시 시작한다. 사용자와 응용 프로그램 클라이언트는 잠깐의 서비스 중단만을 경험하게 된다. 높은 가용성은 안정성을 향상해 많은 응용 프로그램에서 중요하다. 남아 있는 하드웨어 수준에 비례하여 서비스를 계속 제공하는 기능을 **우아한 성능 저하(graceful degradation)**라고 한다. 일부 시스템은 정상적인 성능 저하를 넘어 단일 구성요소에 오류가 발생하여도 계속 동작할 수 있으므로 결함허용 시스템이라고 한다. 결함허용에는 장애를 감지, 진단 및 가능한 경우 수정할 수 있는 기법이 필요하다.
클러스터링은 비 댗칭적으로 또는 대칭적으로 구성될 수 있다. 비대칭형 클러스터링에서는 다른 컴퓨터들이 응용 프로그램을 실행하는 동안 한 컴퓨터는 긴급 대기(hot-stanby) 모드 상태를 유지한다. 이 긴급 대기 모드의 호스트는 활성 서버들을 감시하는 작업만을 수행한다. 서버가 고장 난다면 긴급 대기 모드의 호스트가 활성 서버가 된다. 대칭형 클러스터링에서는 둘 이상의 호스트들이 응용 프로그램을 실행하고 서로를 감시한다. 가용한 하드웨어를 모두 사용하기 때문에 대칭형 구성이 더 효율적이다. 대칭형 구성이 효율적으로 동작하기 위해서는 하나 이상의 응용 프로그램들이 실행 가능해야 한다.
한 클러스터가 네트워크로 연결된 다수의 컴퓨터 시스템으로 구성되므로 클러스터는 고성능 계산 환경을 제공하도록 사용될 수 있다. 이러한 시스템은 클러스터 내의 모든 컴퓨터에서 응용을 병렬 수행할 수 있으므로 단일 처리기나 SMP 시스템보다 훨씬 큰 계산 능력을 제공할 수 있다. 그렇지만 애플리케이션이 클러스터를 이용할 수 있도록 작성되어야 한다. 이는 병렬화라는 기법으로 프로그램을 컴퓨터의 개별 코어에서 혹은 클러스터의 각 컴퓨터에서 수행되는 분리된 요소로 나누는 작업을 포함한다. 전형적으로 이들 애플리케이션은 클러스터의 각 계산 노드가 문제 일부를 해결한 후 모든 노드의 결과를 결합하여 최종 해답을 얻게 된다.
HADOOP
Hadoop은 단순하고 저렴한 하드웨어 구성요소를 포함하는 클러스터형 시스템에서 대용량 데이터 세트 (빅데이터)의 분산 처리에 사용되는 공개 소프트웨어 프레임워크이다. Hadoop은 단일 시스템에서 수천개의 컴퓨팅 노드를 포함하는 클러스터로 확장되도록 설계되었다. 작업은 클러스터의 노드에 할당되며 Hadoop 은 노드 간 통신을 정렬하여 처리할 병렬 계산을 관리하고 결과를 통합한다. Hadoop은 또한 노드의 장애를 감지하고 관리하여 효율적이고 매우 안정적인 분산 컴퓨팅 서비스를 제공한다. Hadoop은 다음 세가지로 구성된다.
- 분산 컴퓨팅 노드에서 데이터와 파일을 관리하는 분산 파일 시스템
- YARN(YET ANOTHER RESOURCE NEGOTIATOR) 프레임워크는 클러스터 내의 자원을 관리하고 클러스터의 노드에 작업을 스케줄 한다.
- MapReduce 시스템은 클러스터의 노드에서 데이터를 병렬 처리할 수 있게 한다.
운영체제의 작동(Operating System Operations)
운영체제는 프로그램이 실행되는 환경을 제공한다. 내부적으로 운영체제는 여러 경로를 거쳐 구성되기 때문에 운영체제마다 큰 차이를 보인다. 그러나 많은 공통점이 존재하고. 이 절에서는 그 공통점들에 대해 논의한다.
컴퓨터의 전원을 켜거나 재부팅할 때와 같이 컴퓨터를 실행하려면 초기 프로그램을 실행해야 한다. 앞에서 언급했듯이 이 초기 프로그램 또는 부트스트랩 프로그램은 단순한 형태를 띠는 경향이 있다. 일반적으로 부트스트랩 프로그램은 컴퓨터 하드웨어 내에 펌웨어로 저장된다.
부트스트랩 프로그램은 CPU 레지스터에서 장치 컨트롤러, 메모리 내용에 이르기까지 시스템의 모든 측면을 초기화한다. 부트스트랩 프로그램은 운영체제를 적재하는 방법과 해당 시스템 실행을 시작하는 방법을 알아야 한다. 이 목표를 달성하려면 부트스트랩 프로그램이 운영체제 커널을 찾아 메모리에 적재해야 한다.
커널이 적재되어 실행되면 시스템과 사용자에게 서비스를 제공할 수 있다. 일부 서비스는 커널이 실행되는 전체 시간 동안 실행되는 시스템 데몬이 되기 위해 부팅할 때 메모리에 적재되는 시스셈 프로그램에 의해 커널 외부에서 제공된다. Linux에서 첫 번째 세스템 프로그램은 'systemd'이며 다른 많은 데몬을 시작한다. 이 단계가 완료되면 시스템은 완전히 부팅되고 시스템은 어떤 이벤트가 발생할 때까지 기다린다.








