티스토리 뷰
컴퓨터 시스템 구조
컴퓨터 시스템은 컴퓨터 내부장치 (CPU + memory) + 외부장치 (디스크 + 키보드 + 마우스 + 모니터 + 네트워크 장치 등) 으로 구성되어 있다. 외부장치에서 데이터를 읽어와(입력) 연산을 수행한 후, 외부장치로 내보내는(출력) 방식으로 작동한다. 각 하드웨어 장치에는 컨트롤러가 붙어있어 제어한다. 각 하드웨어에 있는 작은 CPU라고 할 수 있다. 컨트롤러는 장치로부터 들어오고 나가는 데이터를 임시 저장하는데 이 부분을 로컬버퍼라고 한다. (CPU가 메모리를 가지고 있다면, 컨트롤러는 로컬버퍼를 가지고 있다고 이해했다.)
컴퓨터에서 연산하는 작업은 CPU가 일하는 것이고, 데이터가 메모리에 올라가 있어야 프로그램이 수행된다. (프로그램이 CPU 제어권을 획득하여 자신의 프로그램을 돌아가게 하려고 한다. OS가 그 기반을 만들어주는 것이 주요 내용이라고 생각한다.) 운영체제 중 일부 핵심적인 부분만 메모리에 올라가 있으며 이 부분을 커널이라고 한다.
인터럽트
컴퓨터 내부에서 수행되는 연산은 메인 CPU가 담당하고, 입출력 연산은 입출력 컨트롤러가 담당한다. CPU가 입출력 컨트롤러의 일을 항상 체크하는 것이 아니라, 입출력 컨트롤러가 인터럽트를 발생시켜 CPU에게 보고한다. CPU는 기본적으로 메모리에서 명령을 읽어와서 하나씩 수행한다. CPU 옆에 인터럽트 라인이 있어서 신호가 들어오면 하던 일을 멈추고 인터럽트를 처리하게 되는 것이다. (매 라인을 수행할 때마다 인터럽트 발생여부를 체크하고 신호가 있으면 인터럽트를 처리하는 과정이라고 한다.)
운영체제는 인터럽트에 의해 구동되며, 각각의 인터럽트 종류에 따라 인터런트 처리루틴(인터럽트 핸들링)이 있다.
통상적으로 인터럽트는 하드웨어 인터럽트를 의미한다. 소프트웨어 인터럽트는 트랩이라고 부른다. 소프트웨어 인터럽트에는 예외상황과 시스템콜이 있다. 시스템콜이란 프로그램이 OS의 내부코드를 사용하고 싶을 때 운영체제에 서비스를 요청하는 방식이다. 예를들어 키보드 입력을 받고 싶다면 개발자가 입출력 코드를 작성하는 것이 아니라 시스템콜을 요청하여 커널의 코드를 호출하여 입력받는 형식인 것이다. 예외상황과 시스템콜 모두 CPU 제어권이 OS로 넘어가기 때문에 넓은 의미의 인터럽트 범주에 해당되는 것이다.
인터럽트 핸들링
인터럽트 핸들링은 인터럽트가 발생한 경우 처리할 절차를 의미한다. 레지스터는 CPU 내부의 임시기억장치로 CPU가 데이터를 레지스터에 읽고 쓰면서 연산을 수행한다. 인터럽트가 들어와서 새 명령을 시작하면 기존 레지스터 값은 삭제된다. 기존 레지스터값을 기억하기 위해 OS 안에 프로그램마다 PCB(Process Control Block)이 존재한다. 인터럽트가 들어오면 PCB에 상태를 저장하고 CPU 제어권이 넘어간다. 인터럽트 처리루틴이 끝나면 다시 PCB에 존재하고 있는 해당 데이터를 CPU로 복원해 다음 작업이 수행된다. 이런 과정을 거쳐 다른 프로그램으로 CPU 제어권이 넘어가는 것을 문맥교환이라고 한다.
운영체제는 인터럽트가 발생할 때만 실행된다. 부팅 후, 정상상태가 되면 CPU는 사용자 프로그램에 의해 사용되며, 인터럽트가 발생 시 CPU 제어권이 운영체제로 넘어온다.
입출력 (IO)
입출력 방식은 동기식과 비동기식으로 나뉜다.
동기식 입출력에서는 입출력 중인 프로그램을 봉쇄상태(Blocked State)로 두고 CPU 제어권을 다른 프로그램으로 넘겨 다른 내용을 진행한다. 입출력 중인 프로그램은 입출력연산이 끝나기 전까지 프로그램의 다른 작업을 진행하지 않고 입출력 연산이 끝난 후 다음 연산을 진행한다.
다른 프로그램을 사용시 입출력 연산이 또 들어올 수 있기 때문에 동기화를 위해 장치별로 큐(Queue)를 두어 요청한 순서대로 처리한다.
비동기식 입출력은 입출력 연산과 무관하게 CPU 제어권을 그대로 갖고 처리가능한 작업부터 진행한다.
저장장치
저장장치는 휘발성과 비휘발성 저장장치로 나뉜다. 내부에 해당하는 것(레지스터, 메인메모리 등)은 휘발성이고 보조기억장치로 사용되는 디스크는 비휘발성이다. 보조기억장치는 file system용과 swap area용 두 가지 역할로 나뉜다. swap area용은 메모리의 연장선의 느낌이라고 보면된다.
내부에 해당하는 것은 빠르지만 비싸기 때문에 메모리 용량이 적은 편이고, 보조기억장치로 사용되는 메모리는 느리지만 싼 편이라 용량이 더 큰 편이다. 메모리에 올리는 것은 한계가 있기 때문에 당장 필요한 자료만 메모리에 올려서 사용하고 그 외 값들은 swap out 하여 디스크에 내려 놓는다.
DMA (Direct Memory Access)
원칙적으로 메모리는 CPU에 의해서만 접근가능하다. 하지만 인터럽트가 너무 많이 발생하면 효율이 떨어지기 때문에 CPU의 메모리 접근 권한을 DMA 컨트롤러에게 위임한 것이라고 볼 수 있다. DMA를 사용하면 로컬버퍼에서 메모리로 자료를 읽어오는 것을 대신해준다. block 단위로 로컬버퍼에서 메모리로 복사까지 해주고 CPU에게 인터럽트를 걸어준다.
MODE BIT
하드웨어 보안을 위해 CPU에 모드비트를 두어 접근권한을 제한한다. 시스템에 중요한 영향을 미치는 연산은 커널모드에서만 실행하게 하는 것이다.
값이 0인 경우 운영체제가 CPU 제어권을 가진 상태이다. 이런 경우 커널모드, 시스템모드, 모니터모드 등으로 불리며 모든 접근권한이 열려있다. 특권명령을 가진다.
값이 1인 경우 사용자 프로그램이 CPU 제어권을 가진 상태이다. 이런 경우 사용자모드라고 한다. IO 장치나 운영체제 메모리 접근 등이 제한된다. 사용자모드에서 인터럽트, 시스템콜, 예외상황 등으로 커널모드로 전환된다.
사용자 프로그램이 디스크에 저장된 파일에 자유롭게 접근하면 보안상 문제가 발생하므로 모든 입출력 명령은 커널모드에서만 가능하도록 한다. 운영체제가 CPU를 할당받아 인터럽트 벡터의 특정 위치를 통해 해당 인터럽트 핸들링으로 이동하여 처리한다. 처리 완료 후 사용자 모드로 다시 전환된다. 모드비트를 통해 접근제한을 두어 파일에 대한 보안을 유지한다.
기준레지스터, 한계레지스터
메모리 보안을 위해 사용되는 값이다. 메모리 주소 참조연산을 잘못하여 다른 프로그램의 메모리 영역을 참조하거나 운영체제의 메모리 영역을 참조할 수도 있다. 이런 경우를 제한하고자 접근하려는 메모리 영역이 적합한지를 확인한다. 기준레지스터는 접근가능한 메모리상의 가장 작은 주소를 보관하며 한계레지스터는 기준레지스터 값부터 접근 가능한 메모리의 범위를 보관한다. (쉽게 이해하면 기준레지스터는 메모리 시작값이고 한계레지스터는 그 크기라고 생각한다.)
접근하려는 메모리 주소가 기준레지스터~기준레지스터+한계레지스터 범위 내인지를 확인하여 메모리 접근을 허가한다. 이 값 이외의 메모리 접근을 요청하면 예외상황을 발생시켜 CPU 제어권을 빼앗는다.
사용자모드에서는 기준레지스터와 한계레지스터로 메모리 접근을 제한하지만 커널모드에서는 메모리 접근 제한이 없다.
TIMER
타이머는 CPU 보호를 위한 장치이다. 한 프로그램이 CPU를 독점하여 사용하는 것을 막기위해 제한시간을 걸어두는 것이라고 생각하면 된다. 타이머는 정해진 시간이 지나면 CPU 제어권을 빼앗아 다른 프로그램에게 넘긴다. 타이머의 시간을 세팅하는 명령을 로드 타이머(load timer)라고 하며 이 명령은 특권명령이다.
정리
전체적인 시스템에 대해 정리해 보았다. 컴퓨터에서 일을 하는 것은 CPU이다. CPU는 데이터를 처리하기 위해 빠르지만 용량이 적은 레지스터, 메인메모리 등을 사용한다. 용량이 작고 휘발성이라 보조하기 위해 디스크가 사용된다. 메모리에 올라와 있는 프로그램들이 CPU 제어권을 가져와서 자신의 프로그램을 실행시키려고 한다. 운영체제 또한 프로그램이며, 사용자가 편리하도록 모든 권한을 가지며 다른 프로그램들을 관리해준다. 여러 프로그램이 동시에 실행하기 때문에 뒤엉키지 않도록 여러가지 룰이 존재하고 운영체제가 그 룰을 관리한다.
참고
운영체제 시리즈는 반효경 교수님의 운영체제 강의 와 "운영체제와 정보기술의 원리"라는 책을 바탕으로 정리한 내용입니다.
'Computer Science > 운영체제' 카테고리의 다른 글
운영체제 시리즈 6. CPU Scheduling (0) | 2021.01.03 |
---|---|
운영체제 시리즈 5. 프로세스 관리(Process Management) (0) | 2021.01.02 |
운영체제 시리즈 4. 프로세스(Process) (0) | 2021.01.01 |
운영체제 시리즈 3. 프로그램 실행 (0) | 2020.12.30 |
운영체제 시리즈 1.Intro (0) | 2020.12.28 |
- Total
- Today
- Yesterday
- Transaction
- 우테코수업
- 월간회고
- 코드스쿼드
- 회고
- DB
- 모의면접준비
- React
- CS
- TIL
- 운영체제
- javascript
- python
- 우아한테크코스
- 개발공부일지
- OS
- JS
- 학습로그
- 글쓰기미션
- 네트워크
- 카카오
- 내부코드
- 인증
- TCP/IP
- java
- 알고리즘
- JPA
- 마스터즈코스
- 객체지향
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |