운영체제(2), Operating System Structures

2022. 12. 18. 00:27강의 내용 정리/운영체제

728x90
반응형

Operating System Structures

 

OP Service

시스템 콜이 제일 중요하다. 소프트웨어들이 하드웨어를 쉽게 사용할 수 있도록 인터페이스를 제공하는 것이 System Call이다. OS의 기능이라 해도 크게 다르지 않다. PC로 오면서 GUI가 이뤄져서 User Interface도 OS의 일부이다.

 

커널은 항상 수행 중인 프로그램이고, 운영체제는 커널과 시스템 프로그램을 합친 개념이다. 시스템 프로그램은 커널을 활용하기 위한 도구이다. 이 프로그램은 커널을 설치할 때 같이 설치되는 프로그램이다. OS를 크게 보면 사용자에게 쉽게 사용할 수 있는 인터페이스를 제공하는 것과 운영체제를 사용할 수 있는 프로그램으로 구성되어있다.

 

리눅스와 유닉스의 User Interface는 CLI(커멘드 라인 인터프리터)를 user interface로 사용했었다. 커멘드를 입력할 수 있는 창은 쉘이라 한다. 유닉스가 처음에 만들어졌을 때의 쉘이 Boune shell이다. 최근에는 리눅스의 쉘인 bash를 사용하는 경우가 많다.

리눅스를 설치하면 CLI를 통해 작업하는데, 리눅스에서는 프로그램을 개발하는 환경이기에 대부분 CLI을 사용한다. 개발자 외에도 일반 유저가 컴퓨터를 사용할 때 GUI를 사용한다.

운영체제를 만든 목적은 여러 사람이 모여 프로젝트를 개발하기 위해 모인 것이다. 개발자들을 위한 운영체제가 유닉스이고, 그 이후 활용은 서버 쪽에서 사용되었다. 리눅스도 프로그램을 개발하기 위한 운영체제가 된다. 리눅스를 설치하면 C compiler가 같이 설치된다. 이는 리눅스의 시스템 프로그램이 된다.


System program

탐색기를 통해 파일을 삭제, 저장 등의 작업하는 것들

프로그래밍 언어를 지원한다.

개발환경을 제공하는 형태로 많이 쓰인다.

프로그램을 로딩하고 실행하는 데에도 로더라는 시스템 프로그램과 링커라는 시스템 프로그램이 수행된다.

통신이나 백그라운드 실행 등등을 할 때에도 사용된다.

시스템 프로그램과 대비되는 개념은 응용 프로그램이 된다.

 

Linkers and Loaders

좁은 의미의 컴파일은 object 파일로 만드는 것이다. 리눅스에서의 CLI의 컴파일 프로그램 이름은 gcc(GNU C Compiler)이다. Gcc는 컴파일러만 제공되지만 gcc가 링커를 실행시켜서 링킹을 사용할 수 있다. 이에 따라 gcc 하나로 컴파일과 링킹이 모두 가능하다.

 

.c 파일 하나당 .o 파일로 만들어준다. 이를 묶어서 하나의 실행파일로 만드는 것이 링킹이다. 이때 오브젝트 파일 여러 개를 링킹해서 실행파일로 만들 때에는 외부 라이브러리 또한 연결한다. Main은 메모리에 올려서 실행해줄 때 로더가 올린다.

 

넓은 의미의 컴파일은 컴파일과 링킹의 과정을 모두 포함한다.

Make할 때 설정하는 파일을 make 파일이라 하고, 이는 프로젝트 파일이라고도 한다. Make는 윈도우즈에 와서 빌드로 바뀌었다.

 

 

Static Linking vs Dynamic Linking

 

동시에 동일한 작업을 반복적으로 할 때 이를 모두 메모리에 올려서 사용하는 것이 아니라 동일한 부분은 하나만 올려서 사용하면 메모리의 효율이 올라간다. 이때 사용하는 것이 dll이다. 리눅스에서는 shared library가 된다. 만약 60명이 리눅스 서버에 접속해서 cout을 실행한다면 이를 모두 메모리에 올려서 처리하는 것은 매우 비효율적이다. 따라서 이를 하나만 올리고 반복적으로 실행시키는 것이 다이나믹 링킹이 되는 것이다. 또한 처음 실행시키는 경우에는 속도가 매우 느릴 수 있다. 이후에는 속도가 빨라진다.

 

$ gcc –o hello hello.c

디폴트 값은 다이나믹 링킹이 된다.

 

$ gcc –o hellos –static hello.c

$ ls –l hello hellos // 프로그램의 크기 비교

Static 링킹을 사용하는 경우에는 프로그램 내에 해당 라이브러리를 모두 집어넣는 것이기에 프로그램의 크기가 매우 커진다. Dynamic 링킹은 프로그램 외부에서 이를 처리한다.

 

장단점

다이나믹 링킹은 메모리 효율이 좋아진다. 하지만 실행 시간과 같은 성능의 측면에서는 조금 느려진다. 또한 다이나믹 링킹을 한 라이브러리의 성능을 개선하는 경우에는 내 파일을 수정하지 않아도 성능 개선이 될 수 있다. 하지만 버전이 맞지 않는 경우에는 실행이 되지 않을 수도 있다.스테틱 링킹은 위와 반대로 동작한다. 디폴트로 사용하는 것은 다이나믹 링킹이다.

 

 

System call services

운영체제에서 만든 함수를 호출한다. -> system call

System call이 standard API가 있다. 따라서 이를 지켜서 작성하여 사용하면 된다. 리눅스 커널에 man read와 같은 커멘드를 작성하면 read 함수를 확인할 수 있다.


Handling in OS

시스템콜의 동작 과정

시스템콜은 어플리케이션 프로그램이 실행되다가 trap을 걸어서 커널이 실행된다. 하드웨어 interrupt는 interrupt마다 번호가 매겨져있다. Interrupt가 발생되면 interrupt에 발생된 번호에 해당하는 함수가 실행된다. 이는 interrupt와 일대일로 매칭된다. 소프트웨어 interrupt도 마찬가지이다. 리눅스의 시스템콜이 600여개이다. 해당 테이블의 인덱스가 600여개가 있게 된다. System call을 할 때 번호를 같이 넘겨주면 그 번호에 해당하는 핸들러가 수행된다.

 

 

read라는 시스템콜을 하며 파라미터를 전달하는데 이는 트랩 번호로 넘겨준다. 어플리케이션 프로그램에서 함수를 호출하면 스택에 함수와 관련된 내용이 저장된다. 커널에 전달하는 경우에는 스택을 통해 파라미터를 패싱할 수 없기에 레지스터를 통해 이를 전달한다. 시스템 콜을 통해 파라미터를 호출했을 때 레지스터에 주소를 전달하거나 데이터가 적은 경우에는 그 데이터를 레지스터에 적재해서 커널에 전달할 수 있다.

즉, 레지스터에 파라미터를 집어넣고, 시스템 콜 번호를 통해 트랩 인터럽트를 발생시키면 커널은 파라미터를 레지스터에서 가져온다.

 

 

스탠다드 C 라이브러리

시스템 콜을 직접 호출하는 경우도 존재하지만 일반적으로는 프로그래밍 언어 내에서 운영체제에게 시스템콜을 하는 함수가 존재한다. Printf는 시스템콜의 write()를 호출하는 것이 된다.

 

System call 종류

유닉스/리눅스는 비슷한 시스템콜의 이름으로 만들었다. 윈도우는 리눅스/유닉스의 시스템콜과는 차이가 난다. 윈도우에서 프로그래밍을 할 때에는 시스템콜을 직접 사용하는 경우가 많이 없다. 윈도우 운영체제는 GUI가 기본이다. 이는 훨씬 복잡하기에 시스템콜을 직접 호출하는 경우가 많이 없다. 리눅스에서 프로그래밍을 하는 경우에는 시스템콜을 직접 호출하는 경우가 많다.

 


커널의 종류

Monolithic kernel

운영체제의 모든 기능이 한군데에 뭉퉁그려서 개발되어있는 커널이다. 전통적인 유닉스/리눅스가 모놀리딕 커널에 기반해서 만들어졌다. 리눅스 커널을 컴파일하면 리눅스 커널이라는 파일이 하나가 나온다.

이러한 경우의 다음과 같은 두 문제가 있을 수 있다. 소프트웨어 엔지니어링 이슈가 발생할 수 있다. 소프트웨어의 유지보수를 하는 단계에서는 모놀리딕 커널은 너무 복잡해서 유지보수를 하기가 어렵다.

또한 크기가 매우 커지기에 메모리가 많이 필요해진다. 임베디드 시스템의 환경에서는 다음과 같이 사용하기가 어렵다.

 

위의 문제를 개선하기 위해 마이크로 커널이 등장했다.

 

Micro kernel

마이크로 커널을 만들고 다른 운영체제의 기능을 어플리케이션 프로그램의 형태로 만든다. RTOS는 대부분 마이크로 커널이다. Mach가 마이크로 커널 기반이다. 맥 OS도 마이크로 커널 기반이다.

 

MS Dos는 프로그램을 한번에 하나만 실행할 수 있다. 운영체제라 하기도 부족한 운영체제이다.

 

메모리 관리는 가상메모리를 사용하지 않으면 필요없다.

 

마이크로 커널 외에 GUI와 같은 것은 어플리케이션 프로세스로 만들어서 사용한다. 이러한 프로세스는 사용자가 만든 프로세스보단 우선순위가 높다. 이렇게 개발하면 소프트웨어 엔지니어링 이슈가 좋아져서 유지보수가 좋아진다. 파일시스템이 필요없는 임베디드의 경우에는 해당 기능을 넣지 않아도 되니 메모리도 줄어든다.

 

모놀리딕 커널과 마이크로 커널의 중간점

모듈라 접근

커널을 쪼개거나 커널의 작은 부분을 커널이 로딩된 이후에 붙여서 사용하는 방법이다. 리눅스, 솔라리스는 기본적으로는 모놀리딕 커널이다.

 

하이브리드 어프로치

모놀리딕, 마이크로 커널을 합친 방법이다.

Mac OS X는 Next Step, Mach에 기반해있기에 마이크로 커널에 기반해있다.

 

IOS

 

IOS는 Mac OS X를 모바일에 적용하는 것이기에 UI만 다르게 만들고 커널은 동일하다. 이는 터치스크린을 포함한 라이브러리인 cocoa touch를 별도의 어플리케이션 프로세스로 가지게 된다.

 

안드로이드

리눅스 위에 모바일 디바이스용 런타임 운영체제를 만든 것이다. 안드로이드가 제공하는 시스템콜을 이용해서 프로그램을 하면 안드로이드 프로그램을 짤 수 있다. 운영체제의 인터페이스는 시스템콜이라 하지만 운영체제 위의 덩치가 큰 라이브러리는 프레임워크라는 이름을 사용하기도 한다. Api만 이해하면 라이브러리 내용을 몰라도 동작가능하게 한다.

안드로이드는 리눅스 OS 위에서 모바일 디바이스를 위해 더 많은 기능을 제공해주는 프레임워크(미들웨어)라고 보는 경우도 있다.

 

 


퀴즈 리뷰

 

시스템 콜

Function call은 운영체제의 시스템콜을 사용하기도 한다. 윈도우에서는 윈도우 api라고 표현한다. 운영체제가 만든 함수를 호출하는 것을 의미한다.

 

배치 시스템 시절의 운영체제에 해당하는 것은?

배치 시스템은 프로그램을 실행시키고 이를 다 끝냈는지 모니터링하는 것이기에 운영체제의 역할이 매우 단순했다. 이땐 resident monitor라고 했고, 이는 ram에 항상 상주해있었다.

 

PaaS란?

클라우드 컴퓨팅의 분야 중 하나로, 하드웨어를 비롯한 필요한 환경설정까지 진행한 상태로 빌려서 사용하는 것을 의미한다.

 

Cf) 가상화 덕분에 클라우드 컴퓨팅이 가능해졌다.

 

리눅스가 서버/임베디드 컴퓨터에서 주요한 OS가 된 이유를 설명하시오

무료, 오픈소스 소프트웨어이기에 해당 분야들에서 많은 확산이 이뤄졌다.

 

시스템 프로그램과 어플리케이션 프로그램

운영체제를 설치할 때 함께 설치되는 것이 시스템 프로그램이다. 어플리케이션 프로그램은 특정한 목적에 의해 설치하는 프로그램을 의미한다.

 

스테틱 링킹과 다이나믹 링킹

내가 만든 오브젝트 파일과 다른 사람이 만든 라이브러리와 링킹해서 실행파일로 만들 때 내 프로그램 이미지 내에 라이브러리를 넣는 것은 스테틱 링킹이다. 이를 외부에서 넣는 것은 다이나믹 링킹이다. 특히 서버에서는 메모리가 많이 필요하기에 이를 줄이기 위해 다이나믹 링킹을 사용한다. 디폴트는 다이나믹 링킹이다. 리눅스에서는 shared library, 윈도우에서느 dll이라 한다.

 

모놀리딕 커널과 마이크로 커널은?

OS 기능이 한데 뭉쳐져서 만들어진 커널은 모놀리딕 커널이다. 리눅스를 컴파일하면 파일이 하나만 나오는데 이는 운영체제의 모든 기능이 한군데에 뭉쳐져있게 된다. 임베디드 환경과 같은 분야나, 유지보수 측면에서 유리하게 하기 위해 최소한의 기능만 가진 것을 마이크로 커널을 가진다. 유닉스에서는 mach가 이에 해당한다. 따라서 Mac OS는 마이크로 커널 기반의 유닉스이다.

728x90
반응형