컴퓨터는 CPU, 메모리, 입출력장치, 저장장치 등 하드웨어 장치를 이용하여 명령을 수행하는 기계이다.
여러 프로그램이 이러한 컴퓨터 자원을 공유하게 되는데, 자원은 한정적이기 때문에 경쟁이 발생한다.
이런 경쟁 상태를 조율하고 자원을 효율적으로 사용할 수 있게 관리해주는 소프트웨어가 운영체제이다.
이외에도 컴퓨터 자원을 사용할 수 있는 인터페이스를 제공해주고, 안정적으로 사용할 수 있도록 관리해준다.
운영체제의 구조는 각 운영체제마다 다르지만, 공통적으로 제공하는 서비스는 존재한다.
사용자 인터페이스
사용자가 응용프로그램이나 운영체제가 제공하는 기능들을 사용할 수 있도록 인터페이스를 제공한다.
프로그램 수행
실행하는 프로그램을 메모리에 적재하고 실행한다. 동시에 여러가지 프로그램을 실행하기 위해서는 더 복잡한 작업이 요구되는데, 이를 처리해주는 기능을 한다.
입출력 연산
실행 중인 프로그램이 입출력 장치의 사용을 요구할 때 이를 통제한다.
파일 시스템 조작
파일을 생성하고 삭제하거나 수정하는 기능을 제공한다. 파일에 대한 권한을 설정할 수도 있다.
통신
프로세스간의 정보 교환 기능을 제공한다. 같은 컴퓨터 내에서 수행되는 프로세스간 통신인 IPC (Inter Process Comunication)과 외부 컴퓨터에 존재하는 프로세스와 통신하는 네트워크 통신에 대한 기능을 제공한다.
오류 탐지
하드웨어 장치, 입출력 장치나 프로그램에 오류가 발생하는 경우 원인을 파악하고 조치를 취하거나 사용자에게 원인을 알려준다.
자원 할당
여러개의 프로세스가 동시에 실행될때, 각 프로세스는 하드웨어 자원을 사용하려고 한다. 이 때 여러 프로세스가 하나의 자원을 사용하는 경우가 발생하는데, 자원을 효율적으로 사용할 수 있게 할당해주는 작업을 운영체제가 수행한다.
기록 작성(logging)
보호, 보안
커널은 운영체제의 핵심 소프트웨어이다. Application 관점에서는 시스템 콜의 집합, I/O장치 관점에서는 인터럽트 처리기의 집합이다.
또 컴퓨터를 실행할 때 커널을 메모리에 적재해야 하는데, 이런 부팅 작업(bootstrap) 기능도 커널에서 제공한다.
응용 프로그램은 운영체제가 제공하는 시스템 콜을 통해 운영체제가 제공하는 서비스를 이용하기도 한다.
특정 작업을 수행하기 위해서 복잡하고 많은 시스템 콜이 필요한 경우가 있다. 이러한 시스템콜을 일일히 코드에 작성하는 것은 번거롭고 복잡하다. 때문에 보통 언어에서 제공하는 라이브러리 함수를 이용하여 시스템콜을 간접적으로 호출한다.
예를 들어, 프로그램에서 read()
함수를 호출하면 실제 함수 내에서는 작업에 필요한 시스템 콜을 호출한다.
그리고 시스템콜에 맞는 작업이 커널 내부에서 수행된다.
시스템 콜의 종류는 다음과 같다.
I/O장치 입장에서 커널은 인터럽트 처리기의 집합이다. 커널은 장치 구동기에 접근하고, 장치 구동기(Device driver) 가 장치 제어기(Device controller)를 제어하여 장치를 제어한다.
총 세 종류의 인터페이스가 존재한다.
입출력 시스템의 하드웨어 인터페이스는 장치 경영 방식에 따라 분류할 수 있다.
인터럽트 발생 시 기존 수행되던 ISR(Interrupt Service Routin)이 있으면, 우선순위를 판단하여 실행될 인터럽트 서비스 루틴을 결정한다.
이 과정에서 인터럽트 마스크를 활용한다.
마스크에는 자신보다 높은 인터럽트를 1
로 표시
AND연산 후 true가 나오면 새로 들어온 인터럽트를 처리한다.
응용 프로그램이 운영체제마다 다른 이유
각 운영체제는 서로 다른 시스템콜을 제공한다. 기본적인 매커니즘이 비슷하다 하더라도 다른 부분들이 분명히 존재하고, 이러한 차이때문에 하나의 응용프로그램이 서로 다른 운영체제에서 작동하기 어렵다.
프로그램을 실행하는 하나의 흐름을 프로세스라고 한다.
동시에 여러 프로그램을 실행할 수 있도록 운영체제는 여러 프로세스를 동시에 메모리에 유지한다.
각 프로세스는 프로세스 생명주기에 따라 실행, 대기, 준비, 종료 상태를 거친다.
다중 태스킹은 다중 프로그래밍의 논리적 확장으로, 여러 프로세스를 전환하며 CPU를 효율적으로 사용하고 사용자가 동시에 여러 프로그램을 사용할 수 있도록 하는 것이다.
이를 위해 CPU스케줄링을 한다.
여러 프로세스가 자원을 공유하는 상황에서 한 프로세스가 다른 프로세스의 실행에 영향을 주거나, 오류를 야기할 수 있다.
예를 들어, 한 프로세스가 다른 프로세스가 참조하는 메모리 주소에 접근하여 데이터를 조작하면 정상적으로 동작할 수 없다.
이러한 문제를 방지하고자운영체제는 이중모드를 지원한다.
운영체제는 사용자 프로그램의 잘못된 작동이 다른 프로그램에 영향을 미치는 것을 막아야한다. 따라서 시스템 자체에 접근하는 것은 시스템 콜을 통해서만 가능하도록 하여 이를 보장한다.
운영체제는 사용자 모드와 커널 모드를 구성한다. 사용자 모드에서 시스템 콜을 호출하여 커널모드로 접속한 후 해당 기능을 실행한다. 이 과정에서 잘못된 접근을 방지할 수 있다.