전공/운영체제

Chapter2 운영체제 개요2(OS의 구조)

문정훈 2022. 5. 5. 01:49
더보기

목차

1. 운영체제의 서비스 

2. user Operation System Interface

3. System Calls이란?

4. 운영체제의 여러 구조

1. 운영체제의 서비스

사용자가 실행하는 프로그램이 보다 나은 환경에서 돌아감으로써 사용자에게 신뢰성편리성을 제공한다.

응용 프로그램은 사용자가 원하는 무엇인가를 제공해야하지만 사용자 프로그램이 신뢰성있게 돌아가게 하는 것이 os의 역할이다.

운영체제가 제공하는 서비스를 살펴보면,

사용자의 프로그램이 안정적으로 돌아갈 수 있도록 환경을 제공하는데 그런 기능을 세부적으로 나누면

 

System Call과 같은 User Interface 제공

거의 모든 OS에서는 사용자 인터페이스(UI)를 제공한다. 여러 형태 중 그래픽 사용자 인터페이스(GUI), 모바일 시스템에서는 터치 스크린 인터페이스, 명령어 라인 인터페이스(CLI) 등이 있다. 

 

프로그램 실행 제공(program execution)

os가 제공하는 것은 프로그램의 실행을 제공하는데 os프로그램을 RAM에 적재하고 프로그램을 실행시키는 역할을 하는데 프로그램의 종료까지 해준다.

 

프로그램의 종료에는 2가지 종류가 있는데 normally , abnormally이 있다. 예를 들어 앱이 실행되는 도중 죽어버리는 경우가 있는데 os는 앱이 비정상적 종료가 되더라도 자연스러운 종료가 될 수 있도록 유도해주는 역할 또한 한다.

 

I/O 입출력

osinput output역할을 해준다.

NIC 카드는 인터넷과 연결된 물리적인 기계인데 메신저 프로그램이 있다고 해보자.

프로그램에서 NIC의 버퍼에 내용을 바로 쓰지 않고 프로그램과 NIC 카드 사이에
logical interface가 존재하는데 이 interface의 버퍼에 쓴다. 그리고 이 interface NIC 카드로 전달하게 된다.

이런 logical inteface 역시 파일이다.

사용자들은 통상 입출력 장치를 직접 제어할 수 없다. 따라서 운영체제가 입출력 수행의 수단을 제공해야한다.

 

Communication

스레드라고 하는 것은 하나의 프로세스인데 프로세스 내에 여러 프로세스가 존재할 수 있다.

프로세스 안에 메모리가 할당되는데 메모리를 통해서 통신할 수 있다.

프로세스와 프로세스간의 통신은 파일을 통해 통신할 수 있으며 스레드 간에는 공유되는 메모리를 통해 통신할 수 있다.

 

Resource allocation

다수의 프로스세나 다수의 작업이 동시에 실행될 때, 그들 각각에 자원을 하당 해주어야한다.

운영체제는 CPU 스케줄링 루틴이 CPU의 속도, 반드시 실행해야할 프로세스들, CPU의 처리 코어의 개수와 다른 요인들을 고려하도록 해야한다.


 

 

2. user Operation System Interface

shells이라는 것이란 무엇인가?

껍데기란 의미로 커널을 감싸고 있는 것이 shells이고 이 shells를 감싸는 것이 user interface이다.

사용자는 무엇을 입력할지 예측할 수 없다(ex 해킹) 사용자가 입력하는 것을 커널에 직접 전달하지 않고 shell에게 전달하고 shell이 커널로 전달하고 커널의 리턴 값을 shell이 사용자에게 알려주는 일종의 중계자 역할을 한다.


 

3. System Calls이란?

시스템 콜이란

운영체제에서 사용 가능한 서비스에 대한 인터페이스를 제공한다.

운영체제가 사용하는 기능은 리소스 작업을 분배, 파일 조작, input output, read/write 등이 있는데 이들은 하드웨어를 조작한다.

하드웨어를 조작하기 위해선 어셈블리 언어를 이해해야한다. 하지만 어셈블리 언어로 프로그래밍 하기란 어렵다. OS가 이를 대신 해준다고 생각하면 된다.

os가 제공하는 서비스들을 사용할 수 있도록 하는 인터페이스의 역할을 하는 것이 시스템 콜이다.

어셈블리 언어를 간편화 하기 위해 시스템 콜을 만들었다. user application이 시스템 콜을 호출하면 특정 하드웨어에 접근할 수 있다.

시스템 콜 역시 c언어 함수이다.

 

API와 시스템 콜의 차이점은 무엇일까?

API 내부를 보면 시스템 콜을 호출한다. 즉 시스템 콜을 호출한다. 그럼 API와 시스템 콜을 구별해 놓은 이유는 무엇일까?

프로그램은 이식성이 중요하다. 내가 만든 프로그램이 다른 OS에서도 돌아가기를 원한다.

사용자가 윈도우에서 짠 시스템 콜이 리눅시 시스템에서는 다를 수 있다.

즉 윈도우와 리눅스에서는 시스템 콜의 형태가 다르다. 따라서 API를 통해 이식성을 높이기 위해서 API를 사용하는 것이다.

(API는 다른 운영체제에서도 동일할 수 있다.)

 

JVM이라는 자바 API가 있다 JVM이 무엇이냐면 완전한 이식성을 지원하기 위해 어느 운영체제에서돈 돌아갈 수 있도록한다.

JVM은 각 OS마다 적절한 시스템 콜을 호출한다. 하지만 속도가 느리다.

os에게 시스템 콜을 할 때 os에게 파라미터를 어떻게 전달할까?

레지스터를 통해 전달할 수 있고 stack을 통해 전달할 수도 있다.


 

4. 운영체제의 여러 구조

모놀리식 구조 (초기 유닉스의 구조)

운영체제를 설계하는데 가장 일반적인 형태로 커널의 모든 기능단일 주소 공간에 실행되는 단일 정적 이진 파일에 넣는 것이다.

시스템 콜 인터페이스에서는 오버헤드가 거의 없고 커널 안에서 통신 속도가 빠르다.

시스템의 한 부분을 변경하면 다른 부분에 광범위하게 영향을 주기 때문에

모놀리식 구조 == 밀접하게 결합된 시스템

 

계층적 구조

대안으로 느슨하게 결합된 시스템을 설계할 수 있다.

이 시스템은 기능이 특정 기능 및 한정된 기능을 가진 개별적이며 작은 구성요소로 나뉜다.

(작은 구성요소는 원형으로 구성되고 이들이 모여 하나의 원이 되는데 이 원이 커널을 이룬다. 그림. 2.14 참조)

 

장점 : 한 구성요소의 변경이 해당 구성요소에만 영향을 미친다. 시스템 구현자가 내부 동작을 더 자유롭게 생성하고 변경할 수 있다.

 

계층적 접근 방식은 운영체제가 여러 개의 층으로 나뉜다.

0은 하드웨어, N은 사용자 인터페이스이다.

운영체제 층은 데이터와 이를 조작하는 연산으로 구성된 추상된 객체의 구현이다.

M은 다시 하위층에 대한 자료구조 및 연산을 호출할 수 있다.

이러한 접근 방법은 시스템의 검증과 디버깅 작업을 단순화한다.

 

그림을 보면 층0은 하드웨어인데 그 상위 층인 층 1은 충0만을 사용하여 이 층의 기능을 구현하기 때문에 나머지 시스템 아무런 신경르 쓰지 않고 디버깅하 수 있다.

 

1의 디버깅이 끝나면 층2가 디버깅이 된다.

만약 어느 층의 디버깅 중 오류가 발견되면 그 하위 층은 이미 디버깅 되었기 때문에 오류는 그 층에 있다는 것이다. -> 시스템 구현이 간단해 진다.

 

계층화된 시스템은 컴퓨터 네트워크 및 웹 응용 프로그램에서 성공적으로 사용됐지만 각 계층의 기능을 적절히 정의해야하는 문제 때문에 이러한 구조의 OS는 적다.

이 시스템의 전반적인 성능은 운영체제가 서비스를 얻기 위해 사용자 프로그램이 여러 계층을 통과해야하는 오버헤드로 인해 열악하다.

 

 

마이크로 커널

초기 유닉스는 모놀리식 구조였지만 유닉스가 확장되면서 커널이 커지고 관리하기 힘들어졌다. 이에 따라 마이크로 커널 접근 방식을 사용하여 커널을 모듈화한 Marc라 불리는 OS를 개발하였다.

모든 중요치 않은 구성요소를 커널로부터 제거하고 그들을 별도의 주소 공간에 존재하는 사용자 수준 프로그램으로 구현하여 OS를 구성하는 방법이다. -> 더 작은 커널이다.

 

주 기능

클라이언트 프로그램과 역시 사용자 공간에서 수행되는 다양한 서비스 간에 통신을 제공하는 것이다. 통신은 메시지 전달에 의해서 이루어진다

예를 들어 Client 프로그램이 파일에 접근하기 원하면, 파일 서버와 반드시 상호 작용해야한다. Client 프로그램과 서비스는 직접 상호 작용하지 않으며 마이크로 커널과 메시지를 교환함으로써 간접적으로 상호작용한다.

 

장점

OS의 확장이 쉽다. 모든 새로운 서비스는 사용자 공간에 추가 되며 커널을 변경할 필요 없다.

하드웨어로부터 다른 하드웨어로 이식이 쉽다.

마이크로커널은 서비스 대부분이 커널이 아니라 사용자 프로세스로 수행되기 때문에 높은 보안성과 신뢰성을 제공한다.

 

실 사례

, IOS 운영체제의 커널 구성요소인 Darwin이 있다. 이는 두 개의 커널로 구성되고 그 중 하나는 Mach 마이크로 커널이다.

 

 

적재 가능 커널 모듈(LKM)

커널은 핵심적인 구성요소의 집합을 가지고 있고 부팅 때 또는 실행 중에 부가적인 서비스들을 모듈을 통해 링크할 수 있다. 다시 말해

커널이 핵심 서비스를 제공하고 다른 서비스들은 커널이 실행되는 동안 동적으로 구현하는 것이다. 서비스를 동적으로 링크하는 것은 새로운 기능을 직접 커널에 추가하는 것 보다 바람직하다.

예를 들어 CPU 스케줄링 , 메모리 관리 알고리즘은 커널에 직접 구현하고 다양하 파일 시스템을 지원하는 것은 적재 가능 모듈을 통하여 구현할 수 있다.

 

특징

LKM은 시스템이 시작 되거나 USB 장치가 실행 중인 시스템에 접속되는 겨우와 같이 런타임 중에 커널에 삽입될 수 있다

리눅스 커널에 필요한 드라이버가 없으면 동적으로 적재 할 수 있다.

 

<계층 구조와 닮았다>

전체적인 결과는 각 커널의 각 부분이 정의되고 보호된 인터페이스를 가진다는 점에서 계층 구조를 닮았다. -> 모듈에서 임의의 다른 모듈을 호출할 수 있다는 점에서 계층 구조보다 유연하다.

 

<마이크로 커널과 닮았다>

중심 모듈은 핵심 기능만 가지고 있고 다른 모듈의 적재 방법과 모듈들과 어떻게 통신하는지 안다는 점에서 마이크로 커널과 유사하다. 하지만 메시지를 전달을 호출할 필요가 없기 때문에 더 효율적이다.

 

<마이크로 커널과 LKM의 차이점>

마이크로 커널은 에를 들어 응용 프로그램에서 파일 시스템에 접근하기 위해서는 직접 접근하지 못하고 커널로부터 메시지를 보내고 커널은 파일 시스템으로 메시지를 보냄으로써 간접적으로 통신하게 된다.

 

LKM은 적재가능 커널 모듈로 주요한 핵심 기능은 커널에서 구현하고 CPU 스케줄링 등

다른 서비스들은 에를 들어 파일 프로세스(사용자 프로그램)에서 파일 시스템을 사용하려고 한다면 파일을 RAM에 적재하여 프로세스가 접근하게 된다. 이처럼 다른 서비스들은 커널이 실행되는 동안 모듈을 통해 링크할 수 있다(RAM에 적재)