컴퓨터의 가장 기본이 되는 하드웨어부터 시작해서 하드웨어를 관리해주는 운영체제까지 내가 개발자라면 알아야 할 것들을 하나씩 공부하고자 CS기초 베이스를 튼튼히 하기 위해 공룡책을 읽기로 하였다.
운영체제는 컴퓨터 사용자와 컴퓨터 하드웨어 사이에서 중개자 역할을 한다.
하드웨어는 중앙 처리 장치(CPU), 메모리, 입출력(I/O) 장치로 구성되어 기본 계산용 자원을 지원한다.
응용 프로그램인 워드, 엑셀, 컴파일러, 웹 브라우저 등은 사용자의 ~계산 문제를 해결하기 위해 이들 자원이 어떻게 사용될지~ 정의
운영체제는 다양한 사용자를 위해 다양한 응용 프로그램 간의 하드웨어 사용을 제어하고 조정한다!!!
- Personal Computer System은 한 사용자가 자원을 독점하도록 설계됨, 사용자가 수행하는 작업을 최대화하는 것
- 사용의 용이성↑을 위해 설계, 자원의 이용↓에는 전혀 신경쓰지 않는다.
- Computer 관점에서 운영체제는 하드웨어와 가장 밀접하게 연관된 프로그램
- 자원 할당자(Resource allocator)
- 제어 프로그램(Control program)
위 3가지로 구성되어 있음
운영체제에는 항상 실행 중인 커널, 응용 프로그램 개발을 쉽게 하고 기능을 제공하는 미들웨어 프로그램 및 시스템 실행 중에 시스템을 관리하는 데 도움이 되는 시스템 프로그램이 포함된다.
운영체제 공부가 필요한 이유?!
모든 코드가 운영체제 위에서 실행되므로 운영체제 작동방식에 대한 지식은 적절하고 효율적이며 효과적이며 안전한 프로그래밍에 중요하기 때문이다.
운영체제의 기본 지식, 컴퓨터 하드웨어 구동 방식 및 응용 프로그램에 제공하는 내용을 이해하는 것은 프로그래머에게서 유용한 지식이 될 수 있다.
현대의 범용 컴퓨터 시스템은 하나 이상의 CPU와 구성요소와 공유 메모리 사이의 액세스를 제공하는 공통 버스를 통해 연결된 여러 장치 컨트롤러로 구성된다.
컴퓨터의 입출력 작업
1. 장치 드라이버는 장치 컨트롤러의 적절한 레지스터에 값을 적재
2. 장치 컨트롤러는 이러한 레지스터의 내용을 검사하여 수행할 작업을 결정한다.
e.g. 키보드에서 문자 읽기
3. 컨트롤러는 장치에서 로컬 버퍼로 데이터 전송을 시작한다.
4. 데이터 전송이 완료되면 ~장치 컨트롤러는 장치 드라이버에게 작업이 완료되었음을 알린다.~
5. 장치 드라이버는 읽기 요청이면 ~데이터 또는 데이터에 대한 포인터를 반환~하며 운영체제의 다른 부분에 제어를 넘긴다.
다른 작업의 경우 장치 드라이버는 "쓰기 완료" 또는 "장치 사용 중"과 같은 상태 정보를 반환한다.
- 컨트롤러가 장치 드라이버에게 작업을 완료했다는 사실을 알리는 방법! -> 인터럽트!
하드웨어는 어느 순간이든 시스템 버스를 통해 CPU에 신호를 보내 인터럽트를 발생시킬 수 있다.
CPU가 인터럽트 되면, CPU는 하던 일을 중단하고 즉시 고정된 위치로 실행을 옮긴다.
인터럽트 서비스 루틴의 실행이 완료되면, CPU는 인터럽트 되었던 연산을 재개한다.
인터럽트는 적절한 서비스 루틴으로 제어를 전달한다.
인터럽트는 빠르게 처리되어야 하는데, 필요한 속도를 제공하기 위해 인터럽트 루틴에 대한 포인터들의 테이블을 대신 이용할 수 있다.
이 경우 중간 루틴을 둘 필요 없이, 테이블을 통하여 간접적으로 인터럽트 루틴이 호출될 수 있다.
포인터들의 테이블은 하위 메모리에 저장된다.( 첫 100개 정도의 위치)
이들 위치에는 여러 장치에 대한 인터럽트 서비스 루틴의 주소가 들어 있다.
인터럽트가 요청되면, 인터럽트를 유발한 장치를 위한 인터럽트 서비스 루틴의 주소를 제공하기 위해 ~이 주소의 배열, 즉 인터럽트 백터~가 인터럽트 요청과 함께 주어진 고유의 유일한 장치 번호로 색인(Indexing)된다.
인터럽트 구조
기본 인터럽트 기법은 장치 컨트롤러가 서비스할 준비가 될 때와 같은 비동기 이벤트에 CPU가 대응할 수 있게 한다.
하지만 최신 운영체제에서는 더욱 정교한 인터럽트 처리 기능이 필요하다.
최신 컴퓨터 하드웨어에서는 CPU 및 언터럽트 컨트롤 하드웨어에서 아래 기능을 제공한다.
1. 중요한 처리 중에 인터럽트 처리 연기
2. 장치의 적절한 인터럽트 핸들러로 효율적인 디스패치
3. 운영체제가 우선순위가 높은 인터럽트와 우선순위가 낮은 인터럽트를 구분하고 적절한 긴급도로 대응할 수 있는 다단계 인터럽트 구성
RAM은 휘발성이므로 부트스트랩 프로그램은 EEPROM 및 기타 형태의 펌웨어를 사용
모든 형태의 메모리는 바이트의 배열을 제공한다.
각 바이트는 자신의 주소를 가지고 있다.
상호 작용은 특정 메모리 주소들에 대한 일련의 적재(load), 저장(store) 명령을 통해 이뤄진다.
운영체제 코드의 상당 부분은 I/O 관리에 할애된다.
인터럽트 구동 I/O의 형태는 소량의 데이터 이동에 유리하지만 NVS I/O와 같은 대랑 데이터 이동에 사용될 때 높은 오버헤드를 유발할 수 있다.
장치에 대한 버퍼 및 포인터, 입출력 카운트를 세팅한 후 장치 제어기는 CPU 개입 없이 메모리로부터 자신의 버퍼 장치로 또는 버퍼로부터 메모리로 데이터 블록 전체를 전송
한 바이트마다 인터럽트 발생하지 않고, 블록 데이터 단위로 블록 전성이 완료될 때마다 인터럽트가 발생한다.
장치 컨트롤러가 전송 작업을 수행하고 있는 동안 CPU는 다른 작업을 수행할 수 있다.