sungyup's.

understanding_the_digital_world / 소프트웨어 / 2.6 운영체제

2.6운영체제

운영체제의 역사 및 역할

32. 컴퓨터를 작동하게 만드는 운영체제

소프트웨어의 두 가지 주요한 유형

  • 운영체제(operating system) : 컴퓨터 하드웨어를 관리하고 다른 프로그램을 실행할 수 있게 하는 소프트웨어의 기초 구조물
  • 애플리케이션 : 운영체제 위에서 실행되어 자립적이고 단일한 작업을 처리하는 프로그램

운영체제의 역사

1950년대 초 : 운영체제 / 애플리케이션 간에 구분 없었음

  • 컴퓨터는 한 번에 한 개의 프로그램만 실행할 수 있을 정도로 성능이 제한적이었고, 그 프로그램이 컴퓨터 전체 점유
  • 컴퓨터가 복잡해짐에 따라, 비전문가가 프로그램을 실행하는 일이 비효율적으로 느껴졌고 이에 전문 운영자가 프로그램을 컴퓨터에 입력하고 결과 배부
    • 운영체제는 운영자가 이런 작업을 자동화할 수 있도록 돕는 프로그램에서 시작
  • 운영체제는 자신이 제어하는 하드웨어가 발전됨에 따라 꾸준히 더 정교해짐
  • 1950년대 후반과 60년대 초 : 처음으로 널리 사용된 운영체제 등장, 보통은 하드웨어를 만드는 회사가 같이 제공
    • 하드웨어와 강하게 결부
    • MIT의 CTSS(Compatible Time-Sharing System, 호환 시분할 시스템)
  • 1969년 : 벨 연구소의 Ken Thompson과 Dennis Ritchie의 UNIX
    • Microsoft 제품을 제외하고 오늘날 대부분의 운영체제는 벨 연구소 UNIX에서 파생되었거나, UNIX와 호환되지만 독자적으로 개발된 LINUX에서 파생된 것.
  • 현재 : 일상생활에서 보는 데스크톱 / 노트북의 80 ~ 90는 윈도우
    • 애플 컴퓨터는 MacOS
    • 휴대 전화는 흔히 UNIX나 LINUX의 작은 버전 실행

운영체제의 역할

운영체제는 컴퓨터의 자원을 제어하고 할당한다.

1. 프로세서 관리

현재 사용 중인 프로그램을 스케줄링하고 프로그램 간의 관계를 조정함. 또, 특정한 프로그램이 자원을 독차지 하는 것을 막아줌

2. 주기억 장치 관리

메모리에 프로그램을 로드해서 프로그램이 명령어 실행을 시작할 수 있게 해줌. 메모리 용량이 충분하지 않다면, 프로그램을 일시적으로 디스크로 복사했다가 다시 메모리에 공간이 생기면 옮겨줌.
메모리를 효과적으로 사용하려면 공학적 기법이 필요함. 프로그램이 필요할 때 일부만 메모리에 가져오고 비활성화 상태일 때는 꺼내서 디스크로 복사하는 방법을 스와핑(swapping)이라고 함. 프로그램은 전체 컴퓨터를 독점하고 메모리가 무제한인 것처럼 작성되기 때문에, 운영체제는 프로그램의 덩어리를 메모리와 디스크 간에 적절히 옮김으로써 배후에서 지원해야함. 이 과정에서 하드웨어가 프로그램의 메모리 주소를 실제 메모리상의 진짜 주소로 변환하는데 도움을 주는데, 이 메커니즘을 가상 메모리(virtual memory) 라고 함.
일반적으로 메모리 용량이 더 클수록 컴퓨터가 빠르게 느껴지는데, 메모리와 디스크 간에 스와핑을 하는데 시간을 덜 쓰기 때문.

3. 보조 기억 장치에 저장된 정보 관리

파일 시스템(file system) 이라는 운영 체제의 주요 구성 요소가 폴더와 파일의 계층 구조 제공.

4. 입출력 장치 관리

디스플레이 상에 있는 여러 개의 창을 관리하면서 키보드와 마우스 입력을 받아 정보를 기다리고 있는 프로그램으로 전달되게 해줌. 또한 유무선 네트워크 연결로 주고받는 통신도 처리.

33. 가상 운영체제와 가상 머신

운영체제 역시 C나 C++로 구현되는 프로그램이다. 다뤄야 할 외부 장치도 많지 않았고, 프로그램들이 차지하는 메모리도 크지 않았던 과거에 비해 오늘날은 운영체제가 다양하고 복잡한 일을 처리해야 해 매우 크고 복잡하다.

1975년의 UNIX 운영체제 6판은 두 명이 작성했고, C와 어셈블리 언어 9,000행으로 이루어져있다. 반면, LINUX는 천만 행이 훨씬 넘고, 수십 년간 수천 명이 작업했다.

LINUX는 핀란드 대학생이었던 Linus Torvalds가 1991년에 UNIX를 자신만의 버전으로 새로 만들기로 결심하면서 시작되었다. 인터넷에 리누스가 10,000행이 조금 안 되는 초안을 게시했고, 다른 이들에게 도움을 요청했던 것이(오픈소스) 오늘날까지 이어진다.

하드웨어 개발 시에는 원래 의도와는 다른 운영체제를 실행하기도 하는데, 예를 들면 윈도우를 사용하려던 컴퓨터에서 LINUX를 실행하는 경우가 종종 있다. 이를 Multi Boot(맥OS의 경우 Boot Camp)이라고 하는데, 디스크에 몇 개의 운영체제를 저장해 두고 컴퓨터를 켤 때마다 어느 것을 실행할지 결정하는 것이다.

가상 운영체제

다른 운영체제의 관리하에 실행하는 운영체제를 가상 운영체제(Virtual Operating System)라고 한다. VMware, VirtualBox, Xen(오픈소스) 등의 가상 운영체제 프로그램은 호스트 운영체제에서 게스트 운영체제를 실행할 수 있게 해준다.

호스트는 게스트가 생성하는 요청들 중 파일 시스템 접근이나 네트워크 접근 등 운영체제 권한이 필요한 요청을 가로챈다. 이러한 요청들은 호스트가 작업을 수행하고, 게스트로 되돌아간다. 게스트 운영체제는 호스트 운영체제 입장에서 보면 보틍의 애플리케이션이다.

가상 머신

가상 머신(Virtual Machine)은 소프트웨어로만 존재하지만 마치 하드웨어인 것처럼 작동 방식을 모방하는 프로그램이다.

브라우저에는 자바스크립트 프로그램을 해석하기 위한 한 개의 가상 머신이 있고, 자바 프로그램용으로 별도의 가상 머신도 있다. 가상 머신이 사용되는 이유는 물리적 장비를 만들어 출하하는 것보다 프로그램을 작성해서 배포하는 것이 더 쉽고 더 유연하기 때문이다.

클라우드 컴퓨팅 은 가상 머신에 의존한다. 클라우드 서비스 제공 업체는 물리적 컴퓨터를 대량으로 보유하고, 고객에게 컴퓨팅 성능을 제공한다. 고객들은 가상 머신을 몇 개 사용하게 되는데, 이 가상 머신은 그보다 더 적은 수의 멀티코어 프로세서가 장착된 물리적 컴퓨터의 지원을 받는다.

AWS(Amazon Web Services)는 최대 클라우드 컴퓨팅 제공 업체이며, Microsoft Azure와 Google Cloud Platform이 그 뒤를 잇는다.

이들 서비스들은 모두 고객의 작업량 변화에 맞게 서비스의 성능과 용량을 늘리거나 줄여 제공한다. 최근에는 Netflix 같은 대형 업체들을 비롯한 많은 회사들이 자체 서버를 운영하는 것보다 클라우드 컴퓨팅을 활용하는 것이 비용 면에서 더 효율적이라고 여긴다. 이는 규모의 경제, 작업량 변화에 대한 높은 적응성, 내부 직원의 필요성 감소 때문이다.

35. 운영체제가 일하는 법

프로세서는 컴퓨터가 켜졌을 때 영구 기억 장치에 저장된 (약간의) 명령어를 실행해 작동을 시작하도록 구성되어 있다. 그런 다음, 이 명령어로 작은 플래시 메모리에서 명령어를 읽는데 여기에는 더 많은 명령어를 디스크의 특정 위치, USB 메모리, 또는 네트워크 연결 등에서 읽는 코드가 포함돼 있다.

이렇게 플래시 메모리에서 읽어온 명령어는 더욱더 많은 명령어를 읽어 최종적으로 유용한 작업을 하기에 충분한 코드를 로드한다.

이렇게 컴퓨터가 작동을 시작하는 과정은 booting 이라고 하는데, "자력으로 해내다(pulling oneself up by one's bootstraps)"라는 표현에서 비롯되었다.

부팅

부팅 과정에는 아래의 절차들이 포함된다.

  • 메모리 및 다른 구성 요소를 점검하고 올바르게 작동하는지 확인
  • 컴퓨터에 어떤 외부 장치가 연결되어 있는지 확인
  • 연결된 장치를 운영체제가 사용할 수 있도록 관련된 소프트웨어 드라이버 로드

운영체제는 실행된 이후에는 간단한 작업 사이클을 집중적으로 수행하며, 각 애플리케이션들에 통제권을 준다. 예를 들어 워드프로세서에서 텍스트를 타이핑하거나, 메일을 확인하거나, 웹 서핑을 하거나, 백그라운드에서 음악을 재생하면 운영체제는 프로세서가 이 프로세스 각각에 차례로 관심을 갖고 처리하게 하고, 필요에 따라 프로세스 간 초점을 전환한다.

운영체제는 키가 눌리거나 메일을 받거나 웹페이지를 다운로드하거나 음악이 끝에 도달하는 등의 이벤트에 반응한다. 보통, 이벤트가 발생했다는 사실을 해당 이벤트를 처리해야하는 애플리케이션에 전달한다.

사용자가 화면에 표시된 창을 재배치할 때 운영체제는 디스플레이에 각각의 창을 어디에 놓을지 알려주고, 각 애플리케이션에는 애플리케이션 창의 어느 부분이 화면에 보여야 하는지 알려줘서 애플리케이션이 창을 다시 그리도록 한다.

시스템 콜

운영체제는 하드웨어 ↔ 다른 소프트웨어 간의 인터페이스를 제공한다. 하드웨어를 추상화해 프로그래밍을 더 쉽게 할 수 있도록 돕기도 하여, 운영체제는 애플리케이션이 구축될 수 있는 플랫폼 을 제공한다. 이는 추상화의 사례로, 구현상 관련 없는 세부 사항을 감추는 인터페이스를 제공한다.

운영체제는 애플리케이션에 제공하는 작업이나 서비스의 집합을 정의한다. 예를 들면 데이터를 파일로 저장하거나, 파일에서 데이터 가져오기, 네트워크 연결 맺기, 키보드로 입력된 내용 가져오기, 마우스 움직임, 버튼 클릭, 디스플레이 그리기 등이다.

운영체제는 이러한 서비스를 표준화된 방식으로 이용할 수 있게 하고, 애플리케이션은 운영체제의 특정 부분에 통제권을 넘겨주는 명령어를 실행함으로 서비스를 요청한다. 운영체제는 요청을 처리하고 통제권과 처리 결과를 애플리케이션에 돌려준다.

운영체제에 서비스를 요청하는 진입점을 시스템 콜 이라고 한다. 최신 운영체제에는 보통 수백 개의 시스템 콜이 있다.

디바이스 드라이버

운영체제 ↔ 하드웨어(프린터, 마우스 등)를 이어주는 코드이다.

드라이버 코드는 마우스나 트랙패드에서 오는 움직임과 버튼 정보를 이용하는 방법, 드라이브가 집적회로나 회전하는 자성 표면에서 정보를 읽고 쓰게 하는 방법, 프린터가 종이를 인쇄하게 하는 방법 등을 담고 있다.

디바이스 드라이버는 특정 장치의 특이 속성에서 시스템의 나머지 부분을 분리한다. 예를 들면, 키보드처럼 종류는 다양하지만 동일한 역할을 하는 장치에는 운영체제가 필요로 하는 기본 속성과 동작이 있는데, 드라이버 인터페이스는 운영체제가 서로 다른 장치에도 같은 방식으로 접근할 수 있게 해준다.

부팅 시, 시스템에 현재 가용 장치에 필요한 드라이버를 불러온다. 새로운 장치가 갑자기 연결될 수도 있는데, 외부 디스크가 USB 소켓에 연결되면 운영체제는 새 장치를 인식하고 그게 디스크라는 것을 알아내며, 이후에 디스크와 통신하도록 USB 디스크의 드라이버를 로드한다.

다양한 디지털 장치와 운영체제

기술 발달 덕분에 다양한 장치들(디지털 카메라, 휴대전화 등)은 전반적으로 범용 컴퓨터와 비슷한 모습을 띄게 되었다. 성능이 좋은 프로세서와 용량이 큰 메모리가 내장되었고, 카메라 렌즈와 디스플레이 같은 주변 장치가 여러 개 달려있다. 정교한 사용자 인터페이스를 제공하기도 하고, 다른 시스템과 통신할 수 있도록 네트워크 연결도 가능하다.

이런 추세가 지속되면서 별도의 운영체제를 만들기보다는 범용 운영체제를 사용하는 방식이 더 타당해졌다. 사용 환경이 특수한 경우가 아니라면, LINUX에서 불필요한 부분을 뺀 버전을 사용하는 편이 직접 개발하는것보다 쉽고 저렴하다. 단점은 GPL 같은 라이선스에 따라 결과물 코드 일부를 공개해야 될 수도 있다는 점이다.

36. 파일 시스템과 블록

파일 시스템은 운영체제에서 하드 디스크, CD, 이동식 메모리 장치 같은 물리적인 저장 매체를 파일과 폴더의 계층 구조처럼 보이게 하는 부분이다.

파일 시스템은 논리적 구성과 물리적 구현 간의 분리를 보여주는 훌륭한 사례로, 실제로 파일 시스템은 다양한 종류의 장치에 정보를 조직화하고 저장하지만, 운영체제는 모두 동일한 인터페이스로 표시한다. 폴더(UNIX 계열이라면 디렉토리)는 다른 폴더와 파일의 이름을 담고 있고, 조직화된 구조를 제공한다. 컴퓨터가 보유하는 모든 정보는 파일 시스템에 저장되고, 사용자는 파일 시스템을 통해 정보에 접근한다.

파일 시스템은 폴더와 파일에 대한 모든 정보를 관리하면서 애플리케이션이나 운영체제의 나머지 부분이 정보를 읽고 쓸 수 있도록 접근 가능하게 만든다. 또, 파일에 대한 접근이 효율적으로 수행되고 서로 간섭하지 않도록 조정하는 역할을 하고, 데이터의 물리적인 위치를 계속 파악한다. 다수의 사용자를 지원하는 시스템에서는 한 사용자가 다른 사용자의 파일에 권한 없이 접근할 수 없게 하고, 사용자마다 사용할 수 있는 공간의 용량에 한도를 부과할 수도 있다.

파일 시스템 서비스는 가장 낮은 수준의 시스템 콜을 통해 사용할 수 있으며, 파일 시스템 서비스를 만들 때 공통적인 부분은 라이브러리에 제공되어 있어 프로그래밍하기 쉽다.

보조 기억 장치 파일 시스템

파일 시스템은 어떻게 작동할까?

예를 들어, 500GB 드라이브가 있다고 가정하자. 이 드라이브는 약 5천억 바이트를 담을 수 있다. 이 드라이브 자체의 소프트웨어는 이것을 실제로는 1,024 바이트 단위의 덩어리인 블록 약 5억 개로 표시한다. 예를 들어, 작은 메일 메시지 같은 2,500 바이트 크기의 파일은 블록 3개에 저장된다.

파일 시스템은 한 파일이 사용하는 바이트를 다른 파일이 사용하는 바이트와 같은 블록에 저장하지 않는다. 따라서 마지막 블록이 꽉 차지 않는다면 약간의 공간이 낭비된다. 하지만 손수 관리해야 하는 수고를 덜어주고, 보조 기억 장치는 저렴한 편이기 때문에 큰 문제는 아니다.

폴더 엔트리 (folder entry, UNIX 계열에선 Directory entry)는 파일 이름, 용량, 생성되거나 변경된 날짜와 시간, 다른 각종 정보(권한, 파일 유형 등)를 담고 있으며, 이 모든 정보는 파일 탐색기나 파인더 같은 프로그램에서 확인할 수 있다. 또, 폴더 엔트리는 그 파일이 드라이브 어디에 저장되어 있는지(5억 개의 블록 중 어느 것이 파일의 바이트를 담고 있는지)에 대한 정보를 넣고 있다. 같은 파일을 나눠 담고 있는 블록들이 하드 드라이브에서 물리적으로 인접해 있지 않아도 된다.

SSD는 물리적 구현은 크게 다르겠지만 기본적으로는 하드 드라이버와 기본 아이디어가 같다. 요즈음 대부분의 컴퓨터에서 SSD를 사용하는데, 바이트당 가격이 비싸긴 해도 더 작고 훨씬 안정적이고 가벼우며 전력 소모가 적기 때문이다. 파일 탐색기나 파인더 같은 프로그램에서 보면 차이가 전혀 없지만, SSD 장치는 하드 드라이브와는 다른 드라이버를 사용하며, 장치 자체에 정보가 어느 위치에 있는지 기억하기 위한 정교한 코드가 들어 있다. 이는 SSD 장치의 각 영역이 사용될 수 있는 횟수에 제한이 있기 때문으로, SSD 내부 소프트웨어는 각 물리적 블록이 몇 번 사용되었는지를 파악하고, 각 블록이 거의 같은 횟수로 사용되도록 데이터를 옮긴다. 이러한 처리를 마모 평준화(wear leveling) 라고 한다.

폴더는 다른 폴더와 파일이 어디에 있는지 정보를 담고 있는 파일이다. 폴더의 내용을 관리하고 유지하기 위한 권리는 파일 시스템이 독점한다. 따라서 사용자와 애플리케이션은 파일 시스템에 요청을 해야만 간접적으로 폴더 내용을 바꿀 수 있다. 가장 낮은 레벨에서 보면 폴더는 그저 블록이며, 모두 같은 메커니즘으로 관리된다. 앞서 언급했듯 폴더는 파일의 종류인데, 일반 파일과의 차이는 파일 시스템이 폴더 내용에 완전히 책임을 진다는 점과, 애플리케이션이 그 내용을 직접 바꿀 방법이 없다는 것이다.

프로그램이 기존 파일에 접근하려 할 때, 파일 시스템은 계층 구조의 최상위부터 시작해서 파일 경로명의 각 요소를 해당하는 폴더에서 찾으면서 파일을 검색한다. 이렇게 함으로 경로에서 폴더를 찾아 들어갈 때마다 그 폴더 이하에 있는 파일과 폴더에 수행되는 검색의 범위가 좁아져 탐색을 효율적으로 할 수 있다. 실제로는 프로그램과 운영체제가 현재 사용되는 폴더를 계속 파악하기 때문에 검색이 매번 최상위에서 시작할 필요는 없다. 또한, 시스템이 작업 속도를 높이기 위해 자주 사용되는 폴더를 캐싱하기도 한다.

프로그램이 새 파일을 생성하려고 할 때, 파일 시스템에 요청을 한다. 파일 시스템은 폴더에 새로운 엔트리를 넣으면서 이름, 날짜 등을 넣고 크기를 0으로 표시한다. 나중에 프로그램이 파일에 데이터를 쓰면 파일 시스템은 요청된 정보를 담기에 충분한 수의 미사용 블록을 찾아서 데이터를 복사해 넣고, 폴더의 블록 목록에 그 블록들을 삽입하고, 애플리케이션으로 되돌아간다. 즉, 파일 시스템은 미사용 블록을 포함한 모든 블록의 목록을 유지하고 사용한다. 이 미사용 블록은 운영체제만 접근할 수 있고 애플리케이션은 접근할 수 없다.

37. 파일을 휴지통에 넣을 때 일어나는 일

파일 제거하기

파일이 제거되면 휴지통 으로 간다. 휴지통은 일부 속성이 조금 다르지만 그저 또 다른 폴더이다. 파일이 제거되기로 하면 그 파일의 폴더 엔트리와 전체 이름이 현재 폴더에서 휴지통이라는 폴더로 복사되고 원래 폴더 엔트리는 지워진다. 파일의 블록과 그 내용은 전혀 바뀌지 않는다. 휴지통에서 파일을 복원할 때는 이 과정을 정반대로 수행해서, 엔트리를 원래 폴더로 복구한다.

원래 의도한 삭제 작업은 '휴지통 비우기'에서 일어난다. 휴지통을 비우면 휴지통에 있는 폴더 엔트리가 지워지고 블록은 미사용 블록 목록에 추가된다. 하지만 해당 블록에 있는 내용은 아직 삭제되지 않은 상태다. 원래 파일에 할당된 각 블록의 모든 바이트는 그대로 있고, 이 블록이 미사용 목록에서 꺼내져서 새로운 파일에 할당되기 전까지는 새로운 내용으로 덮어 쓰이지 않는다. 즉, 물리적 블록 단위로 드라이브를 읽는 프로그램, 파일 시스템 계층 구조를 통하지 않고 디스크를 읽는 프로그램이라면 예전 내용을 확인할 수 있다.

따라서 군 조직 등 보안이 중요한 곳에서는 블록을 무작위 패턴으로 된 0과 1 값을 여러번 덮어 씌움으로 파일을 제거한다. 더 좋은 방법은 하드 디스크를 강한 자석 근처에 놓아 자성을 없애 버리는 것이다. 최선의 방법은 물리적으로 파괴하는 것이며, 저장된 정보를 확실히 사라지게 하는 유일한 방법이다.

하지만 데이터가 항상 자동으로 백업되고 있거나 드라이브 대신 네트워크 파일 시스템이나 클라우드 어딘가에 파일이 보관되고 있다면 이마저도 충분하지 않을 수 있다.

다른 파일 시스템

지금까지는 보조 기억 장치 드라이브에 사용되는 종래의 파일 시스템에 대한 설명이었다. 파일 시스템의 추상화는 다른 저장 매체에도 적용된다.

CD-ROM과 DVD도 마찬가지로 폴더와 파일 계층 구조로 되어 있는 파일 시스템처럼 정보에 접근하게 한다. USB 드라이브와 SD 카드도 플래시 메모리 파일 시스템을 사용한다. 이들 저장 매체를 윈도우 컴퓨터에 연결하면 또 다른 디스크 드라이브로 나타나고, 저장된 내용을 파일 탐색기로 탐색하거나 내장 드라이브와 똑같이 파일을 읽고 쓸 수 있다. 유일한 차이는 용량이 더 작고 접근 속도가 다소 느릴 수 있다는 점이다.

동일한 장치를 맥 컴퓨터나 UNIX, LINUX 컴퓨터에 연결하면 마찬가지로 폴더가 나타나고 해당 운영체제의 파일 시스템에 나타난다. 소프트웨어는 물리적인 장치가 파일 시스템처럼 보이게 해주는데, 운영체제는 다양하지만 모두 동일하게 추상화된 '폴더와 파일 구조'로 보이게 한다. 내부적인 구성 방식은 사실상의 표준인 마이크로소프트의 FAT(File Allocation Table) 파일 시스템일 가능성이 높지만, 전부 그런 것은 아니다.

네트워크 파일 시스템도 동일한 추상화를 사용한다. 네트워크 파일 시스템은 소프트웨어를 활용해서 다른 컴퓨터의 파일 시스템이 마치 자신의 컴퓨터에 있는 것처럼 파일 탐색기, 파인더, 또는 다른 프로그램을 사용하여 접근하게 해준다.네트워크 파일 시스템은 주된 파일 저장소로도 사용되지만 백업 용도로도 자주 쓰인다. 파일의 이전 버전 여러 개를 서로 다른 위치에 있는 보관용 저장 매체로 복사해 두면, 랜섬웨어 공격이나 화재 등의 재난에서 데이터를 지킬 수 있다.

어떤 디스크 시스템은 RAID(Redundant Array of Independent Disks)라는 방법을 사용하는데, 이 기술은 디스크 중 하나가 고장 나더라도 정보를 복원할 수 있는 오류 수정 알고리즘을 이용해 여러 개의 디스크에 데이터를 기록한다.

38. 여러 작업을 수행하는 애플리케이션

애플리케이션은 운영체제를 플랫폼으로 삼아 작업을 수행하는 온갖 종류의 프로그램이나 소프트웨어 시스템을 통칭하는 용어다.

애플리케이션의 크기는 천차만별로, 아래의 date라는 UNIX 프로그램은 입력 시 현재 날짜와 시간을 출력해주는데, 완전한 구현 코드가 다음과 같이 짧다.

clike
#include <stdio.h> #include <time.h> int main() { time_t t=time(0); // 현재 시간을 내부 형식으로 제공하는 시스템 콜 printf("%s", ctime(&t)); // 날짜를 형식화하고 텍스트를 출력 return 0; }

워드 같은 애플리케이션은 훨씬 규모가 크다. 사용자가 파일을 열고, 내용을 읽고, 파일 시스템에 문서를 저장할 수 있도록 파일 시스템 코드 일부가 포함된다. 텍스트가 바뀜에 따라 디스플레이를 계속해서 갱신하기 위한 알고리즘도 필요하다. 또, 정보를 화면에 표시하고, 글자 크기, 글꼴, 색상, 레이아웃 등을 조정하는 방법을 제공하는 정교한 사용자 인터페이스를 지원한다.

브라우저는 규모가 크고 무료이며 간혹 오픈소스로 개발되는 애플리케이션이다. 브라우저 또한 상당히 복잡한 애플리케이션이다. 우선, 브라우저는 비동기적(asynchronous) 이벤트를 처리해야 한다. 비동기적 이벤트란, 일정한 순서를 따라 발생한게 아니라 예측할 수 없는 시점에 발생하는 이벤트를 뜻한다. 예를 들면, 사용자가 링크를 클릭하면 브라우저는 페이지에 대한 요청을 보내는데, 브라우저는 해당 응답을 기다리고만 있지 않고 그 사이에 사용자가 현재 페이지를 스크롤하면 즉각 반응해야 하고, 뒤로 가기 버튼을 누르거나 다른 링크를 클릭하면 요청된 페이지가 오는 중이더라도 요청을 취소해야 한다. 사용자가 창의 모양을 바꾸면 디스플레이를 갱신하고, 페이지에 소리나 동영상이 포함돼 있다면 미디어의 재생도 처리해야 한다.

또, 브라우저는 정적인 텍스트부터 페이지 내용을 계속 바꾸는 대화형 프로그램에 이르기까지 많은 종류의 콘텐츠를 지원해야 한다. 그 중 일부는 확장 프로그램에 콘텐츠 처리(주로 PDF나 동영상 같은 표준 포맷 처리 시)를 위임하는데, 확장 프로그램을 실행하고, 데이터에 대한 요청을 보내고 받고, 처리된 데이터를 디스플레이에 표시하기 위한 메커니즘을 제공해야 한다.

브라우저는 여러 개의 탭과 여러 개의 창을 관리하는데, 이들 각각이 앞서 언급한 작업 중 일부를 수행할 뿐 아니라 수행한 작업의 이력과 함께 북마크, 즐겨찾기 등의 다른 데이터를 유지한다. 업로드, 다운로드, 이미지 캐싱을 하기 위해 로컬 파일 시스템에 접근하기도 한다.

이 모든 기능을 수행하기 위한 복잡한 코드가 있기 때문에 브라우저는 자체 구현 코드나 자신이 활성화하는 프로그램에 있는 버그를 이용한 공격에 취약하다. 브라우저는 운영체제와 비슷하다. 자원을 관리하고, 동시에 일어나는 활동을 제어하고 조정한다. 또한 다수의 출처에 정보를 저장하고 가져오며, 애플리케이션 프로그램이 실행될 수 있는 프로그램을 제공한다.

실제로 브라우저는 오늘날 운영체제로 사용할 수 있게 되어 수많은 서비스가 오로지 브라우저 인터페이스로만 접근할 수 있고(이메일, 달력, 음악, 비디오, SNS 등이 있다) 이러한 추세는 계속될 예정이다. 구글은 웹 기반 서비스에 주로 의존하는 크롬 OS라는 운영체제를 제공한다. 크롬북은 크롬 OS를 실행하는 컴퓨터로, 로컬 저장 장치의 용량은 제한적이며 대부분 저장 기능은 웹을 사용한다. 또한 Google Docs 같은 브라우저 기반 애플리케이션만 실행한다. 관련 내용은 4부 클라우드 컴퓨팅에 대해서 보다 자세히 다룬다.

39. 소프트웨어의 계층 구조

마치 지질학의 지층처럼, 소프트웨어도 계층으로 구성된다고 볼 수 있다.

가장 밑바닥에는 하드웨어가 있다. 하드웨어는 시스템으로는 거의 변경할 수 없다.

그 위의 계층은 엄밀한 의미의 운영체제로, 커널(Kernel) 이라고 부른다. 운영체제는 하드웨어와 애플리케이션 사이의 계층으로, 운영체제는 하드웨어의 특수한 속성을 숨기고, 애플리케이션에 인터페이스를 제공한다. 인터페이스가 잘 설계되어 있으면, 동일한 운영체제 인터페이스를 다양한 종류의 프로세서에서 이용할 수 있다. UNIX와 LINUX가 그 예로, 온갖 종류의 프로세서에서 작동하고, 각각의 프로세서에 동일한 운영체제 서비스를 제공한다.

이렇기에, 운영체제 윗 계층인 소프트웨어는 하드웨어에 독립적으로 작용한다. 프로그램을 새로운 프로세서로 옮기는데 필요한 작업은 적합한 컴파일러로 컴파일 하는 것 뿐으로, 애플은 2005 ~ 2006년 1년도 안 되는 사이에 자사 소프트웨어를 IBM 파워PC 프로세서에서 인텔 프로세서 기반으로 변경했다. 2020년 중반에 애플은 또 휴대전화, 태블릿, 컴퓨터 전체에 인텔 프로세서 대신 ARM 프로세서(애플 실리콘)로 전환했다.

윈도우는 1978년 인텔 8086 프로세서를 시작으로 많은 발전 단계에 걸쳐 인텔 아키텍처와 상당히 밀접하게 결부된 상태였다. 하지만 요즘엔 윈도우도 ARM 프로세서 상에서 실행된다.

운영체제 위의 계층은 라이브러리 집합으로, 프로그래머 개개인이 기능을 새로 만들어 낼 필요가 없도록 일반적으로 유용한 서비스를 제공한다. 라이브러리는 API를 통해 사용할 수 있다. 어떤 라이브러리는 낮은 수준으로 기본적인 기능을 처리한다.(예를 들면 앞서 봤던 date 라던가 수학적 기능 계산) 다른 라이브러리 중에는 훨씬 복잡한 것도 많다. 예를 들면 GUI 구성 요소(대화 상자, 메뉴, 버튼, 체크박스, 스크롤 바, 탭이 있는 분할된 창)는 훨씬 많은 코드를 필요로 한다. 일단 이 GUI 구성 요소가 라이브러리에 있으면 누구나 사용할 수 있어서 균일한 디자인을 보장하는데 도움이 된다. 그래픽 구성 요소를 다시 만들고 재구현하는 것은 대부분의 소프트웨어 공급 업체에 지나치게 많은 일을 부여하는 것이며, 무의미하게 겉모습을 다르게 만들어봤자 사용자들에게 혼란만 준다.

가끔은 커널, 라이브러리, 애플리케이션 간의 구분이 명확하지 않을 때도 있다 .소프트웨어 구성 요소를 만들고 연결하는 방법에는 경우의 수가 많기 때문이다. 예를 들면 커널은 적은 서비스만 제공하고, 대부분을 상위에 있는 라이브러리가 처리할 수도 있고 반대로 할 수도 있다. 즉, 운영체제와 애플리케이션 사이의 경계는 뚜렷하지 않다.

그 경계선은 어디일까? 어떤 애플리케이션이 다른 애플리케이션의 동작에 간섭하지 않도록 하는데 필요한 모든 것은 운영체제의 역할이다. 예를 들면 메모리 관리, 즉 프로그램이 실행되는 동안 RAM의 어느 위치에 프로그램을 둘지 결정하는 것은 운영체제의 일이다. 이와 비슷하게, 보조 기억 장치의 어느 위치에 정보를 저장할지 결정하는 파일 시스템은 매우 중요한 운영체제의 기능이다. 주변 장치 제어도 마찬가지다. 두 개의 애플리케이션이 프린터를 동시에 작동 시키는 일은 있어서 안되고, 그 중심에서 프로세서를 제어하는 운영체제가 필요하다.

이러한 이유에서, 브라우저는 운영체제의 일부가 아니다. 왜냐하면 어떤 브라우저든 공유된 자원이나 제어 기능에 간섭하지 않으면서 여러개가 동시에 실행될 수 있기 때문이다. 이 주제는 사실 IT 역사에 한 획을 그은 소송의 법리적 해석에 중대한 영향을 미친 주제였는데, 1998년에 시작해서 2011년에 끝난 미국 법무부 대 마이크로소프트 간의 반독점 소송의 부분이 마이크로소프트의 브라우저인 Internet Explorer가 운영체제의 일부인지 단지 애플리케이션인지 다툰 논쟁이었기 때문이다. 마이크로소프트가 주장한 대로 IE가 운영체제의 일부라면 제거될 수 없는 것이 타당했고, 그냥 애플리케이션이라면 굳이 IE를 쓸 필요가 없는 이들에게 불법적으로 강요하는 상황이 되었다. 법정은 브라우저가 운영체제의 일부가 아니라 애플리케이션이라고 판결 내렸다.

40. 요약

애플리케이션은 사용자가 원하는 작업을 처리한다.

운영체제는 애플리케이션이 자원(프로세서 시간, 메모리, 보조 기억 장치 네트워크 연결, 기타 장치)을 효율적이고 공평하게 공유하면서 서로 간섭하지 않을 것을 보장하는 조정자 역할을 한다.