컴퓨터 시스템 구조
CPU와 Memory : Computer
우측 부분들 : I/O device
mode bit
- CPU에서 실행되는 것이 운영체제인지, 사용자 프로그램인지 구분 1: 사용자 모드/ 0: 모니터모드(=커널모드, 시스템모드)
- 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호장치
- 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 "특권 명령"으로 규정
- Interrupt나 Exception 발생시 하드웨어가 mode bit을 0으로 바꿈
- 사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 셋팅
타이머
- 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트 발생시킴 - 타이머는 매 클럭 틱 때마다 1씩 감소 - 타이머 값이 0이 되면 타이머 인터럽트 발생 - CPU를 특정 프로그램이 독점하는 것으로 부터 보호 - time sharing구현이나 현재 시간 계산하기 위해서도 사용
Device Dontroller
- I/O device controller - 해당 I/O 장치 유형을 관리하는 일종의 작은 CPU - 제어 정보를 위해 control register,status register를 가짐 cf) control register : CPU가 일 시킬 때 그 레지스터를 통해서 무슨 일을 해라! 라는 걸 지시하기 위함 - local buffer를 가짐(일종의 data register)즉, 입출력 명령어는 control register에 , 실제 입출력할 정보는 local buffer에 저장한다. - I/O는 실제 device와 local buffer 사이에서 일어남 - Device controller 는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알림
device driver (장치 구종기)
: OS 코드 중 각 장치별 처리 루틴=>software
device controller(장치 제어기)
: 각 장치를 통제하는 일종의 작은 CPU => hardware
CPU
- 메모리보다 더 빠르고 정보를 저장할 수 있는 register를 가진다.
- CPU에서 실행되는 것이 운영체제인지, 사용자 프로그램인지를 mode bit이 구분한다.
- CPU가 메모리 접근을 하다가 I/O가 발생하면 I/O device 의 device controller에 요청하고 다음 Instruction을 실행한다.
- 사용자 프로그램은 직접 I/O 접근을 못하기 때문에 자신의 CPU 제어권을 OS에 넘기면서 요청한다. OS는 device controller에 의해 I/O가 진행되는 동안 CPU의 제어권을 다른 프로그램으로 넘겨준다.
- I/O 요청을 받은 해당 device는 local buffer에 정보를 담아두고, 작업이 완료되면 device controller는 interrupt를 발생 시킨다.
- Interrupt가 발생하면 기본적으로 CPU의 제어권이 OS로 넘어가므로, CPU는 하던 일을 멈추고 Interrupt의 발생 원인 을 확인한다.
- local buffer에 저장되어 있던 값을 I/O 요청을 했던 프로그램의 메모리 공간에 copy하고 intterupt가 발생하기 이전의 프로그램으로 다시 돌아가 남은 한정된 시간동한 실행된다.
- timer는 사용자 프로그램에서 무한 반복 등의 문제로 CPU를 독점하는 상황을 대비해준다.
- CPU는 하나의 instruction이 실행된 후, interrupt line을 확인하고 난 뒤에 다음 instruction을 실행한다.
- timer가 interrupt를 발생시키면 CPU는 하던 일을 멈추고, CPU의 제어권이 사용자 프로그램으로부터 운영체제로 넘어 간다.
- timer에 기준 시간을 설정하면 OS는 다음 사용자 프로그램에 CPU의 제어권을 넘겨준다.
DMA Controller
CPU가 interrupt를 너무 많이 당해서 효율이 떨어지게 되는데 이 때문에 DMA controller를 가진다.
DMA Controller는 직접 메모리 접근이 가능한 controller이며 CPU와 DMA controller가 특정 메모리에 같이 접근하는 것을 방지하기 위해서 memory controller를 갖는다.
DMA controller가 I/O 작업 후 메모리에 데이터를 옮긴 뒤, CPU에는 interrupt를 한 번 발생시킴으로 오버헤드를 줄일 수 있다.
사용자 프로그램은 I/O device에 접근 가능한 특권 명령을 내릴 수 있는 권한이 없다.
그래서 CPU가 실행하고 있는 메모리 주소를 OS로 넘겨줘야 하는데, 사용자 프로그램은 운영체제의 메모리 주소를 참조할 수 있는 능력도 없다.
따라서 timer나 device controller와 같이 사용자 프로그램도 interrupt를 통해 CPU가 다음 명령어를 실행하기 전에 interrupt를 확인하고, mode bit을 0으로 변경하여, OS가 제어권을 가진 뒤 I/O요청을 해야 한다.
=> 이런 인터럽트 방식을 Trap(소프트웨어 인터럽트)라고 한다.
즉, I/O를 위해서는 2번의 intterupt가 발생한다. 소프트웨어 인터럽트(요청) 과 I/O작업 이후 하드웨어 인터럽트가 발생.
입출력 I/O의 수행
- 모든 입출력 명령은 특권 명령
- 사용자 프로그램은 어떻게 I/O를 하는가?
- 시스템 콜 : 사용자 프로그램은 운영체제에게 I/O요청
- trap을 사용하여 인터렙트 벡터의 특정 위치로 이동
- 제어권이 인터렙트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동
- 올바른 I/O요청인지 확인 후 I/O 실행
- I/O 완료 시 제어권을 시스템 콜 다음 명령으로 옮김
인터럽트
- 인터럽트 당한 시점의 레지스터와 program couter를 save 한 후 CPU의 제어를 인터럽트 처리 루틴에 남긴다.
넓은 의미의 인터럽트
- intterupt(하드웨어 인터럽트) :하드웨어가 발생시킨 인터럽트 (ex. 요청한 I/O가 끝난경우)
- Trap( 소프트웨어 인터럽트)
- Exception :프로그램이 오류를 범한 경우
- System call :프로그램이 커널 함수를 호출하는 경우
인터럽트 관련 용어
- 인터럽트 벡터
- 해당 인터럽트의 처리 루틴 주소를 가지고 있음
- 인터럽트 처리 루틴(=interrupt Service Routine, 인터럽트 핸들러)
- 해당 인터럽트를 처리하는 커널 함수
동기식 입출력과 비동기식 입출력
두 경우 모두 I/O 완료는 intterupt로 알려준다.
동기식 입출력
- I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감.
구현 방법 1
- I/O가 끝날 때 가지 CPU를 낭비시킴
- 매 시점 하나의 I/O만 일어날 수 있음
구현 방법 2
- I/O가 완료될 때 까지 해당 프로그램에게서 CPU를 빼앗음
- I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
- 다른 프로그램에게 CPU를 줌
비동기식 입출력
- I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감.
DMA ( Direct Memory Access)
- 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용
- CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송
- 바이트 단위가 아니라 block 단위로 interrupt 발생
서로 다른 입출력 명령어
좌측 (I/O를 수행하는 special instruction)
- I/O를 수행하는 일반적인 방식
- 메모리를 접근하는 instruction과 각 I/O device에 접근하는 instruction이 구분
- instruction과 같이 address도 구분
우측 (Memory Mapped I/O)
- I/O 장치 또한 메모리 주소에 연장 주소를 붙여 접근
저장장치 계층 구조
Primary(Executable)
- CPU가 직접 접근 가능
- 바이트 단위로 접근 가능한 매체이므로 CPU가 접근 가능
Secondary - CPU가 직접 접근 불가능 - 섹터 단위로 접근 가능하므로 CPU가 접근 불가능
=> 위로 갈수록 빠르고, 비싸다. Primary는 휘발성 , Secondary는 비휘발 성
Caching: 캐싱은 재사용을 목적으로 한다.
프로그램의 실행(메모리 load)
어떤 프로그램을 실행시키면 Virtual Memory에 그 프로그램의 주소 공간 생성
- 0번지 부터 시작
- code, data, stack 영역으로 이루어짐
모든 가상 메모리 주소 공간은 0번지 부터 시작하기 때문에 실제 물리 메모리 주소 값과는 차이가 있다.
Kernal Address space는 컴퓨터 부팅 시에 생성
- 프로세스들의 주소 공간은 프로세스가 실행되었을 때 생성되었다가 완료되면 사라짐
주소 공간을 모두 Physical Memory에 올리는 것이 아니라 필요한 부분만 올려서 메모리 낭비를 막는다.
필요하지 않는 부분은 디스크 공간의 Swap area에 둔다.
커널 주소 공간의 내용
Code 영역
커널 코드가 있다.
- 시스템 콜, 인터럽트 처리 코드
- 자원 관리를 위한 코드
- 편리한 서비스 제공을 위한 코드
Data 영역
- 운영체제는 CPU, Memory, Disk 등의 하드웨어를 관리
- 하드웨얼르 다루기 위한 자료구조를 내부적으로 정의 됨
운영체제는 Process들을 관리
- 각 프로그램들의 독자적인 주소공간을 관리하기 위해 자료구조인 PCB를 가짐
Stack 영역
- 운영체제의 코드는 사용자 프로그램들의 요청에 의해 호출
즉, 사용자 프로그램마다 커널 스택을 따로둔다.
사용자 프로그램이 사용하는 함수
사용자 정의 함수
- 자신의 프로그램에서 정의한 함수
- 프로세스 A의 주소 공간 내의 code영역에 존재한다.
라이브러리 함수
- 자신의 프로그램에서 정의하지 않고 갖다 쓴 함수
- 자신의 프로그램의 실행 파일에 포함
- 프로세스 A의 주소 공간 내의 code 영역에 존재
커널 함수
- 운영체제 프로그램의 함수
- 커널 함수의 호출 = 시스템 콜
- 커널 주소 공간 내의 code 영역에 존재.
프로그램의 실행
사용자 정의 함수나 라이브러리 함수를 호출하면 자신의 주소 공간의 code 영역 내에서 함수를 호출하므로 모드 전환이 없다.
system call하면 사용자 모드에서 커널 모드로의 전환이 발생
참고 URL
http://www.kocw.net/home/cview.do?cid=3646706b4347ef09
'운영체제(KOCW)' 카테고리의 다른 글
3차시. Process (0) | 2022.04.03 |
---|---|
Introduction to Operating System (0) | 2022.03.08 |