[KOCW] 운영체제 - 반효경, 시스템 구조와 프로그램 실행
시스템 구조와 프로그램
컴퓨터 시스템에서 하드웨어가 어떻게 동작하는지, 하드웨어 위에서 프로그램이 어떻게 동작하는지에 대한 내용.
컴퓨터 시스템 구조
<--Host Computer-->
+-----+ +--------+
| CPU | - | Memory | - I/O Device (keyboard, monitor, disk)
+-----+ +--------+
- CPU: 메모리에서 인스트럭션 하나씩 읽어들여 실행.
- interrupt line: cpu는 메모리에 있는 인스트럭션만 실행함. I/O 디바이스에서 들어오는 인터럽트를 알아채기 위함.
- mode bit: 어떤 모드인지 알려주는 비트.
- device controller: 각 I/O 디바이스를 전담하는 CPU.
- CPU가 인터럽트를 너무 많이 받는다 -> 비효율적 -> DMA Controller
- DMA Controller: CPU, DMA Controller 모두 메모리 영역에 접근할 수 있음. 중간중간 local buffer에 있는 값을 메모리에 가져오고, 한번만 CPU에게 인터럽트를 걸어 CPU의 효율적인 사용을 도움.
- Memory: CPU의 작업 공간.
- local buffer: 각 I/O 디바이스의 작업 공간.
- memory controller: 메모리 접근을 제어하는 기능.
- timer: 특정 프로그램이 CPU를 독점하는 것을 막는 것.
- 운영체제가 사용자 프로그램에 cpu를 주는 것은 가능하지만, 줬던 것을 뺏을 순 없다. 그래서 추가적인 하드웨어(timer)를 통해 cpu를 제어할 수 있게 하는 것.
동작
- OS가 어떠한 프로그램을 실행할 때, timer로 시간 제약을 걸어 놓고, 메모리에 올라간 해당 프로그램을 CPU에게 할당한다.
- CPU는 그 프로그램 인스트럭션을 메모리로부터 읽어들여 수행한다.
- 그 과정에서 I/O 디바이스나 timer에 의한 인터럽트를 감지하고, 그 인터럽트에 따라 device controller에게 해당 I/O 디바이스에 입/출력을 넘겨주거나 CPU에게 다른 프로그램 인스트럭션을 읽어들여 실행하게 한다.
- CPU가 프로그램을 실행하고 있는 때에, 프로그램이 I/O를 해야 하면 OS 시스템 콜로 트랩을 건다.
- OS는 이를 올바른 요청인지 확인하고, 다시 명령을 실행한다.
즉, 현대의 운영체제는 인터럽트에 의해 구동된다.
Mode bit
-
사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치.
- 1: 사용자 모드(사용자 프로그램 수행)
- 보안상의 목적으로 제한된 일만 수행.
- 0: OS모드(커널 모드)
- 운영체제가 CPU를 가지고 있을 땐 무슨 일(Memory, I/O device 접근)이든 가능.
- interrupt나 exception발생시 0으로 바뀜.
Timer
- 특정 프로그램이 CPU를 독점하는 것을 막기 위함.
- 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 함.
Device Controller
- I/O Device Controller
- 해당 I/O 장치를 관리하는 일종의 작은 CPU
- 제어정보를 위한 register: cpu -> device controller -> I/O device
- 데이터를 담는 local buffer: I/O data -> local buffer -> memory -> CPU
- I/O는 실제 device와 Local buffer 사이에서 일어남.
- device driver: 소프트웨어. 하드웨어에 접근하기 위한 코드.
I/O의 수행
- OS에 의해 수행됨.
- 사용자 프로그램은 어떻게 I/O를 하는지?
- 시스템콜: OS 함수 호출 <- 프로그램이 직접 interrupt를 걸 수 있도록 함. => Trap을 이용해 인터럽트 거는 것. 왜? I/O 를 시작하기 위해.
- 올바른 요청인지 OS가 확인한 뒤 명령 수행.
- I/O 요청 -> 소프트웨어 인터럽트, I/O 끝남을 알림 -> 하드웨어 인터럽트
Interrupt
- 인터럽트 당한 시점의 레지스터와 program counter를 저장한 뒤 CPU의 제어를 인터럽트 처리 루틴에 넘김.
하드웨어 인터럽트(Interrupt): 하드웨어가 발생시킨 인터럽트
- ex) I/O, Timer 등
소프트웨어 인터럽트(Trap)
- Exception: 프로그램이 오류를 범한 경우
- System Call: 프로그램이 커널 함수를 호출하는 경우
인터럽트 벡터
- 인터럽트 처리 루틴 주소를 가짐. 인터럽트 종류마다 어디에 있는 함수를 실행해야 하는지 정의해 놓은 일종의 테이블.
인터럽트 처리 루틴
- 인터럽트 처리 커널 함수. 실제로 인터럽트 처리하는 부분/함수.
동기식 입출력과 비동기식 입출력
동기식 입출력(synchronous I/O)
- I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감
- 구현 방법 1
- I/O가 끝날 때까지 CPU를 가지고 있음 -> CPU 낭비
- 매 시점 I/O가 한번만 일어날 수 있음
- 구현 방법 2
- I/O가 완료될 때까지 해당 프로그램에게서 CPU 빼앗음
- I/O 처리를 기다리는 줄에 해당 프로그램을 줄 세움
- 다른 프로그램에게 CPU 넘겨줌
비동기식 입출력(asynchronous I/O)
- I/O가 시작된 후 입출력 작업이 끝나길 기다리지 않고 제어가 사용자 프로그램에 바로 넘어감
두 방법 모두 I/O의 완료를 interrupt를 통해 알려준다.
DMA(Direct Memory Access) Controller
- I/O 컨트롤러의 자잘한 인터럽트 => CPU의 오버헤드
- 효율적 이용을 위해 I/O 버퍼에 어느정도 블럭에 해당하는 데이터가 입력되면 그 때 CPU에게 알려줌
- CPU의 중재 없이 device controller가 buffer storage의 내용을 메모리에 block단위로 직접 전송할 수 있게 함.
서로 다른 입출력 명령어
CPU에서 메모리에 접근하는 인스트럭션과 I/O 디바이스에 접근하는 인스트럭션이 분리된 방식이 있고, 메모리의 연장선으로 I/O 디바이스에 접근하는 인스트럭션이 있다.
후자를 Memory Mapped I/O라고 함. 전자는 일반적인 I/O.
저장장치 계층 구조
- CPU가 직접 접근: primary(executable)
- CPU가 직접 접근X: secondary
- speed: primary > secondary
- cost: primary > secondary
- volatility(휘발성): primary > secondary
- caching: 재사용을 목적으로 하는 것. speed와 cost를 조금 더 효율적으로 사용하기 위함.
프로그램의 실행(메모리 load)
- 프로그램은 파일시스템에 파일 형태로 저장.
- 이를 실행시키면 그 프로그램의 메모리 주소 공간(Virtual memory)이 만들어짐. 이 때 프로그램이 프로세스가 됨.
- Virtual Memory: stack-data-code
- 각 프로그램마다 독자적으로 가지고 있는 메모리 주소 공간을 뜻함.
- Virtual Memory: stack-data-code
- 이를 물리적인 메모리에 올려서 실행. 당장 필요한 부분만 메모리에 올리고, 사용하지 않는 것은 메모리에서 쫓아냄.
- virtual -> physical 되면서 주소 변환이 일어남.
- swap area에 있는 내용은 전원이 꺼지면 휘발되는 메모리의 연장 공간.
- file system은 프로그램 등 파일을 저장하는 비휘발성 공간.
커널 주소 공간의 내용
- stack
- 커널 스택(프로그램마다 따로 커널 스택을 별도로 가짐)
- data
- 운영체제가 이용하는 자료구조
- CPU, Memory, Disk, PCB(Process Control Block)
- code
- 커널 코드
- 시스템콜, 인터럽트 처리 코드
- 편리한 서비스 제공을 위한 코드
사용자 프로그램이 사용하는 함수
- 함수(Function)
- 사용자 정의 함수: 프로그램에서 정의한 함수.
- 라이브러리 함수: 갖다 쓰는 함수. 프로그램 실행 파일에 포함되어 있음.
- 커널 함수: 운영체제 프로그램의 함수.
- 커널 함수 호출 == 시스템 콜 (커널 주소 공간의 code 영역에 있음)
사용자 정의 함수, 라이브러리 함수: (프로세스 주소 공간의 code 영역에 있음)
프로그램의 실행
- 프로그램은 user mode와 kernel mode를 쭉 반복하다가 종료된다.
A의 주소공간 Kernel의 주소공간 A의 주소공간 Kernel의 주소공간
user mode kernel mode user mode kernel mode
-----------> ------------------> ------------> ------------------>
| | | | |
program system return from system program
begins call kernel call ends
출처
해당 내용은 KOCW 강의 중 이화여자대학교의 운영체제-반효경 강의의 내용을 정리한 것입니다.
댓글남기기