🎛️ 운영체제 - 2. System Structure & Program Execution
출처 : http://www.kocw.net/home/cview.do?lid=af8e05c97c6d60de
🎛️ 컴퓨터 시스템 구조
CPU : 매 클럭 사이클마다 메모리에서 인스트럭션을 읽고 계산을 수행
mode bit : cpu에서 돌아가는 것이 운영체제인지 사용자 프로그램인지 구분
memory : 메모리
register : 레지스터
interrupt line : 디바이스 컨트롤러나 타이머가 여길 통해서 cpu 사용권 가져옴
DMA Controller : 다이렉트 메모리 access / 타이머가 cpu를 너무 자주 방해하지 않도록 교통정리해줌.
memory controller :
timer : 특정 프로그램의 cpu 독점 막기
device controller : 디바이스 내부 통제 ( cpu, io 장치 속도 차이 관리)
local buffer : io 장치의 메모리 같은 작업 공간
I/O device : 입출력 장치.
키보드, 마우스, 모니터 등등.. cpu보다 속도가 훠어어얼씬 느리다.
🎛️ Mode bit
사용자 프로그램이 다른 사용자 프로그램이나 운영체제에 피해를 끼치지 않도록 권한 설정
🖥️ 모니터 모드 (커널 모드/시스템모드) mode bit : 0 OS 프로그램 수행 CPU 제어권 권한 : 운영체제에게 |
🖥️ 사용자 모드 mode bit : 1 사용자 프로그램 수행 CPU 제어권 권한 : 사용자 프로그램에게 |
모니터 모드 -> 커널 모드 : interrupt 나 Exception 발생시
모니터 모드 <- 커널 모드 : 운영체제가 cpu 권한 넘기고 modebit 1 세팅
특권 명령
- 보안을 해칠 수 있는 중요한 명령어
- 모니터 모드 (0) 에서만 수행 가능!
🎛️ 타이머 (Timer)
특정 사용자 프로그램의 CPU 사용 독점을 막기 위해서 사용
=> "Time sharing"을 구현하기 위해 이용
매 클럭 시마다 1씩 줄어들며,
0이 되었을 시 타이머 인터럽트 발생!
운영체제에게 제어권 넘어감
+ 현재 시간 계산을 위해서도 사용
🎛️ 디바이스 컨트롤러 (Device Controller)
I/O 장치에 각각 달려 있으며, 이를 관리하는 일종의 작은 CPU임
control register/status register : 제어 정보를 위한 요소
local buffer : data register 같은 요소
io 입력 일이 완료되면 CPU에 이를 알림 (interupt)
🎛️ 입출력 (I/O)의 수행
입출력 => 특권명령! (운영체제가 모니터 모드에서 수행해야 함)
사용자 프로그램이 입출력 명령을 수행해야 할 때
"시스템 콜 (System call)" 사용
- 사용자 프로그램은 운영체제에게 i/o 요청
- trap을 사용하여 인터럽트 벡터의 특정 위치로 이동
- cpu 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동
- 올바른 io 요청인지 확인하고 수행
- io 작업 완료 시 제어권을 사용자 시스템 코드의 시스템콜 다음 명령으로 옮김
🎛️ 인터럽트 (Interrupt)
인터럽트가 들어오면
그 시점의 "레지스터, program counter"를 인터럽트 처리 루틴에 넘김
< Interrupt 분류 >
interrupt (하드웨어 인터럽트) | - | 하드웨어가 발생시킨 인터럽트 |
Trap(소프트웨어 인터럽트) | Exception | 프로그램이 오류를 발생시킨 경우 |
System call | 프로그램이 커널 함수를 호출한 경우 |
< Interrupt 관련 용어 >
인터럽트 벡터 : 해당 인터럽트의 처리 루틴(어떻게 처리해야 하는지) 주소를 가지고 있음
인터럽트 처리 루틴 : 해당 인터럽트를 처리하는 커널 함수
timer, device controller 가 cpu의 interrupt line을 통해 interrupt 발생시킴
현대 운영체제 : 인터럽트를 통해 구동
🎛️ 시스템 콜 (System call)
사용자 시스템이 커널 함수를 실행하고 싶을 때,
운영체제가 실행해야 하므로(특권명령이라 모니터 모드에서 수행해야 함)
시스템 콜을 함
디바이스 컨트롤러나 타이머가 인터럽트 라인으로 인터럽트를 걸고,
CPU는 다음 메모리 인스트럭션을 실행하기 전에 인터럽트 라인을 체크하고,
있다면 이를 실행함(제어 권한을 os에게)
🎛️ 동기식 입출력과 비동기식 입출력
동기식 입출력 (Synchronous I/O)
동기식 입출력은 한 작업이 완료될 때까지 기다렸다가 다음 작업을 실행하는 방식
어떤 I/O 작업을 요청하면 그 작업이 완료될 때까지 프로그램이 멈춰 있게 되고, 결과가 돌아온 후에야 다음 코드 라인으로 넘어감
(= 입출력 작업 완료 후에 제어가 사용자 프로그램에게 돌아감)
1. io 작업 완료 전까지 CPU 제어권을 유지
2. io 작업 완료 전까지 CPU 제어권을 다른 프로그램에게 넘김
비동기식 입출력 (Asynchronous I/O)
비동기식 입출력은 I/O 작업을 요청한 후, 그 작업이 완료되기를 기다리지 않고 바로 다음 코드 라인으로 넘어감
(= 입출력 작업 완료 전에 제어가 사용자 프로그램에게 즉시 돌아감)
- 두 방법 모두 I.O 의 완료는 인터럽트로 알림
🎛️ DMA (Direct Memory Access)
CPU의 중재 없이 메모리에 직접 접근할 수 있게 해주는 기술
=> 데이터 전송 시 CPU가 아닌 디바이스 컨트롤러가 데이터를 메모리의 버퍼 스토리지에 직접 전송
이를 통해 데이터 블록을 메모리로 직접 전송할 수 있어, CPU의 부하를 줄이고 시스템의 전반적인 효율성을 높일 수 있음
- CPU가 관여하는 방식: CPU가 데이터 전송을 시작하고, 디바이스 컨트롤러가 전송을 담당. 이 경우 CPU는 전송 시작에만 관여하며, 나머지 전송 과정은 컨트롤러가 처리
- CPU가 관여하지 않는 방식: CPU 없이 컨트롤러가 전체 데이터 전송 과정을 직접 담당
"바이트 단위"가 아니라 "블럭 단위로" 로 인터럽트 발생시킴
n번째 구간 끝났어요~
🎛️ 서로 다른 입출력 명령어
메모리 맵드 I/O는 디바이스와 메모리 간의 데이터 전송을 위해 특별한 지시어(special instruction)에 의해 실행
이 방식에서는 각 디바이스에 메모리 주소가 할당되어, 마치 메모리의 일부인 것처럼 데이터를 주고받을 수 있음
이를 통해 CPU는 메모리 주소를 통해 디바이스에 접근할 수 있으며, 프로그래밍이 훨씬 단순화됨
🎛️ 저장 장치 계층 구조
🎛️ 프로그램의 실행 ( 메모리 load)
🎛️ 커널 주소 공간의 내용
🎛️ 사용자 프로그램이 사용하는 함수
- 사용자 정의 함수
자신의 프로그램에서 정의한 함수
- 라이브러리 함수
갖다 쓴 함수
자신의 프로그램의 실행 파일애 포함되어 있음
- 커널 함수
운영체제 프로그램의 함수
커널함수의 호출 = 시스템 콜
🎛️ 프로그램의 실행
휴!