운영체제 강의노트 정리 - 컴퓨터 시스템 구조
컴퓨터 시스템 구조
컴퓨터 시스템의 동작
공유된 주기억 장치에 접근을 제공하는 공통 버스에 의해 연결된 CPU와 여러 개의 장치 제어기device controller로 구성되어 있다.
장치 제어기는 디스크, 오디오 장치 등 각 장치를 관리하며, CPU와 병행으로 수행되어 주기억 장치에 대한 접근에 대하여 경쟁한다. 주기억 장치 제어기는 이들의 접근을 동기화하는 역할을 맡는다.
컴퓨터를 부팅하면 부트스트랩 프로그램bootstrap program이 실행된다. 이 프로그램은 일반적으로 ROM에 저장되어 있다.
부트스트랩 프로그램은 모든 하드웨어를 초기화하고, 운영체제 커널을 주기억 장치에 적재하고, 커널을 실행한다.
컴퓨터에서 사건의 발생은 인터럽트interrupt 또는 트랩trap(예외exception)을 통해 운영체제에 통보된다.
- 인터럽트는 하드웨어에 의한 것이고, 트랩은 소프트웨어에 의한 것이다.
- 하드웨어는 CPU에 특정 신호를 보내어 인터럽트의 발생을 알린다.
- 소프트웨어는 시스템 호출system call을 실행하여 트랩을 발생시키며, 0으로 나누기와 같은 오류가 발생하면 트랩이 자발적으로 발생된다.
- 인터럽트가 발생하면 CPU는 현재 수행 중인 작업을 멈추고, 운영체제에 있는 특정 코드를 실행한 후, 멈춘 작업을 재개한다.
- 현재 작업을 멈추고 현재 상태를 보관
- 인터럽트의 종류 분석
- 특정 인터럽트 수행
- 보관된 상태를 원상복귀시키고 멈춘 작업을 재개
I/O 구조
하나 이상의 장치가 장치 제어기에 연결될 수 있으며, 장치 제어기는 지역 버퍼와 몇 개의 특수 목적 레지스터를 가지고 있다.
장치 제어기는 연결된 주변 장치와 지역 버퍼 간 데이터 이동을 관리한다. 버퍼의 크기는 주변 장치에 따라 다르다.
I/O 인터럽트
CPU는 입출력을 하기 위해 장치 제어기 내에 있는 레지스터에 적절한 데이터를 적재하고, 제어기는 이를 토대로 어떤 행동을 취할지 결정한다.
입출력이 종료되면 인터럽트를 통해 CPU에 그 사실을 통보한다.
입출력은 두 가지 형태를 갖는다.
- 동기식 입출력synchronous I/O : 입출력이 시작되면 요청한 프로세서는 입출력이 완료될 때까지 기다린다.
- 비동기식 입출력asynchronous I/O : 입출력을 요청한 프로세서는 입출력이 완료될 때까지 기다리지 않고 계속 다른 작업을 수행한다.
입출력의 완료를 기다리기 위해 특수한 명령어를 사용하거나, 대기 루프를 사용한다.
여러 입출력을 병행할 수 있고, 입출력과 계산을 병행할 수 있어야 시스템의 효율을 높일 수 있을 것이다.
운영체제는 여러 개의 입출력 요청을 관리하기 위해 장치 상태 테이블device-status table을 관리하며, 각 장치마다 대기 큐를 관리한다.
DMA 구조
입출력 장치의 속도가 너무 빠르면 인터럽트가 빈번하게 발생하여 CPU가 다른 유용한 작업을 할 시간이 적어진다.
이를 해결하기 위해 DMA(Direct Memory Access, 직접 메모리 접근) 기법을 활용한다. 이를 통해 장치 제어기는 CPU의 관여 없이 데이터 블록을 주기억 장치로 직접 이동시킬 수 있으며, 인터럽트는 바이트 단위가 아닌 블록 단위로 발생하게 된다.
저장 구조
주기억 장치에 프로그램이 적재되어야 실행될 수 있다.
CPU가 직접 접근할 수 있는 기억 장치는 주기억 장치 뿐이다.
주기억 장치로는 일반적으로 DRAM(Dynamic RAM, 동적 램)을 사용한다.
주기억 장치의 한 구성 단위를 워드word라고 하며, 각 워드는 개별 주소를 갖는다.
주기억 장치의 크기와 휘발성 때문에, 모든 프로그램을 주기억 장치에 저장할 수 없다. 이를 해결하기 위해 보조 기억 장치를 활용한다.
주기억 장치
Memory-mapped I/O는 주기억 장치의 일부 주소가 입출력을 위해 예약되어 있는 방식을 말하며, 이 주소에서 읽거나 쓰면 장치 레지스터로부터 데이터를 읽거나 쓰는 결과를 낳게 된다. 결과적으로 빠른 응답 시간을 얻을 수 있다.
직렬 포트 또는 병렬 포트에 연결된 장치와 입출력할 때도 위의 방식을 사용한다.
데이터 교환 방식은 다음과 같다.
- 프로그래밍된 I/Oprogrammed I/O : CPU가 장치의 상태를 계속 검사pooling
- 인터럽트 기반 : 다음 데이터를 처리할 준비가 되면 장치 제어기는 인터럽트를 통해 그 사실을 CPU에게 알림
주기억 장치와 CPU 사이에 캐시cache라고 하는 고속 메모리 버퍼를 두어 둘 사이의 속도 차를 극복한다.
자기 디스크
자기 디스크는 플래터platter라고 하는 여러 개의 원형 판으로 구성되어 있으며, 플래터는 원형 모양의 트랙track으로 나뉘어지며, 트랙은 여러 개의 섹터sector로 나뉘어진다.
같은 위치에 있는 트랙의 모음을 실린더cylinder라고 한다.
디스크의 속도는, 디스크에서 컴퓨터로 데이터를 전송하는 비율인 전송률transfer rate과 임의 접근 시간random-access time에 의해 결정된다.
임의 접근 시간은 다음의 것들로 구성되어 있다.
- 탐색 시간seek time : 디스크 암arm을 원하는 실린더 위치로 옮기는 데 걸리는 시간
- 회전 지연rotation latency : 디스크가 회전하여 원하는 섹터가 디스크 암 위치에 놓이는데 걸리는 시간
디스크 드라이브는 I/O 버스를 통해 컴퓨터에 연결되어 있으며, EIDE / ATA / SCSI와 같은 방식이 사용된다.
데이터의 교환은 특수한 제어기를 통해 이루어지는데, 컴퓨터 연결 끝에 호스트 제어기가 있고, 디스크 자체 내에 디스크 제어기가 있다.
실제 데이터는 디스크 제어기에 의해 디스크에서 캐시로 옮겨지고, 호스트 제어기에 의해 캐시에 있는 데이터가 주기억 장치로 옮겨진다.
저장 장치의 계층 구조
계층 구조의 상위에 위치할 수록 속도가 빠르나 비싸며 휘발성이다.
계층 간 속도 차이를 캐시를 두어 극복할 수 있다.
레지스터 <-> 캐시 <-> 주기억 장치 <-> SSD <-> HDD <-> CD <-> …
캐싱
CPU는 데이터를 필요로 하면 먼저 캐시에 해당 데이터가 있는지 검사한다. 있으면 캐시에서 꺼내어 사용하고, 그렇지 않으면 주기억 장치에 있는 데이터를 사용하면서 해당 데이터를 캐시에 저장한다.
명령어 캐시처럼 전적으로 하드웨어를 이용하여 구현된 캐시도 있다.
캐시의 크기는 제한되어 있으므로 이를 잘 관리해야 성능을 높일 수 있다. 캐시의 크기와 교체 정책replacement policy이 중요해진다.
주기억 장치는 CPU와 보조 기억 장치 사이에 있는 캐시로 사용될 수 있다.
일관성
저장 장치의 계층 구조를 사용하면 같은 데이터가 여러 레벨에 존재할 수 있다. 이 때 여러 프로세서가 어떠한 데이터에 접근했을 때 최신 데이터를 얻지 못할 수 있으므로(캐시 일관성cache coherency) 일관성을 유지시켜야 한다.
분산 환경에서 여러 파일의 복사본이 여러 컴퓨터에 분산되어 있을 수 있으므로, 하나의 복사본에 대한 갱신이 이루어지면 다른 복사본도 갱신되게 해야 한다.
하드웨어 보호
다중 프로그래밍 환경에서는 하나의 프로세스의 오류가 다른 프로세스에 영향을 줄 수 있으므로, 이것에서 프로세스를 보호해야 한다.
일반적으로 오류가 발생하면 하드웨어는 트랩을 발생시키고, 운영체제는 트랩을 발생시킨 프로세스를 강제 종료하면서 적절한 오류 메세지를 출력한다.
이중 모드 동작
하드웨어는 현재 모드를 나타내기 위한 모드 비트mode bit를 가지고 있다.
- 사용자 모드 : 사용자 프로세스는 해당 모드에서 수행되다가 인터럽트나 트랩이 발생하면 모니터 모드로 전환된다.
- 모니터 모드 : 시스템 모드.
문제를 일으킬 소지가 있는 명령어는 특권 명령으로 분류하고 모니터 모드에서만 수행될 수 있도록 하여 프로세스를 보호한다.
사용자는 시스템 호출을 통해 운영체제만이 수행할 수 있는 특권 명령의 수행을 부탁할 수 있다. 이 경우 소프트웨어 인터럽트가 발생한다.
입출력 보호
입출력 명령은 특권 명령으로 분류되어 보호된다.
주기억 장치 보호
운영체제가 사용하는 주기억 장치 영역은 사용자 프로그램으로부터 보호되어야 하며, 사용자 프로그램이 사용하는 주기억 장치 영역은 다른 사용자 프로그램으로부터 보호되어야 한다.
기준 레지스터base register와 한계 레지스터limit register를 사용하여 특정 프로그램이 접근할 수 있는 주기억 장치 영역을 설정할 수 있다. CPU는 이 두 개의 레지스터를 이용하여 주기억 장치에 대한 접근 허용 여부를 결정한다.
중앙 처리 장치 보호
운영체제가 항상 제어권을 확보할 수 있도록 해야 한다.
사용자 프로그램이 무한 루프에 빠져 제어권을 운영체제에 넘기지 않을 수 있는데, 이 경우 타이머를 사용하여 일정 시간이 경과하면 인터럽트를 발생시키는 것으로 해결할 수 있다.
시분할을 구현하기 위해 타이머를 사용하며, 시간 구획time slice이라고 하는 고정된 기간마다 인터럽트를 발생시킨다. 이 때 운영체제는 현재 수행 중인 프로세스의 상태를 보관하고 다음 차례의 프로세스 상태를 메모리에 적재한 후 실행하는데, 이를 문맥 전환context switch라고 한다.