본문 바로가기

OS/운영체제론

[운영체제론] 하드웨어와 소프트웨어 (2) / 2021.09.26

* 참고 자료 : 운영체제론 한빛아카데미

 

1. 응용 프로그래밍 인터페이스 (API)

응용 프로그래밍 인터페이스는 프로그래머들이 운영체제에 서비스를 요청할 수 있는 일련의 루틴을 제공한다. 프로세스는 API에 정의된 함수를 실행해 시스템의 하위 계층 서비스에 접근한다. 응용 프로그래밍 인터페이스의 예로는 윈도우 API 등이 있다.

 

응용 프로그램 인터페이스

 

프로세스가 운영체제에 서비스를 요청할 때 시스템 호출을 해야 하는 이유는 무엇인가?
답 : 운영체제는 시스템을 보호하기 위해 프로세스들이 운영체제 서비스나 특권 명령에 직접 접근하는 것을 금지한다. 운영체제에서 프로세스에 제공할 수 있는 서비스는 API로 묶어 제공한다. 프로세스는 시스템 호출 인터페이스를 통해서만 이러한 서비스에 접근할 수 있다. 이로썬 운영체제가 시스템을 제어할 수 있게 된다.

 

2. 컴파일링, 링킹, 로딩

고급 언어로 작성한 프로그램을 실행하려면 먼저 기계어로 컴파일해야 하고, 실행에 필요한 여러 기계어 프로그램과 링크해야 하며, 메모리에 로드해야 한다.

 

(1) 컴파일링

실행 가능한 프로그램을 만드는 첫 번째 단계는 고급 언어로 작성한 코드를 기계어로 컴파일하는 것이다. 

 

컴파일 단계 :

- 렉서(lexer) : 렉서는 프로그램의 문자들을 토큰으로 분리한다. (토큰 : 문법적으로 더 이상 나눌 수 없는 기본적인 언어 요소 예 : 키워드, 연산자, 구두점 등)

- 파서(parser) : 파서는 토큰을 구문적으로 올바른 문장으로 그룹화한다.

- 중간 코드 생성기(intermediate code generator) : 그룹화된 구문 구조를 어셈블리 언어를 닮은 간단한 명령어 스트림으로 변환 

- 옵티마이저(optimizer) : 최적화해서 코드의 실행 효율을 높이고 프로그램의 메모리 요구량을 줄이는 역할을 한다.

- 코드 생성기(code generator) : 마지막 단계에서 코드 생성기가 기계어 명령어를 담고 있는 오브젝트 파일을 만들어낸다.

 

컴파일 단계

 

(2) 링킹

일반적으로 프로그램은 독립적으로 개발된 몇 개의 하위 프로그램(모듈)으로 구성된다. 컴퓨터 루틴을 수행하는 기능은 라이브러리라는 미리 컴파일된 모듈 패키지로 준비된다. 링킹은 프로그램에서 참조하는 다양한 모듈을 실행 가능한 한 단위로 통합하는 과정이다. 프로그램을 컴파일해 얻은 오브젝트 모듈은 프로그램의 소스 파일에서 얻은 프로그램 데이터와 명령어들을 포함한다. 만약 프로그램이 다른 모듈로부터 함수나 데이터를 참조하면, 컴파일러는 이런 참조 사항들을 외부 참조로 변환한다. 또한 프로그램이 다른 프로그램에서 사용할 수 있는 함수나 데이터를 만들면, 이런 함수와 데이터들은 각각 외부 명칭으로 제공된다. 오브젝트 모듈들은 이러한 외부 참조와 외부 명칭을 심벌 테이블이라는 자료 구조에 저장한다.

 

링킹 과정 :

링커는 종종 한 프로그램을 형성하는 오브젝트 파일을 몇 개 제공받는다. 각 오브젝트 파일은 상대 주소라는 파일의 상대적인 주소를 사용해 데이터와 명령어의 위치를 명시한다.

 

링커는 모듈들을 결합해 연결된 프로그램을 형성할 때, 주소 재배치를 해 각 모듈의 주소들을 적절하게 수정한다.

또한 한 모듈의 외부 참조를 다른 모듈에 대응하는 외부 명칭으로 변환하는 심벌 확정도 수행한다. 주소가 수정되면 이에 대한 참조도 갱신해야 한다.

 

(3) 로딩 

링커는 일단 로드 모듈을 생성하고 나면 로더 프로그램에 보낸다. 로더는 명령어와 데이터 유닛을 메인 메모리의 특정 주소에 배치한다. 이를 주소 바인딩이라고 한다.

 

- 절대 로딩 : 절대 로딩은 단순히 명령어와 데이터를 프로그래머나 컴파일러가 명시한 주소에 배치하는 것이다.

- 재배치 가능한 로딩 : 로드 모듈이 실제 메모리 주소로 변환해야 하는 상대 주소를 포함할 때 수행된다. 상대 주소는 실제 메모리 주소로 변환된다.

 

3. 펌웨어

펌웨어는 종종 읽기 전용 메모리가 부착된 영구 저장소에 저장되는 실행 가능한 명령어로 구성되어있다.

펌웨어는 마이크로프로그래밍으로 프로그래밍하는데, 이는 컴퓨터의 기계어보다 아래에 있는 프로그래밍 계층을 말한다. 기계어 연산에 필요한 간단하고 기초적인 명령어를 포함한다.

 

4. 미들웨어

미들웨어는 운영체제와 응용 소프트웨어의 중간에서 조정과 중개의 역할을 수행한다. 운영체제가 지원할 수 없는 서비스를 제공한다. (예 : 이종 네트워크 간의 프로토콜 인터페이스 문제). 또한 미들웨어는 소프트웨어 글루라고 불린다. 한 컴퓨터에서 실행하는 응용 프로그램이 원격 컴퓨터에서 실행하는 다른 응용 프로그램과 통신할 수 있게 해 준다. 그리고 컴퓨터가 미들웨어를 설치하고 있으면 이기종 컴퓨터 플랫폼에서 응용 프로그램들을 실행 할 수 있게 해준다.