********************************
##이 글은 제가 공부하고 있는 책을 요약해놓은 것이므로 본문 내용만 봐선 이해가 어려울 수 있습니다.
목차
1. 컴퓨터 시스템 구조
2. CPU연산과 I/O연산
3. 인터럽트의 기능
4. 인터럽트 핸들링
5. 입출력 구조
6. DMA
********************************
1. 컴퓨터 시스템 구조
내부장치: CPU,메모리 / 외부장치: 디스크, 키보드, 마우스, 모니터, 네트워크 장치 등(외부장치는 입출력장치로도 부른다)
입력: 컴퓨터 내부로 데이터가 들어오는 것 / 출력: 컴퓨터 외부 장치로 데이터가 나가는것.
메모리 및 입출력장치 등의 각 하드웨어 장치에는 컨트롤러라는 것이 있어 각 하드웨어 장치를 제어.
2. CPU연산과 I/O연산
입출력장치들의 I/O연산 : 입출력 컨트롤러가 담당
컴퓨터 내에서 수행되는 연산 : CPU담당
입출력장치와 CPU는 동시 수행이 가능.
컨트롤러는 장치로부터 오고나가는 데이터를 임시로 저장하기위한 작은 메모리인 로컬버퍼를 가지고 있다. 디스크나 키보드 등에서 데이터를 읽어오는 경우 우선 로컬버퍼에 데이터가 임시 저장된 후 메모리에 전달됨. 이때 장치에서 로컬버퍼로 읽어오는 일은 컨트롤러가 담당.
예시: 프로그램B가 수행중에 디스크에서 데이터를 읽어오라는 명령을 내림- 디스크컨트롤러가 디스크에서 내용을 읽어 로컬버퍼에 저장-원하는 데이터를 로컬버퍼로 다 읽어오고나면 B는 자신이 필요로 하는 데이터를 다 읽어왔으므로 메인 CPU에서 다음 일을 수행.
이때 로컬버퍼로 읽어오는 작업이 끝났는지는 컨트롤러가 인터럽트를 발생시켜 CPU에 보고.
CPU 옆에는 인터럽트 라인이 있어서, 인터럽트 라인에 신호가 들어오면 하던 일을 멈추고 인터럽트 관련 일을 처리.
3. 인터럽트의 기능
운영체제 커널에는 인터럽트가 들어왔을 때 해야할 일이 미리 다 프로그래밍되어 코드가 보관되어 있음(이전글 참고).
이것을 인터럽트 처리루틴이라 함. 예를 들어 디스크 컨트롤러가 인터럽트를 발생시키면 CPU는 하던 일 멈추고 이 인터럽트에 해당하는 코드를 찾아서 수행함. 이때 수행하는 일은 디스크의 로컬버퍼에 있는 내용을 사용자 프로그램의 메모리로 전달하고, 해당 프로그램이 CPU를 할당받을 경우 다음 명령을 수행할 수 있음을 표시해두는 일이다. 운영체제는 할 일을 쉽게 찾아가기 위해서 인터럽트 벡터를 가지고 있음(코드기 위치한 부분을 가리키는).
인터럽트 종류 : 하드웨어 인터럽트/ 소프트웨어 인터럽트
하드웨어 인터럽트: 컨트롤러 등 하드웨어 장치가 CPU의 인터럽트 라인을 세팅
소프트웨어 인터럽트: 소프트웨어가 그 일을 수행
통상적으로 인터럽트는 하드웨어 인터럽트를 의미.
소프트웨어 인터럽트(트랩이라고도 부름)의 예시로 예외상황(exception)과 시스템 콜(system call)이 있음.
예외상황: 0으로 나누기 연산 등 비정상적인 작업 또는 자신의 메모리 바깥 영역에 접근하려는 등 권한이 없는 작업을 시도할 때 이를 처리하기 위해 발생시키는 인터럽트.
시스템 콜: 사용자프로그램이 운영체제 내부에 정의된 코드를 실행하고싶을때 운영체제에 서비스를 요청하는 방법
예를 들어 앱개발자가 프로그램 작성중 키보드입력이나 화면 출력 등의 입출력 작업이 필요할 때 본인이 직접 입출력 수행 코드를 작성하는 것이 아니라 이미 존재하는 커널의 코드를 호출해서 처리.
4. 인터럽트 핸들링
인터럽트 핸들링: 인터럽트가 발생한 경우 처리해야 할 일의 절차
CPU에서 명령이 실행될 때에는 CPU 내부에 있는 임시 기억장치인 레지스터에 데이터를 읽거나 쓰면서 작업을 하는데, 이때 인터럽트가 발생해 새로운 명령을 실행하면 기존의 레지스터값들이 지워지게 되므로 CPU 내의 이러한 상태를 저장해두어야 한다.
운영체제는 현재 시스템 내에서 실행되는 프로그램들을 관리하기 위해 프로세스 제어블록(Process Control Block)이라는 자료구조를 둔다. PCB는 각 프로그램마다 하나씩 존재하며 프로그램의 어느 부분이 실행 중이었는지가 저장됨. 어떤 프로그램 실행 중 인터럽트가 발생하면 프로그램 실행 상태를 PCB에 저장한 후 CPU의 제어권이 인터럽트 처리루틴으로 넘어가게 되며, 인터럽트 처리가 끝나면 저장된 상태를 PCB로부터 복원한다.
5. 입출력 구조
동기식 입출력 / 비동기식 입출력
동기식 입출력: 어떤 프로그램이 입출력 요청을 했을 때 입출력 작업이 완료된 후에야 그 프로그램이 후속작업을 수행.
입출력이 진행되는 동안 그 프로그램의 다음 명령을 수행하지 않고 기다리다가 입출력이 완료되면 인터럽트를 통해 그 사실이 전달된 후에야 CPU의 제어권이 그 프로그램에게 넘어감. CPU는 입출력 연산이 끝날 때까지 인터럽트를 기다리며 자원을 낭비. 따라서 일반적으로 프로그램에 입출력을 수행하는 경우 CPU를 다른 프로그램에 이양해 CPU가 계속 일하게 함. 이를 관리하기 위해 운영체제는 프로그램을 몇가지 상태로 나누고 입출력 중인 프로그램의 경우 봉쇄 상태(blocked state)로 전환시킴. 근데 이렇게 이양된 CPU를 받은 프로그램 역시 입출력 연산이 가능하기 때문에 경우에 따라 충돌이 일어날 수 있음. 따라서 동기식 입출력에서 입출력 요청의 동기화를 위해 장치별로 큐queue를 두어 요청한 순서대로 처리할수 있게 함. 장치별로 큐헤더가 존재하여 큐를 관리.
(예시-프로그램 A가 디스크에 원래 1이던 파일 내용을 3으로 바꾸는 입출력 연산을 요청 -> 작업이 수행되는 동안 A에게 CPU를 빼앗아 B에게 할당 -> 마침 B에서는 디스크의 동일한 파일 내용을 1증가시키는 연산을 요청 -> 충돌이 발생할 수 있음. 파일 내용이 1-3-4로 변하는 것이 아니라 1-2-3으로 변할 수가 있다는 소리.)
요청된 입출력 연산이 완료되면 CPU에게 인터럽트를 통해 완료를 통보. 이 경우 운영체제 커널은 인터럽트 처리루틴으로 가서 입출력 연산을 끝낸 프로그램이 CPU를 할당받을 수 있도록 봉쇄 상태를 해제시킴.
비동기식 입출력: CPU제어권을 입출력 연산을 호출한 프로그램에게 곧바로 다시 부여하는 방식.
어떤 프로그램이 입출력요청을 통해 어떤 데이터를 디스크에서 읽어오라는 요청을 했을 때 그 데이터와 관련없이 수행할 수 있는 일을 먼저 수행하고 있고, 데이터가 받아지면 그 데이터가 필요한 일을 그 다음으로 수행. 비동기식 입출력도 마찬가지로 인터럽트를 통해 CPU에게 입출력연산 완료를 통보.
<***전체 과정 정리*** 이해가 중요!!!>
프로그램 A가 실행 중 디스크에서 어떤 데이터를 읽어오는 명령을 만남- 프로그램 A는 시스템 콜을 통해 CPU에 소프트웨어 인터럽트를 발생시킴- CPU는 하던일을 멈추고 현재 상태를 저장한 후 인터럽트에 의해 처리되어야 할 커널의 루틴으로 이동- 처리루틴으로 이동하면 CPU는 컨트롤러에게 입출력 연산 요청- 컨트롤러는 A가 요청한 데이터를 디스크로부터 자신의 로컬버퍼로 읽어옴-읽어오는 동안 프로그램 A는 CPU를 다시 할당받지 못함-운영체제는 프로그램 A가 입출력 연산을 요청했으므로 CPU를 할당해도 명령을 수행하지 못한다는 사실을 봉쇄상태로 표시- 그리고 CPU를 다른 프로그램 B에게 할당해 계속 일을 하게 함 - 원하는 정보가 로컬버퍼로 다 들어오면 컨트롤러는 CPU에게 인터럽트를 발생시켜 완료를 알림(이때는 하드웨어인터럽트)- CPU는 수행중이던 프로그램 B의 작업상태를 저장해놓고 인터럽트 처리- 인터럽트 처리루틴은 로컬버퍼에 있는 A가 요청한 데이터를 A의 메모리 영역으로 읽어오고, A의 봉쇄상태를 해제시킴- A는 CPU를 기다리는 줄에 다시 서게 됨- 수행하던 프로그램 B로 돌아가 CPU는 다시 하던 작업 수행- 프로그램A는 줄에서 기다리다가 자기 차례가 되면 CPU를 할당받고 입출력 연산 이후의 작업을 수행
--->>> 한마디로 CPU는 프로그램과 컨트롤러 사이에서 왔다갔다 하면서 요청 정보나 데이터 다 옮겨주고 그 사이사이에 다른 프로그램 일까지 한다.
6. DMA
메모리는 CPU에 의해서만 접근할 수 있지만, 위에서 본것처럼 모든 메모리 접근 연산이 CPU를 통해서만 이루어질 경우 입출력 장치가 메모리 접근을 원할때마다 인터럽트에 의해 CPU가 너무 자주 방해를 받게되어 효율이 떨어지게 됨. 그래서 CPU 이외에 메모리 접근이 가능한 장치를 하나 더 두는데 이 장치를 DMA(direct memory access)라고 함.
DMA도 일종의 컨트롤러로서 로컬버퍼에서 메모리로 읽어오는 작업을 CPU대신 DMA가 대행. 이때 DMA는 바이트 단위가 아닌 블록이라는 큰 단위로 정보를 메모리로 읽어온 후에 CPU에게 인터럽트를 발생시켜 알림.
댓글