KOCW에 공개된 이화여대 반효경 교수님 운영체제 강의를 수강 후 정리한 내용입니다.
1. 컴퓨터 시스템 구조
- memory: CPU 작업 공간
- CPU는 매순간 memory에서 instruction을 읽어와 실행
- CPU
- mode bit: 실행되고 있는 프로그램이 운영체제인지 사용자 프로그램인지를 구분
- 0: 커널 모드(OS 코드 수행), 1: 사용자 모드(사용자 프로그램 수행)
- 0인 경우, 메모리, IO 장치 접근 등 모든 일을 수행할 수 있도록 정의 됨. IO 장치에 접근하는 모든 작업은 mode bit이 0일 때만 실행될 수 있도록 함
- 1인 경우, 제한된 instruction만 실행 가능 (보안상의 문제)
- interrupt line: CPU와 IO 장치와 통신해야할 때 사용
- 하드웨어 인터럽트(Interrupt): 하드웨어가 발생시킨 인터럽트
- 소프트웨어 인터럽트(Trap): Exception(프로그램이 오류를 범한 경우), System call( 프로그램이 커널 함수를 호출하는 경우)
- 인터럽트 벡터: 해당 인터럽트의 처리 루틴 주소를 가지고 있음
- 인터럽트 처리 루틴 (Interrupt Service Routine): 해당 인터럽트를 처리하는 커널 함수
- CPU의 레지스터 중에서 메모리 주소를 가리키고 있는 PC의 값에 해당하는 주소를 메모리에서 읽어와 명령어를 실행 (일반적으로 PC의 값은 4씩 증가)
- 하나의 명령어 실행이 끝날 때마다 interrupt line 체크. 인터럽트가 들어오면 하던 작업을 멈추게 되고 CPU의 제어권이 운영체제에게 넘어감. 운영체제는 인터럽트 벡터를 확인해 인터럽트 처리 루틴을 실행
- CPU의 전체적인 통제를 OS가 수행
- timer
- 무한루프를 도는 프로그램이 CPU에게 할당되면 CPU는 다른 작업을 수행할 수 없게됨
- 특정 프로그램이 CPU를 독점하는 것을 막는 역할을 수행
- timer에 일정한 값을 정해준 후에 사용자 프로그램에게 CPU를 넘겨줌
- 일정 시간이 지나면 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시킴
- IO device
- device controller가 IO device마다 존재해 IO device를 제어
- local buffer: IO 장치의 작업 공간. 실제 데이터 저장
- device driver: OS 코드 중 각 장치별 처리루틴 (소프트웨어)
- device controller: 각 장치를 통제하는 일종의 작은 CPU (하드웨어)
- DMA(Direct Memory Access) controller
- IO 장치가 너무 자주 인터럽트를 걸어서 CPU가 방해를 받기 때문에 이것을 방지하기 위해 존재
- 직접 메모리에 접근할 수 있는 controller
- 메모리에는 CPU와 DMA가 접근 가능
- CPU와 DMA가 메모리에 동시에 접근할 때 memory controller가 접근 순서를 조율해주는 역할을 함
- CPU는 계속해서 하던 일을 진행하고 IO 장치의 local buffer에 정보가 읽거나 쓰여지면 DMA가 메모리에 정보를 저장해주는 역할을 수행한 후 CPU에게 인터럽트를 걸어줌
- CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송
- 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴
사용자 프로그램은 어떻게 IO를 수행?
- 시스템콜(system call): 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것
- 사용자 프로그램이 interrupt line을 setting하면 CPU 제어권이 운영체제에게 넘어감
- trap을 사용하여 인터럽트 벡터의 특정 위치로 이동
- 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동
- 올바른 IO 요청인지 확인 후 IO 수행
- IO 완료 시 제어권을 시스템콜 다음 명령으로 옮김
- IO를 요청할 때는 소프트웨어 인터럽트를 사용하고 IO 수행이 끝나면 하드웨어 인터럽트 사용
2. 동기식 입출력과 비동기식 입출력
- 두 경우 모두 IO가 완료되었다는 것을 인터럽트를 통해 알려줌
1. 동기식 입출력(synchronous I/O)
- IO 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감
- IO 장치까지 가서 내용을 확인한 후 읽어와서 확인한 후 작업
- ex) IO 장치에게 무언가를 쓰라고 했을 때, 명령을 내린 후 다른 작업을 수행하는 것이 아니라 IO 장치에 가서 내용이 쓰였는지 확인한 후 다른 작업을 수행
구현 방법 1
- IO가 끝날 때까지 CPU를 낭비시킴
- 매시점 하나의 IO만 일어날 수 있기 때문에 IO 장치도 낭비됨
구현 방법 2
- IO가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음
- IO 처리를 기다리는 줄에 그 프로그램을 줄 세움
- 다른 프로그램에게 CPU를 줌
2. 비동기식 입출력(asynchronous I/O)
- IO가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감
동기식 입출력과 비동기식 입출력의 차이점
- 프로세스가 입출력이 완료될 때까지 아무 일도하지 않고 기다리게 되면 동기식 입출력, 사용자 프로세스가 입출력 요청을 한 뒤 입출력이 진행되는 동안 그 프로세스가 바로 CPU를 잡아 다른 instruction을 실행하는 경우는 비동기식 입출력
- 프로세스가 CPU를 가지고 있든 가지고 있지 않든 상관없이 프로세스가 입출력을 실행을 기다리면 동기식, 기다리지 않으면 비동기식 입출력
3. 서로 다른 입출력 명령어
- 왼쪽 그림: 메모리에 접근하는 instruction과 IO 장치에 접근하는 instruction이 따로 존재
- 오른쪽 그림: 메모리에 접근하는 instruction을 통해 IO 장치에 접근 =< memory-mapped IO
4. 저장장치 계층 구조
- 위로 갈수록 속도가 빠르고, 가격이 비싸지고, 용량이 적어짐
- CPU가 직접 접근 가능한 것을 Primary(Executable, byte 단위로 접근 가능하다는 것을 의미), 직접 접근하지 못하는 것을 Secondary라고 부름
- main memory(DRAM), cache memory(SRAM), 레지스터는 휘발성
- secondary는 비휘발성
5. 프로그램 실행
1. 메모리 load
- virtual memory: 각 프로그램마다 독자적으로 가지고 있는 메모리 주소
- 프로세스에서 당장 필요한 부분은 physical memory에 올려두고 당장 필요하지 않은 부분은 disk의 swap area 부분에 올려놓음
- swap area는 메모리 용량의 한계로 하드 디스크를 메모리 연장 공간으로 사용하는 부분을 의미
2. 커널 주소 공간의 내용
- data: 운영체제가 사용하는 여러 자료구조들이 들어있는 공간
- 하드웨어를 관리하고 처리하는데 각각의 하드웨어마다 자료구조를 하나씩 만들어서 관리
- 운영체제는 프로세스도 관리. 프로세스를 관리하기 위한 자료구조가 PCB(Process Control Block)
- stack: 함수를 호출하거나 리턴할 때 사용하는 공간
- 사용자 프로세스마다 커널의 스택을 따로 두고 있음
사용자 프로그램이 사용하는 함수
- 사용자 정의 함수
- 라이브러리 함수
- 자신의 프로그램에서 정의하지 않고 가져다 쓴 함수
- 자신의 프로그램 실행 파일에 포함되어 있음
- 커널 함수
- 운영체제 프로그램의 함수
- 커널 함수의 호출 = 시스템 콜
3. 프로그램의 실행
2추자 강의 끝
게시물에 사용된 사진은 강의 내용을 캡쳐한 것입니다.