[OS] 2-1. System Structure & Program Execution 1
- IT/OS
- 2020. 12. 15.
1. 컴퓨터 시스템 구조
⇒ Memory는 CPU의 작업 공간. CPU는 매 순간(매 클럭) 메모리에서 기계어를 하나씩 읽어서 실행.
⇒ I/O device로 부터 Computer로 데이터를 가져가는 것을 input, 처리된 결과가 I/O Device로 나타나는 것을 output이라고 함.
⇒ Disk는 input 장치이기도 하고 output 장치이기도 함. 파일을 메모리에 input, 파일을 disk에 output.
⇒ 각각의 IO device들은 각 device를 전담하기 위한 작은 cpu같은 것들이 있음. 이것을 device controller라고 부름.
⇒ disk에서 head가 어떻게 움직이고 어떤 데이터를 읽을지와 같이 disk 내부를 통제하는 것은 cpu가 아닌 disk에 붙어있는 disk controller가 이 작업을 수행
⇒ keyboard controller도 마찬가지.
⇒ cpu의 작업공간이 있듯(main memory), device controller들도 그들의 작업 공간이 필요함. local buffer.
CPU
-
cpu의 운명 : 메모리에서 매 클럭마다 instruction을 하나씩 읽어 수행.
-
register : CPU안에는 메모리보다 더 빠르면서 정보를 저장할 수 있는 작은 공간 존재
-
mode bit : 지금 이 CPU에서 실행되고 있는 것이 OS인지, 사용자 프로그램인지를 구분해주는 역할
-
interrupt line : cpu는 항상 메모리에 있는 instruction만을 실행.(메모리와만 일을 함) 그렇다면 키보드나 디스크처럼 IO장치에서 무언가를 읽어와야 할 때는? 혹은 디스크에 무언가를 요청했는데 디스크가 그것을 다 끝냈다는 것을 어떻게 알까? 그것을 전달하기 위해 cpu에는 interrupt line이라는 것이 있음.
-
situation 1) 내가만든 c언어 프로그램(사용자 프로그램A). 실행되다가 scanf를 만남. 사용자로(키보드)부터의 입력이 필요. 이와 같이 IO가 필요한 instruction을 만나면 CPU가 직접 명령을 수행하는 것이 아니라(CPU는 IO Device에 직접 접근하지 않음) keyboard controller에게 부탁(명령). 그래놓고 자기 할일을 계속 수행(메모리에 있는 instruction 수행). IO 장치 결과는 local buffer에다 저장
-
situation 2) CPU가 무한루프를 수행하는 프로그램을 만날경우
⇒ 프로그램이 종료되지도 않고, IO를 하지도 않고. CPU만 계속 씀. CPU가 다른 프로그램에 넘어가지 못함.
⇒ 그래서 PC 안에는 timer라는 하드웨어를 두고 있음. 특정 프로그램이 CPU를 독점하는 것을 막기 위함.
⇒ 처음에 PC를 켰을 땐 OS가 CPU를 가지고 있다가 여러 사용자 프로그램이 실행되면 CPU를 그 프로그램에 넘겨줌. 이 때 그냥 넘겨주는 것이 아니라 timer에 어떤 값을 세팅 한 다음에 넘겨줌. 그렇게 되면 사용자 프로그램은 할당된 시간만큼만 사용하다가 할당된 시간이 되면 timer가 CPU에게 interrupt를 걸어서 알려줌. "세팅해준 시간이 끝났다!"
⇒ CPU는 매번 instruction을 하나씩 실행하다가 하나의 instruction이 끝나고 나면 interrupt line을 체크. interrupt 들어온 것이 없으면 다음 instruction 실행. 또 instruction 끝났으면 interrupt 들어 온것이 있는지 체크.
⇒ timer가 interrupt를 걸었으면 CPU는 하던 일을 잠시 멈추고 CPU의 제어권이 사용자 프로그램으로부터 OS로 자동으로 넘어가게 되어 있음.
⇒ OS가 사용자 프로그램에게 CPU를 줄 때는 자유롭게 주지만 한 번 넘어가면 뺏을 수 없음. (추가적인 하드웨어(timer)를 통해 제어권 탈취)
⇒ OS가 CPU를 받으면 뭘하느냐. 사용자 프로그램B가 이전에 CPU를 사용했다면 다음 프로그램에게 CPU를 넘겨줌(timer를 설정해놓고)
-
아까처럼 사용자 프로그램에서 scanf와 같은 IO 가 필요한 상황이 생겼을 때, 사용자 프로그램에선 OS에게 IO를 해달라고 자진해서 CPU를 넘겨주게 됨. 사용자 프로그램은 본인이 직접 IO장치에 접근할 수 없음. IO장치에 접근하는 모든 instruction은 OS를 통해서만 할 수 있도록 막아 놨음.(여러가지 보안상 이유)
Mode bit
-
지금 이 CPU에서 실행되고 있는 것이 OS인지, 사용자 프로그램인지를 구분해주는 역할
-
커널모드(모니터 모드) : OS가 CPU에서 수행중일 때 ⇒ mode bit 0
⇒ mode bit이 0일 땐 무슨 일이든 다 할 수 있도록 정의가 돼있음. 메모리 접근, IO 디바이스 접근 등.
-
사용자모드 : CPU가 사용자 프로그램을 실행 중일 때 ⇒ mode bit 1
⇒ 제한된 instruction만 cpu에서 실행을 할 수 있게 돼있음. 보안상의 목적. 사용자 프로그램에선 IO에 접근하지 못함.
-
OS가CPU를 점유하고 있다가 사용자 프로그램에게 CPU를 넘겨줄 때 mode bit 을 1로 바꾸어서 넘겨줌.
-
interrupt가 들어오면 cpu의 제어권이 OS로 넘어가면서 mode bit은 자동으로 0이 됨.
Timer
-
특정 프로그램이 CPU를 독점하는 것을 방지하기 위해 OS가 사용자 프로그램에게 CPU를 넘겨줄 때 Timer에 정해진 시간을 할당한 다음 넘겨줌
Device controller
⇒ 제어 정보를 위한 register라는 것은 CPU가 IO장치에게 무슨일을 하도록 지시하기 위해 사용되는 register.
⇒ 명령에 의한 결과를 local buffer에다가 저장해놓으면 CPU가 가져감.
⇒ CPU가 interrupt당하는 일이 너무 많음 ⇒ DMA controller라는 것을 둠.
⇒ 원래는 CPU만 메모리에 접근할 수 있으나 DMA 도 접근할 수 있게함. (밑에 그림 참조)
(IO장치가 결과를 내 줄때 그 결과를 CPU는 일일이 메모리에 카피(OS)해 옴. CPU가 일을 못함)
DMA(Direct Memory Access) controller
⇒ 직접 메모리에 접근할 수 있게 하는 controller
⇒ IO장치의 수많은 인터럽트 때문에 CPU가 방해받는 것을 방지하기 위함
⇒ IO의 결과를 CPU가 아닌 DMA controller가 Memory에 복사
⇒ 이 작업까지 끝나면 DMA controller 는 CPU에 인터럽트를 한 번만 걸어서 작업이 다 끝났다고 알림.
⇒ 만약 CPU와 DMA가 특정 메모리 영역을 동시에 접근할 경우 문제가 생길 수 있음. 이런 것을 중재하기 위해 memory controller
2. 입출력(I/O)의 수행
⇒ 사용자 프로그램은 직접 I/O 접근 불가. 운영체제를 통해서만 가능
⇒ 운영체제에 부탁. (시스템콜). 사용자 프로그램이 OS의 커널, 함수를 호출하는 것.
⇒ 시스템콜의 원리(Trap) : 일단 I/O를 하기 위해선 OS로 제어권이 넘어가야 함. 그렇다면 OS에 제어권을 넘기도록 하는 것이 중요. 어떻게? interrupt line을 통해. 사용자 프로그램에서 instruction이 하나씩 실행 될때마다 CPU에서는 interrupt가 들어온 것이 있는지 확인. timer, I/O controller도 interrupt를 걸 수 있지만 사용자 프로그램도 OS에게 무언가를 요청하기 위해 소프트웨어적으로 인터럽트를 걸 수 있음. 그렇게 되면 CPU는 해당 프로그램의 다음 instruction을 실행하는 것이 아니라 mode bit을 0으로 바꾼 다음 제어권을 OS에게 넘김.
3. 인터럽트
⇒ 사용자 프로그램에서 scanf와 같은 함수를 만났을 때, IO를 요청해야 함 (소프트웨어 인터럽트(System call))
⇒ 사용자 프로그램이 필요에 의해 OS에게 무언가 해달라고 요청하는 것(소프트웨어 인터럽트 중 System call)
⇒ IO에서 scanf를 수행하고 결과가 나오면 IO가 CPU에게 다 됐다고 알림(하드웨어 인터럽트)
⇒ 인터럽트 종류가 굉장히 많음. 키보드 컨트롤러가 걸어주는 인터럽트, 타이머가 걸어주는 인터럽트 등. 각각의 인터럽트 종류마다 운영체제가 해야 될 일이 다를 것. 키보드 컨트롤러에 의한 경우 '키보드 버퍼에 있는 내용을 메모리에 카피 하고 키보드 I/O를 요청한 프로세스에겐 CPU를 얻을 수 있다라는 걸 표시'할 것. Timer에 의한 경우는 '사용중인 프로세스에게서 CPU를 뺏어서 다른 프로세스에게 넘겨준다' 이렇게 인터럽트 종류마다 해야 할 일이 다름. 각각의 인터럽트마다 무슨일을 해야 하는 지가 운영체제 코드에 정의가 되어 있음. 이것이 인터럽트 처리 루틴. 즉, 각 인터럽트마다 처리해야 할 실제 코드가 인터럽트 처리 루틴. 그리고 1번 인터럽트일 땐 어떤 인터럽트(코드)를 실행하고, 2번 일 땐 어떤 코드를 실행하는 지를 표시해야 함. 그것이 인터럽트 벡터. 인터럽트를 실행하려고 할 때 어디에 있는 함수를 실행해야 하는지에 대한 함수의 주소 테이블.
출처 : 반효경 교수님(이화여대) 강의
반효경 교수님의 강의를 들으며 정리한 것입니다.
'IT > OS' 카테고리의 다른 글
[OS] 4. Process Management (0) | 2020.12.24 |
---|---|
[OS] 3-2. Process 2 (0) | 2020.12.24 |
[OS] 3-1. Process 1 (0) | 2020.12.18 |
[OS] 2-2. System Structure & Program Execution 2 (0) | 2020.12.16 |
[OS] 1. Introduction to Operating Systems (0) | 2020.12.14 |