인터럽트
- 하드웨어 인터럽트
- timer의 인터럽트
- 컨트롤러의 인터럽트 : 요청한 I/O 작업이 끝났다는 것을 CPU에게 알림
- 트랩(Trap, 소프트웨어 인터럽트)
- Exception : 프로그램이 오류를 범한 경우 (ex. 0으로 나누는 연산, 사용자 프로그램에서 운영체제에 접근 등)
- System call : 프로그램이 커널 함수를 호출하는 경우
- 인터럽트 벡터
- 인터럽트의 처리 루틴의 주소를 가지고 있음
- 인터럽트 처리 루틴
- 인터럽트를 처리하는 커널 함수
— 만약 인터럽트가 들어왔다면 지금 하던 작업을 멈추고(Program Counter 저장) CPU 제어권을 운영체제(OS)에게 넘김
— 운영체제 내부에는 인터럽트 상황에 따라 처리할 수 있도록 커널함수들이 정의돼있음
— I/O 디바이스는 운영체제(OS)에서만 접근 가능
Mode bit
CPU 내부에 0,1을 나타내는 장치
- 0일 경우 : 모든 기계어 집합을 수행할 수 있음 (운영체제가 CPU를 가진 경우)
- I/O 디바이스에 접근하는 인스트럭션은 0일 경우에만 가능(운영체제만 접근 가능)
- 1일 경우 : 한정된 기계어 집합을 수행할 수 있음 (사용자 프로그램이 CPU를 가진 경우)
- 사용자 프로그램은 1일 경우 커널로 접근할 수 없기 때문에 시스템 콜을 통해 요청
- 시스템 콜(System Call) : 운영체제에 있는 함수를 사용자 프로그램이 필요에 의해서 요청하는 것
- 사용자 프로그램이 의도적으로 인터럽트를 세팅함
- 모든 작업이 중단되고 CPU가 운영체제로 넘어감
타이머(Timer)
사용자 프로그램이 CPU를 독점해서 사용하는 것을 막기 위해 시간을 세팅하는 역할
- 시간을 초과하면 인터럽트를 걸어 CPU를 운영체제에게 넘김
동기식 입출력(Synchronous I/O)
- 일반적으로 읽기 작업(Read)
- I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에게 넘어감
- 구현 방법 1
- I/O가 끝날 때까지 CPU를 낭비시킴
- 매시점 하나의 I/O만 일어날 수 있음(I/O도 낭비)
- 구현 방법 2
- I/O가 완료될 때까지 해당 프로그램에서 CPU를 빼앗음
- I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
- 다른 프로그램에게 CPU를 줌비동기식 입출력(Asynchronous I/O)
- 구현 방법 1
- 일반적으로 읽기 작업(Read), 쓰기 작업(Write)
- I/O 요청 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에게 즉시 넘어감
위의 두 경우는 모두 I/O의 완료는 디바이스 컨트롤러에서 인터럽트로 알려줌
비동기식 입출력(Asynchronous I/O)
- 일반적으로 읽기 작업(Read), 쓰기 작업(Write)
- I/O 요청 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에게 즉시 넘어감
위의 두 경우는 모두 I/O의 완료는 디바이스 컨트롤러에서 인터럽트로 알려줌
동기식 입출력 VS 비동기식 입출력
- 입출력이 진행되는 과정에서 인스트럭션을 실행시키는지에 따른 차이가 있음
DMA(Direct Memory Access)
메모리에 접근할 수 있는 장치
- CPU뿐만이 아니라 DMA를 통해 메모리에 접근이 가능함
- 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용
(키보드 한번 누를때마다 CPU에 인터럽트 요청을 하면 오버헤드가 발생할 수 있음) - byte 단위가 아니라 block 단위로 인터럽트를 발생시킴
- CPU의 중재없이 DMA를 통해 I/O의 버퍼 스토리지의 내용을 메모리에 블럭단위로 직접 전송
서로 다른 입출력 명령어
- 좌측은 메모리에 접근하는 인스트럭션과 I/O에 접근하는 스페셜 인스트럭션이 있음
- 우측은 주소값을 통해 접근하는 Memory Mapped I/O라고 부름
저장장치 계층 구조
위로 갈수록 속도가 빠르고, 비용이 비싸고, 용량이 작음
Primary(CPU 직접 접근해 처리 가능한 부분) : 휘발성 / 속도가 빠름 / 비용이 비쌈 / 용량이 작음 / 바이트 단위로 접근이 가능해야 함
Secondary(CPU가 직접 접근하지 못하는 부분) : 섹터 단위로 접근 가능
정적 할당영역
- 코드, 데이터
동적 할당영역
- 힙, 스택
프로그램의 실행
- 프로그램의 하드디스크에 실행파일 형태로 저장돼있음
- 프로그램을 실행시키면 메모리로 복사되어 하나의 프로세스가 됨
- 프로그램을 실행시키면 실행시킨 그 프로그램의 독자적인 주소 공간이 생성됨
(0번부터 시작 / stack, data, code 영역으로 구성됨) - 커널 주소 공간은 컴퓨터 부팅시 커널영역에 자동으로 위치함
- 전체 주소공간을 올리는 것이 아니라 당장 필요한 것만 주소 변환을 통해 물리적 메모리에 저장하고
나머지는 메모리의 연장 공간으로 디스크의 Swap Area라는 공간에 놔둠(메모리 낭비를 방지) - 또한 사용하지 않는 메모리는 물리적 메모리에서 빼버림
- 프로그램을 실행시키면 실행시킨 그 프로그램의 독자적인 주소 공간이 생성됨
- 가상 메모리(Virtual Memory)를 통해서 물리적 메모리에 필요한 것만 할당
커널 주소 공간의 내용
프로그램의 실행
개괄적인 동작원리
- CPU에서 실행 중인 프로그램 A가 디스크(또는 다른 I/O 장치)에 입력 요청을 보내야 할 일이 생긴다.
- CPU가 디스크에서 데이터를 읽어올 때, CPU는 직접 디스크에 접근하지 않고 디스크 컨트롤러에 명령을 해 놓는다.
- CPU는 명령을 던져놓고 자기는 다른 작업(다른 프로세스 B의 실행)을 계속 한다. (CPU는 매우 빠른 속도로 일하기 때문에 쉴 틈이 없다)
- 디스크가 요청이 들어온 데이터를 찾으면 local buffer에 넣어 놓는다.
- 디스크 컨트롤러는 buffer에 데이터가 들어오면 CPU에 interrupt를 건다.
- CPU가 interrupt line을 확인하고 interrupt가 들어온 게 있음을 확인한다.
- CPU의 제어권이 OS한테 넘어간다.
- OS는 왜 interrupt가 들어왔는지 살펴보고 요청을 보냈던 데이터가 들어왔음을 확인한다.
- OS는 입력된 값을 요청을 보냈던 프로그램 A의 메모리 공간에 카피를 해준 다음, 이미 실행되고 있었던 프로세스 B에 할당된 시간이 끝나기를 기다렸다가 끝나면 프로그램 A한테 CPU를 넘겨 준다.
'크래프톤 정글 - TIL' 카테고리의 다른 글
크래프톤 정글 5기 TIL - Day 13(알고리즘) (0) | 2024.04.01 |
---|---|
크래프톤 정글 5기 TIL - Day 12(2)(프로세스) (0) | 2024.03.29 |
크래프톤 정글 5기 TIL - Day 11 (0) | 2024.03.28 |
크래프톤 정글 5기 TIL - Day 10 (0) | 2024.03.28 |
크래프톤 정글 5기 TIL - Day 9 (0) | 2024.03.27 |