운영체제 개요

기운찬곰·2020년 10월 23일
1

Computer Science

목록 보기
1/27
post-thumbnail

운영체제

정보처리기사 책을 보면 운영체제에 대한 정의는 다음과 같다.

  • 운영체제는 사용자가 컴퓨터의 하드웨어를 쉽게 사용할 수 있도록 인터페이스를 제공해주는 소프트웨어다.
  • 운영체제는 한정된 시스템 자원을 효과적으로 사용할 수 있도록 관리 및 운영함으로써 사용자에게 편리성을 제공한다.

다른 블로그를 참고해보면 다음과 같이 정의하고 있다.

  • 자원의 관리와 보호, 사용자 인터페이스 제공, 하드웨어 인터페이스 제공 등을 하는 시스템 소프트웨어
  • 운영체제(Operating System)는 컴퓨터 시스템의 자원들을 효율적으로 관리하며, 사용자가 컴퓨터를 편리하고, 효과적으로 사용할 수 있도록 환경을 제공하는 여러 프로그램의 모임

🤚 이를 통해 알 수 있는 사실은 운영체제는 소프트웨어이며 여러가지 프로그램을 가지고 있으며 사용자가 컴퓨터 사용을 쉽게 하도록 도와주는 역할을 한다는 것이다.

운영체제가 어디에 위치하는가에 대해 알 수 있는 그림인데 이를 통해 알 수 있는 사실은 운영체제는 시스템 및 응용 프로그램과 컴퓨터 하드웨어 사이의 매개체 역할을 한다는 것이다. 즉, 시스템 및 응용 프로그램은 하드웨어를 직접 제어할 수 없게 만들어져있다.

이를 통해 악의적인 접근을 어느정도 막아주며 효율적인 자원 관리가 가능해진다.


운영체제 기능

위 그림은 운영체제가 제공하는 서비스를 확대한 사진이다. 가장 기본적으로 사용자 인터페이스를 제공하며, 중간에는 시스템 콜이라는 것이 보인다. 그 아래에는 운영체제가 제공하는 여러 서비스들(프로그램 수행, I/O 연산, 파일시스템 관리, 통신, 오류탐지, 기록, 자원할당, 보호와 보안 등)이 존재한다.

1. 사용자 인터페이스

운영체제는 기본적으로 사용자 인터페이스를 제공한다. 그리고 제공하는 방식에 따라 크게 2가지로 나뉜다.

  • CLI(Command line interface) : 특수한 프로그램인 셸(Shell)이라는 것이 존재하며, 셸은 조개껍데기란 의미를 가지는데 즉, 내부에 커널을 감싸고 있고 사용자 및 응용프로그램이 셸을 이용해 커널을 제어

  • GUI(Graphical user interface) : 직접 명령어를 입력하는 CLI 방식이 아닌 마우스를 이용해 메뉴 시스템(=아이콘)을 사용. 직관적이고 쉽다는 것이 장점. 윈도우가 성장하게된 결정적 계기.


2. I/O 연산

1단계. CPU에서 유저프로세스 실행 중이며, I/O는 요청 -> 전송 -> 전송완료되면 인터럽트를 발생시킨다.

2단계. 인터럽트가 발생하면 CPU는 하던일을 그만두고 저장한다음 인터럽트 서비스 루틴을 실행.

3단계. 처리가 끝나면 다시 하던일을 재개한다.

👉 이런식으로 처리하는 역할도 운영체제가 하는일이다.


3. 시스템 콜(System Call)

사용자가 운영체제 내부로 서비스를 받기 위해 안으로 들어가는 절차. 사용자 프로그램이 하기 어려운 일을 운영체제에게 부탁하기 위해 시스템 콜을 호출한다.

  • 운영체제가 제공하는 서비스 프로그램의 인터페이스
  • c, c++과 같은 고급언어로 주로 개발
  • 대부분의 프로그램은 API를 써서 시스템 콜을 호출
  • win32 api, posix API, JAVA API등이 존재한다

✅ 시스템 콜을 자세히 이해하기 위해 Copy라는 명령에 대해 시스템이 어떻게 동작하는지 알아보자.

1) 입력 파일 이름과 출력 파일 이름을 획득

2) 입력 파일을 열어(단, 입력파일이 없으면 비정상 종료)

3) 출력파일 생성(단, 출력파일이 이미 존재하는 경우 중단시키거나 삭제한후 새로운 파일을 생성하거나, 대체하거나 등의 동작을 수행)

4) 반복문 실행(입력파일로 읽고 출력파일에다가 씀)

5) 반복문이 끝나면 출력파일 닫고 완료 메시지를 출력

6) 정상 종료

copy 명령어 하나가 엄청 많은 system call로 이루워져있다는 사실이 꽤나 놀랍다. 😲


리눅스 시스템 프로그래밍을 보면 C언어에서 read라는 함수가 존재한다. 이 함수는 쉽게 말해 C언어에서 unistd.h 라이브러리에서 제공하는 API중에 하나인 셈이다.

음... 그렇다면 왜 직접 시스템 콜을 사용하지 않고 제공되어지는 API를 쓰는 걸까? 🤔

  • 일단 어렵다. 실제 시스템 호출은 종종 좀 더 자세한 명세가 필요하고 프로그램 상에서 작업하기가 응용 프로그래머에게 가용한 API보다 어렵다.
  • 같은 API를 지원하는 어느 시스템에서건 컴파일되고 실행된다는 것을 기대할 수 있다

유저모드 c언어에서 사용한 open()이라는 함수도 사실 API로 설계되어있고 그 함수가 실행이 되면 실제 시스템을 호출. 시스템 콜은 커널모드에서 동작한다. 시스템 콜은 컴퓨터에 따라 방법이 서로 다를 수 있다.


4. 프로세스 제어(수행)

프로세스를 생성하고 CPU에 할당하고 제어하는 과정을 스케줄링이라고 하며 운영체제마다 스케줄링 기법이 다르며 뒤에 가서 자세하게 배우므로 여기서는 생략하도록 하겠다.


5. 시스템 서비스(시스템 프로그램)

운영체제는 알려진 프로그램의 개발과 실행을 위해 좀 더 편리한 환경을 구축하도록 도움을 주는 시스템 유틸리티(System Utility) 즉, 시스템 프로그램을 제공한다.

윈도우의 메모장, 그림판, 계산기 등이 운영체제안에 포함된 시스템 프로그램이라고 볼 수 있다.


6. 그 외

파일관리, 장치관리, 정보유지, 통신, 보호 등


커널과 쉘

커널(kernel)

커널(kernel)은 핵이란 이름대로 운영 체제에서 가장 핵심이 되는 프로그램이다. 안드로이드를 리눅스로 취급하는 이유가 바로 이 때문이다. 안드로이드의 커널이 바로 리눅스 커널이기 때문.

커널은 드라이버를 이용해서 CPU나 그래픽카드와 같은 하드웨어를 제어하고 여러 응용프로그램들이 갖가지 다른 하드웨어 위에서 돌아가도록 호환성을 보장하기 위해 API를 제공한다. 예를 들면 웹 브라우저가 화면에 점을 찍고 싶다면 커널에서 제공하는 점을 찍는 함수를 호출하고, 커널이 드라이버를 참조해서 그래픽카드에 명령해 점을 찍는 것이다.

쉘(shell)

사용자 입장에서 가장 크게 느껴지는 프로그램은 쉘(shell)이다. 리눅스에서는 bash, bsh, csh와 같은 프로그램들이 해당되고, 윈도우에서는 cmd.exe(CLI)가 이에 해당된다.

사용자가 입력한 명령어를 해석하여 커널에게 보내면 커널이 수행하고 그 결과를 전송해서 다시 쉘을 통해 사용자에게 보여준다.


아키텍처에 따른 커널의 종류

1. 단일형 구조 커널

  • simple structure 또는 monolithic structure 라고도 불림. 대표적인 예로는 MS-DOS(윈도우의 조상격), VMS, 초기의 유닉스 등이 있다.

  • 운영체제 도움없이 ROM BIOS(basic i/o 시스템)을 이용해 application program이 바로 그 하드웨어를 동작시킬 수 있음

  • 버그 처리, 상호 의존성, 이식성, 고장 및 보안 위험 등 여러가지 문제점이 있음

2. 계층적 구조 커널

  • 기능별로 모듈을 계층화하고 계층 간 통신을 통해 운영체제를 구현하는 방식

  • 주된 장점은 구현과 디버깅 간단함. 시스템 설계나 구현이 간단해짐.

  • 다만, 운영체제는 복잡하다 보니까 단순히 층으로 구분할 수 없다는 문제가 존재. 각 층으로 전달되는 과정에서 오버헤드를 추가하며 수행시간이 오래걸림

3. 마이크로 커널

  • 프로세스 관리, 메모리 관리, IPC관리 등 기본적인 기능만 제공하고 다른 부분들은 사용자 영역에 맡기는 운영체제 구현 방식. 즉, 핵심적인 기능만 커널모드가 가지며 나머지는 전부 프로세스로 만듦

  • 오류가 적고 안정적이긴 하나, 유저영역에서 할일이 많아지고 커널모드와 통신하는 양이 많아지므로 효율이 떨어진다.

4. 모듈 커널

  • 운영체제 기능을 여러가지 모듈로 나눠서 조립식으로 탑재

  • 리눅스가 대표적. 커널을 설치하고 나면 뭐도 설치하고 뭐도 설치하고 하면서 필요한것들을 늘려나가는 방식이다


References

profile
배움을 좋아합니다. 새로운 것을 좋아합니다.

1개의 댓글

comment-user-thumbnail
2021년 9월 23일

자세하게 적어주셔서 감사합니다.
막무가내로 개발하다 보니 이런 정보들이 부족했는데 많이 알아갑니다.

답글 달기