운영체제 또한 C나 C++로 구현된 하나의 프로그램입니다 :)
초창기에는 메모리도 더 작고 작업이 단순했기 때문에 운영체제의 크기가 작았고, 한번에 한개의 프로그램이 실행되어 스와핑이 제한적으로 이루졌어요
그러나 기술이 발전하면서 프로그램의 종류가 다양해지고 복잡해졌기 때문에 운영체제 또한 매우 크고 복잡해졌습니다. (코드가 수백만행 이상에 달하니까요!)
운영체제는 단지 프로그래밍이기 때문에 이론상으로 직접 작성할 수 있습니다 .
리눅스 또한 핀란드 대학생이었던 리누스 토르발스가 밑바닥부터 새로 만들기를 결심하면서 시작했는데, 초기에는 10,000행도 안되는 작은 단위의 프로그램이었지만 프로그래머들간의 협업으로 인해서 막대한 영향력을 가진 운영체제가 되었습니다.
하드웨어를 개발할 때 의도한 운영체제가 아닌 다른 운영체제를 설치하여 사용하는 사례가 많은데, 예를 들어 윈도우에 최적화하여 설계된 컴퓨터지만, 리눅스를 설치하여 사용할 수 있습니다.
또는 디스크에 몇개의 운영체제를 저장해두고 컴퓨터를 켤때마다 선택할 수 있는데 이 기능을 멀티부트라고 하며 애플은 부트캠프라는 이름으로 지원합니다.
심지어 다른 운영체제의 관리 하에 가상운영체제를 설치하여 사용할 수도 있습니다. VM 웨어, 버추얼박스, 오픈소스인 젠과 같은 가상 운영체제가 대표적인 예이죠!
이러한 프로그램들은 메인 운영체제인 호스트 운영체제에서 다른 운영체제를 게스트 운영체제로 실행할 수 있도록 해줍니다.
호스트는 게스트가 실행하는 요청 중 파일접근시스템이나 네트워크 접근 등 근본적인 운영체제 접근 권한은 실행되지 않도록 가로채고, 호스트운영체제에서 처리 후 게스트로 돌아갑니다.
이렇게 보면 게스트 운영체제는 호스트 운영체제의 입장에서 보면 보통의 애플리케이션과 다를바 없죠?
위와 같은 게스트 운영체제와 같은 가상 운영체제를 가상 머신이라고 하는데 컴퓨터 상에서 소프트웨어로 존재하지만 마치 하드웨어인 것 처럼 그 작동방식을 모방하는 프로그램입니다.
이러한 가상머신을 이용하는 이유는 하드웨어처럼 물리적 장비를 만들어서 출하는 것 보다 프로그램을 작성해서 배포하는 것이 더 유연하기 때문입니다.
클라우드 컴퓨팅은 가상머신에 의존하는데 AWS가 대표적인 예입니다!
AWS는 고객의 작업량 변화에 맞게 서비스 성능과 용량을 줄여서 제공하여 특히 성공적이며, 비용면에서도 효율적이기 때문에 넷플릭스같은 대형 업체를 비록해서 많은 회사가 자체 서버를 운영하는 것 보다 클라우드 컴퓨팅을 활용합니다 :)
프로세서는 컴퓨터가 켜졌을 때 기억장치에 저장된 약간의 명령어를 실행해서 작동을 시작하도록 요청(컴퓨터야 커져라 얍) 하며, 이후 플래시 메모리에 저장된 명령어로 컴퓨터가 유용한 작업을 할 수 있는 충분한 코드가 로드될 때까지 작동합니다.
이렇게 컴퓨터가 작동을 시작하는 과정을 부팅이라고 한다.
부팅과정에서는 컴퓨터 구성요소가 잘 작동하는지 확인하고 외부 디바이스(마우스/키보드 등등)를 쓸 수 있게 준비가 되어있는지 점검합니다
운영체제는 일단 실행되면 간단한 작업 사이클을 집중적으로 수행하며, 실행할 준비가 됐거나 관심이 필요한 각 애플리케이션에 차례로 통제권을 줍니다.
동시다발적인 작업을 할 때 운영체제는 할당된 순서대로 처리하게 하고 필요에 따라 프로세스간에 초점(아래 설명하는 이벤트 발생이 그 예)을 전환합니다. 각 프로그램은 짧은 시간조각을 할당받는데, 시간조각은 프로그램이 시스템 서비스를 요청할 때 할당받고 프로그램에 할당된 시간이 다 끝나면 끝이 납니다!
운영체제는 이벤트에 반응합니다. (음악이 끝에 도달했거나 이벤트를 받거나 키가 눌리거나 등등) 운영체제는 각 이벤트에 대해 필요한 어떤 일을 수행하며 이벤트가 발생했다는 사실을 해당 이벤트를 처리하는 애플리케이션에 전달합니다.
사용자가 애플리케이션 종료 요청을 하면 운영체제는 애플리케이션이 남은 일을 정리할 수 있도록 기회도 줍니다. ( 파일을 저장하시겠습니까? 와 같은 식) 그, 후 운영체제는 프로그램이 사용하던 모든 자원을 회수하고 화면에 노출 될 다른 애플리케이션에게 화면에 창을 그려야한다고 요청합니다.
(저는 저렇게 바쁘게 못살것 같네요.. 소듕한 내 OS.........)
시스템콜
운영체제는 하드웨어와 다른 소프트웨어간의 인터페이스를 제공하며, 애플리케이션이 구축될 수 있는 플렛폼을 제공합니다.
운영체제는 요청에 포함된 어떤 일이든 처리하고 통제권의 결과를 애플리케이션에 돌려줍니다. 운영체제에 서비스를 요청하는 이 진입점을 시스템콜이라고 하며 시스템 콜의 세부 명세에서 그 운영체제가 무엇인지를 규정한합니다.
말이 어려운데 그냥 운영체제에다가 애플리케이션 실행할꺼야.. 일해..! 라고 요청하라는 의미입니다.
디바이스 드라이버
운영체제와 특정 종류의 하드웨어(마우스/키보드/프린터 등등) 장치간에 가교역할(*분리되어있는 일을 서로 이어주는 역할)을 하는 코드입니다.
어떤 장치의 공통된 기능은 운영체제 내부에 드라이버 인터페이스가 설치되어있어서 자동으로 인식을 합니다. 윈도우는 소비자들이 사용할 가능성이 있는 매우 다양한 장치를 위한 드라이버를 이미 설치한 상태로 출하합니다.
그러나 범용적으로 사용하는 기능이 아닌, 특정 장치의 특정 기능을 사용하기 위해서는 제품의 제조사가 운영체제가 인식하기 쉽도록 일부 프로그래밍 된 드라이버를 제공해야합니다.
프린터를 예로들어 일반적으로 프린터를 출력하는 것은 어느 프린터나 적용되는 공통적인 기능이지만, 특정 프린터는 컬러인쇄, 양면인쇄, 지원되는 종이의 크기 등등 특정 기능을 제공할 수 있습니다. 이럴 경우 운영체제에 요청을 할 때 그 프린터가 수행할 수 있도록 적합한 형태로 변환을 해줘야합니다.
컴퓨터에 여러대의 프린터를 연결해서 사용하보면 이 매커니즘을 확인할 수 있지요 ㅇ_ㅇ!
다양한 디지털 장치와 운영체제
전자부품이 꾸준히 저렴해지고 작아지면서 장치 하나에 더 많은 하드웨어를 넣을 수 있게 되어 장치의 처리 성능과 메모리 용량이 상당히 높아졌습니다.
기술 발달 덕분에 장치들은 전반적으로 앞에서 살펴봤던 범용 컴퓨터와 비슷한 모습을 가지게 되었고, 이런 추세가 계속 된다면 별도의 운영체제를 만들기 보다는 범용 운영체제를 사용하는 방식이 더 타당합니다.
새로운 소프트웨어를 개발하고 비싼 라이센스를 얻는 것 보다 리눅스에서 불필요한 부분을 뺀 버전을 사용하는 것이 더 쉽고 저렴하지요!
다만, 라이센스 에 따라 결과물 코드 일부를 공개해야될 수 있다는 단점이 있어 장치에 포함된 지적 재산권의 보호에 관한 논쟁을 불러일으킬 수 있지만 킨들(전자책)과 티보(비디오녹화기)를 비롯한 많은 장치의 사례를 보면 적절히 대처할 수 있는 것으로 보입니다 :)