전공/시스템 프로그래밍(운영체제)

1. 시스템 구조와 시스템 라이브러리

문정훈 2021. 10. 12. 21:44

1. 운영체제란 

운영체제를 정리한 글이 아니라 시스템 라이브러리를 이해하기 위한 최소한의 OS개념을 정리한다.

운영체제(operating system),

사용자 프로그램을 동작시키는 프로그램이 운영체제이다.

사용자 프로그램을 동작시키는 것과 운영체제에는 어떤 벽이 존재한다.

예를 들어 pc에서 두 개의 독립적 프로세스가 서로 방해하지 않도록 독립성을 보장하기 위해 두 개의 프로세스를 동시에 실행하고 관리하기 위한 것이 운영체제이다.

운영체제가 관리하는 것은 사실 하드웨어이다.

하드웨어를 관리해서 사용자가 하드웨어에 접근해서 하드웨어를 사용할 수 있도록 만들어주는 것이 운영체제이다.

따라서 정리해보면, 하드웨어를 동작시키거나 사용자 프로그램을 동작시키는 것이 운영체제이다.

 

 

2. 시스템 프로그래밍: 시스템 라이브러리?

사용자 프로그램이 운영체제에게 직접 말해서 데이터를 전송할 수 없기 때문에 운영체제에게 시그널을 보낸다. 이 시그널이 컴퓨터에 하드웨어를 조작해야하는 시그널이면 사용자 프로그램을 커널 영역으로 데려간다. 커널영역에서 사용자 프로그램이 하드웨어를 동작시키는 것이다.

 

비주얼 스튜디오 코드(사용자 프로그램) 에서 c언어로 프로그램을 작성한다고 가정해보자. 이때 printf 함수를 사용하는것은 printf 라는 API를 사용해 하드웨어인 모니터에 우리가 원하는 결과를 출력하게 된다. 

이 과정을 자세히 보면, 

 

  1. printf라는 API는 하드웨어를 조작하기 위해 운영체제와 통신하는 시스템 라이브러리를 호출한다. 
  2. 시스템 라이브러리는 운영체제에게 하드웨어를 조작하고 싶다는(화면에 출력하고싶어!) 시그널을 보내게 되고
    운영체제는 이 시그널을 trap해서 사용자 프로그램을 운영체제의 커널 영역으로 데려온다. 그리고 실행한다.

정리하면, 시스템 라이브러리란?
내가 만든 프로그램이 하드웨어를 조작할 필요가 있을 때 운영체제에게 시그널을 보내야하는데 시스템 라이브러리를 통해 운영체제에게 신호를 보낸다. (나 하드웨어 조작하고싶어!!)
그것을 하기 위해 시스템 라이브러리가 존재한다. 

 

3.  시스템 프로그래밍: 시스템의 구조 

위 모델은 시스템의 구조를 나타낸 것이다. 하드웨어는 컴퓨터 구조 시간에 대해 배울 것이다. HAL은 하드웨어를 소프트웨어적으로 다루기 위한 다양한 함수 혹은 다양한 fromware같은 역할을 한다.

fromware란 하드웨어를 다루기 위해서는 하드웨어에 신호를 보내야하는데 그 신호를 생성하는 하드웨어를 조작하는 소프트웨어라고 정리해두자.

(완전한 소프트웨어는 아니다 그 이유는 소프트웨어는 input, output 모두 소프트웨어이지만 fromware의 input은 디지털 정보인 소프트웨어지만 output은 전기적 signal이기 때문이다.)

 

os에서 HAL에게 소프트웨어적 신호인 디지털 정보(신호) input하게 되면
HAL(fromware)는 출력으로 하드웨어에게 전기적 시그널로 변환하여 전달해준다. 이것이 HAL의 역할이다.

 

시스템 구조는 위 구조처럼 생겼는데, 그럼 시스템 프로그래밍이란 뭘 배우는 것인가?

어떻게 보면 애플리케이션을 사용하는 것이 맞다. 일종에 어플레케이션을 개발하는 것이 맞는데 우리가 사용하고자 하는 os바로 위에있는 시스템 라이브러리를 사용해보는 것이다.

 

4. API vs SI

1) AP와 SI의 차이점

SI OS에 의존적이다. OS가 무엇인가에 따라 SI가 바뀐다.
예로 open을 통해 파일(txt)을 열고 읽기 쓰기 하는 것은 하드디스크에 기록을 하는 것이다. 운영체제는 우리가 하는 모든 작업은 운영체제가 검사한다. 컴퓨터 하드웨어에 접근이 필요하다고 판단이 되면 우리의 응용 프로그램은 직접적으로 하드웨어에 접근할 수 없다. (참고로 모든 하드웨어에는 사용자가 직접 접근할 수 없다.

운영체제를 통해 접근하게된다. 운영체제에 명령을 전달해야한다.)

 

응용 프로그램으로 open() 메소드라는 API 를 호출하면 OS에 명령을 보내게 되고 OS는 이를 전기적 신호로 바꾸어 실제로 하드웨어에 기록하게 된다. (응용 프로그램이 직접 하드웨어에 접근하지 않는단 말임!!) 그렇기 때문에 반드시 시스템 라이브러리를 통해 중계역할을 해야만 OS를 통해 하드웨어에게 신호를 보내는 것이다.

 

2) API가 왜 필요한가?

SI OS에 의존적이다. OS가 무엇인가에 따라 SI가 바뀐다. SI 호출을 위해 API를 사용한다. API SI와 종속적이지 않다.
API는 애플리케이션에서 호출한 함수를 현재 실행중인 OS의 시스템 라이브러리에 맞추어 실행시켜주는 역할을 하는 것이다.

 

내가 만든 응용 프로그램은 플랫폼(어느 OS)에 상관 없이 어디서든 실행되길 원한다. 하지만 OS에 의존(OS에 의해 결정된다) 하는 시스템 라이브러리를 응용 프로그램에서 사용해버리면 문제가 발생한다. 따라서 응용 프로그램과 시스템 라이브러리 사이 인터페이스인 API가 존재하는 것이다.

 

5. 마무리...

우리의 컴터에 있는 모든 응용 프로그램들이 서로 충돌 없이 아주 평화롭게 하드웨어를 사용할 수 있도록 해주는 것이 운영체제의 역할이다. 우리가 만든 프로세스는 그래서 반드시 운영체제의 도움을 받아 실행을 해야 하고 그렇기 위해서는 SI를 사용해야한다.

 

애플리케이션에서 API를 통해 open이라고 하는 시스템라이브러리를 호출하게 되면 운영체제에서 파일을 읽도록 만들어주는 것이다.
운영체제가 파일을 대신 읽는 것이 아니라 시스템 라이브러리는 프로세스를 운영체제 영역 안으로 불러들인다. 그리고 운영체제가 프로세스에게 파일 접근 권한을 부여한다.(이것을 trap 한다. 라고 함)

 

바로 위 내용을 다시 정리하면 사용자 레벨의 애플리케이션을 커널 영역으로 데려온 후 trap 하는 것이다.
이렇게 해주는 것이 시스템 라이브러리이다.

 

'전공 > 시스템 프로그래밍(운영체제)' 카테고리의 다른 글

3. System Call: read, write  (0) 2021.10.16
2. System Call: open  (0) 2021.10.12
Linux3) 리눅스 사용자 계정  (0) 2021.10.12
Linux2) 프로세스  (0) 2021.10.12
Linux1) 리눅스 파일  (0) 2021.10.12