카테고리 없음

CS 스터디 발제 38,39 - 여러작업을 수행하는 애플리케이션 그리고 소프트웨어의 계층구조

7th crunch Tutorial participant 2022. 6. 10. 07:33

애플리케이션?

 

앱스토어, 구글 플레이 앱, 안드로이드 앱 등등 - 앱, 애플리케이션이라는 이름은 이제 우리에게 대단히 익숙한 이름입니다.

 

손바닥 위의 조그마한 핸드폰에서 우리는 카카오톡, 온라인 뱅킹, 웹 브라우저 등등 하루에도 수많은 애플리케이션을 실행하고 있습니다. 너무나 익숙해진 나머지 우리는 애플리케이션이라고 말할때, 그 말이 무엇을 가리키는지 대충이나마 떠오르는 생각이 있기는 합니다만, 안타깝게도 프로그래머에게 요구되는 IT 지식이란 그정도로 아련한 수준의 내용은 아닙니다. 

 

어쩌면 응용프로그램이라는 이름을 들어본 적도 있을 겁니다. 요새는 앱이나 애플리케이션이라는 말을 더 많이 사용하게 된 탓에 응용프로그램이라면 틀딱들을 위한 단어가 되어버린 것은 아닌지 하는 생각이 좀 들기도 합니다만, 어쨌거나 이 앱, 애플리케이션이 가리키는 말의 좁은 의미는 응용프로그램이라는 단어의 의미와 거의 일치한다고 보면 되겠습니다.

 

그렇다면 이 앱, 애플리케이션은 정확하게 무엇을 가리키는 말일까요?

 

앱, 애플리케이션, 응용프로그램(혹은 응용소프트웨어)

 

상식적인 레벨에서 우리는 소프트웨어라는 단어에 익숙합니다.

소프트웨어는 하드웨어에 대척점에 있는 말로, 기계적인 구성을 이루고 있는 하드웨어와 달리 그 하드웨어를 바탕으로 하드웨어에서 동작하고, 하드웨어를 효율적으로 사용할수록 돕고, 인간이 이해할 수 있도록 표현하는 무형의 시스템을 통칭하는 말입니다.

 

물론 위 말은 사람이 물건과 상호작용하는 직관의 관점에서 보았을 때 소프트웨어의 의미고, 컴퓨터 입장에서 소프트웨어는 사람이 하드웨어에게 작업을 지시하기 위해서 사용하는 명령어들의 모음이라고 말할 수 있겠습니다.

 

이런 범주에서 보았을 때, 하드웨어에서 동작하는 모든 무형의 시스템들은 소프트웨어이고 애플리케이션은 이러한 소프트웨어의 하위 범주에 속합니다. 어떤 한 개념을 파악하려 할 때, 그 반대의 개념이 무엇인지 살펴보는 것이 도움이 될 때가 있죠. 소프트웨어의 범주 내에서 애플리케이션의 반대개념을 담당하고 있는 것은 바로 시스템 소프트웨어입니다.

 

우리가 지금까지의 CS 스터디를 통해서 살펴보았던 파일시스템, 운영체제, 하드웨어의 펌웨어, 바이오스와 같이, 하드웨어의 제어와 효율적인 운용을 위해 필요한 소프트웨어들이 바로 시스템 소프트웨어고요. 응용소프트웨어, 애플리케이션이란 이런 시스템 소프트웨어들, 특히 운영체제의 위에서 동작하는 실질적인 작업용 소프트웨어들을 가리키는 말입니다.

 

사실상 우리가 사용하는, 운영체제를 제외한 거의 모든 프로그램들이 바로 이 애플리케이션에 속하게 됩니다.

 

소프트웨어의 계층 구조

 

발제의 순서를 조금 꼬아서 여기에서 소프트웨어의 계층 구조에 대해서 알아봅시다. 원래 이는 39장의 내용으로 38장을 모두 끝내고 난 다음에 하는 것이 순서에 맞겠지만 이미 소프트웨어의 이야기가 나왔으니 보다 자세하게 알아보자는 의미에서 여기에서 짚어보고 넘어가는 것도 상관 없겠죠.

 

위에서 이야기 한 것 처럼, 컴퓨터 구조의 가장 바닥에는 물리적인 실체를 이루는 하드웨어가 있습니다. 하드웨어의 변경이나 확장은 곧 물리적인 변경이나 확장을 의미하고 이는 어떤 의미에서, 섬세하고 지루한 노동과, 많은 돈을 의미 합니다. 그리고 대개의 경우, 소프트웨어가 하드웨어 간의 강력한 결합을 가지고 개발되는 것이 아닌 이상 소프트웨어는 하드웨어의 성격과는 무관하게 독립적입니다. 이는 현대의 운영체제가 시스템을 구동하는 컴퓨터의 구체적인 하드웨어 사양과 무관하게 작동을 한다는 점에서 더 명확하게 이해가 가능합니다. intel의 CPU 와 HDD, DDR3에서 동작하는 WINDOW가  AMD의 CPU, SSD, DDR4를 사용하는 컴퓨터에서 동작안하거나 하지는 않는다는겁니다.

물론 가끔 뻑나기는 합니다만... 그럴때는 시원하게 하드웨어 제조사를 욕해줍시다.

 

커널 - 운영체제의 심장

 

하드웨어의 다음 계층은 위에서 시스템 소프트웨어로 분류되는 커널'kernel'이 있습니다. 커널은 말하자면 운영체제의 구성요소 중에서도 가장 중심이 되는 심장과도 같은 것으로, 하드웨어의 자원을 분배하고, 프로세스와 메모리를 제어하며, 프로그램이 요구하는 시스템 콜을 대리하는 역할을 합니다.(기본적으로 커널 이외의 상위 계층은 컴퓨터의 시스템 리소스에 직접 접근할 수 없습니다. 언제나 커널의 제한에 따라 리소스를 할당 받도록 되어 있습니다.)

 

라이브러리 - 프로그래머들의 레고블럭

 

커널의 위에는 라이브러리의 계층이 있습니다. 라이브러리는 프로그래밍을 공부하고 있는 우리의 입장에서 대단히 익숙하기도 하고 한편으로 아리송하기도 한 이름인데요. 정확하게 말하면 프로그래머들이 보다 더 복잡한 프로그램을 만들기 위해서 활용할 수 있는 거대한 레고블럭의 세트로 비유할 수 있겠습니다. 라이브러리는 대단히 단순하거나, 혹은 그것보다는 조금 더 복잡한 다양한 함수들과 명령어, 루틴들로 이루어져있으며 프로그래머들은 이 라이브러리를 조합하여 보다 상위계층의 소프트웨어를 만들어 내는데 도움을 받습니다.

 

각 라이브러리는 단편적인 기능을 수행하면서도, 독립된 프로그램이라는 점에서 특징을 가지고 있습니다. 라이브러리는 분류로 치자면 시스템 소프트웨어에 속할 것이지만, 몇몇 고수준의 라이브러리는 시스템 소프트웨어라고 부르기 어려울 수도 있습니다.

 

아 그리고 라이브러리에 대해서 책에는 없지만 한가지 짚고 넘어가야 할 것이 있습니다.

라이브러리를 배포하는 주체는 회사일수도 있고 잉여력 넘치는 개인일 수도 있습니다. 어떤 라이브러리는 완전히 공개된 오픈 소스의 라이브러리일수도 있지만 어떤 라이브러리는 라이선스가 있는 라이브러리일 수도 있습니다.

온갖 라이브러리 리소스를 긁어다가 만드는 우리 코린이의 입장에서 라이브러리란 모두 공짜같아 보일수 있지만 항상 그렇지만은 않다는 점 꼭 인지하셔서 나중에가서 벌금을 물거나 강제로 오픈소스 공개당하는 일이 없도록 합시다.

 

이 라이브러리의 윗 계층이 바로 애플리케이션의 영역입니다.

 

애플리케이션의 종류

 

애플리케이션에는 정말 많은 종류가 있습니다. 워드프로세서, 스프레드시트, 프리젠테이션, 데이터베이스, 그래픽 툴, 영상편집 툴과 같이 생산성을 위한 프로그램부터 미디어 플레이어, 그리고 누군가가 정말 좋아하시는 게임, 그리고 우리가 친숙해져야만 하는 IDE와 웹브라우저까지 애플리케이션에 범주 안에 속합니다. 사실상 우리가 컴퓨터에게 바라는 기능이 곧 이 애플리케이션이라고 할수 있겠죠.

 

웹 브라우저의 특이성

 

애플리케이션은 간단하게는 아주 짧은 코드로 이루어진 날짜를 찍어주는 프로그램에서부터 거대하게는 용량만 80GB가 훌쩍 넘어가는 트리플 에이급 게임까지 그 규모에 있어서도 아주 다양한데, 그 중에서도 웹 브라우저는 지속적으로 발전하는 웹 환경과 점점 늘어나는 사용자들의 요구에 부합하기 위하여, 웹 브라우저의 본연의 기능인 리퀘스트와, 리스폰스, 렌더링의 기능을 넘어서 점점 다양한 기능들을 구현하는 방향으로 비대해져가고 있습니다.

 

이미 브라우저는 현대의 웹 환경에서 수많은 비동기 처리를 지원하고 있으며, 확장프로그램을 통한 콘텐츠 지원, 업로드, 다운로드, 로컬스토리지, 캐싱 등을 위하여 파일 시스템에도 접근할 수 있어야 하며, 이렇게 처리된 모든 것들을 사람이 보고 이해할 수 있는 형식으로 출력하는 기능 역시 갖추고 있어야 하는 등, 기능적으로 운영체제와 거의 유사한 요구사항을 맞춰야 할 정도가 되었습니다.

 

어쩌면 단지 브라우저와 그 확장프로그램들 만으로 구동되는 하드웨어가 등장하게 될지도 모르죠.

어쩌면 브라우저의 기능이 현대의 OS를 밀어내는 날이 올지도 모르고요.

 

어쨌든 이런 기능들 덕분에 브라우저는 매우 복잡한 코드를 가지고 있으며 많은 보안취약점의 원인이 될 수 있으므로 사용에 주의하셔야 합니다. 

 

운영체제(시스템 소프트웨어)와 애플리케이션의 경계

 

위에서도 한번 이야기 했지만, 가끔은 시스템 소프트웨어와 애플리케이션의 경계가 모호할 때가 있습니다. 애초에 라이브러리의 위치가 모호한 점도 있고, 웹브라우저의 확장이 그렇기도 합니다만 책에서 말하길 유용한 지침이 있다고 합니다.

 

'어떤 애플리케이션이 다른 애플리케이션의 동작에 간섭하지 않도록 필요한 것은 무엇이든 운영체제의 역할의 속한다'

 

라는 표현입니다. 즉 어떤 녀석이 애플리케이션이 동작하기 위한 기반역할을 수행하고 있다면 그 녀석은 무조건 운영체제의 일부라는 표현입니다. 

 

이를 몇가지 방식으로 이해해 볼 수 있겠는데, 먼저 운영체제는 상위에 있는 애플리케이션들의 기능들이 서로 충돌하지 않도록 조절하는 역할을 한다는 점을 하나로 볼 수 있을 것이고, 다른 하나는 각각의 애플리케이션들은 다른 애플리케이션과 무관하게 완벽하게 독립적이라는 점을 생각해 볼 수 있겠습니다.

 

그런 의미에서 볼때 확실히 브라우저는 애플리케이션의 범주에 들어간다고 볼 수 있겠네요.

운영체제를 깔지 않고 오로지 브라우저를 통해서만 실행되는 하드웨어를 가져다 놓지 않는 이상에는 말이죠.