2강-1. System Structure & Program Execution 1
운영체제 2개의 난관 중 첫 번째 고비!
전체 오버뷰인데 잘 따라와야 한다.
I/O : Input/Output
memory : cpu의 작업공간, cpu는 매 클럭사이클마다 메모리에서 기계어(instruction)를 하나씩 읽어서 실행을 하게 됨.
device controller : i/o-device을 cpu 대신 컨트롤 한다. ---> 작은 cpu 역할을 한다.
제어정보 register는 메인 CPU에서 지시한 내용을 저장하기 위한 register라고 보면 된다.
ex)
어떤 사용자 프로그램에서 화면에 출력하고 싶을 때.
-> 사용자 프로그램 메모리 영역에서 data를 copy 해서 모니터(i/o device) local buffer에 화면에 출력할 data를 담는다.
-> 메인 cpu의 명령을 받은 device controller가 모니터에 출력한다.
파일을 저장하고 싶을 때
-> 사용자 프로그램 메모리 영역에서 data를 copy 해서 디스크(i/o device) local buffer에 저장할 data를 담는다.
-> 메인 cpu의 명령을 받은 device controller가 디스크에 저장한다.
저장하라는 명령은 제어 레지스터를 통해서 메인 cpu가 i/o controller에게 전달을 한다.
device controller(작은 cpu)는 자신의 local buffer만 접근가능!
device driver : 각 디바이스에 접근하고 처리하기 위해서 디바이스에 있는 인터페이스에 맞게 접근할 수 있도록 도와주는 소프트웨어 모듈
local buffer : device controller의 작업공간 --> 메모리 역할
cpu : memory에서 instruction을 가져와서 실행. cpu는 항상 memory와 일한다.
1. instruction을 실행.
2. interrupt line 확인.
cpu는 momery 접근, local buffer 접근 ->ok
CPU는 본인이 다음에 실행해야 할 메모리의 주소를 register 중에서 pc( program counter) register에다가 실행할 instruction(명령어)의 주소를 가지고 있다.
cpu는 instruction 중에서 i/o 장치를 접근해야 되는 상황이 오면 device driver를 통해서 device controller에게 명령을 내린다.
cf) device controller는 cpu가 device driver를 통해서 전달한 명령을 수행
cpu는 i/o device와 직접 접근하지 않는다. 오직 메모리를 접근하는 instruction만 실행한다.
그러면 만약에 디스크에서 읽어오라는 명령은 어떻게 처리할까?
-> disk device controller에게 읽어오라고 일을 시킨다. -> disk는 disk device controller에게 명령을 받아서 data를 찾은 뒤에 local buffer에 data를 저장한다.
즉, cpu는 i/o가 발생하면 i/o controller에게 일을 시키고 자신(cpu)은 메모리에 접근하면서 계속 instruction을 실행한다. 쉬지 않고 일을 한다.
DMA controller : Direct Memory Access controller
직접 메모리를 접근하는 컨트롤러
원래는 메모리를 접근할 수 있는 건 cpu 뿐이었는데, DMA controller가 있으면 DMA controller도 메모리에 접근할 수 있게 된다.
i/o device가 많아지면서 cpu가 방해를 너무 많이 받게 된다.(오버헤드가 커짐) 그래서 cpu가 방해받지 않도록 DMA controller가 직접 local buffer에 들어오는 내용이 끝났으면, local buffer에 있는 data를 사용자 프로그램 메모리영역에 copy 한다. 복사가 완료됐다면 cpu에게 interrupt를 한번 걸어줘서 i/o 내용이 메모리에 올라갔다고 알려준다.
cpu를 효율적으로 사용할 수 있게 도와준다.
memory controller: 만약에 DMA controller와 cpu가 동시에 같은 메모리 영역을 접근하게 되면 문제가 생길 수 있다.
이때 memory controller가 중재를 한다. 누가 먼저 접근할지 교통정리를 하는 역할
register : cpu안에는 메모리보다 작지만, 더 빠른 정보를 저장할 수 있는 공간
mode bit : cpu에서 실행되는 프로그램이 운영체제인지, 사용자 프로그램인지 구분해 준다.
mode bit = 0 : 운영체제가 cpu에서 실행 중 일 때는 무슨 일이든 다 할 수 있다. -> 메모리 접근, i/o device 접근 ok
mode bit = 1 : 사용자 프로그램이 cpu를 가지고 있을 때는 제한된 instruction(명령어)만 실행가능하다.-> 보안상 이유
운영체제는 cpu제어권을 사용자 프로그램에 넘겨줄 때 mode bit을 1로 바꿔서 보내준다.
인터럽트가 오면 cpu 제어권이 운영체제로 넘어오면서 mode bit이 0으로 바뀌게 된다.
interrupt line : cpu는 메모리에 있는 인스트럭션을 실행, 다음번에 실행할 기계어의 주소값을 증가. interrupt line은 i/o device에서 요청이 들어올 때 cpu에 전달해 준다.
cpu는 instruction이 끝나고 나면 interrupt line을 확인한다.
timer : 특정 프로그램이 cpu의 독점을 막기 위해. cpu의 제어권이 운영체제에서 특정 프로그램으로 넘어갈 때, timer에 값을 세팅하고 제어권을 넘겨준다. (수십 밀리초 세팅)
timer에서 시간이 다 되었으면 인터럽트로 cpu에게 알려준다. 그러면 cpu의 제어권이 사용자 프로그램에서 운영체제로 변경이 된다. 다음 프로그램에게 cpu 제어권을 넘겨준다.(물론 이때도 위와 같이 timer에 시간을 세팅한다)
time sharing을 하기 위해서 꼭 필요하다.
사용자 프로그램 : 만약에 i/o를 해야 되는 상황이면, 사용자 프로그램은 cpu의 제어권을 운영체제에게 넘긴다. i/o를 접근하는 모든 instruction은 운영체제를 통해서만 할 수 있다.
그러면 어떻게 운영체제에게
cpu 제어권을 받은 운영체제는 i/o device controller에게 일을 시킨다. 운영체제는 방금 i/o를 요청한 프로그램에게 제어권을 넘겨주기 않고, 다음 프로그램에게 제어권을 넘겨준다.( i/o는 시간이 많이 걸리기 때문)
그러면 i/o를 요청한 cpu는 언제 cpu제어권을 받게 되는가?
-> i/o device controller가 요청한 작업이 끝나서 local buffer에 data가 들어왔으면 i/o device controller가 cpu에게 interrupt를 보낸다.
-> 그러면 cpu 제어권이 사용자 프로그램에서 운영체제로 넘어감.
-> 운영체제는 인터럽트가 왜 들어왔는지 확인하고, 해당 i/o device의 local buffer에 있는 값을 [i/o를 요청한 사용자 프로그램의 메모리 공간]에 copy 해서 넣는다.
-> 보통은 interrupt 발생 전에 작업하던 프로그램에게 cpu를 다시 준다. cpu를 받은 프로그램은 자신에게 할당받은 시간만큼 작업을 시작한다.
경우에 따라서 프로그램이 실행하고 있을 때, 입력(키보드, 마우스..)/ 출력(화면..)을 받아야 하는 상황이나 디스크에서 파일을 읽어와서 다른 instruction을 실행하는 경우. 등등. 다양한 경우가 있다.
사용자 프로그램이 운영체제에게 i/o를 부탁하는 것을 "시스템콜"이라고 한다.
-> 사용자 프로그램이 운영체제의 커널 함수를 호출하는 것을 시스템 콜이라고 부른다.
그러나 사용자 프로그램에서 운영체제의 커널함수를 바로 호출하지 못한다!
-> 왜나하면 mode bit이 1일 때는 커널의 메모리 영역에 접근하지 못한다. 따라서 사용자 프로그램은 interrupt line을 실행하는 instruction을 실행한다.
-> 인터럽트가 발생해서 mode bit = 0으로 변경되고, cpu의 제어권이 운영체제로 넘어간다.
-> 운영체제는 요청받은 i/o 작업을 device controller에게 명령을 내린다.
- Interrupt(하드웨어 인터럽트) : timer 인터럽트, controller 인터럽트
- Trap(소프트웨어 인터럽트) : system call( i/o요청) , Exception ( 사용자 프로그램에서 0으로 나눈 연산, 사용자 프로그램에서 운영체제 영역에 접근하려는 시도)
- Exception이 발생하면 인터럽트 라인이 세팅되고, cpu가 운영체제한테 넘어감. 해당 사용자 프로그램은 강제로 종료시킴.
- i/o를 하기 위해서 2가지 인터럽트가 발생한다
- 1. 사용자 프로그램이 i/o를 요청하기 위해서 system call를 실행한다. (소프트웨어 인터럽트)
- 2. i/o device에서 작업이 다 끝났으면 device controller가 인터럽트를 날린다.(하드웨어 인터럽트)
- 인터럽트 벡터
- 어떤 인터럽트가 들어왔을때, 그 인터럽트에 해당하는 인터럽트 처리 루틴의 주소를 가지고 있다.
- 인터럽트 처리 루틴(= Interrupt Service Routine)
- 인터럽트의 종류가 여러개 있고, 각 인터럽트마다 해야 할 일이 다르다.
- 각각의 인터럽트 종류마다 운영체제 코드에 정의가 되어있다.
- 각 인터럽트마다 처리해야 할 코드를 [인터럽트 처리 루틴]이라고 한다.
- 사용자 프로그램이 운영체제에게 서비스 요청할 때 시스템 콜을 사용
- 사용자 프로그램에서는 mode bit = 1 이므로 pc(program counter) register가 운영체제 영역으로 잡혀있다고 하더라도 점프를 못함. -> 그래서 시스템콜을 사용하여 운영체제에 요청한다.
출처 : http://www.kocw.net/home/search/kemView.do?kemId=1046323