[KOCW 운영체제] 2강 컴퓨터 시스템 구조와 프로그램 실행(System Structure & Program Execution)
KOCW 이화여대 반효경 교수님의 운영체제(2014-1) 강의 정리입니다.
2강
- 컴퓨터 시스템에서 하드웨어의 동작
- 하드웨어 위에서의 프로그램의 실행
컴퓨터 시스템 구조
- CPU와 메모리로 구성된 것을 보통 컴퓨터라고 한다.
-
I/O device의 데이터가 컴퓨터로 들어가는 것을 Input이라고 하며, I/O device의 결과를 컴퓨터로 내보내는 것은 output이라고 한다.
- 메모리는 CPU의 작업 공간이다.
- CPU는 메모리에서 기계어를 읽어서 실행한다.
- 디스크는 Input, Output device의 역할을 모두 수행한다.
- I/O device를 전담하는 작은 CPU 같은 Device Controller가 있다.
- Device Controller를 위한 작업 공간을 Local Buffer라고 한다.
CPU
- Register
- 정보를 저장하는 공간이다.
- Mode Bit
-
CPU안에서 실행되는 프로그램이 운영체제인지 사용자 프로그램인지를 구분해준다.
-
사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치 필요.
- Mode Bit을 통해 하드웨어적으로 두 가지 모드의 Operation 지원.
- 1 사용자 모드: 사용자 프로그램 수행.
-
0 모니터 모드: OS 코드 수행.
- 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 특권명령으로 규정.
- Interrupt나 Exception 발생 시 하드웨어가 Mode Bit을 0으로 바꾼다.
-
사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 셋팅.
모니터 모드(= 커널 모드, 시스템 모드)
- Mode Bit을 통해 하드웨어적으로 두 가지 모드의 Operation 지원.
-
- Interrupt Line
- 메모리 접근을 하면서 명령어를 실행하는 동안 I/O Device, Timer에서 들어온다.
-
Interrupt가 들어오면 프로그램의 CPU 사용 제어권이 OS로 넘어간다.
- 인터럽트(Interrupt)
- 일반적으로 하드웨어 인터럽트를 말한다.
-
인터럽트 당한 시점의 레지스터와 Program Counter(메모리 주소를 가리키고 있는 레지스터)를 저장한 후, CPU의 제어를 인터럽트 처리 루틴에 넘긴다.
- 하드웨어 인터럽트(Interrupt)
- 하드웨어가 발생시킨 인터럽트
- 소프트웨어 인터럽트(Trap)
- Exception: 프로그램이 오류를 범한 경우
- System Call: 프로그램이 커널 함수를 호출하는 경우
- 💡 인터럽트 관련 용어
- 인터럽트 벡터
- 해당 인터럽트의 처리 루틴 주소를 가지고 있다(각 인터럽트 마다 어디에 있는 함수를 실행해야 하는지 알 수 있다).
- 인터럽트 처리 루틴(=Interrupt Service Routine, 인터럽트 핸들러)
- 해당 인터럽트를 처리하는 커널 함수.
- 인터럽트 벡터
Timer
- CPU를 특정 프로그램이 독점하는 것으로부터 보호한다.
- 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시킨다.
- 타이머는 매 클럭 틱 때마다 1씩 감소.
- 타이머 값이 0이 되면 타이머 인터럽트 발생.
- 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시킨다.
- Time Sharing을 구현하기 위해 널리 이용된다.
- 현재 시간을 계산하기 위해서도 사용한다.
Device Controller
- 해당 I/O 장치유형을 관리하는 일종의 작은 CPU
- (CPU가 지시한)제어 정보를 위해 Control Register, Status Register를 가진다.
- Local Buffer(일종의 Data Register)를 가진다.
- I/O는 실제 Device와 Local Buffer 사이에서 일어난다.
-
Device Controller는 I/O가 끝났을 경우 Interrupt로 CPU에 그 사실을 알린다.
Device Driver(장치 구동기)
- OS 코드 중 각 장치별 처리 루틴 👉 Software
- 각 하드웨어에 접근하기 위한 매개체(?)
Device Controller(장치 제어기)
- 각 장치를 통제하는 일종의 작은 CPU 👉 Hardware
DMA(Direct Memory Access) Controller
- CPU와 같이 메모리에 직접 접근할 수 있는 Controller.
- CPU의 중재없이 Device Controller가 Device의 Buffer Storage의 내용을 메모리에 Block 단위로 직접 전송.
- I/O Device로부터 CPU에 들어오는 인터럽트를 대신 처리해준다.
- 바이트 단위가 아니라 Block 단위로 인터럽트를 발생시킨다.
- 💡 CPU와 CMA Controller가 동시에 접근 시 이를 제어할 수 있도록 Memory Controller가 있다.
입출력(I/O)의 수행
- 운영체제를 통해서만 I/O 장치에 접근할 수 있다.
-
모든 입출력 명령은 특권 명령이다.
-
사용자 프로그램이 I/O를 하는 과정
- 시스템 콜(System Call)
- 사용자 프로그램이 운영체제의 서비스를 받기 위해 (운영체제) 커널 함수를 호출하는 것.
- 프로그램은 운영체제에게 요청을 하기 위해서 CPU에 인터럽트를 걸 수 있다. 👉 소프트웨어 인터럽트
- 따라서, Mode Bit이 0으로 바뀌고, CPU 제어권이 운영체제로 넘어가고 운영체제는 해당 I/O 장치에 요청할 수 있게 된다.
- Trap을 사용하여 인터럽트 벡터의 특정 위치로 이동.
- 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동.
- 올바른 I/O 요청인지 확인 후 I/O 수행.
- I/O 완료 시 제어권을 시스템콜 다음 명령으로 옮긴다.
- I/O가 끝나면 이를 CPU에게 알린다. 👉 하드웨어 인터럽트
- 시스템 콜(System Call)
동기식 입출력과 비동기식 입출력
- 동기식 입출력(Synchronous I/O)
- I/O 요청 후 입출력 작업이 완료된 후에 제어가 사용자 프로그램에 넘어간다.
-
일반적으로 read 수행 시.
- 구현 방법 1
- I/O가 끝날 때까지 CPU를 낭비시킨다.
- 매 시점 하나의 I/O만 일어날 수 있다
- 구현 방법 2
- I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗는다.
- I/O 처리를 기다리는 줄에 그 프로그램을 줄 세운다.
- 다른 프로그램에게 CPU를 준다.
- 비동기식 입출력(asynchronous I/O)
- I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고, 제어가 사용자 프로그램에 즉시 넘어간다.
- I/O 요청 후, I/O와 무관한 일을 계속 진행.
- 일반적으로 write 수행 시.
- I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고, 제어가 사용자 프로그램에 즉시 넘어간다.
- 두 경우 모두 I/O의 완료는 인터럽트로 알려준다.
서로 다른 입출력 명령어
- I/O를 수행하는 Special Instruction에 의해 수행(좌측 그림)
- 메모리를 수행하는 명령어가 따로 있고, I/O를 수행하려면 Special Instruction에 의해 수행하는 방식.
- Memory Mapped I/O에 의해 수행(우측 그림)
- I/O Device에도 메모리 주소의 연장 주소를 붙이고, 주소에 의해 접근하는 방식.
저장장치 계층 구조
-
위로 갈수록 속도가 빠른 매체를 사용하고, 단위 공간당 가격이 비싸기 때문에 용량이 적다.
- Primary
- 휘발성 매체로 구성.
- CPU에서 직접 접근할 수 있는 메모리 매체.
- CPU가 직접 접근하기 위해서는 바이트 단위로 접근 가능한 매체여야 한다.
- Secondary
- 비휘발성 매체로 구성.
-
하드디스크는 섹터 단위로 접근이 가능하기 때문에 CPU에서 직접 접근하기 못한다.
Caching
- 다른 매체로부터 정보를 읽어들여서 쓰는 것.
- 재사용을 목적으로 한다.
프로그램의 실행(메모리 load)
- 프로그램은 실행파일 형태로 파일 시스템(비휘발성)에 저장되어 있고, 실행시키면 메모리에 올라가서 프로세스가 된다.
- 정확하게는 물리적 메모리에 올라가기 전에 가상 메모리라는 한 단계를 더 거치게 된다.
- 각 프로그램의 독자적인 메모리 공간을 가상 메모리라고 한다.
- 프로그램을 실행시키면, 해당 프로그램만의 메모리 주소 공간이 형성된다. 이를 물리적 메모리에 올려서 실행한다.
- 사용자 프로그램의 필요한 부분만 올리고, 그렇지 않은 부분은 디스크의 Swap Area에 올려둔다.
- Swap Area는 메모리의 연장 공간으로 사용한다.
-
물리적 메모리에서 커널은 메모리에 항상 올라가 있지만, 사용자 프로그램은 종료 시 사라진다.
Kernel Address Space
- Code: CPU에서 실행할 기계어 코드
- Data: 변수 등 프로그램이 사용하는 자료구조
- Stack: 함수를 호출하거나 실행할 때 사용
- Address Transition
- 가상 메모리의 주소는 물리적 메모리의 주소로 변환.
운영체제 커널 주소 공간의 내용
- Data
- 운영체제에서 사용하는 자료구조가 정의되어 있다.
- CPU, 메모리, 디스크와 같은 하드웨어를 관리하기 위한 자료구조를 만들어서 정의하고 있다.
- 프로세스를 관리하기 위한 자료구조(PCB, Process Control Block)를 만들어서 정의하고 있다.
- Stack
- 어떤 사용자 프로그램들이 운영체제 커널의 코드를 실행 중인가를 저장.
사용자 프로그램이 사용하는 함수
-
함수(function)
- 사용자 정의 함수
- 자신의 프로그램에서 정의한 함수.
- 라이브러리 함수
- 자신의 프로그램에서 정의하지 않고 갖다 쓴 함수.
- 자신의 프로그램의 실행 파일에 포함되어 있다.
- 사용자 정의 함수와 라이브러리 함수는 프로그램끼리 점프를 하여 함수에 접근할 수 있다.
- 커널 함수
- 운영체제 안에서 정의된 함수.
- 커널 함수의 호출 = 시스템 콜.
- 시스템 콜을 통해서만 접근 가능하다.
- 사용자 정의 함수