컴퓨터나 스마트폰(하드웨어)는 그 자체로 혼자할 수 있는 일이 없다. 하드웨어의 설계를 바탕으로 하이웨어에게 일을 시켜야 하는데, 이 하드웨어에게 일을 시키는 주체가 바로 운영체제이다.
대표적인 운영체제로는 Windows OS, Mac OS, LINUX OS가 있다.
이제 운영체제의 역할을 알아보자.
앞서 말했듯 컴퓨터 하드웨어는 운영체제가 없으면 빈 깡통이다. 따라서 하드웨어를 관리하기 위해서는 반드시 운영체제가 필요하다. 하드웨어를 구성하는 일을 하는 CPU, 자료를 저장하는 RAM, 디스크 등의 시스템 자원을 관리하는 주체가 바로 운영체제이다.
운영체제는 사용자와 컴퓨터 사이의 커뮤니케이션을 중재한다. 사용자가 입출력장치를 통해 명령을 내리면 운영체제가 컴퓨터 하드웨어를 관리한다.
운영체제는 컴퓨터 하드웨어 뿐만아니라 응용프로그램도 제어한다.
모든 응용 프로그램이 시스템의 자원을 마음대로 사용한다면, 해커에 의한 공격에 무방비한 상태가 된다. 따라서, 응용 프로그램은 권한에 대한 관리가 필요하다. 또한 여러 사람이 하나의 기기를 사용하는 경우에는 사용자를 관리하는 일도 매우 중요하다. 이에 운영체제는 응용 프로그램이 실행되고, 시스템 자원을 사용할 수 있도록 권한과 사용자를 관리한다.
❓응용 프로그램
응용 프로그램은 응용 소프트웨어(application software) 또는 애플리케이션(application)이라고도 한다. 운영 체제에서 실행되는 모든 소프트웨어를 뜻한다. 워드, 엑셀, 파워포인트 등 우리가 흔히 앱이라고 하는 것들이다. 응용 프로그램은 컴퓨터를 조작할 수 있는 권한을 운영체제로부터 부여받은 후, 운영체제를 통해 컴퓨터에게 일을 시킬 수 있다. 운영체제 구조는 아래 이미지를 참고하자.
응용 프로그램은 운영체제를 통해 조작 권한을 얻어야 컴퓨터에 일을 시킬 수 있다. 이렇게 응용 프로그램이 운영체제와 소통하기 위해서, 운영체제는 API(Application Programming Interface)를 제공한다. 운영체제의 API 내부는 시스템 콜(System call)로 이루어져 있다. 시스템 콜은 응용 프로그램이 시스템 자원을 사용할 수 있도록, 운영체제 차원에서 다양한 함수를 제공하는 것을 말한다.
❓시스템 콜(System call)
시스템 콜은 운영체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다. 따라서 시스템 콜은 운영체제가 제공하는 서비스를 사용자가 이용할 수 있도록 해준다. 운영체제는 크게 커널모드(Kernel Mode)와 사용자모드(User Mode)로 나누어진다. 커널 모드는 모든 시스템 자원에 접근이 가능하며, 명령할 수 있다. 반면 사용자 모드는 사용자가 접근할 수 있는 영역에 제한을 두어, 프로그램에 함부로 침범할 수 없도록 한다. 시스템 콜 호출 시 일시적으로 커널모드로 전환되며 커널 영역의 기능을 사용자가 사용 가능하도록, 즉, 프로세스가 하드웨어에 직접 접근해서 필요한 기능을 사용할 수 있게 해준다.
❓커널(kernel)
운영체제의 핵심이 되는 컴퓨터 프로그램으로, 시스템 자원의 모든 것을 완전히 통제한다. 컴퓨터의 전원을 켜면 운영체제는 동시에 수행된다. 소프트웨어가 컴퓨터 시스템에서 수행되기 위해서는 메모리에 그 프로그램이 올라가야 하는데, 모든 프로그램이 메모리에 올라가게 된다면 한정된 메모리 공간에서의 낭비가 심해질 것이다. 따라서 운영체제 중에서 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려놓는데, 이때 메모리에 상주하는 운영체제의 부분을 커널이라고 한다.
운영체제에서 실행중인 하나의 애플리케이션을 뜻한다. 사용자가 애플리케이션을 실행하면, 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행한다. 이때 실행되는 애플리케이션을 프로세스라고 부른다.
프로세스 내에서 코드가 실행되는 흐름의 단위이다. 각 스레드마다 call stack이 존재하고, 스레드는 다른 스레드와 독립적으로 동작하는 특징이 있다.
❓call stack
컴퓨터 프로그램에서 현재 실행 중인 서브루틴을 저장하는 자료 구조이다. 현재 어떤 함수가 동작하고 있는 지, 그 함수 내에서 어떤 함수가 동작하는 지, 다음에 어떤 함수가 호출되어야하는 지 등을 제어한다.
운영체제는 멀티 태스킹(두 가지 이상의 작업을 동시에 처리하는 것)을 할 수 있도록 프로세스마다 CPU 및 메모리 자원을 적절히 할당하고 병렬로 실행한다. 멀티 스레드란 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미한다. 멀티 프로세스가 애플리케이션 단위의 멀티 태스킹이라면, 멀티 스레드는 애플리케이션 내부에서의 멀티 태스킹이다.
멀티 프로세스가 아닌 멀티 스레딩으로 구현할 경우, 메모리 공간과 시스템 자원의 소모가 줄어드는 장점이 있다. 스레드 간 통신은 별도의 자원을 이용하지 않고, 전역 변수의 공간 혹은 동적으로 할당된 힙(Heap) 영역을 이용한다. 따라서 프로세스 간 통신 방법(IPC)보다 스레드 간의 통신이 훨씬 간단하다.
결과적으로 시스템의 처리량(Throughput)이 향상되고 자원 소모가 줄어들어 자연스럽게 프로그램의 응답 시간이 단축된다. 이런 장점 때문에 여러 프로세스로 할 수 있는 작업을 하나의 프로세스에서 스레드로 나눠 수행한다.
멀티 프로세스로 프로그래밍할 때에는 프로세스 간 공유하는 자원이 없어 동일한 자원에 동시에 접근하는 일이 없다. 하지만 멀티 스레딩을 기반으로 프로그래밍을 하면 다른 스레드가 동일한 데이터에 동시에 접근할 수 있고, 또 서로 사용 중인 변수나 자료구조에 접근해 엉뚱한 값을 읽거나 수정하는 일이 발생할 수 있다.
따라서 멀티스레딩 환경에서는 동기화 작업이 필요하다. 동기화를 통해 작업 처리 순서를 제어하고, 공유 자원에 대한 접근을 제어해야 한다.
💥 데드락(Deadlock, 교착상태)
두 개 이상의 프로세스가 서로의 작업이 끝나기만을 기다리고 있어 둘 다 영원히 끝나지 않는 상황을 가리킨다.💥 뮤텍스(Mutex)와 세마포어(Semaphore)
공유자원을 안전하게 관리하기 위해서 상호배제(Mutual exclusion)를 달성하는 기법이 필요하다. 뮤텍스와 세마포어는 서로 다른 방식으로 상호배제를 달성한다.
뮤텍스는 공유된 자원에 하나의 프로세스 혹은 스레스가 접근하는 것을 막아주고, 세마포어는 공유된 자원에 여러 프로세스 혹은 스레스가 접근하는 것을 막아주는 것이다. 즉, 뮤텍스는 동기화 대상이 하나, 세마포어는 동기화 대상이 하나 이상이다.
동시에 돌릴 수 있는 스레드 수는 컴퓨터에 있는 코어 개수로 제한된다. 운영체제(또는 가상 머신)는 각 스레드를 시간에 따라 분할하여, 여러 스레드가 일정 시간마다 돌아가면서 실행되도록 한다. 이런 방식을 시분할이라고 한다.
시분할에서 다른 태스크(프로세스, 스레드)가 시작할 수 있도록 이미 실행 중인 태스크(프로세스, 스레드)를 멈추는 것을 Context Switching이라고 한다.