★★★★★★★
- Basic Input Output System
- 전원이 켜지면 CPU는 부트스트랩 프로그램인 Basic Input Output System 을 실행한다.
- Boot Strap Program이 실행이 되면 시스템을 초기화한다.
- BIOS에 시스템 주변 장치들을 초기화하는 코드가 들어있다.
- 초기화가 끝나면 운영체제가 로딩한다.
- 운영체제는 Boot Loader를 통해 로딩한다.
- 운영체제 디자인
- Policy : 뭐가 수행되어야 되냐?
- Mechanism : 어떻게 수행할까?
- Mechanism을 잘 구현해 놓으면 다양한 Policy를 설정할 수 있다.
- Policy에 맞는 Mechanism을 사용하면 된다.
- CPU scheduler
- Policy (what)
- 스케줄링 알고리즘 (FIFO, SJF 등)
- Quantum size
- Mechnism (how)
- Dispatcher
- Priority queue
- Policy (what)
BIOS (Basic Input Output System) -> Bootloader
( ) decisions are important for all resource allocation and scheduling problems.
( ) : The toll for implementing a set of policies
Lowest levels in ( ).
Main body in ( ).
Policy, Mechanism, assembly, C
일반적인 컴퓨터는 인터럽트 베이스로 동작한다.
멀티모드로 작동되고 있다.
user mode, kernel mode가 있다.
CPU가 처리하는 instruction중에 privileged instruction이 있는데 kernel mode에서만 동작한다.
일반적으로 유저모드에서 동작하다가 뭔가 발생하면 커널모드로 진입한다.
유저모드에서 동작하다가 하드웨어 인터럽트가 발생하면 커널모드로 돌아간다.
그리고 다시 유저모드로 돌아간다.
유저가 System call(운영체제에 있는 8가지 서비스)을 통해서 커널모드로 바뀔 수 있다.
운영체제의 세부 내용에 앞서서 컴퓨터가 어떻게 돌아가는지 봐보자.
컴퓨터가 켜졌을 때부터 운영체제가 돌아갈 때까지를 봐보자.
파워버튼을 누르면 LED가 깜빡깜빡하면서 Fan이 돌아가기 시작하고 하드디스크가 있으면 뭔가 드드득 소리가 나면서
우리 모니터에 처음 나타나는 화면은 아래 화면이다.
이런 BIOS 화면이 나타난다. = 초기화 과정
옛날 PC들
컴퓨터라는게 사실 굉장히 단순하다.
컴퓨터에서 가장 중요한게 프로세서이다. CPU
메모리의 주어진 위치의 instruction을 가져와서 순차적으로 하나씩 실행시킨다. 이게 CPU가 하는 일이다.
전원이 켜지면 주어진 주소에 가서 실행하기 시작한다.
그래서 CPU가 정해진 주소에 가서 동작을 시작한다.
그 위치에 있는 프로그램이 부트스트랩 프로그램이다. (BIOS) (Basic Input Output System)
시스템에 붙어있는 주변 장치들을 초기화하는 코드가 BIOS 코드에 들어있다.
이걸 수행한다.
BIOS는 메인보드의 ROM에 내장되어있는 프로그램으로써 키보드, 마우스, CPU, 하드디스크 등의 하드웨어 장치를 초기화하여 제어하고 운영체제에 바톤을 넘기는 역할을 한다. 해당 PC의 입출력을 관리하는 역할이다.
그러면 아래 화면이 나온다.
부트스트랩 프로그램이 초기화를 다 마친 다음에
운영체제를 로딩해서 초기화를 하기 시작하는 것이다.
근데 이 복잡한 것을 부트스트랩이 한방에 로딩을 잘 못한다.
그래서 운영체제를 로딩하기 전에 Boot loader라는 것을 임시로 만들어놓은 경우가 많다.
부트로더가 윈도우에 핵심적인 부분만 읽어들인다.
부트스트랩 프로그램이 처음에 떠서 시스템을 초기화하고 (플레시 메모리에 붙어있음)
운영체제에게 실행권을 넘겨주는데
운영체제가 너무 복잡하기 때문에 핵심적인 부분은 떼어져 있는 부트로더라는 것을 불러들여주고
부트로더는 다시 운영체제의 복잡한 부분을 불러들여주고
GRUB이라는 것도 부트로더이다.
CPU는 정해진 위치에 가서 실행을 시작
정해진 위치에 있는 프로그램 = Boot Strap
굉장히 간단한 시스템.
하드웨어를 초기화 시키고.
운영체제에게 선택권을 넘겨준다.
운영체제가 너무 복잡해서 간단한 애(Boor Loader)가 복잡한 애를 로딩한다.
이런식으로 할 때 굉장히 간단한 운영체제를 Boot Loader라고 한다.
어떻게 운영체제를 디자인하는게 최선인가?
정답은 없다. 최고의 방법도 최선의 방법도 없다.
왜 그런 운영체제를 만들건데? 부터 시작해야 한다.
거기에 맞춰서 디자인을 시작해야 한다.
잘되는 시스템 소프트웨어는 Policy를 잘 분류를 했다.
Mechanism : 숙제를 냈을때 컴파일 해서 어떤 결과랑 비교해서 다른게 있다 없다를 체크하는 것
Policy : 이중에 몇 개가 맞고 몇 개가 틀렸을 때 점수를 어떻게 주겠다. 혹은 얼마나 틀렸을 때 다른 결과라고 말할 것이냐
과제에 짜야하는 Policy가 뭐냐?
어떤 Mechanism으로 짤거냐?
예를 한 가지 더 들어보자
마스크 사재기 방지 : Policy
Mechanism : 약국에 있는 개인정보를 통해 이 사람이 무슨약을 샀는지 트래킹, 공유하는 시스템
Policy : 생년월일의 정해진 날짜에 사시오.
Mechansim : 주민등록번호로 어디서 샀다를 트래킹하는 것
Policy : 무슨요일에 누가 살 수 있다 . 실제로 이걸 realize 하는게 Mechanism
Mechanism을 잘 구현해 놓으면 다양한 Policy를 설정할 수 있다.
Policy는 상황상황마다 다르게 구현 할 수 있다.
Policy에 잘 맞는 Mechanism을 사용
Policy와 Mechanism의 분리
어떤 시점에 어떤 프로그램이 CPU를 써서 동작을 할지를 결정을 해서 바꿔준다.
이때는 CPU를 얘가 쓰고, 저때는 CPU를 쟤가 쓰고
이걸 하는걸 운영체제가 해주고 이런 모듈을 CPU scheduler라고 한다.
먼저온 애를 먼저 하거나 어떻게 처리할 것인지 : Policy
이걸 어떻게 구현 할거냐 : Mechanism
리눅스는 C로 돼있다.
왜 C냐? 운영체제가 C로 많이 만들어져있기 때문.
C라는 언어 자체가 하드웨어를 있는 그대로 잘 보여주기 때문이다.
System call >> 실제로 인터럽트를 만들어서 시스템을 넘겨주는 것은 어셈블리로 만들어져 있고
시스템 콜을 불렀을 때 인터페이스, 처리하는 코드들은 C로 짜져있다.
시스템콜이 350개 있다 했는데
예를 들어 write는 시스템콜 넘버 30번이다. 어떤 함수를 불러야한다. 정의가 되어있다.
코드가 generation돼서 C랑 합쳐지고 어셈블리랑 합쳐져서 인터럽트 핸들링을 구현하게 된다.
- 제일 낮은 레벨은 assembly
- 중간 대부분은 C
- 반복되는 스크립트 langauge들로 구성되어 있다.
'🚦 Server > Operating System' 카테고리의 다른 글
05. Processes (0) | 2020.04.06 |
---|---|
04. Operating System Structures (2) (0) | 2020.03.30 |
02. System Call (0) | 2020.03.23 |
Programming Assignment 0 (0) | 2020.03.18 |
01. Introduction to OS (0) | 2020.03.18 |