운영체제 서비스
운영체제 서비스는 사용자와 프로그램이 컴퓨터 시스템을
더 쉽고 효율적으로 사용할 수 있도록 운영체제가 제공하는 기능.
운영체제는 사용자 프로그램과 하드웨어 사이에 위치하며,
운영체제마다 제공하는 서비스는 다르지만
프로그램 실행에 필요한 여러 기능을 공통적으로 제공.
운영체제 서비스는 크게 사용자에게 편의를 제공하는 기능과
시스템 자체의 효율적 운영을 위한 기능으로 구분.
사용자에게 편의를 제공하는 서비스는
사용자 인터페이스, 프로그램 수행, 입출력 연산, 파일 시스템 조작, 통신, 오류 탐지.
시스템의 효율적 운영을 위한 서비스는 자원 할당, 기록 관리, 보호와 보안이 있음.
사용자 인터페이스
사용자 인터페이스는 사용자가 운영체제와 상호작용할 수 있도록 제공되는 접점.
사용자는 운영체제 내부 구조를 직접 다루지 않고 사용자 인터페이스를 통해 명령을 입력하거나 프로그램을 실행.
사용자 인터페이스의 대표적인 형태는
명령어 라인 인터페이스(CLI), 그래픽 사용자 인터페이스(GUI), 터치스크린 인터페이스.
명령어 라인 인터페이스는 사용자가 명령어를 직접 입력하는 방식.
그래픽 사용자 인터페이스는 창, 아이콘, 메뉴, 포인터 등을 이용하는 방식.
터치스크린 인터페이스는 스마트폰이나 태블릿처럼 손가락 터치와 제스처를 이용하는 방식.
프로그램 수행
프로그램 수행은 사용자가 실행하려는 프로그램을 메모리에 적재하고 CPU에서 실행되도록 하는 운영체제 서비스.
운영체제는 프로그램을 실행할 수 있어야 하며,
실행 중인 프로그램을 정상적으로 종료하거나 오류 발생 시 비정상 종료(오류표시와 함께) 할 수 있어야 하는 기능 제공.
프로그램은 디스크에 저장된 파일 상태만으로는 실행 불가능.
실행을 위해서는 메모리에 적재되어야 하고, CPU가 명령어를 처리할 수 있는 상태가 되어야 함.
이 과정에서 운영체제는 프로그램 적재, 실행 시작, 종료 처리, 오류 처리 등을 담당.
입출력 연산
입출력 연산은 실행 중인 프로그램이 파일이나 입출력 장치와 데이터를 주고받을 수 있도록 운영체제가 제공하는 기능.
프로그램은 실행 중에 파일을 읽거나 쓰고, 키보드 입력을 받거나, 화면에 출력하거나, 네트워크 장치와 통신할 필요존재.
사용자 프로그램은 입출력 장치를 직접 제어하지 않고 운영체제를 통해 입출력 요청을 수행.
이유는 입출력 장치 제어가 복잡하고, 여러 프로그램이 동시에 장치를 사용할 경우 충돌이 발생할 수 있기 때문.
운영체제는 장치별 세부 제어 방식을 감추고 일관된 입출력 기능을 제공.
파일 시스템 조작
파일 시스템 조작은 프로그램이 파일과 디렉터리를 생성, 삭제, 읽기, 쓰기, 검색할 수 있도록 하는 운영체제 서비스.
파일은 보조기억장치에 저장되는 데이터 단위이며, 디렉터리는 파일을 체계적으로 관리하기 위한 구조.
운영체제는
파일 생성, 파일 삭제, 파일 열기, 파일 닫기, 파일 읽기, 파일 쓰기, 파일 위치 이동, 파일 속성 확인과 변경을 지원.
또한 파일 소유자, 접근 권한, 생성 시간, 수정 시간 등의 정보 관리 기능 제공.
파일 시스템 조작이 중요한 이유는 대부분의 프로그램이 데이터를 파일 형태로 저장하거나 읽기 때문.
운영체제는 사용자가 저장 장치의 물리적 위치를 직접 알지 않아도
파일 이름과 경로를 통해 데이터를 사용할 수 있도록 지원.
통신
통신은 프로세스 사이에서 정보를 교환할 수 있도록 운영체제가 제공하는 서비스.
통신은 같은 컴퓨터 안에서 실행되는 프로세스 사이에서도 필요하고,
네트워크로 연결된 서로 다른 컴퓨터의 프로세스 사이에서도 필요.
프로세스 간 통신 방식은 크게 공유 메모리 방식과 메시지 전달 방식으로 구분.
공유 메모리 방식은 여러 프로세스가 공통 메모리 영역을 함께 사용하는 방식.
메시지 전달 방식은 운영체제가 제공하는 통신 기능을 통해 메시지를 주고받는 방식.
통신 서비스는 파일 전송, 웹 요청, 원격 접속, 프로세스 간 데이터 교환 등 다양한 기능의 기반.
분산 시스템이나 네트워크 기반 응용 프로그램에서 특히 중요한 운영체제 기능.
오류 탐지
오류 탐지는 시스템에서 발생할 수 있는 여러 오류를 운영체제가 감지하고 적절히 처리하는 기능.
오류는 CPU, 메모리, 입출력 장치, 저장 장치, 사용자 프로그램, 네트워크 등 다양한 위치에서 발생 가능.
예를 들어
메모리 접근 오류, 디스크 읽기 오류, 장치 오류,
프로그램의 잘못된 명령 실행, 네트워크 연결 실패 등이 오류에 해당.
운영체제는 오류를 감지한 뒤 오류 메시지를 출력하거나,
프로그램을 종료하거나, 시스템을 복구하는 조치를 수행.
오류 탐지가 중요한 이유는 하나의 오류가 전체 시스템의 안정성을 해칠 수 있기 때문.
운영체제는 오류 발생 상황에서도 가능한 한 시스템이 계속 동작하도록 관리하는 역할.
자원 할당
자원 할당은 여러 사용자나 여러 프로그램이 동시에 실행될 때
CPU, 메모리, 파일, 저장 장치, 입출력 장치 등을 적절히 분배하는 기능.
컴퓨터 시스템의 자원은 한정되어 있기 때문에 운영체제가 자원을 관리하지 않으면 충돌이나 비효율 발생 가능.
CPU 스케줄링은 여러 프로세스 중 어떤 프로세스에게 CPU를 줄지 결정하는 작업.
메모리 관리는 각 프로세스에게 필요한 메모리 공간을 할당하고 회수하는 작업.
입출력 장치 관리는 여러 프로그램이 같은 장치를 사용할 때 순서를 조정하는 작업.
자원 할당은 다중 사용자 시스템과 다중 작업 시스템에서 특히 중요한 기능.
운영체제는 공정성과 효율성을 고려하여 자원 배분 수행.
기록 관리
기록 관리는 사용자가 어떤 자원을 얼마나 사용했는지 추적하는 운영체제 기능.
CPU 사용 시간, 메모리 사용량, 파일 사용량, 입출력 횟수, 로그인 정보 등이 기록 대상.
기록 관리는 시스템 사용 통계, 성능 분석, 문제 추적, 과금, 보안 감사 등에 활용.
관리자는 기록 정보를 통해 시스템 자원이 어떻게 사용되는지 확인 가능.
보호와 보안
보호는 시스템 내부 자원에 대한 접근을 제어하는 기능.
여러 사용자가 동시에 시스템을 사용하는 경우,
한 사용자의 프로그램이 다른 사용자의 파일이나 메모리 영역에 함부로 접근하지 못하도록 제한하는 기능.
보안은 외부 또는 내부의 부적절한 접근으로부터 시스템을 지키는 기능.
사용자 인증, 비밀번호, 접근 권한, 네트워크 보안, 데이터 보호 등이 보안 기능에 포함.
보호와 보안의 차이는 보호가 주로 시스템 내부 자원 접근 통제에 초점을 두는 개념이고, 보안은 외부 공격과 인증되지 않은 접근까지 포함하는 더 넓은 개념이라는 점.
운영체제는 보호와 보안을 통해 시스템의 안정성과 신뢰성을 유지.
사용자와 운영체제 인터페이스
사용자와 운영체제 인터페이스는 사용자가 운영체제의 기능을 사용할 수 있게 해주는 방식.
운영체제 내부 기능은 복잡하기 때문에 사용자는 직접 커널을 조작하지 않고 인터페이스를 통해 필요한 작업 수행.
대표적인 사용자 인터페이스는 명령 인터프리터, 그래픽 사용자 인터페이스, 터치스크린 인터페이스.
시스템에 따라 하나의 인터페이스만 제공되기도 하고 여러 인터페이스가 함께 제공되기도 함.
명령 인터프리터
명령 인터프리터는 사용자가 입력한 명령어를 읽고 해석하여 실행하는 프로그램
.
셸이 명령 인터프리터 역할 수행.
사용자는 터미널에 명령어를 입력하고, 명령 인터프리터는 해당 명령이 무엇을 의미하는지 해석.
그 후 명령을 직접 실행하거나, 명령에 해당하는 프로그램을 찾아 실행.
명령 인터프리터가 명령을 처리하는 방식은 두 가지.
1. 명령 인터프리터 자체에 명령 실행 코드가 포함된 방식.
2. 명령 이름을 가진 파일을 찾아 메모리에 적재하고 실행하는 방식.
두 번째 방식의 장점은 새로운 명령을 추가할 때 명령 인터프리터를 수정할 필요가 적다는 점.
새로운 실행 파일을 만들고 적절한 위치에 저장하면 명령어처럼 사용 가능.
명령어 라인 인터페이스는 어렵지만 반복 작업 자동화와 시스템 관리에 강점.
셸 스크립트를 이용하면 여러 명령을 하나의 파일에 저장해 반복적으로 실행 가능.
그래픽 사용자 인터페이스
그래픽 사용자 인터페이스는 사용자가 마우스, 키보드, 아이콘, 창, 메뉴 등을 이용해 운영체제와 상호작용하는 방식.
명령어를 직접 외우지 않아도 시각적 요소를 통해 프로그램 실행, 파일 이동, 설정 변경 등이 가능.
그래픽 사용자 인터페이스는 데스크톱 환경에서 널리 사용.
사용자는 아이콘을 클릭해 프로그램을 실행하고, 창을 이동하거나 크기를 변경하고, 메뉴를 선택하여 명령 수행.
초기의 그래픽 사용자 인터페이스는 Xerox PARC 연구소에서 발전.
이후 Apple Macintosh를 통해 대중화.
Microsoft Windows도 그래픽 사용자 인터페이스를 제공하며 널리 사용.
UNIX 계열 시스템에서도 그래픽 사용자 인터페이스 제공.
CDE, KDE, GNOME 같은 데스크톱 환경이 대표적인 예.
Linux에서는 오픈소스 기반의 다양한 그래픽 환경 사용 가능.
그래픽 사용자 인터페이스의 장점은 사용 편의성.
단점은 명령어 라인 인터페이스에 비해 반복 작업 자동화나 세밀한 시스템 제어가 불편할 수 있다는 점.
터치스크린 인터페이스
터치스크린 인터페이스는 스마트폰과 태블릿 같은 모바일 장치에서 많이 사용되는 방식.
사용자는 손가락으로 화면을 터치하거나 스와이프하고, 확대와 축소 같은 제스처를 사용.
터치스크린 인터페이스는 물리적 키보드나 마우스가 없는 환경에서 적합.
작은 화면에서도 직관적인 조작이 가능하다는 장점.
스마트폰 운영체제는 터치 기반 조작을 중심으로 설계.
앱 실행, 화면 전환, 알림 확인, 키보드 입력 등이 모두 터치와 제스처 중심으로 구성.
인터페이스 선택
사용자는 상황에 따라 서로 다른 인터페이스 사용.
일반 사용자는 GUI를 많이 사용.
시스템 관리자나 개발자는 명령어 라인 인터페이스를 자주 사용.
명령어 라인 인터페이스는 강력한 제어와 자동화에 유리.
그래픽 사용자 인터페이스는 직관적 조작에 유리.
터치스크린 인터페이스는 모바일 환경에 유리.
현대 운영체제는 여러 인터페이스를 함께 제공하는 경우가 많음.
사용자는 작업 목적과 환경에 따라 적절한 인터페이스 선택 가능.
시스템 콜
시스템 콜은 사용자 프로그램이 운영체제 커널에게 서비스를 요청하는 방법.
응용 프로그램은 하드웨어나 커널 내부 기능에 직접 접근하지 않고 시스템 콜을 통해 운영체제 기능 사용.
시스템 콜은 사용자 프로그램과 운영체제 사이의 프로그래밍 인터페이스.
파일 열기, 파일 읽기, 프로세스 생성, 메모리 할당, 장치 사용, 통신 연결 등은 시스템 콜을 통해 수행.
시스템 콜은 보통 직접 호출하기보다 API를 통해 간접적으로 사용.
개발자는 API 함수를 호출하고, API 내부에서 필요한 시스템 콜 호출.
이 방식은 시스템 콜의 복잡한 세부 사항을 개발자로부터 감추는 역할.
시스템 콜 사용 예시
파일 복사 프로그램을 예로 들면 시스템 콜이 여러 번 사용.
1. 먼저 입력 파일 이름과 출력 파일 이름을 받아야 하는 과정 필요.
2. 입력 파일을 열기 위한 시스템 콜 필요.
3. 출력 파일을 생성하기 위한 시스템 콜 필요.
4. 입력 파일에서 데이터를 읽기 위한 시스템 콜 필요.
5. 출력 파일에 데이터를 쓰기 위한 시스템 콜 필요.
6. 파일 끝에 도달하면 파일을 닫고 프로그램을 종료하는 시스템 콜 필요.
파일이 존재하지 않거나, 출력 파일 이름이 이미 존재하거나, 디스크 공간이 부족하거나, 권한이 없으면 오류 처리 필요.
이러한 오류 상황도 운영체제의 시스템 콜 결과를 통해 확인.
간단해 보이는 파일 복사 작업도 실제로는 많은 운영체제 서비스와 시스템 콜의 조합으로 수행되는 작업.
API
API는 응용 프로그램 개발자가 운영체제 기능을 쉽게 사용할 수 있도록 제공되는 함수 집합.
대표적인 API는 Windows API, POSIX API, Java API.
Windows API는 Windows 운영체제에서 제공하는 프로그래밍 인터페이스.
POSIX API는 UNIX, Linux, macOS 계열 시스템에서 표준화된 방식으로 제공되는 인터페이스.
Java API는 Java 프로그램이 사용할 수 있는 표준 라이브러리 인터페이스.
개발자가 API를 사용하는 이유는 편리성과 이식성.
시스템 콜 번호나 레지스터 사용 방식, 커널 내부 구현 방식을 직접 알 필요 없이
API 함수 호출만으로 운영체제 기능 사용 가능.
예를 들어 C 언어의 printf 함수는 화면 출력 기능을 제공하지만,
내부적으로는 운영체제의 출력 관련 시스템 콜을 사용할 수 있는 구조.
개발자는 printf만 사용하면 되고, 실제 출력 장치 제어는 운영체제가 담당.
시스템 콜 인터페이스
시스템 콜 인터페이스는 API와 운영체제 커널 사이에서 시스템 콜 요청을 처리하는 계층.
각 시스템 콜에는 번호가 부여되어 있고, 시스템 콜 인터페이스는 이 번호를 이용해 적절한 커널 서비스 호출.
사용자 프로그램은 시스템 콜을 직접 자세히 알 필요가 적음.
API가 시스템 콜 인터페이스를 통해 커널에 요청을 전달하고, 결과를 다시 사용자 프로그램에 반환.
시스템 콜이 호출되면 일반적으로 사용자 모드에서 커널 모드로 전환.
사용자 모드는 일반 프로그램이 실행되는 제한된 권한의 실행 모드.
커널 모드는 운영체제 커널이 실행되는 높은 권한의 실행 모드.
이 모드 전환이 필요한 이유는 중요한 하드웨어와 시스템 자원을 보호하기 위한 것.
사용자 프로그램이 마음대로 하드웨어를 제어하면 시스템 전체가 불안정해질 수 있기 때문에 운영체제가 중간에서 통제.
시스템 콜 매개변수 전달
시스템 콜을 사용할 때는 운영체제에게 필요한 정보를 전달해야 함.
예를 들어 파일을 열려면 파일 이름과 접근 방식이 필요.
데이터를 쓰려면 쓰려는 데이터의 위치와 크기가 필요.
매개변수 전달 방식은 세 가지.
1. 레지스터를 통한 전달.
2. 메모리 블록이나 테이블을 통한 전달.
3. 스택을 통한 전달.
레지스터 전달은 간단하고 빠르지만 전달할 수 있는 정보의 개수가 제한.
메모리 블록 전달은 전달할 정보가 많을 때 유리.
스택 전달은 매개변수를 스택에 쌓고 운영체제가 이를 꺼내 사용하는 방식.
시스템 콜의 종류
시스템 콜은 기능에 따라 프로세스 제어, 파일 관리, 장치 관리, 정보 유지 관리, 통신, 보호로 구분.
프로세스 제어
프로세스 제어는 실행 중인 프로그램인 프로세스를 생성, 실행, 종료, 대기, 제어하는 기능.
프로그램 실행과 종료는 운영체제의 핵심 기능 중 하나.
프로세스 제어 시스템 콜에는
비정상 종료, 프로그램 실행, 프로세스 생성,
프로세스 종료, 프로세스 속성 획득과 설정, 시간 대기, 이벤트 대기, 이벤트 신호, 메모리 할당과 해제가 포함.
프로세스는 실행 중에 다른 프로세스를 생성할 수 있음.
생성한 프로세스는 부모 프로세스.
생성된 프로세스는 자식 프로세스.
UNIX 계열 시스템에서는 fork 시스템 콜로 새 프로세스 생성.
exec 시스템 콜로 새 프로그램 실행.
부모 프로세스는 wait 시스템 콜을 통해 자식 프로세스 종료 대기 가능.
Windows에서는 CreateProcess와 같은 API를 통해 새 프로세스 생성.
운영체제마다 프로세스 생성 방식과 API 이름은 다르지만, 기본 목적은 프로그램 실행과 프로세스 관리.
프로세스가 오류로 종료되면 메모리 상태가 덤프 파일로 저장될 수 있음.
이 덤프 파일은 디버거가 오류 원인을 분석하는 데 사용.
파일 관리
파일 관리는 파일을 생성, 삭제, 열기, 닫기, 읽기, 쓰기, 위치 이동하는 기능.
또한 파일 속성을 확인하거나 변경하는 기능 포함.
파일 관리 시스템 콜은 대부분의 응용 프로그램에서 자주 사용.
문서 편집기, 컴파일러, 웹 브라우저, 데이터베이스 등은 모두 파일을 읽거나 쓰는 기능 필요.
파일 속성에는 파일 이름, 파일 크기, 파일 위치, 접근 권한, 생성 시간, 수정 시간 등이 포함.
운영체제는 파일 자체뿐 아니라 파일과 관련된 메타데이터도 함께 관리.
장치 관리
장치 관리는 입출력 장치를 요청하고 해제하며, 장치에서 데이터를 읽거나 장치에 데이터를 쓰는 기능.
디스크, 프린터, 키보드, 마우스, 네트워크 카드 같은 장치가 관리 대상.
프로그램은 특정 장치를 사용하기 전에 운영체제에 장치 사용 요청.
사용이 끝나면 장치 해제.
운영체제는 여러 프로그램이 같은 장치를 동시에 사용하려 할 때 충돌을 방지.
일부 장치는 파일처럼 취급 가능.
UNIX와 Linux에서는 장치를 파일 형태로 표현하는 방식 사용.
이 방식은 파일 입출력과 장치 입출력을 비슷한 인터페이스로 처리할 수 있게 하는 특징.
정보 유지 관리
정보 유지 관리는 시스템과 프로세스에 대한 여러 정보를 얻거나 설정하는 기능.
시간과 날짜 확인, 시스템 정보 확인, 프로세스 정보 확인, 파일 속성 확인 등이 포함.
운영체제는 현재 시스템 상태를 여러 형태로 유지.
사용자는 시스템 콜이나 시스템 프로그램을 통해 이러한 정보 확인 가능.
예를 들어
현재 시간 확인, 시스템 버전 확인, 사용 중인 메모리 확인,
프로세스 ID 확인, 파일 권한 확인 등이 정보 유지 관리에 해당.
통신
통신 시스템 콜은 프로세스 사이의 데이터 교환을 지원.
통신 연결 생성과 삭제, 메시지 송신과 수신, 상태 정보 전달 등이 포함.
통신 방식은 메시지 전달 방식과 공유 메모리 방식으로 구분.
메시지 전달 방식은 프로세스들이 운영체제를 통해 메시지를 주고받는 방식.
공유 메모리 방식은 여러 프로세스가 같은 메모리 영역을 공유하고 직접 데이터를 주고받는 방식.
메시지 전달 방식은 구현이 비교적 단순하고 충돌 관리가 쉬움.
공유 메모리 방식은 빠른 데이터 교환이 가능하지만 동기화 문제가 중요.
보호
보호 시스템 콜은 시스템 자원에 대한 접근 권한을 제어하는 기능.
파일, 장치, 메모리, 프로세스 등에 대해 사용자가 어떤 작업을 할 수 있는지 결정.
보호 기능에는 접근 권한 확인, 권한 설정, 권한 제거, 사용자 접근 허용과 거부 등이 포함.
운영체제는 보호 기능을 통해 사용자의 실수나 악의적 접근으로부터 시스템 자원 보호.
시스템 서비스
시스템 서비스는 사용자가 운영체제 기능을 더 편리하게 사용할 수 있도록 제공되는 프로그램.
시스템 유틸리티라고도 하며, 운영체제 위에서 실행되는 보조 프로그램 성격.
시스템 서비스는 시스템 콜보다 사용자에게 더 가까운 형태.
사용자는 시스템 콜을 직접 호출하지 않고 시스템 서비스를 통해 파일 관리, 프로그램 실행, 상태 확인, 통신 등을 수행.
파일 관리 서비스
파일 관리 서비스는 파일과 디렉터리를 생성, 삭제, 복사, 이름 변경, 출력, 목록 확인할 수 있도록 제공되는 프로그램.
사용자는 명령어 또는 그래픽 환경을 통해 파일 관리 작업 수행.
예를 들어 파일 복사, 파일 삭제, 디렉터리 생성, 파일 목록 보기 등이 파일 관리 서비스에 해당.
상태 정보 서비스
상태 정보 서비스는 시스템의 현재 상태를 사용자에게 알려주는 기능.
날짜, 시간, 사용 가능한 메모리, 디스크 공간, 사용자 수, 프로세스 상태, 시스템 성능 정보 등이 제공 대상.
일부 상태 정보 서비스는 단순히 정보를 화면에 출력.
일부는 정보를 파일에 저장하거나, 시스템 관리 도구에서 활용할 수 있도록 제공.
파일 수정 서비스
파일 수정 서비스는 파일 내용을 만들거나 변경할 수 있는 기능.
텍스트 편집기, 문서 편집 도구, 파일 내용 변환 도구 등이 해당.
프로그래머는 소스 코드를 작성하고 수정하기 위해 파일 수정 서비스 사용.
일반 사용자는 문서나 설정 파일을 수정하기 위해 사용.
프로그래밍 언어 지원 서비스
프로그래밍 언어 지원 서비스는 프로그램 개발에 필요한 도구 제공.
컴파일러, 어셈블러, 디버거, 인터프리터 등이 포함.
컴파일러는 고급 언어로 작성된 소스 코드를 기계어에 가까운 코드로 변환.
어셈블러는 어셈블리어를 기계어로 변환.
디버거는 프로그램 오류를 찾고 분석하는 도구.
인터프리터는 프로그램을 한 줄씩 해석하며 실행하는 도구.
프로그램 적재와 실행 서비스
프로그램 적재와 실행 서비스는 프로그램을 메모리에 올리고 실행을 시작하는 기능.
사용자가 프로그램 실행 명령을 내리면 운영체제는 해당 실행 파일을 찾아 메모리에 적재하고 실행 환경 구성.
프로그램 실행에는 명령어 해석, 메모리 배치, 라이브러리 연결, 입출력 연결 등이 필요.
이 과정을 운영체제와 관련 시스템 서비스가 처리.
통신 서비스
통신 서비스는 사용자와 프로세스가 서로 메시지를 주고받거나 네트워크를 통해 데이터를 교환할 수 있도록 지원.
전자우편, 원격 로그인, 파일 전송, 네트워크 연결 등이 통신 서비스에 해당.
통신 서비스는 로컬 시스템 내부뿐 아니라 네트워크로 연결된 원격 시스템과의 상호작용에도 필요.
백그라운드 서비스
백그라운드 서비스는 사용자가 직접 실행하지 않아도 시스템 시작 시 자동으로 실행되어 계속 동작하는 서비스.
UNIX 계열에서는 데몬이라고 부르는 경우가 많음.
Windows에서는 서비스라는 용어 사용.
백그라운드 서비스는 네트워크 관리, 프린터 관리, 로그 기록, 스케줄 작업, 보안 감시 등 다양한 작업 수행.
사용자는 직접 보지 못해도 시스템 내부에서는 많은 서비스가 계속 실행 중.
링커와 로더
프로그램은 소스 코드를 작성했다고 바로 실행되는 것이 아님.
소스 코드는 컴파일, 링크, 적재 과정을 거쳐 실행 가능한 형태가 됨.
일반적인 프로그램 실행 준비 과정은
소스 파일 작성, 컴파일, 오브젝트 파일 생성, 링크, 실행 파일 생성, 로더에 의한 메모리 적재, 실행 순서로 구성.
컴파일러
컴파일러는 고급 언어로 작성된 소스 코드를 오브젝트 코드로 변환하는 프로그램.
예를 들어 C 언어로 작성된 main.c 파일은 컴파일 과정을 통해 main.o 같은 오브젝트 파일로 변환 가능.
오브젝트 파일은 아직 완전한 실행 파일이 아님.
다른 오브젝트 파일이나 라이브러리와 연결되어야 최종 실행 파일이 될 수 있음.
링커
링커는 여러 오브젝트 파일과 라이브러리를 하나로 연결하여 실행 파일을 만드는 프로그램.
프로그램이 여러 소스 파일로 나누어져 있거나 외부 라이브러리를 사용할 경우 링커 필요.
예를 들어 main 함수가 있는 파일에서 다른 파일의 함수를 호출하면, 링커가 그 함수의 실제 위치를 연결.
표준 라이브러리 함수도 링커를 통해 실행 파일에 연결.
링커는 심볼 해석과 재배치 작업 수행.
심볼 해석은 함수나 변수 이름이 실제 어디에 있는지 찾는 작업.
재배치는 프로그램이 메모리에 올라갈 때 사용할 주소를 조정하는 작업.
로더
로더는 실행 파일을 메모리에 적재하고 실행할 수 있도록 준비하는 프로그램.
실행 파일은 디스크에 저장되어 있기 때문에 CPU가 바로 실행할 수 없음.
로더가 실행 파일을 메모리에 올리고, 필요한 주소와 라이브러리 연결을 준비.
로더는 프로그램 코드와 데이터를 메모리에 배치.
프로그램 시작 주소로 제어를 넘겨 실행 시작.
동적 연결 라이브러리
동적 연결 라이브러리는 프로그램 실행 중에 필요한 라이브러리를 연결하는 방식.
Windows의 DLL, UNIX/Linux의 공유 라이브러리가 대표적.
동적 연결의 장점은 메모리와 디스크 공간 절약.
여러 프로그램이 같은 라이브러리를 사용할 경우, 라이브러리를 중복해서 포함하지 않고 공유 가능.
동적 연결은 프로그램 실행 중 필요한 시점에 라이브러리를 연결할 수 있다는 특징.
다만 실행 시 필요한 라이브러리가 없으면 프로그램 실행 실패 가능.
실행 파일 형식
운영체제마다 실행 파일 형식이 다름.
UNIX와 Linux에서는 ELF 형식 사용.
Windows에서는 PE 형식 사용.
macOS에서는 Mach-O 형식 사용.
실행 파일 형식에는 프로그램 코드, 데이터, 심볼 정보, 라이브러리 정보, 실행 시작 위치 등이 포함.
운영체제의 로더는 이 형식을 이해하고 실행 파일을 메모리에 적재.
응용 프로그램이 운영체제마다 다른 이유
응용 프로그램은 보통 특정 운영체제에서 실행되도록 작성되고 컴파일.
Windows용 프로그램이 Linux에서 바로 실행되지 않고, Linux용 프로그램이 macOS에서 바로 실행되지 않는 이유는
운영체제마다 제공하는 API, 시스템 콜, 실행 파일 형식, 라이브러리 구조가 다르기 때문.
운영체제 의존성
응용 프로그램은 운영체제의 API를 사용.
운영체제마다 API가 다르면 같은 소스 코드라도 그대로 실행되지 않을 수 있음.
또한 운영체제마다 시스템 콜 번호와 호출 방식이 다름.
실행 파일 형식도 다름.
프로그램이 사용하는 라이브러리도 다름.
따라서 하나의 운영체제에서 컴파일된 실행 파일은 다른 운영체제에서 그대로 실행되기 어려운 구조.
CPU 구조와 ABI
응용 프로그램은 운영체제뿐 아니라 CPU 구조에도 영향을 받음.
CPU마다 명령어 집합이 다를 수 있기 때문.
ABI는 응용 프로그램 이진 인터페이스.
컴파일된 프로그램이 운영체제와 하드웨어에서 어떻게 실행될지 정하는 규칙.
함수 호출 방식, 레지스터 사용 방식, 시스템 콜 호출 방식, 데이터 타입 크기, 실행 파일 형식 등이 ABI에 포함.
같은 소스 코드라도 다른 CPU 구조나 다른 ABI 환경에서는 다시 컴파일 필요.
이식성을 높이는 방법
응용 프로그램의 이식성을 높이는 방법은 여러 가지.
1. 인터프리터 언어 사용.
2. 가상 머신 사용.
3. 표준 API 사용.
4. 운영체제별 차이를 감추는 라이브러리 사용.
Java는 JVM 위에서 실행되므로 여러 운영체제에서 같은 프로그램을 실행하기 쉬운 구조.
Python 같은 인터프리터 언어도 운영체제별 인터프리터가 제공되면 같은 소스 코드를 여러 환경에서 실행 가능.
그러나 완전한 이식성은 쉽지 않음.
운영체제별 파일 경로, 권한 모델, GUI 시스템, 네트워크 설정, 성능 차이 등을 고려해야 하는 경우 존재.
운영체제 설계와 구현
운영체제 설계는 운영체제가 어떤 목표를 가지고 어떤 구조로 만들어질지를 결정하는 과정.
운영체제는 매우 크고 복잡한 소프트웨어이기 때문에 명확한 설계 원칙 필요.
설계 목표
운영체제 설계 목표는 사용자 목표와 시스템 목표로 구분.
사용자 목표는 사용하기 쉽고, 배우기 쉽고, 신뢰성 있고, 안전하고, 빠른 시스템.
시스템 목표는 구현하기 쉽고, 유지보수하기 쉽고, 오류가 적고, 효율적이며, 확장 가능한 시스템.
사용자 입장에서는 편리성과 안정성이 중요.
개발자와 관리자 입장에서는 구조의 명확성, 유지보수성, 성능, 확장성이 중요.
정책과 기법
정책은 무엇을 할 것인지 결정하는 기준.
기법은 그 정책을 어떻게 구현할 것인지에 대한 방법.
예를 들어 CPU 스케줄링에서 어떤 프로세스를 먼저 실행할지 결정하는 것은 정책.
그 결정을 구현하기 위해 큐, 우선순위, 타이머, 알고리즘을 사용하는 것은 기법.
정책과 기법을 분리하면 운영체제를 더 유연하게 수정 가능.
정책이 바뀌어도 기법을 일부 유지할 수 있고, 기법이 바뀌어도 정책을 유지할 수 있기 때문.
구현 언어
초기 운영체제는 어셈블리어로 많이 작성.
어셈블리어는 하드웨어를 세밀하게 제어할 수 있지만 작성과 유지보수가 어려운 단점.
현대 운영체제는 대부분 C와 C++ 같은 고급 언어로 작성.
일부 하드웨어 의존적인 부분만 어셈블리어로 작성.
고급 언어를 사용하면 코드 작성이 쉽고, 가독성이 좋고, 유지보수가 쉬우며, 다른 하드웨어로 이식하기 쉬움.
단점은 어셈블리어에 비해 일부 성능 제어가 제한될 수 있다는 점.
그러나 컴파일러 최적화 기술 발전으로 대부분의 운영체제는 고급 언어 중심 구현.
운영체제 구조
운영체제는 매우 크고 복잡한 시스템이므로 내부 구조가 중요.
구조가 명확하지 않으면 유지보수, 확장, 디버깅이 어려워짐.
대표적인 운영체제 구조는 단순 구조, 계층 구조, 마이크로커널 구조, 모듈 구조, 하이브리드 구조.
단순 구조
단순 구조는 운영체제 내부 기능이 명확하게 분리되지 않고 하나의 큰 프로그램처럼 구성된 방식.
초기 MS-DOS와 초기 UNIX가 대표적인 예.
MS-DOS는 작은 시스템을 위해 만들어졌기 때문에 계층 구분이 뚜렷하지 않은 구조.
응용 프로그램이 기본 입출력 루틴이나 장치 드라이버에 직접 접근할 수 있는 구조적 특징.
초기 UNIX는 커널과 시스템 프로그램으로 나눌 수 있지만, 커널 내부는 여러 기능이 하나의 큰 구조 안에 포함.
파일 시스템, CPU 스케줄링, 메모리 관리, 장치 드라이버 등이 커널 안에 포함.
단순 구조의 장점은 구현이 비교적 간단하고 성능이 좋을 수 있다는 점.
단점은 기능 간 경계가 불명확하여 오류 발생 시 영향 범위가 크고 유지보수가 어렵다는 점.
계층 구조
계층 구조는 운영체제를 여러 계층으로 나누고, 각 계층이 아래 계층의 기능을 이용하는 방식.
가장 아래 계층은 하드웨어.
가장 위 계층은 사용자 인터페이스 또는 응용 프로그램.
각 계층은 자신의 하위 계층 기능만 사용.
상위 계층은 하위 계층이 제공하는 기능을 이용하여 더 복잡한 기능 제공.
계층 구조의 장점은 구조가 명확하고 디버깅이 쉬움.
한 계층에서 오류가 발생하면 해당 계층과 아래 계층을 중심으로 문제 분석 가능.
계층 구조의 단점은 계층을 나누는 기준을 정하기 어렵다는 점.
또한 기능을 수행하기 위해 여러 계층을 거치면 성능 저하 발생 가능.
마이크로커널 구조
마이크로커널 구조는 커널에 최소한의 기능만 남기고 나머지 기능을 사용자 공간의 서버로 분리하는 방식.
커널에는 기본적인 프로세스 관리, 메모리 관리, 통신 기능 정도만 포함.
파일 시스템, 장치 드라이버, 네트워크 서비스 같은 기능은 사용자 공간에서 실행되는 서버 형태로 구성 가능.
응용 프로그램과 서비스는 메시지 전달 방식으로 통신.
마이크로커널 구조의 장점은 확장성, 이식성, 신뢰성, 보안성.
새로운 서비스를 추가할 때 커널 자체를 크게 수정하지 않아도 됨.
하나의 서비스가 실패해도 전체 커널이 중단될 가능성이 줄어듦.
마이크로커널 구조의 단점은 성능 저하 가능성.
서비스들이 사용자 공간에 분리되어 있기 때문에 메시지 전달과 모드 전환이 많이 발생할 수 있음.
모듈 구조
모듈 구조는 커널의 핵심 부분은 유지하면서 필요한 기능을 모듈 형태로 동적으로 추가하거나 제거할 수 있는 방식.
현대 운영체제에서 많이 사용하는 구조.
모듈은 독립적인 기능 단위.
장치 드라이버, 파일 시스템, 네트워크 프로토콜 등이 모듈 형태로 제공 가능.
모듈 구조의 장점은 유연성과 확장성.
새로운 기능을 추가할 때 커널 전체를 다시 컴파일하지 않고 모듈만 추가 가능.
필요 없는 기능은 제거 가능.
Linux, Solaris, macOS 등은 모듈형 구조를 활용.
모듈 구조는 단일 커널의 성능 장점과 마이크로커널의 확장성 장점을 일부 함께 가질 수 있는 구조.
하이브리드 구조
하이브리드 구조는 여러 운영체제 구조의 장점을 조합한 방식.
현대 운영체제는 순수한 단일 구조나 순수한 마이크로커널 구조보다 하이브리드 구조를 사용하는 경우가 많음.
Windows, macOS, Linux, Android 등은 각각 단일 커널, 모듈, 마이크로커널적 요소, 계층 구조적 요소를 함께 포함.
현실적인 성능과 유지보수성을 모두 고려한 구조.
하이브리드 구조의 핵심은 이론적으로 하나의 구조만 고집하지 않고
실제 시스템 요구에 맞게 여러 구조를 조합한다는 점.
운영체제 생성과 부팅
운영체제 생성과 부팅은 운영체제가 특정 하드웨어에서 실행될 수 있도록 준비하고,
컴퓨터 전원이 켜진 뒤 운영체제가 실행되는 과정.
운영체제 생성
운영체제 생성은 특정 컴퓨터 시스템에 맞는 운영체제 이미지를 구성하는 과정.
운영체제는 다양한 하드웨어에서 실행될 수 있기 때문에 시스템 환경에 맞는 설정 필요.
운영체제 생성 과정에서는
CPU 종류, 메모리 크기, 장치 구성, 사용할 드라이버, 필요한 커널 기능, 파일 시스템 종류 등이 고려됨.
시스템에 필요한 기능만 포함하거나, 범용 운영체제처럼 다양한 기능을 포함할 수도 있음.
일부 운영체제는 소스 코드를 직접 구성하고 컴파일하여 커널 생성.
Linux 커널은 설정 도구를 통해 필요한 기능을 선택하고 빌드 가능.
시스템 부팅
부팅은 컴퓨터 전원이 켜진 뒤 운영체제 커널이 메모리에 적재되어 실행되기까지의 과정.
부팅 과정은 부트스트랩 프로그램에서 시작.
부트스트랩 프로그램은 ROM이나 펌웨어에 저장된 작은 프로그램.
하드웨어를 초기화하고 운영체제 커널을 찾아 메모리에 적재할 준비 수행.
일반적인 부팅 흐름은
전원 켜짐, 펌웨어 실행, 하드웨어 초기화, 부트로더 실행,
커널 적재, 커널 실행, 시스템 서비스 시작, 로그인 또는 사용자 환경 제공 순서.
부트로더는 운영체제 커널을 찾아 메모리에 적재하는 프로그램.
Linux 시스템에서는 GRUB 같은 부트로더 사용.
커널이 메모리에 적재된 뒤에는 커널 초기화 수행.
이후 시스템 프로세스와 백그라운드 서비스가 시작되고 사용자가 시스템을 사용할 수 있는 상태가 됨.
initramfs와 초기 파일 시스템
일부 시스템에서는 커널이 완전한 루트 파일 시스템을 사용하기 전에 임시 파일 시스템을 먼저 사용.
initramfs는 초기 부팅 과정에서 필요한 드라이버와 도구를 제공하는 임시 파일 시스템.
커널은 initramfs를 이용해 필요한 장치 드라이버를 로드하고 실제 루트 파일 시스템을 마운트.
이후 정상적인 운영체제 실행 단계로 전환.
운영체제 디버깅
운영체제 디버깅은 운영체제나 시스템에서 발생하는 오류를 찾고 분석하고 수정하는 과정.
운영체제는 하드웨어와 밀접하게 동작하고 여러 프로그램을 동시에 관리하기 때문에 디버깅이 중요.
디버깅은 오류 분석뿐 아니라 성능 감시와 조정까지 포함.
시스템이 정상적으로 동작하더라도 성능이 낮으면 병목 지점을 찾아 조정 필요.
장애 분석
장애 분석은 시스템이 잘못 동작하거나 프로그램이 비정상 종료되었을 때 원인을 찾는 작업.
운영체제는 장애가 발생하면 관련 정보를 로그나 덤프 형태로 저장 가능.
프로세스가 비정상 종료되면 코어 덤프 생성 가능.
코어 덤프는 프로세스가 종료될 당시의 메모리 상태를 저장한 파일.
디버거는 코어 덤프를 분석하여 오류 발생 위치와 원인 확인 가능.
커널이 심각한 오류로 중단되면 크래시 덤프 생성 가능.
크래시 덤프는 운영체제 커널의 상태를 저장한 자료.
운영체제 개발자나 시스템 관리자가 커널 오류 분석에 사용.
성능 감시와 조정
성능 감시는 시스템이 얼마나 효율적으로 동작하는지 관찰하는 작업.
CPU 사용률, 메모리 사용량, 디스크 입출력, 네트워크 사용량, 프로세스 상태 등이 주요 관찰 대상.
성능 조정은 관찰 결과를 바탕으로 시스템 설정을 변경하거나 병목 지점을 개선하는 작업.
예를 들어 CPU 사용률이 높으면 어떤 프로세스가 CPU를 많이 사용하는지 확인.
메모리 사용량이 높으면 불필요한 프로세스나 메모리 누수 가능성 확인.
디스크 입출력이 많으면 저장 장치 병목 여부 확인.
성능 카운터
성능 카운터는 시스템 활동을 수치로 기록하는 도구.
CPU 사용 시간, 시스템 콜 횟수, 디스크 읽기와 쓰기 횟수,
네트워크 패킷 수, 컨텍스트 스위치 횟수 등이 성능 카운터에 해당.
Linux와 UNIX 계열에서는 ps, top 같은 명령으로 프로세스 상태와 시스템 사용량 확인 가능.
Windows에서는 작업 관리자와 성능 모니터를 통해 시스템 상태 확인 가능.
추적
추적은 시스템 내부에서 발생하는 이벤트를 시간 순서대로 기록하는 기능.
시스템 콜 호출, 함수 호출, 프로세스 전환, 입출력 요청, 네트워크 이벤트 등을 분석하는 데 사용.
추적 도구는 단순한 사용량 확인보다 더 깊은 분석 가능.
어떤 프로그램이 어떤 시스템 콜을 호출하는지, 어느 지점에서 시간이 오래 걸리는지 확인 가능.
BCC와 eBPF
BCC는 BPF Compiler Collection의 약자.
Linux 시스템에서 eBPF 기능을 이용해 커널 내부 동작을 동적으로 관찰할 수 있게 해주는 도구 모음.
eBPF는 커널 내부에 안전하게 작은 프로그램을 실행하여 이벤트를 관찰할 수 있게 하는 기술.
시스템 성능 분석, 네트워크 분석, 보안 감시, 커널 함수 추적 등에 활용.
BCC 도구를 사용하면 커널을 다시 컴파일하지 않고도 실행 중인 시스템의 내부 동작을 추적 가능.
운영체제 디버깅과 성능 분석에서 유용한 도구.