Search
🗂️

[OS] System Structure & Program Execution

부팅
전원 버튼이 눌러져 커널이라고 불리는 운영체제의 일부가 메모리에 올라와 실행될 장치들을 준비시키고 각종 레지스터 값을 초기화하고 나서 사용자의 입력을 받을 준비를 마치는 것
ROM에 저장되어 있는 부트 프로그램(= 부츠트랩로더)이 전원을 키자마자 제일 먼저 실행
실행 순서
1.
부트 프로그램 제일 먼저 실행
2.
디스크에 저장되어있는 OS의 Kernel 파트를 메모리에 올림
3.
Kernel에서 준비할 수 있는 프로그램들을 쭉 실행해서 준비시킴
4.
부팅 끝(시스템마다 다르지만 대체적으로 이 과정을 겪는다)
레지스터
CPU는 여러 개의 레지스터를 가지고 이것들은 메모리보다 빠른 기억 장치이지만 크기가 작아서 시스템과 사용 목적에 따라 8, 16, 32 비트 등의 크기를 가진다.
데이터, 주소, 조건 코드 레지스터 등
데이터 레지스터 : 연산을 위해 사용(메모리에 있는 데이터 연산보다 빠름)
주소 레지스터 : 데이터나 명령어의 메모리 주소를 저장하거나 계산하는데 사용
인덱스 레지스터 : 주소 지정을 위해서 사용
세그먼트 포인터, 스택 포인터 : 해당 포인터 값을 저장하는데 사용
CPU의 연산을 제어하기 위해서 사용되는 레지스터
MBR(메모리 버퍼 레지스터)
MAR(메모리 주소 레지스터)
IR(명령어 레지스터)
PC(프로그램 카운터)
모든 CPU는 현재 상태 정보를 저장하기 위해서 프로그램 상태 워드(Program Status Word, PSW)라는 레지스터를 가짐.
여러 가지 조건 코드, 인터럽트 가능불가능 표시 비트, 현재 실행 모드를 나타내는 비트 포함
명령어 처리
instruction : Assembler-level의 한줄 한줄
≠ High-level language의 한줄 한줄은 Statement(명령문)
1.
메모리에 있는 명령어를 읽어서 처리기에 있는 레지스터로 가지고 옴 → Fetch
2.
연산 종류를 파악하고 실행 → decode and execute
3.
들어온 인터럽트가 있다면 인터럽트를 확인하고 처리한다.
4.
그 다음 명령어 가지고 오기
  다음에 실행해야 할 메모리에 있는 명령어 주소는 PC 레지스터가 가지고 있음
  한 명령어의 실행이 끝나면 인터럽트를 확인하고 처리함
I/O 방식에 따른 분류
1.
프로그램에 의한 입출력(Programmed I/O)
: CPU가 입력을 지시한 후 한 워드가 컨트롤러의 버퍼에 입력됐는지를 계속해서 확인하도록 하는 방식
I/O가 진행되는 동안 CPU를 I/O에만 활용하게 된다.(I/O에 매여있게 됨)
인터럽트가 필요없는 대신 CPU가 지속적으로 완료의 여부를 확인
결국 CPU가 낭비된다
장점 : I/O가 완료되면 완료 시그널을 가지고 바로 이어갈 수 있음
2.
  인터럽트에 의한 입출력(Interrupt-driven I/O) → 대부분의 시스템 I/O
: 입력을 지시한 후 한 워드의 입력이 이루어지는 사이에 CPU는 다른 작업에 활용되어 지며 입력의 완료 시 인터럽트를 통해 CPU에 알려지는 방식
장점 : CPU 낭비를 없앤다.
단점 : 완료되어도 바로 이어 나갈 수 없다. → 완료된 걸 interrupt를 통해서 확인 가능하기때문에 interrupt를 처리한 후에야 이어나가기 가능
3.
메모리에 직접 접근하는 입출력(Direct Memory Access, DMA)
잦은 인터럽트 처리 횟수를 줄이고자하는 방식
입출력 작업을 CPU 대신 해 줄 수 있는 채널(Channel)이라는 위성 프로세서(Satellite Processor)가 필요 → 입출력 업무만 처리하는 장치
CPU가 입출력할 데이터의 시작주소와 크기 등을 채널에게 알려주고 다른 작업에 동원됨 → 채널에 주도권 넘겨짐
채널은 블록 단위로 CPU에게 인터럽트를 보내 알리게 된다.
Channel의 Memory Cycle Stealing
Channel
Channel이 Memory의 Cycle(= CPU가 Memory를 사용하려는 그 타이밍을) Steal
Channel에게 우선권을 준다. → 속도가 빠른 CPU가 평소 메모리 접근 기회를 더 많이 가지기 때문에 이때만이라도 채널에게 기회를 주어 원활한 입출력이 이루어질 수 있도록 조치하는 것이 공평, 타당하다고 보기 때문에 그렇게 설계
공유 버스(Shared Bus)로 시스템을 구성할 경우 한 번에 하나의 장치만 이 버스를 사용하도록 되어 있으므로 채널이 버스를 사용해 한 블록을 전송하고 있는 동안 CPU는 기다릴 수밖에 없다.
하드웨어 구성에 따른 분류
1.
독립적인 입출력(Isloated I/O)
: 입출력 장치들이 입출력 버스(I/O Bus)를 통해서 CPU와 연결되어 있는 경우 입출력은 입출력을 담당하는 명령어를 통해 실행되는데, 입출력 버스를 통해 해당 장치의 지정, 데이터, 입출력을 구분해주는 제어(Control)값이 전달된다.
Instruction set에 I/O 명령어가 따로 존재하면 I/O Bus를 사용하게 됨
I/O, Memory 실행을 동시에 사용 가능
단점 : 입출력 명령어가 명령어 집합에 추가되므로 제어 로직이 복잡해지고, 입출력 버스를 장착하는데 추가 비용이 생김 ⇒ Cost 증가, Instruction Set 커짐
2.
메모리 주소지정 입출력(Memory-mapped I/O)
: 입출력 장치들이 메모리와 함께 메모리 버스에 연결되어 있으며, 입출력을 위한 명령어를 따로 두어 사용하지 않고 메모리에 대한 명령어(MOVE, LOAD 등)를 사용하여 실제 입출력을 하게 되는 방식 → Data Transform 명령어를 사용
장점 : 추가된 I/O 명령어가 없어서 Instruction Set이 커질 이유가 없다.
단점 : I/O Device로 mapping된 영역만큼 실제 메모리로 사용되지 못한다.
  하드웨어 구성 분류 + I/O 방식에 따른 분류 입출력을 섞어서 사용한다.
ex. Interrupt I/O + Isolated I/O