KOCW 반효경 교수님 운영체제 강의와 운영체제와 정보기술의 원리 도서를 정리한 내용입니다
컴퓨터는 내부장치와 외부장치로 나뉘며, CPU와 메모리부터 시작해 IO 디바이스를 살펴볼 수 있다.
컴퓨터 구조
메모리
내부장치인 메모리는 휘발성이며, CPU가 실행할 명령어와 데이터를 저장하는 공간으로, 여러 개의 사용자 프로그램과 운영체제(OS)가 올라간다. OS 는 전체 파일이 모두 올라가진 못하고 필수적인 부분만 항상 메모리에 올라가있다. 이를 좁은 의미에서의 커널
이라고 부른다.
CPU
CPU 는 메모리에 적재되어 있는 instruction를 가지고 와서 한줄씩 실행시킨다. 이때의 instruction은 기계어에 가까운 어셈블리어이다. (add, sub 등)
IO 장치
외부장치인 IO 장치에는 키보드, 하드디스크, 모니터 등이 있다. IO 앞단에는 IO 컨트롤러와 로컬 버퍼가 있으며, IO 컨트롤러는 IO 장치의 데이터를 로컬 버퍼에 적재해둔다. 버퍼에 적재된 데이터들은 한번에 처리된다. IO 장치가 작업을 완료하면 IO 컨트롤러에서 CPU에 '입력이 완료되었다'는 알림을 보내며, 이를 하드웨어 인터럽트
라고 한다. IO 장치는 보안상의 이유로 사용자 프로그램이 직접 접근하지 못하며, 대신 운영체제가 이를 대신 처리한다.
인터럽트
CPU 는 메모리으로부터 instruction를 불러와서 한줄 씩 실행시키기 전에 항상 interrupt line이 있는지 확인한다. 인터럽트 라인이 존재한다면 항상 그것을 먼저 처리하도록 os가 설계되어 있다. 사용자 프로그램이 실행되다가 OS의 도움이 필요해지는 순간 코드는 인터럽트를 발생시켜 CPU 소유권을 OS에게 넘긴다.
인터럽트가 들어온다면 인터럽트의 종류에 따라 행동이 달라야한다. 그 행동 코드가 어디있는지 확인하는 곳을 인터럽트 벡터
라고 부른다. 인터럽트 벡터에는 종류마다 번호를 정해서, 번호에 따라 처리해야할 코드가 위치한 부분을 가르키는 자료구조이다.
인터럽트가 된다면 그 일을 수행하러 가야한다. 근데 원래 실행하던 것의 정보는 어떻게 저장할 것인가? 이때 나오는 개념이 PCB (Process Control Block)
이다. 인터럽트가 들어오면 인터럽트를 처리하러 가기 전에 하던 일의 정보를 저장한다. 그 정보에는 실행 중이던 코드의 메모리 주소, 레지스터값, 하드웨어 상태 등이 해당된다. 인터럽트를 완료한다면 PCB를 통해 값들을 원래대로 되돌리고 CPU는 하던 일을 하면 된다.
인터럽트는 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉘며, 소프트웨어 인터럽트는 트랩이라고도 부른다.
하드웨어 인터럽트는 앞에서 보았던 IO 장치가 불러내는 인터럽트가 해당된다. 앞에서 얘기했던 키보드 입력을 모두 받았을 때 다 받았다고 컨트롤러가 보고를 올리는 것이 그 예이다.
소프트웨어 인터럽트는 예상치 못한 인터럽트와 의도된 인터럽트가 있다. 예상치 못한 인터럽트를 예외 상황 (Exception) 이라고 부르고 의도된 인터럽트를 시스템 콜 (System call) 이라고 부른다.
- 하드웨어 인터럽트 : IO 장치 (키보드 입력 완료했다는 보고)
- 소프트웨어 인터럽트 (trap) : 예외 상황(division by zero, 자신의 메모리 바깥 영역 접근), 시스템 콜 (사용자 프로그램이 운영체제 내부에 정의된 코드를 실행시키고 싶어서 필요에 의해 호출한 경우)
입출력 구조
입출력 작업에는 입출력 요청이 오면 요청을 모두 수행한 뒤 그 다음 코드가 실행되는 동기식 입출력과 입출력 요청이 끝나기를 기다리지 않고 계속 진행되는 비동기식 입출력이 있다.
동기식 입출력
IO 는 어떠한 일보다도 시간이 오래 걸린다. 따라서 cpu가 입출력 요청을 기다리게 된다면 cpu는 오랜 시간 아무것도 못하게 된다. 따라서 요청을 하고 cpu는 다른 프로그램에 할당되게 된다. 입출력 요청을 했던 프로그램은 봉쇄상태가 되어 cpu를 할당받지 못한다. 이후에 입출력 요청이 완료되면 IO 컨트롤러가 인터럽트를 하게 되고 그렇게 되면 봉쇄상태가 해제되고 cpu를 다시 받을 수 있는 상태가 된다.
예를 들어, 프로그램 A가 입출력 연산을 요청했다. CPU는 A 프로그램의 요청 후 바로 프로그램 B로 넘어갔다. 그런데 B도 입출력 연산을 요청했다. 심지어 프로그램 A, B 모두 같은 IO 장치에 요청을 보냈다. 우리는 A 다음에 B 가 실행될 것을 기대했지만 B가 먼저 실행되는 문제가 생겼다. 따라서 동기성
을 보장하기 위해 큐
를 두어 요청된 순서대로 실행되는 것을 보장한다. 참고로 뒤에 나오는 비동기식 입출력보단 일반적으로 동기식 입출력이 쓰인다.
비동기식 입출력
이전까지는 입출력 연산 요청을 하고 나면 cpu가 다른 프로그램에게 넘어갔다. 비동기식 입출력에서는 그렇지 않다. 오히려 cpu를 계속 갖고 있는다.
프로그램 A에서 입출력 연산 요청을 하면 제어권이 OS 로 잠시 넘어가게 된다. 이전에는 이 다음에 다른 프로그램 B에게 CPU가 할당됐지만 비동기식 입출력은 제어권을 프로그램 A가 다시 부여받는다. 그리고 프로그램 A는 입출력 요청과 무관한 명령어를 계속 수행하게 된다.
이외의 컴퓨터 구조
DMA
IO 요청이 잦으면 CPU 가 OS로 넘어가는 경우가 많아지며 이는 성능상 좋지 못하다. 따라서 DMA가 CPU 대신 IO 요청을 처리한다. DMA는 IO 요청에서 오는 데이터를 CPU 대신 메모리에 적재해준다.
저장 장치
저장장치는 주기억장치와 보조기억장치로 나뉘는데 주기억장치에는 우리가 흔히 말하는 메모리가 포함된다. 메모리는 휘발성이기 때문에 보조기억장치에는 비휘발성 정보를 저장한다. 비휘발성 메모리에는 플래시 메모리, CD, 마그네틱 테이프, 하드디스크가 포함된다. 보조기억장치는 메모리의 스왑 영역이 되기도 한다. 이후에서 배울 내용이지만 짧게 설명하자면 사용자 프로그램의 모든 내용이 메모리 용량 부족으로 적재되지 못하는 경우, 당장 필요한 부분만 메모리에 올려두고 나머지는 보조기억장치에 저장한다. 이후에 필요한 코드는 스왑
을 통해 보조기억장치에 있는건 메모리로, 메모리에 있는건 보조기억장치로 옮긴다.
타이머
cpu가 사용자 프로그램에 할당되었는데 무한루프를 돈다. 이 경우에 cpu를 다시 되찾을 방법이 없어 타이머
가 등장한다. 타이머는 지정된 시간이 지나면 cpu를 빼앗아오는 역할을 해준다.
'💻Computer Science > Operating System' 카테고리의 다른 글
[OS] 프로세스 동기화 (0) | 2023.07.25 |
---|---|
[OS] CPU 스케줄링 (0) | 2023.07.25 |
[OS] 프로그램의 구조와 실행 (0) | 2023.07.25 |
[OS] 디스크 관리 (0) | 2023.07.08 |
[OS] file system (0) | 2023.07.07 |