인터럽트가 운영체제를 구동시키는 원리와 인터럽트의 한 종류인 시스템콜에 대해 알아본다. 동기식/비동기식 입출력에서의 인터럽트, DMA를 이용한 인터럽트 조절에 대해 알아본다. 계층구조에 의해 I/O 에서 입출력 명령어가 다름을 이해한다.
시스템 콜
인터럽트 이러면은,
CPU에 붙어있는 인터럽트 라인이 세팅돼서 다음 실행하기 전에 CPU를 운영체제한테 자동적으로 넘어가게 하는건데.
이것도 진행상황 똑같음
함수를 써서 입력을 받아서 프로그램 실행하는 코드를 만나면, 본인이 직접 못하기 때문에 운영체제한테 시스템 콜을 하고, 큐에다가 줄세워놓고 다른 프로그램한테 CPU를 넘긴다. 언젠가 키보드 입력이 들어오면? 키보다 컨트롤러가 CPU한테 인터럽트를 걸어서 요청한거 들어왔다. CPU가 운영체제한테 넘어와서 키보드 요청한 프로그램한테 CPU를 넘겨주고, 그 다음을 처리하게 된다.
모든 I/O장치를 전담하는 작은 CPU
CPU는 하드웨어다. Device controller도 하드웨어다.
운영체제는 소프트웨어다.
device controller 어디 코드가 있고, 어디 기계어 같은게 있고 주어진대로 일한다
미리 이 안에 코딩된 프로그램들이 들어있다. 그거에 의해서 동작을 한다.
운영체제한테 cpu가 넘어가는 경우는?
1) interrupt line 을 세팅하는 경우에 한해서.
인터럽트 벡터
: 인터럽트 종류별로 해당하는 종류의 인터럽트가 발생했을 때 운영체제의 어디 있는 코드를 실행해야 하는지 인터럽트 종류별로 실행해야 하는 코드의 위치를 가지고 있음
=> 타이머 인터럽트가 걸렸을 때~~ 여기 있는 코드 실행. 디스크 컨트롤러가 인터럽트가 걸렸을 때~~ 저기 있는 코드 실행
인터럽트 처리 루틴
: 해당 인터럽트가 뭐해야하는지 기계어로 저장되어있다.
프로그램이 cpu를 가지고 있다가, 스스로 내놓던지 빼앗기는 경우는?
1) 나는 계속 cpu를 쓰고 싶은데 , 번갈아쓰게 만드는 규정
=> timer interrupt
2) 더이상 cpu를 쓸 의지가 없는 경우
=> i/o 작업을 해야할 때! 내가 cpu를 가지고 있어봐야 다음 기계어를 실행하지 못해. i/o가 못끝나서 (디스크가 파일을 읽어와야 그 다음 작업할 수 있을 때)
cpu가 i/o 요청을 한다. 그 작업과cpu의 작업이 씽크 되어야 하는데 동기식 i/o .
시스템 콜을 해서 i/o 요청을 해서 시킨일이 다 끝나서 컨트롤러가 인터럽트를 걸었을 때 그 결과를 보고 그 다음 스텝을 밟아가는건 => 동기식
CPU는 대단히 빠른 자원이라서 놀지않고 계속 일한다. 인터럽트를 CPU한테 걸 때 너무 자주 걸리면 인터럽트 처리도 일종의 오버헤드다. CPU가하던일을 멈추고 운영체제한테 넘겨져서 다시 프로그램한테 넘겨진다. 인터럽트는 CPU입장에서 보면 그렇게 빈번한 일은 아니다.
I/O 장치 중 고속 장치가 있다. 인터럽트가 너무 자주 걸리면 CPU한테 대단히 비효율적인 상황이 생긴다.
DMA : direct memory access
메모리에 접근할 수 있는 장치를 하나 더 둔다.
=> 인터럽트가 너무 자주 걸리는걸 막기 위해서 존재
아주 작은 크기의 데이터가 로컬 버퍼에 들어와 있다해서 그때마다 이 컨트롤러가 직접 cpu한테 인터럽트를 거는게 아니라, DMA가 직접 메모리에 카피하는 작업까지 해준다. 그 작업이 다 끝나면 인터럽트를 한번 걸어서 알려준다. 그러면 인터럽트가 덜 빈번하게 발생한다. CPU가 효율적으로 동작하게 된다.
I/O를 수행하는 방법은 2가지가 있다.
저장장치가 계층적으로 구조. 위로갈수록 용량은 적을수록 빠르고, 아래로 갈수록 용량은 크고 느리고 저렴하다. 이러한 계층 구조에서 모든 데이터는 실제적으로 아래쪽에. 필요할 때 위에서 읽어다가 쓰도록 되어있다.
캐싱의 개념이라는게 위쪽에서 필요하다고 하면 제일 아래쪽까지 가면 느리기 때문에 중간에 미리 가지고 있으면 바로 위로 가져가는=> 캐싱의 원리
재사용성이 높은 것을 보관하고 있고, 사용가능성이 낮은것을 쫓아내는게 캐싱을 효율적으로