운영체제 개념 이해
운영체제란? (Operating System)
운영체제란 컴퓨터 하드웨어 바로 윗단에 설치되는 소프트웨어를 말합니다.
- 컴퓨터 하드웨어: CPU, 메모리, 디스크, 네트워크 등 컴퓨터의 물리적인 부분
- 운영체제 역할: 컴퓨터 하드웨어를 관리하고, 응용 프로그램과 하드웨어 간의 인터페이스 역할을 합니다.
- 자원 관리: CPU, 메모리, 디스크, 네트워크 등의 자원을 관리
- 프로세스와 쓰레드 관리: 프로세스 생성, 스케줄링, 종료, 스레드 생성, 스케줄링, 종료 등
- 파일 시스템 관리: 파일 및 디렉토리 생성, 삭제, 읽기, 쓰기, 보호 등 + 케싱, 버퍼링, 저널링 등
- 메모리 관리: 메모리 할당, 해제, 보호, 주소 변환 등 + 가상 메모리, 페이지 교체, 메모리 단편화 등
- 입출력 관리: 입출력 장치와 컴퓨터 간의 데이터 전송 관리
- 보안 및 보호: 권한 체계를 설정해 특정 자원에 대한 접근을 제한하며, 유저 모드와 커널 모드로 구분해 시스템 자원을 오용하거나 침해하는 것을 방지
- 사용자 인터페이스 제공: 사용자와 컴퓨터 간의 상호작용을 위한 인터페이스 제공 + 시스템 호출, 그래픽 사용자 인터페이스(GUI) 등
위의 역할에 대한 내용들을 자세히 알아보겠습니다.
커널(Kernel)의 개념 및 구조
컴퓨터에서 프로그램이 실행되려면 메모리 상에 올라가야 합니다. 운영체제 또한 메모리 상에 올라가야하는데 모든 코드가 메모리에 올라가면 메모리가 부족해질 수 있습니다. 이를 해결하기 위해 운영체제는 커널이라는 핵심 부분만 메모리에 올려두고, 나머지 부분은 필요할 때만 메모리에 올립니다.
커널모드 vs 사용자모드
커널모드란 운영체제가 CPU의 제어권을 가지고 운영체제 코드를 실행하는 모드를 말합니다. 이때는 모든 종류의 명령을 다 실행할 수 있다. 반면 사용자모드는 응용 프로그램이 CPU의 제어권을 가지고 사용자 프로그램을 실행하는 모드를 말합니다.
모드비트가 0이면 커널모드, 1이면 사용자모드입니다. 사용자모드에서 커널모드로 전환할 때는 시스템 콜을 사용합니다.
사용자의 프로그램이 하드웨어에 자유롭게 접근한다면 보안에 문제가 생길 수 있습니다. 이를 방지하기 위해 사용자 프로그램이 하드웨어에 직접 접근하는 것을 막고, 운영체제가 대신 하드웨어에 접근하도록 합니다.
- 특권 명령: 사용자 프로그램이 하드웨어에 직접 접근하는 보안이 필요한 명령 (ex. 입출력 명령, 메모리 할당 명령)
- 일반 명령: 사용자 프로그램이 실행하는 명령
- 사용자 모드 to 커널 모드: 시스템 콜/인터럽트/예외 발생 시
- 커널 모드 to 사용자 모드: 요청된 작업이 완료되었을 때
메모리 보안과 CPU 보호
운영체제는 메모리 보안을 위해 메모리 보호를 제공합니다. 메모리 보호는 사용자 프로그램이 다른 프로그램이나 운영체제의 메모리 영역을 침범하지 못하도록 하는 것을 말합니다.
메모리 보호를 위해 Base, Limit Register를 사용합니다. Base Register는 프로그램이 메모리에 올라갈 때 시작 주소를 저장하고, Limit Register는 프로그램이 사용할 수 있는 메모리의 크기를 저장합니다. (기준 레지스터와 한계 레지스터)
- Base Register: 프로그램이 메모리에 올라갈 때 시작 주소를 저장
- Limit Register: 프로그램이 사용할 수 있는 메모리의 크기를 저장
두개를 통해 메모리 시작 주소 + 메모리 크기를 더한 값이 운영체제의 메모리 주소를 넘어가면 인터럽트를 발생시켜 프로그램을 종료시킵니다.
timer를 통한 CPU 보호는 프로그램이 무한 루프에 빠지거나, 다른 프로그램을 방해하는 경우를 방지하기 위해 사용됩니다. timer는 일정 시간이 지나면 인터럽트를 발생시켜 CPU의 제어권을 운 영체제로 넘깁니다.
인터럽트(Interrupt)와 시스템 콜(System Call)
인터럽트 는 CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외 상황이 발생하여 처리가 필요한 경우 CPU에게 알려 처리할 수 있도록 하는 것을 말합니다.
CPU는 인터럽트가 발생하면 현재 실행 중인 프로그램을 멈추고, 인터럽트 처리 루틴을 실행합니다. 인터럽트 처리 루틴이 끝나면 다시 중단된 프로그램을 실행합니다. (중단된 프로그램의 상태를 저장해두고 복구)
인터럽트는 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉩니다.
- 하드웨어 인터럽트: 하드웨어 장치에서 발생하는 인터럽트
- 소프트웨어 인터럽트: 프로그램이 CPU에서 실행 중에 발생하는 인터럽트
인터럽트 작업 처리 중 다른 인터럽트가 발생하면, 인터럽트 중첩이 발생할 수 있습니다. 이때 기본적으로 인터럽트 중첩을 허용하지 않습니다. (인터럽트 중첩을 허용하면 인터럽트 처리 루틴이 복잡해지고, 시스템의 안정성이 떨어질 수 있습니다.)
그러나 예외가 존재합니다. 새로 들어온 인터럽트가 현재 처리 중인 인터럽트보다 더 중요하다면, 현재 처리 중인 인터럽트를 중단하고 새로운 인터럽트를 처리합니다.
Interrupt Request Line (IRQ): 인터럽트가 발생했을 때 CPU에게 알리는 선으로 CPU는 IRQ를 통해 인터럽트가 발생했음을 알게 됩니다.
시스템 콜은 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널에게 요청하는 것을 말합니다. 사용자 프로그램이 직접 운영체제의 서비스를 받을 수 없기 때문에, 시스템 콜을 통해 운영체제에게 요청합니다. (ex. 파일 읽기, 쓰기, 프로세스 생성, 종료 등)
메모리의 계층 구조
메모리는 계층 구조로 이루어져 있습니다. 레지스터, 캐시, 메인 메모리, 보조기억장치로 나뉩니다.
속도가 빠를 수록 비싸고, 이 때문에 속도가 빠른 것에는 적은 양의 데이터를 저장하고, 속도가 느린 것에는 많은 양의 데이터를 저장합니다.
- 레지스터(Register): CPU 내부에 있는 메모리로, 가장 빠르고 소량입니다.
- 캐시(Cache): 메인 메모리와 CPU 사이에 위치하며, 메인 메모리의 일부를 저장합니다. 레지스터보다 느리지만 메인 메모리보다 빠릅니다.
- 메인 메모리(Main Memory): 프로그램이 실행되는 메모리로, 캐시보다 느리지만 용량이 큽니다.
- 보조기억장치(Secondary Storage): 하드디스크, SSD 등의 저장 장치로, 메인 메모리보다 느리지만 용량이 큽니다.
메모리의 계층 구조를 통해 레지스터와 캐시에는 자주 사용되는 데이터를 저장하고, 메인 메모리와 보조기억장치에는 자주 사용되지 않는 데이터를 저장하여 메모리의 속도와 용량을 효율적으로 사용할 수 있습니다.