운영체제 서비스
- 사용자 인터페이스 : 일반적으로 사용자에게 보여질 수 있는 그래픽 인터페이스(GUI) 제공한다. 태블릿, 휴대전화를 위한 스크린 인터페이스 또한 제공하며, 명령어 라인 인터페이스 (CLI) 등을 제공한다.
- 프로그램 수행 : 메모리에 명령어를 적재하는 프로그램을 실행할 수 있도록 한다.
- 입출력 연산 : 수행 중인 입출력을 프로그램에서 제어할 수 있게 한다.
- 파일 시스템 조작: 프로그램은 파일을 읽고 쓸 수 있게 하며, 파일 소유권에 기반한 권한 관리를 부여하여 파일에 접근권한에 대한 설정을 할 수 있다.
- 통신 : 프로세스 간 정보를 교환에 두 가지 방식을 제공한다. 같은 컴퓨터 내에서 정보를 교환하는 방식과 네트워크에 의해 같이 묶여져 있는 다른 컴퓨터 간의 공유 메모리를 통해서 구현될 수 있으며, message passing 기법을 사용하여 구현될 수 있다.
- 오류 탐지 : 운영체제는 CPU, 메모리, 하드웨어, 사용자 프로그램에서 일어날 수 있는 오류에 대해 조치를 취할 수 있으며, 자원을 효율적으로 사용할 수 있어야 한다.
- 자원 할당 : 멀티 프로세스 및 다수 작업이 병행되었을 때, 자원을 적절히 할당할 수 있어야 한다. CPU를 효율적으로 이용하기 위해 CPU 스케쥴링 루틴, 코어 등 다양한 요인을 고려해야 한다.
사용자와 운영체제 인터페이스
UNIX , LINUX 환경에서 운영 체제는 명령 인터프리터를 제공하여 사용자에게 커맨드 입력을 받을 수 있다. 이렇게 명령 인터프리터를 제공하는 해석기를 쉘(shell)이라고 불린다.
시스템 콜
운영체제에 의해 사용 가능하게 된 서비스에 대한 인터페이스를 제공하는 용어이다. 하드웨어에 직접 어셈블리 언어를 사용하여 작성하게 될 경우 C , C++ 함수를 제공한다.
응용 프로그래밍 인터페이스 (API)
우리는 매 순간 수천개의 시스템 콜을 사용하여, 프로그램이 수행하게 된다. 이에 애플리케이션 개발자들은 API에 따라 프로그램을 설계하게 된다. API는 각 함수에 전달되는 매개변수와 반환 값을 포함하여 프로그래머가 사용 가능한 함수의 집합을 명시한다. UNIX, LINUX 시스템에서 제공되는 라이브러리는 libc로 불린다. 시스템 콜에 대한 확장으로 시스템 콜 인터페이스가 존재한다. 모든 API 기능을 프로그래머가 알 필요 없이, 각 시스템 콜에 할당된 색인되는 테이블의 번호를 호출 함으로서, 시스템 콜의 상태와 반환 값을 얻을 수 있다.
운영체제에 매개 변수를 전달받기 위해 크게 3가지가 사용된다.
첫 번째는 레지스터에 전달받는 것이다. 레지스터의 용량보다 많은 매개변수를 전달받을 경우엔, 매개변수는 메모리 내의 블록이나 테이블에 저장되고, 블록의 주소가 레지스터 내에 저장된다. 주로 Linux는 이러한 접근법을 사용하며, 매개변수는 Stack 에 push() 혹은 pop() 되어진다.
프로세스 제어(process control)
실행 중인 프로그램은 수행 이후 정상적으로 end() 되거나 abort()된다.
한 프로그램을 실행하고 있는 프로세스가 다른 프로그램을 적재하고 실행할 수 있다. 만약, 적재된 프로그램이 종료되었을 떄 어떻게 처리가 될까?...
새로운 프로그램이 종료되었을 때 제어가 기존 프로그램으로 돌아간다면, create_process() 시스템 콜을 호출하며, 새로운 프로세스를 생성할 것이다. 이후, 생성된 프로세스의 reset 이후, terminate_process() 혹은 wait_time()에 의해 기다릴 수 있다. 이렇게 빈번하게 둘 이상의 프로세스는 데이터를 공휴하기 때문에, 공유되는 데이터에 관한 일관성을 보장하기 위해 운영체제는 프로세스에 따라 다양하게 작동된다.
시스템 서비스
- 파일 관리 : 프로그램은 파일과 디렉터리를 생성, 삭제, 복사 등 조작한다.
- 상태 정보: 상세한 성능, 로깅 및 디버깅 정보를 제공한다.
- 프로그래밍 언ㅇ: c, c++, Java을 제공한다.
- 프로그램 적재 및 수행 : absolute loader, relocatable loader, linkage editor 와 중첩 로더 등을 제공한다.
- 백그라운드 서비스 : 프로세스 스케줄러, 시스템 오류 감시 서비스 및 출력 서버를 제공한다.
링커와 로더 (Linker & Loader)
CPU에서 실행하려면 프로그램을 메모리로 가져와 프로세스 형태로 배치해야한다. 소스파일은 임의의 물리 메모리 위치에 적재되어 설계된 오브젝트 파일로 컴파일된다. 이를 Object File로 일컫는다. 다음으로 링커는 이러한 오브젝트 파일을 하나의 바이너리 실행 파일로 결합한다. 로더는 바이너리 실행 파일을 메모리에 적재하는데 사용되며, CPU 코어에서 실행할 수 있는 상태가 된다. 링커 및 로더는 relocator 역할을 하며, 프로그램에 주소를 할당하고 코드가 실행되었을 때, 프로그램 코드와 데이터가 적절한 라이브러리 함수와 변수에 접근할 수 있도록 해준다.

실제로 프로그램에서 라이브러리가 실행 파일에 링크되어 메모리에 적재되었을 때, 라이브러리를 동적으로 링크할 수 있도록 해준다. 이를 Windsows 는 동적 링킹 라이브러리(dynamically linked library, DLL)을 지원한다. 이 방법은 실행 파일에 라이브러리를 담지 않아도 되며, 실행 시간에 필요한 경우 메모리에 적재되는 방식이다. 이는 동적으로 링크된 라이브러리를 공유할 수 있어, 메모리 사용이 크게 절약될 수 있다.
오브젝트 파일 및 실행 파일은 일반적으로 표준화된 형식을 갖는다. UNIX 및 Linux 시스템의 경우 ELF(Excutable and Linkable Format)이라고 한다. Windows 시스템은 PE(Portable Executable) 형식을 사용하고 macOS는 Mach-) 형식을 사용한다.
'운영체제 > 공룡책' 카테고리의 다른 글
클라이언트 서버 통신 (0) | 2024.09.22 |
---|---|
프로세스 (0) | 2024.09.17 |
운영체제 구조 (0) | 2024.09.09 |