컴퓨터 시스템과 구조
1. 전체적인 스토리
- I/O Device는 host 컴퓨터에 붙어서 host에 입출력하는 역할을 수행한다
- Device Controller는 I/O Device를 통해 데이터를 읽거나 쓰면 local buffer에 저장한다
- Device Controller가 CPU에 어떠한 정보를 제공할 때에는 Interrupt를 건다
- CPU는 매순간 메모리 레지스터에 있는 PC가 가리키고 있는 메모리에 올라와있는 기계어(Instruction) (보통 4Byte)를 하나씩 읽어와서 실행한다
- PC는 다음 Instruction 실행할 위치를 가리킨다. 실행 후 += 4Byte
- 하지만 항상 순차적인 처리는 아님! If문 해당안하거나 Interrupt 발생 시 메모리 주소를 점프하여 Instruction 수행하기도 함
- CPU는 아주 빠른 일꾼이다! 항상 PC라는 레지스터가 가리키고 있는 메모리 주소에서 Instruction을 하나 읽어 수행..
- 이때 다음 Instruction을 수행하기 전에 Interrupt가 들어왔는지 확인!
- 들어왔다면 하고 있던 작업을 멈추고 CPU를 누가 사용하고 있든 상관없이 OS로 넘어감
- OS는 Interrupt마다 상황에 맞게 처리해야 되는 일들이 운영체제 내에 커널 함수로 정의되어 있음 ( 인터럽트 벡터 → 각 인터럽트 종류별로 처리해야 되는 Instruction 주소 가리킨다 )
- CPU의 mode bit에 따라 0 → CPU가 수행할 수 있는 기계어 집합 모두 수행가능/ 1 → 한정된 기계어 수행
- 사용자 프로그램을 온전히 신뢰할 수 없기 때문에 자기 자신의 메모리 주소만 보고 수행하도록 mode bit로 막아놓는다
- 모든 I/O Device 접근은 mode bit 0일때만 수행 가능
2. 동기식 입출력과 비동기식 입출력
- 동기식 입출력 (Synchronous I/O) - 결과를 보고온다
- I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감
- 구현 방법 1
- I/O가 끝날 때까지 CPU를 낭비시킴 → 매 순간 I/O 장치 하나만 작동 가능
- 매시점 하나의 I/O만 일어날 수 있음
- 구현 방법 2
- I/O가 완료될 때가지 해당 프로그램에게서 CPU를 빼앗음
- I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
- 다른 프로그램에게 CPU를 줌
- 비동기식 입출력 (Asynchronous I/O)
- I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감
두 경우 모두 I/O의 완료는 인터럽트로 알려줌
I/O → 오래 걸리는 작업
READ : I/O 작업 하는 동안 기다린다 → 대부분 Synchronous Async로도 프로그램 작성 가능
WRITE : Asyn 작업이 자연스럽다 (ex: storage 데이터 작성해라 ) Sync로 작업해야 하는 경우도 있음
3. DMA (Direct Memory Access)
- DMA
- 빠른 입출력 장치 (인터럽트를 자주 거는)를 메모리에 가까운 속도로 처리하기 위해 사용
- CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송
- 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴
키보드 1Byte 하나 입력 시 CPU에 Interrupt 발생 시 오버헤드가 매우 크다
→ DMA도 메모리 접근 가능하게끔 하여 키보드 버퍼에 하나의 페이지나 블럭이 쌓이면 DMA가 메모리에 카피한 후 인터럽트를 건다 → CPU 인터럽트 빈도가 낮아져서 더 효율적으로 사용할 수 있다
4. 서로 다른 입출력 명령어
I/O를 할 수 있는 서로 다른 방법 2가지
- I/O를 수행하는 spectial instruction에 의해
- 좌측 → 일반적으로 I/O 수행 방식 : 메모리에 접근하는 Instruction과 I/O Device에 접근하는 Instruction이 있음 (두 개의 작업은 별개의 Instruction에 의해 수행된다)
- Memory Mapped I/O에 의해
- 우축 → I/O Deice에 메모리 주소(연장 주소)를 매겨 메모리 접근하는 Instruction으로 I/O Device에 접근할 수 있음
5. 저장장치 계층 구조
- 위로 갈수록 속도가 빠르고 가격이 비싸므로 용량이 적다
- Volatility(휘발성) : 전원이 나가면 메모리가 사라지나 ?
[Primary]
- CPU가 직접 접근할 수 있는 메모리들 → 바이트 단위로 접근 가능해야함
- 휘발성
[Secondary]
- Excutable 하지 않은 매체
- 바이트가 아닌 색터 단위로 접근이 가능하다
상하위 속도차를 극복하기 위해 Cache Memory, Resister등을 이용한다
Caching : 더 빠른 저장 매체로 정보를 읽어들여서 작성하는 것 → 재사용 목적!
6. 프로그램의 실행 (메모리 load)
프로그램이 어떻게 컴퓨터에서 실행이 될까?
- 프로그램은 실행 파일 형태로 하드 디스크에 저장되어 있음
- 실행 시 메모리에 올라가서 프로세스가 된다
- 물리적인 메모리에 바로 알라가는 것이 아니라 Virtual Memory에 먼저 올라간다
- 어떤 프로그램의 메모리 주소 공간이 형성 (그 프로그램만의 독자적인 주소 공간)
- Virtual Memory에서 당장 필요한 부분만 Physical Memory에 올려 메모리 낭비를 막는다
- Swap Area : 메인 메모리의 연장 공간, 전원이 나가면 의미없는 데이터들
- Address Translation (주소 변환) : Virtual Memory에서의 메모리 주소와 Physical Memory에서의 메모리 주소는 같지 않다 → 주소 변환 계층 (하드웨어 장치)에서 매핑을 수행
- 운영체제 커널 - 사실 하나의 프로그램 (코데힙스로 구성)
7. 커널 주소 공간의 내용
- 코드
- 운영체제 커널에는 어떤 코드 ?
- 운영체제는 자원을 관리하고 편리한 서비스를 제공한다
- 이에 관련된 코드가 가지고 있다
- 운영체제는 Interrupt가 들어오면 CPU를 가지게 된다
- Interrupt를 어떻게 처리해야 되는지 코드가 들어있다
2. 데이터 영역
- 운영체제가 사용하는 여러 자료구조 정의되어 있음
- CPU, Memory, Disk와 같은 하드웨어 관리 및 통제 → 하드웨어 종류마다 자료구조를 만들어서 관리
- 프로세스 관리 → 프로세스를 관리 (Process Control Block)
3. 스택 영역
8. 사용자 프로그램이 사용하는 함수
- 함수
- 사용자 정의 함수 : 자신의 프로그램에서 정의한 함수
- 라이브러리 함수 : 자신의 프로그램에서 정의하지 않고 갖다 쓴 함수
- 자신의 프로그램의 실행 파일에 포함되어 있다
- 커널 함수 : 운영체제 프로그램의 함수
- 커널 함수의 호출 = 시스템 콜
9. 프로그램의 실행 단계
- User mode : 프로그램이 CPU를 잡고 있는 경우
- kernel mode : systemc call을 할 경우
- 프로그램은 태어나서 죽을 때까지 user mode - kernel mode를 반복한다
- 다른 프로세스I/O 작업 배제한 그림이다
강의 주소
'CS > 운영체제' 카테고리의 다른 글
[OS] Lecture 5. Process Scheduling (1) | 2024.01.24 |
---|---|
[OS] Lecture 4. Thread Management (1) | 2024.01.24 |
[OS] Lecture 3. Precess Management (0) | 2024.01.20 |
[OS/반효경 교수님] 2. System struct & Program Execution 1 (1) | 2023.06.03 |
[OS/반효경 교수님] 1. Introduction to Operation Systems (0) | 2023.05.25 |