특별한 일이 없다면 CPU는 항상 다음의 instruction을 순차적으로 실행한다. 이때 이 instruction의 주소는 PC(Program Counter)를 통해 알 수 있다.
CPU는 다음 instruction을 실행하기 전에 interrupt line을 확인한다. interrupt가 발생했다면 프로그램이 실행중이더라도 멈추고 자동으로 CPU의 제어권이 운영체제로 넘어가게 된다.
I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어간다. I/O 작업이 진행되는 동안 기다린다.
synch는 서로 맞추는 걸 얘기한다. 가수가 노래를 부를때 립싱크가 맞는다면 싱크가 맞는다고 하는걸 생각하면 된다.
I/O 까지 가서 뭐가 적혀있는지 직접 확인하고 읽어와 그걸 보고 작업하는 것이다.
보통은 Synchronous 로 동작하도록 한 뒤 I/O 작업이 오래 걸리니 다른 프로그램에 CPU를 준다.
A 프로그램 실행 -> I/O 요청 -> 기다리면서 B 프로그램 실행 -> I/O 작업 끝 -> CPU 제어권 운영체제로 넘어감 -> local buffer의 데이터 복사해옴 -> B 프로그램으로 제어권 넘김 -> B 프로그램 끝 -> A 프로그램 실행
I/O 에게 쓰라고 하고 다른 일을 하고 있는 것이다.
I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어간다.
write의 경우 출력이 어떻게 되든 다음작업을 할 수 있는 경우가 많다. 따라서 비동기 방식이 더 자연스럽다.
A 프로그램 실행 -> I/O 요청 -> 기다리지 않고 A 프로그램 실행 -> I/O 작업 끝 -> CPU 제어권 운영체제로 넘어감 -> local buffer의 데이터 복사해옴 -> A 프로그램으로 제어권 넘김 -> A 프로그램 끝
두 경우의 I/O 작업 완료는 모두 interrupt가 알려준다.
원래는 메모리에 접근할 수 있는 것이 CPU 밖에 없으나 I/O 작업 등에서 interrupt 가 너무 많이 일어나 CPU가 효율적으로 일하지 못한다. 그래서 메모리에 접근할 수 있는 DMA를 둬 local buffer의 특정 크기의 데이터가 쌓이면 local buffer의 데이터를 메모리에 복사해주고 I/O가 끝났음을 CPU에게 interrupt를 걸어 알려준다. 따라서 interrupt 횟수가 줄어든다.
빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용한다.
CPU의 중재 없이 device controller가 device 의 buffer storage의 내용을 메모리에 block 단위로 직접 전송한다. 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킨다.
I/O를 할 수 있는 방법이 두가지 있다.
CPU에서 실행할 수 있는 instruction는 메모리의
일반적인 방식
Memory Mapped I/O
아래의 세가지로 구분할 수 있다.
CPU가 접근하려면 바이트 단위로 접근할 수 있어야 한다. primary storage만 CPU가 직접 접근할 수 있다.
위로 읽어놓고 재사용하기 위해 caching을 한다. 하지만 primary들은 메모리가 작기 때문에 적절하게 데이터를 관리 해야한다.
프로그램이란 것은 실행파일의 형태로 File system에 저장되어 있다. 프로그램을 실행한다고 바로 물리적인 메모리로 가진 않고 중간에 있는 것이 가상 메모리 이다. 각 싪행 파일이 실행되면 각 프로그램 마다 독자적인 주소 공간이 만들어진다. stack(함수를 호출하거나 리턴할 때 사용하는 용도), data(전역 변수, 사용하는 자료구조), code(코드)를 담고 있다.
컴퓨터를 부팅하고 나면 커널 영역은 항상 메모리에 상주해있지만 프로그램은 아니다. 사용되지 않는 메모리를 쫓아내기도 하고, 모든 데이터가 올라오지 않고 당장 필요한 메모리만 물리적인 메모리에 올려놓고 아닌 것은 disk의 swap 영역에 내려놓는다. 따라서 실행파일의 메모리는 연속적으로 저장되어 있지 않고 쪼개져 각각 물리 메모리와 swap 영역에 저장된다.
virtual 메모리란 각 실행파일의 독자적인 주소공간이다. 전원이 꺼지면 file system의 파일들은 보존이 되지만, 물리 메모리와 swap area에 있는 데이터들은 프로세스가 종료되기 때문에 의미가 없어진다.
주소가 독자적이므로 virtual memory에서의 주소와 물리 메모리에서의 주소가 다르다. 따라서 주소 변환이 이루어져야 하는데 이를 해주는것이 따로 있다.
운영체제의 코드는 여러 프로그램들이 요청에 따라 불러 사용할 수 있다. 따라서 사용자 프로그램들이 사용할 수 있다.
운영체제가 사용하는 여러 자료구조가 정의되어 있다.
하드웨어들을 관리하고 통제하기 때문에 하드웨어의 종류마다 자료구조를 하나씩 만들어 관리한다.
또한 운영체제들은 process들을 관리 하기 위한 자료구조가 필요하다.
함수를 호출하거나 return 할 때 사용한다.
어떤 사용자 프로그램이 커널의 코드를 사용하는지 process 별로 독자적인 커널 스택을 가진다.
자신의 프로그램에서 정의한 함수
자신이 직접 작성한 함수이다.
자신의 프로그램에서 정의하지 않고 갖다 쓴 함수
자신의 프로그램의 실행 파일에 포함되어 있다.
기능이 워낙 유용해 다른이가 작성해놓고 그걸 가져다 사용한다.
사용자 정의 함수, 라이브러리 함수 모두 프로그램을 실행하면 각각의 실행파일의 virtual memory에 할당된다.
운영체제 프로그램의 함수
커널 함수의 호출 = 시스템 콜 (CPU의 제어권을 넘겨 실행한다. )
내 프로그램 안에 들어있는 함수가 아니므로 kernel 주소 공간에 정의되어 있다.
Operating System Concepts 10th
KOCW 강의 - [운영체제] 이화여자대학교 반효경 교수