컴퓨터 응용 분야의 종류와 그 특성
스마트 가전제품이나 휴대전화에 내장되는 컴퓨터에서부터 초대형 슈퍼컴퓨터에 이르기까지 기본이 되는 하드웨어 기술은 같지만, 응용 분야에 따라서 설계 요구사항과 핵심적인 하드웨어 기술을 사용하는 방법은 각기 다르다. 개괄적으로 컴퓨터는 크게 세 가지 응용 분야에서 사용된다.
개인용 컴퓨터(Personal Computer, PC)
개인용 컴퓨터는 낮은 가격으로 단일 사용자에게 좋은 성능을 제공하는 것을 중요시하며 제 3자(third-party) 소프트웨어를 실행하기 위해 주로 사용된다.
서버(Server)
서버는 과거 대형 컴퓨터로 불리던 것의 현대적 형태로서 보통 네트워크를 통해서만 접근된다. 서버는 대개 대형 작업 수행에 이용된다. 대형 작업은 과학이나 공학 분야의 복잡한 응용 프로그램 1개일 수도 있고, 대규모 웹 서버에서처럼 작은 작업 여러 개로 구성될 수도 있다.
이러한 응용 프로그램은 다른 회사가 개발한 소프트웨어(데이터베이스나 시뮬레이션 시스템 등)를 이용하기는 하나, 특정한 기능을 수행하도록 변형되거나 맞추어지는 경우가 많다. 서버는 개인용 컴퓨터와 같은 기술로 제작되지만, 연산과 입출력 용량의 확장성이 훨씬 더 크다. 서버가 고장 나면 단일 사용자 PC와는 비교할 수 없이 큰 손해가 발생되므로, 일반적으로 서버는 신용도(dependability)를 매우 강조한다.
서버는 가격과 성능의 폭이 매우 넓다. 저사양 서버는 화면과 키보드가 없는 개인용 컴퓨터와 다를 바가 없으며 가격은 천 달러 정도에 불과하다. 이런 저사양 서버는 파일 저장이나 중소기업 업무 또는 간단한 웹 서비스용으로 사용된다. 이와 반대로 극단에는 슈퍼컴퓨터가 있다. 오늘날의 슈퍼컴퓨터는 가격이 수천만 ~ 수억 달러로, 수십만 개의 프로세서와 수 TeraByte의 메모리를 가지고 있다. 슈퍼컴퓨터는 일기 예보, 석유 탐사, 단백질 구조 등 대형 과학 및 공학 계산에 주로 사용된다.
임베디드 컴퓨터(Embedded Computer)
가장 많이 사용되고 있는 임베디드 컴퓨터는 응용 분야와 성능이 매우 다양하다. 자동차에 들어있는 마이크로프로세서와 디지털 텔레비전 등에서 사용되는 컴퓨터 등이 여기에 포함된다. 인터넷상에서 무선으로 통신하는 많은 수의 작은 기기들을 의미하는 사물인터넷(IOT)도 오늘날 친숙하게 접하는 용어이다.
임베디드 컴퓨팅 시스템은 한 가지 응용을 수행하거나 서로 연관된 일련의 프로그램을 실행하도록 설계되어 있다. 보통 임베디드 컴퓨터는 다른 하드웨어와 한 덩어리로 묶인 단일 시스템으로 공급되기 때문에 도처에 깔려 있어도 대부분의 사용자는 자기가 컴퓨터를 사용하고 있다는 사실조차 인식하지 못한다.
임베디드 응용은 최소한의 성능만 유지하면서 가격과 소모 전력은 엄격히 제한해야 하는 독특한 요구사항을 갖는 경우가 많다.
포스트 PC 시대
개인용 컴퓨터가 개인 휴대용 기기(Personal Mobile Device, PMD - 스마트폰, 태블릿 등)로 대치되고 있다. PMD는 배터리로 동작하며, 무선으로 인터넷에 연결된다.
전통적인 서버도 창고 규모의 컴퓨팅(Warehouse-Scale Computing, WSC)으로 알려진 거대 규모의 데이터센터를 이용하는 클라우드 컴퓨팅(Cloud Computing)으로 전환되고 있다.
Amazon이나 Google과 같은 회사들은 50,000개 이상의 서버들을 가진 WSC를 구축하고, 그 일부를 다른 회사에 빌려주고 있다. 그러면 이 회사들은 자체적으로 WSC를 구축할 필요 없이 PMD에 필요한 서비스를 제공할 수 있다.
클라우드를 통해 제공되는 서비스로서의 소프트웨어(Software as a Service, SaaS)가 소프트웨어 산업에 혁명을 일으키고 있다.
Cloud Computing : 인터넷을 통해 서비스를 제공하는 서버들의 집합. 일부 공급자들은 서버의 수를 필요한 만큼 임대해 주기도 한다.
Saas : 소프트웨어와 데이터를 서비스의 일환으로 인터넷을 통해 제공한다. 설치 과정이 필요하고 모든 실행이 설치한 기기에서 이루어지는 이진 코드 대신에, 브라우저처럼 로컬 클라이언트 기기에서 실행되는 가벼운 프로그램을 사용한다. 그 예로 웹 검색과 소셜 네트워킹 등이 있다.
컴퓨터 구조의 이해에 대한 필요성
성공적인 프로그래머들은 항상 자기가 작성한 프로그램의 성능에 신경을 써 왔다. 성공적인 소프트웨어 작성에서 중요한 문제는 사용자가 원하는 결과를 빨리 얻을 수 있게 하는 것이기 때문이다. 1960년대와 1970년대에 컴퓨터 성능을 제약하던 가장 큰 요소는 컴퓨터 메모리의 용량이었다. 그러나 지난 20년간 컴퓨터 설계와 메모리 분야의 기술이 눈부시게 발전하면서 임베디드 시스템을 제외한 대부분의 응용에서 메모리 사용을 최소화해야 할 필요성은 크게 줄어들었다.
오늘날 성능에 관심이 있는 프로그래머라면 1960년대의 단순한 메모리 모델을 사라지게 만든 두 가지 이슈, 메모리의 계층성과 프로세서의 병렬성을 이해해야 한다. 또한 PMD나 클라우드에서 수행되는 프로그램의 에너지 효율성을 신경 써야 한다.
이를 위해서 코드 아래의 계층에서 무슨 일이 벌어지는지 잘 이해할 필요가 있다. 따라서 경쟁력 있는 소프트웨어를 개발하고자 하는 프로그래머라면 컴퓨터 구조에 대한 지식을 늘려 나갈 필요가 있다.
- C나 Java 같은 상위 수준 언어로 작성된 프로그램이 어떻게 하드웨어 언어로 번역되며,
하드웨어는 번역된 프로그램을 어떻게 실행하는가? - 소프트웨어와 하드웨어 사이의 인터페이스는 무엇이며,
소프트웨어는 어떻게 필요한 일을 하드웨어에게 지시하는가? - 프로그램의 성능을 결정하는 요소는 무엇이며, 프로그래머는 어떻게 성능을 개선할 수 있는가?
- 성능 개선을 위해 하드웨어 설계자는 어떤 기술을 사용할 수 있는가?
- 에너지 효율성을 개선하기 위해 하드웨어 설계자는 어떤 기술을 사용할 수 있는가?
- 순차적인 처리에서 병렬 처리로 넘어가는 이유는 무엇이며 그 결과는 어떤가?