-
CPU의 작업공간이 Memory 이기 때문에 CPU는 매순간(클럭) Memory로부터 기계어를 하나씩 읽어 실행한다.
-
하드 디스크 = 보조기억장치, Input & Output Device
-
Device Controller
- 각 디바이스를 전담하는 작은 CPU 역할을 함
- IO Device에 작업을 지시함
-
Local Buffer : 디바이스의 작업공간
-
CPU와 IO장치의 작업 속도 차이가 큼
-
레지스터 : 메모리보다 더 빠르면서 정보를 저장할 수 있는 작업 공간
-
Mode Bit : CPU에서 실행되는 것이 운영체제인지 사용자 프로그램인지 구분하는 것
-
Interrupt Line
- CPU는 메모리의 인스트럭션만 실행함 → CPU를 프로그램 A가 쓰고 있다면 키보드에서 읽어오거나 화면에 출력하거나 등의 IO Device의 결과를 CPU에게 전달하기 위해 Interrupt Line을 사용함
- 인터럽트 작업이 들어있는 것오
-
CPU는 메모리 접근을 하다가 IO 작업이 필요할 경우, Device Controller에 작업을 시키고 그동안 메모리를 접근하여 작업을 하고 있음
-
CPU는 빠르면서 쉬지 않고 작업을 처리한다.
-
만약 무한루프를 도는 프로그램을 실행한다면 프로그램이 종료되지 않고 CPU를 계속해서 사용하게 된다 → Time sharing을 구현할 수 없게 됨
-
⇒ Timer : 특정 프로그램이 CPU를 독점하는 것을 막음
- Timer에 값을 세팅하고 사용자 프로그램으로 넘겨줌 → 세팅된 시간이 되면 timer가 CPU에 interrupt 함
-
프로그램 A에서 IO가 필요할 경우, CPU를 OS에게 넘김
- 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치 필요
- Mode bit을 통해 하드웨어적으로 두 가지 모드의 operation 지원
1 사용자 모드 : 사용자 프로그램 수행
0 모니터 모드 : OS 코드 수행
* 모니터 모드 = 커널 모드, 시스템 모드
-
보안을 해칠 수 있는 주요한 명령어는 모니터 모드에서만 수행 가능한 ‘특권명령’으로 규정
-
Mode bit이 0일때는 모든 것을 CPU에서 실행할 수 있음
-
1일때는 실행할 수 있는 것이 한정적임
-
Interrupt나 Exception 발생시 하드웨어가 mode bit을 0으로
-
사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 셋팅
- 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시킴
- 타이머는 매 클럭 틱 때마다 1씩 감소
- 타이머 값이 0이 되면 타이머 인터럽트 발생
- CPU를 특정 프로그램이 독점하는 것으로부터 보호
- 타이머는 time sharing을 구현하기 위해 널리 이용됨
- 타이머는 현재 시간을 계산하기 위해서도 사용
- I/O device controller
- 해당 I/O 장치유형을 관리하는 일종의 작은 CPU
- 제어 정보를 위해 control register, status register를 가짐 → CPU가 일을 시킬 때
해당 레지스터로 어떠한 일을 하라
고 지시할때 사용함 - 데이터를 저장하는 Local buffer를 가짐(일종의 data register) → device쪽은 처리한 data를 CPU로 보내거나 CPU에서 보내온 데이터를 local buffer에 담아두고 명령은 제어 레지스터로 처리
- I/O는 실제 device와 local buffer 사이에서 일어남
- Device controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알림
- 용어 정리
- device driver(장치구동기) : OS 코드 중 각 장치별 처리루틴 → software
- device contoller(장치제어기) : 각 장치를 통제하는 일정의 작은 CPU → hardware
- 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용(빠른 입출력 장치 → 빈번한 인터럽트)
- CPU의 중재없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송
- 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴
- 메모리를 접근할 수 있는 장치
- 메모리를 CPU도 접근할 수 있고 DMA도 접근할 수 있음
- 누가 먼저 접근하게 할지 교통정리를 해줌
- IO 장치가 자주 인터럽트를 하여 CPU가 방해받는 것을 방지
- CPU를 더욱 효율적으로 사용할 수 있음
- 모든 입출력 명령은 특권 명령
- 사용자 프로그램의 I/O 절차(파일을 읽어오던 키보드 입력을 받던 등등)
- 시스템콜(system call) : 사용자 프로그램은 운영체제에게 I/O 요청
- Trap을 사용하여 인터럽트 벡터의 특정위치로 이동
- 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동
- 올바른 I/O 요청인지 확인 후 I/O 수행
- I/O 완료 시 제어권을 시스템콜 다음 명령으로 옮김
- 인터럽트 당한 시점의 레지스터와 program counter를 save 한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다
- Interrupt(넓은 의미)
- Interrupt(하드웨어 인터럽트) : 하드웨어가 발생시킨 인터럽트
- Trap(소프트웨어 인터럽트)
- Exception : 프로그램이 오류를 범한 경우
- System call : 프로그램이 커널 함수를 호출하는 경우
- 관련 용어
- 인터럽트 벡터 : 해당 인터럽트의 처리 루틴 주소를 가지고 있음
- 인터럽트 처리 루틴(Interrupt Service Routine, 인터럽트 핸들러) : 해달 인터럽트를 처리하는 커널 함수
- 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것
- I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감
- 구현방법 1
- I/O가 끝날 때까지 CPU를 낭비시킴
- 매시점 하나의 I/O만 일어날 수 있음
- 구현방법 2
- I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음
- I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
- 다른 프로그램에게 CPU를 줌
- I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감
⇒ 두 경우 모두 I/O의 완료는 인터럽트 알려줌
- I/O를 수행하는 special instruction 에 의해
- Memory address와 device address를 구분하여 둠
- Memory Mapped I/O에 의해
- Device에도 memory address 부여
Registers ↔ Cache Memory ↔ Main Memory ↔ / Disk
Primary(Executable) : CPU에서 직접 접근가능 / Secondary
* Speed(빠름/느림), Cost(비쌈/쌈), Volatility(휘발성/비휘발성)
- Caching
- 더 빠른 저장시스템으로 정보를 복사함
- 당장 필요한 정보만 읽어서 씀(상단으로 갈수록 용량은 작고, 속도는 빠름 → 더 빠르지만 용량 작은 저장매체로 데이터를 보냄)
- 하단에서 불러올 필요가 없이 미리 저장해둔 데이터를 바로 사용
- 목적 : 재사용
- PCB : 프로세스마다 생성됨
-
함수(fuction)
- 사용자 정의 함수 : 자신의 프로그램에서 정의한 함수
- 라이브러리 함수 : 자신의 프로그램에서 정의하지 않고 갖다 쓴 함수
- 자신의 프로그램의 실행 파일에 포함되어 있음
- 기능이 유용해서 누군가가 미리 만들어 둔 것
⇒ 사용자정의, 라이브러리 → 컴파일해서 실행파일을 만들면 실행파일 안에 함수들이 포함되어 있음
호출 : 프로세스 A의 Address space → code 호출(점프 가능)
- 커널 함수 : 운영체제 프로그램의 함수
- 커널 함수의 호출 = 시스템 콜
⇒ 커널코드 안에 들어있는 함수
호출 : Kernel Address space → code 호출(점프 불가 → 시스템 콜)