운영체제를 설명하기에 앞서, 하드웨어적인 것을 설명
CPU와 메모리로 구성된 컴퓨터와 그 외 I/O Device로 구성
컨트롤러들이 각 디바이스에 붙어있어서 작은 CPU 역할을 함
이 역할을 하는데 필요한 작은공간 → local buffer
라고 함
CPU는 메모리로부터 하나의 instruction
가져와 실행시키는 역할(program counter 주소에서 가져와 명령 실행)
register
: CPU 안에 메모리보다 더 빠르면서 정보를 저장할 수 있는 작은 공간
mode bit
: 사용자의 프로그램인지 OS인지 구별하는 역할
Interrupt line
: CPU는 항상 메모리에 있는 instruction을 실행시키는데, 키보드나 디스크와 같이 I/O Device에서 어떤 요청이 들어왔을 때, 이를 인터럽트 라인에 세팅하고 마이크로 프로세서에게 알려 처리하도록 함
timer: 사용자 프로그램중 무한루프틑 도는 것과 같은 프로그램이 있을 때, 타이머를 이용하여 CPU를 선점할 수 있는 시간을 설정하여 이를 방지함. (추가적인 하드웨어, Time sharing을 위한 것)
프로그램에서 키보드 입력 요구(트랩이라는 소프트웨어 인터럽트를 발생시켜 시스템 콜을 함)을 이용하여 인터럽트 벡터가 가리키는 서비스 루틴실행
⬇️
I/O Controller가 요청한 작업이 끝남(키보드를 두드려서 입력한 데이터가 버퍼에 들어옴)
⬇️
키보드 컨트롤러가 CPU에 인터럽트(하드웨어 인터럽트)를 검
⬇️
인터럽트가 들어오면 CPU 제어권이 프로그램에서 OS로 넘어감
⬇️
운영체제가 인터럽트가 왜 들어왔는지 살펴보고, 입력된 키보드 값을 요청한 프로그램의 메모리공간에 카피
⬇️
방금까지 CPU를 점유하고 있던 프로그램에게 다시 제어권 양도(timer값이 남아 있다면)
디스크를 읽는 과정도 동일함(디스크 컨트롤러가 다 읽으면 인터럽트걸고 순차적으로 진행)
사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호장치
즉, 현재 권한이 커널모드냐, 사용자 모드냐에 따라 자원에 접근할 수 있는 권한을 부여
Mode bit을 통해 하드웨어적으로 두 가지 모드의 operation 지원
1 사용자 모드: 사용자 프로그램 수행
0 모니터 모드: OS 코드 수행
Interrupt
나 Exception
발생 시 하드웨어가 mode bit을 0으로 바꿈모니터모드: 커널모드, 시스템 모드
이 타이머는 time sharing을 구현하기 위해 널리 이용된다. 또한 현재 시간을 계산하기 위해서도 사용된다.
I/O device controller
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
CPU에 인터럽트가 많이 걸리면 효율적으로 동작할 수 없음. 그래서 DMA(Direct Memory Access) controller가 생김
원칙적으로 메모리에 CPU만 접근할 수 있지만, DMA를 두게 되면 CPU도 접근할 수 있고 DMA도 접근 가능.
둘이 접근하는 것을 중재하는 역할을 memory controller가 제어
DMA 컨트롤러의 역할은 I/O Device의 인터럽트가 발생했을 때, 로컬 버퍼에 있는 내용을 메모리에 복사하여(메모리에 block 단위로 직접 전송) 그 작업이 다끝나면 CPU에 인터럽트 한번만 걸어서 보고를 함.
모든 입출력 명령은 특권 명령이다.
사용자 프로그램은 그럼 어떻게 I/O를 하는가?
인터럽트
Interrupt (넓은 의미)
인터럽트 관련 용어
→ 인터럽트의 종류가 여러개 있고, 각각 해야할 일이 다르기 때문에 각 인터럽트가 처리해야할 일을 인터럽트 처리 루틴에 담아둠
어디에 있는 함수들을 실행해야 하는지? → 인터럽트 벡터에 명시해둠
현대의 운영체제는 인터럽트에 의해 구동됨
동기식 입출력 (synchronous I/O)
비동기식 입출력 (asynchronous I/O)
두 경우 모두 I/O의 완료는 인터럽트로 알려줌
special instruction
에 의해Memory Mapped I/O
에 의해좌측에 있는 그림은 메모리 접근하는 instruction
따로, I/O를 위한 special instruction
을 위한 것 따로를 구분해놓은것
우측에 있는 그림은 I/O 장치도 메모리의 연산주소를 붙여서 같이 접근(ex: 100번대 메모리 주소, 1000번대 I/O 주소) → 이를 memory Mapped I/O
라고 부름
위 3가지는 바이트 단위로 접근이 가능하기 때문에 CPU가 실행시킬 수 있음. 세컨더리 부분은 섹터 단위로 접근
프로그램은 파일형태로 파일시스템에 존재
프로그램을 실행시키게 되면 가상메모리를 거쳐 물리적인 메모리로 올라감(메모리 주소 변환이라는 하드웨어 계층을 통해)
어떤 프로그램을 실행시키게 되면 주소공간 형성 → 프로세스 A의 Address space (stack, data, code)
이를 물리적인 메모리에 올려서 사용하는데, 다 올리면 메모리가 부족하기 때문에 당장 필요한 부분만 올려서 사용
스왑 공간이라는 disk에 나머지 저장하고, 전원이 나가면 안에 있는 데이터가 의미없어짐(파일 시스템은 영구 보존의 목적!)
code: 커널 자체의 코드
data: 하드웨어 관리를 위한 자료구조, PCB(현재 실행중인 프로그램을 관리하기 위한 자료구조)
stack: 운영체제도 함수 구조로 짜여있기 때문에 stack을 이용
함수(function)
사용자 정의, 라이브러리 함수는 프로세스의 주소 공간에 있고, 커널 함수는 커널 주소 공간에 있음
커널 함수를 실행하려면 system call
을 통해 실행시켜야 함!
프로세스 A의 관점에서 본 프로그램 실행 과정