정보처리기사 책을 보면 운영체제에 대한 정의는 다음과 같다.
다른 블로그를 참고해보면 다음과 같이 정의하고 있다.
🤚 이를 통해 알 수 있는 사실은 운영체제는 소프트웨어이며 여러가지 프로그램을 가지고 있으며 사용자가 컴퓨터 사용을 쉽게 하도록 도와주는 역할을 한다는 것이다.
운영체제가 어디에 위치하는가에 대해 알 수 있는 그림인데 이를 통해 알 수 있는 사실은 운영체제는 시스템 및 응용 프로그램과 컴퓨터 하드웨어 사이의 매개체 역할을 한다는 것이다. 즉, 시스템 및 응용 프로그램은 하드웨어를 직접 제어할 수 없게 만들어져있다.
이를 통해 악의적인 접근을 어느정도 막아주며 효율적인 자원 관리가 가능해진다.
위 그림은 운영체제가 제공하는 서비스를 확대한 사진이다. 가장 기본적으로 사용자 인터페이스를 제공하며, 중간에는 시스템 콜이라는 것이 보인다. 그 아래에는 운영체제가 제공하는 여러 서비스들(프로그램 수행, I/O 연산, 파일시스템 관리, 통신, 오류탐지, 기록, 자원할당, 보호와 보안 등)이 존재한다.
운영체제는 기본적으로 사용자 인터페이스를 제공한다. 그리고 제공하는 방식에 따라 크게 2가지로 나뉜다.
CLI(Command line interface) : 특수한 프로그램인 셸(Shell)이라는 것이 존재하며, 셸은 조개껍데기란 의미를 가지는데 즉, 내부에 커널을 감싸고 있고 사용자 및 응용프로그램이 셸을 이용해 커널을 제어
GUI(Graphical user interface) : 직접 명령어를 입력하는 CLI 방식이 아닌 마우스를 이용해 메뉴 시스템(=아이콘)을 사용. 직관적이고 쉽다는 것이 장점. 윈도우가 성장하게된 결정적 계기.
1단계. CPU에서 유저프로세스 실행 중이며, I/O는 요청 -> 전송 -> 전송완료되면 인터럽트를 발생시킨다.
2단계. 인터럽트가 발생하면 CPU는 하던일을 그만두고 저장한다음 인터럽트 서비스 루틴을 실행.
3단계. 처리가 끝나면 다시 하던일을 재개한다.
👉 이런식으로 처리하는 역할도 운영체제가 하는일이다.
사용자가 운영체제 내부로 서비스를 받기 위해 안으로 들어가는 절차. 사용자 프로그램이 하기 어려운 일을 운영체제에게 부탁하기 위해 시스템 콜을 호출한다.
✅ 시스템 콜을 자세히 이해하기 위해 Copy라는 명령에 대해 시스템이 어떻게 동작하는지 알아보자.
1) 입력 파일 이름과 출력 파일 이름을 획득
2) 입력 파일을 열어(단, 입력파일이 없으면 비정상 종료)
3) 출력파일 생성(단, 출력파일이 이미 존재하는 경우 중단시키거나 삭제한후 새로운 파일을 생성하거나, 대체하거나 등의 동작을 수행)
4) 반복문 실행(입력파일로 읽고 출력파일에다가 씀)
5) 반복문이 끝나면 출력파일 닫고 완료 메시지를 출력
6) 정상 종료
copy 명령어 하나가 엄청 많은 system call로 이루워져있다는 사실이 꽤나 놀랍다. 😲
리눅스 시스템 프로그래밍을 보면 C언어에서 read라는 함수가 존재한다. 이 함수는 쉽게 말해 C언어에서 unistd.h 라이브러리에서 제공하는 API중에 하나인 셈이다.
음... 그렇다면 왜 직접 시스템 콜을 사용하지 않고 제공되어지는 API를 쓰는 걸까? 🤔
유저모드 c언어에서 사용한 open()이라는 함수도 사실 API로 설계되어있고 그 함수가 실행이 되면 실제 시스템을 호출. 시스템 콜은 커널모드에서 동작한다. 시스템 콜은 컴퓨터에 따라 방법이 서로 다를 수 있다.
프로세스를 생성하고 CPU에 할당하고 제어하는 과정을 스케줄링이라고 하며 운영체제마다 스케줄링 기법이 다르며 뒤에 가서 자세하게 배우므로 여기서는 생략하도록 하겠다.
운영체제는 알려진 프로그램의 개발과 실행을 위해 좀 더 편리한 환경을 구축하도록 도움을 주는 시스템 유틸리티(System Utility) 즉, 시스템 프로그램을 제공한다.
윈도우의 메모장, 그림판, 계산기 등이 운영체제안에 포함된 시스템 프로그램이라고 볼 수 있다.
파일관리, 장치관리, 정보유지, 통신, 보호 등
커널(kernel)은 핵이란 이름대로 운영 체제에서 가장 핵심이 되는 프로그램이다. 안드로이드를 리눅스로 취급하는 이유가 바로 이 때문이다. 안드로이드의 커널이 바로 리눅스 커널이기 때문.
커널은 드라이버를 이용해서 CPU나 그래픽카드와 같은 하드웨어를 제어하고 여러 응용프로그램들이 갖가지 다른 하드웨어 위에서 돌아가도록 호환성을 보장하기 위해 API를 제공한다. 예를 들면 웹 브라우저가 화면에 점을 찍고 싶다면 커널에서 제공하는 점을 찍는 함수를 호출하고, 커널이 드라이버를 참조해서 그래픽카드에 명령해 점을 찍는 것이다.
사용자 입장에서 가장 크게 느껴지는 프로그램은 쉘(shell)이다. 리눅스에서는 bash, bsh, csh와 같은 프로그램들이 해당되고, 윈도우에서는 cmd.exe(CLI)가 이에 해당된다.
사용자가 입력한 명령어를 해석하여 커널에게 보내면 커널이 수행하고 그 결과를 전송해서 다시 쉘을 통해 사용자에게 보여준다.
simple structure 또는 monolithic structure 라고도 불림. 대표적인 예로는 MS-DOS(윈도우의 조상격), VMS, 초기의 유닉스 등이 있다.
운영체제 도움없이 ROM BIOS(basic i/o 시스템)을 이용해 application program이 바로 그 하드웨어를 동작시킬 수 있음
버그 처리, 상호 의존성, 이식성, 고장 및 보안 위험 등 여러가지 문제점이 있음
기능별로 모듈을 계층화하고 계층 간 통신을 통해 운영체제를 구현하는 방식
주된 장점은 구현과 디버깅 간단함. 시스템 설계나 구현이 간단해짐.
다만, 운영체제는 복잡하다 보니까 단순히 층으로 구분할 수 없다는 문제가 존재. 각 층으로 전달되는 과정에서 오버헤드를 추가하며 수행시간이 오래걸림
프로세스 관리, 메모리 관리, IPC관리 등 기본적인 기능만 제공하고 다른 부분들은 사용자 영역에 맡기는 운영체제 구현 방식. 즉, 핵심적인 기능만 커널모드가 가지며 나머지는 전부 프로세스로 만듦
오류가 적고 안정적이긴 하나, 유저영역에서 할일이 많아지고 커널모드와 통신하는 양이 많아지므로 효율이 떨어진다.
운영체제 기능을 여러가지 모듈로 나눠서 조립식으로 탑재
리눅스가 대표적. 커널을 설치하고 나면 뭐도 설치하고 뭐도 설치하고 하면서 필요한것들을 늘려나가는 방식이다
자세하게 적어주셔서 감사합니다.
막무가내로 개발하다 보니 이런 정보들이 부족했는데 많이 알아갑니다.