부팅
전원 버튼이 눌러져 커널이라고 불리는 운영체제의 일부가 메모리에 올라와 실행될 장치들을 준비시키고 각종 레지스터 값을 초기화하고 나서 사용자의 입력을 받을 준비를 마치는 것
•
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