[문과 코린이의 IT 기록장] 운영체제(OS) - System structure & Program execution (컴퓨터 시스템 구조, 동기식 입출력과 비동기식 입출력, 서로 다른 입출력 명령어, 저장장치 계층 구조, 프로그램의 실행, 커널 주소 공간의 내용)
# 운영체제 내용에 본격적으로 들어가기에 앞서, 컴퓨터 시스템에서 하드웨어가 어떻게 동작하는지, 프로그램들이 그 하드웨어 위에서 어떻게 돌아가는지에 대해 알아보고자 함.
1. 컴퓨터 시스템 구조
- Computer(=Host = Host Computer) : CPU, Memory로 구성
: Memory는 CPU의 작업 공간임. CPU는 매 클럭사이클마다, 메모리에서 기계어를 하나씩 읽으며 실행함.
- I/O device : Disk, 키보드, 프린터, 모니터 등으로 구성
* input device : 키보드, 마우스
* output device : 프린터, 모니터
* HDD는 input, output device 모든 역할을 함. (데이터를 메모리로 읽어들이기도, 처리의 결과를 출력하기도 함)
1) Device controller
- 각각의 I/O device들에, 각각의 device들을 전담하는 작은 cpu가 붙어있음. 그것을 device controller라고 함.
ex. Disk 내부를 통제하는 것 : Disk controller, 키보드 내부를 통제하는 것 : 키보드 controller
- 즉, 해당 I/O 장치유형을 관리하는 일종의 작은 CPU임.
* 제어 정보를 위해 control register, status register(cpu가 일을 시킬 때 해당 일을 지시하는 레지스터)를 가지며, local buffer(일종의 data register)를 가진다.
* I/O는 실제 device와 local buffer 사이에서 일어난다.
* Device controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알린다.
- device driver(장치구동기) : 소프트웨어 : OS 코드 중 각 장치별 처리루틴 (운영체제 코드 중 각 디바이스를 처리하기 위한 인터페이스에 맞게 접근할 수 있도록 돕는 소프트웨어 모듈) - device controller(장치제어기) : 하드웨어 : 각 장치를 통제하는 일종의 작은 CPU |
2) Local buffer
- device controller들도, 각각의 작업공간들이 필요함. 그 공간을 local buffer라고 함.
# CPU와 I/O device는 속도와 성능에 있어 엄청난 차이가 존재한다. 따라서 CPU가 직접 device를 관리하게 된다면 효율성이 크게 떨어지게 되며, 이러한 이유로 device controller가 각각의 device를 담당하게 된다. 즉, CPU는 매 클럭사이클마다 메모리에서 명령어를 하나씩 읽어 실행하는 역할만 한다.
3) Register (레지스터)
- 메모리보다 더 빠르게 정보를 저장할 수 있는 작은 공간 (CPU 내부에 존재)
4) Mode bit
- CPU 내부에서 실행하는 것이 운영체제(OS)인지, 사용자 프로그램인지를 구분해주는 것
- 사용자 프로그램의 잘못된 수행으로, 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치
- Mode bit을 통해 하드웨어적으로 두 가지 모드의 operation 지원
a. 1 : 사용자 모드 - 사용자 프로그램 수행
* 사용자 프로그램에게 CPU를 넘기기 전에, mode bit을 1로 셋팅
b. 0 : 모니터 모드(=커널 모드 = 시스템 모드) - OS 코드 수행
* 보안을 해칠 수 있는 중요한 명령어 또한 수행 가능
* 즉, 무엇이든 다 접근 가능 (I/O device ,Memory 등..)
* interrupt나 Exception 발생 시 하드웨어가 mode bit을 0으로 바꿈.
5) Interrupt line
- CPU는 항상 메모리에 있는 명령어만 실행함. 즉, I/O device에 직접 접근할 수 없다는 것.
- 그렇다면, 만약 I/O device에서 명령 및 요청(scanf, 파일 입출력 등)이 들어올 경우에 그 정보를 어떻게 전달받는가?
- 이 정보를 전달해주는 역할을 interrupt line이라고 함.
6) Timer
- 만약 프로그램 1이 무한루트(for,while)를 도는 프로그램이라면, CPU가 계속 이 프로그램에서 사용되게 될 것이다. 그러면 Time sharing을 구현하기가 어려워짐.
- 이 경우를 방지하기 위해서 컴퓨터 내부에는 Timer라는 하드웨어를 두고 있음.
- 즉, 이는 특정 프로그램이 CPU를 독점하는 것을 막기 위해서 사용되는 것임.
* Timer는 매 클럭 틱마다 1씩 감소
* Timer 값이 0이 되면, Timer interrupt 발생
7) Memory controller & DMA controller
- Memory는 원칙적으로 CPU만 접근할 수 있게 해놓음. (I/O device들은 각자의 local buffer를 통해 작업하고, CPU가 이를 복사함) 그러다보니, CPU가 요청을 너무 많이 받게 되면서 interrupt가 상당히 많이 발생하곤 함.
- 이로 인해 CPU가 그닥 효율적이지 않게 동작하기도 함. 이를 효율적으로 하기 위해 메모리를 직접 접근할 수 있는DMA controller(local buffer의 정보를 메모리에 복사하는 역할 등을 함)를 두고 있음.
- 그리고 CPU와 DMA controller가 동시에 메모리 접근을 하는 문제를 방지하기 위해, Memory controller가 이를 중재하고 있음.
8) PC register
- CPU 내부에 있는 메모리 주소를 가지고 있는 공간.
- PC register를 통해, CPU는 메모리의 명령어를 수행하고, 그 다음 어떤 메모리 주소를 통해 실행해야할지를 알게 됨.
* 다음 명령어를 처리하기 전에 CPU는 항상 interrupt를 체크함.
9) Interrupt (인터럽트)
- 인터럽트 당한 시점의 레지스터와 program counter(PC)를 save한 후 , CPU의 제어를 인터럽트 처리 루틴에 넘긴다.
a. 하드웨어 인터럽트(넓은 의미의 인터럽트) : 하드웨어가 발생시킨 인터럽트
ex 1 ) Timer에서 발생한 인터럽트
* 처음에는 OS가 CPU를 가지고 있다가, 프로그램이 사용이 되면 CPU를 넘겨줌.
-> 프로그램을 넘겨줄 때, OS는 Timer에 값을 세팅해서 넘겨줌
-> 프로그램에서 CPU를 사용하다, 세팅된 시간이 끝나면 Timer가 CPU에게 interrupt를 걸게 됨
-> interrupt가 걸린 CPU는, 제어권을 OS에 돌려줌.
-> OS는 다른 프로그램에 CPU 제어권을 넘겨줌.
* 프로그램이 끝나면 CPU는 자동으로 OS에 제어권이 넘어감.
ex 2 ) I/O device에서 전달한 인터럽트
* I/O 장치에서 전달해야 하는 정보가 존재할 경우, CPU에 interrupt를 걸게 된다. 그러면, DMA controller가 먼저 local buffer에 존재하는 내용들을 Memory에 복사하고, 그 정보가 어느 정도 유의미하게 모이게 되면 DMA controller는 CPU에게 interrupt를 걸게 된다.
b. 소프트웨어 인터럽트 (Trap)
- Exception : 프로그램이 오류를 범한 경우
ex 1 ) 사용자 프로그램이 OS에 잘못 접근한 경우
* 사용자 프로그램이 오류를 범하게 되면, interrupt line이 자동으로 생성되면서, CPU 제어권이 운영체제로 넘어가게 된다.
- System call : 프로그램이 커널 함수를 호출하는 경우
ex 1 ) 사용자 프로그램이 I/O 요청을 하는 경우
* 사용자 프로그램이 I/O device에서 정보를 읽어와야 하는 경우, CPU에게 interrupt를 건다. interrupt를 받은 CPU는 mode bit을 0으로 바꾸며 OS에게 CPU 제어권을 넘긴다. 그러면 OS는 올바른 요청인지 확인한 후, I/O를 수행하게 된다.
# 인터럽트 관련 용어 - 인터럽트 백터 : 해당 인터럽트의 처리 루틴 주소를 가지고 있음 (인터럽트마다 처리해야 하는 것들을 모아둔 코드 테이블) - 인터럽트 처리 루틴(interrupt Service Routine, 인터럽트 핸들러) : 해당 인터럽트를 처리하는 커널 함수 |
2. 동기식 입출력과 비동기식 입출력
* 두 경우 모두 I/O의 완료는 interrupt로 알려준다.
1) 동기식 입출력 (Synchronous I/O)
* Synchronous : 서로 맞춘다는 의미가 내포됨.
- I/O 요청 이후 입출력 작업이 완료된 후에야, 제어가 사용자 프로그램에 넘어감.
구현 방법 1 ) - I/O가 끝날 때까지 CPU를 낭비시킨다. - 매시점 하나의 I/O만 일어날 수 있다. 구현 방법 2 ) - I/O가 완료될 때까지, 해당 프로그램에게서 CPU를 빼앗는다. - I/O 처리를 기다리는 중에, 다른 프로그램에게 CPU를 줌으로써 더 효율적으로 활용할 수 있다. |
2) 비동기식 입출력 (Asynchronous I/O)
- I/O가 시작된 후, 입출력 작업이 끝나기를 기다리지 않고 제어가 가능한 사용자 프로그램에 즉시 넘어간다.
* read의 경우에는, 읽어온 데이터와 관계없이 진행할 수 있는 코드들을 먼저 진행한다.
* write의 경우에는, 좀 더 자연스럽게 진행될 수 있다. (일반적으로 출력 결과를 꼭 봐야하는것은 아니기 때문)
3. 서로 다른 입출력 명령어
- I/O를 수행(접근)한는 방법이, 2가지가 있다.
1) 일반적인 I/O 방식
- I/O에 접근하는 특정 명령어를 실행하면, 그 device를 접근하게 됨
2) Memory Mapped I/O 방식
- I/O device들에 각각 메모리 주소를 매겨서, 명령어를 통해 메모리를 접근하는 방식
4. 저장장치 계층 구조
* 올라갈수록 속도가 빠르며, 단위공간당 가격이 비싸고, 용량이 적어짐.
* 또한 위로 올라갈수록 휘발성이 높으며, 아래로 갈수록 비휘발성이 높음.
- Primary(excutable) : CPU에서 직접 접근할 수 있는 Memory storage 매체
* 이들은 byte단위로 이루어짐. (CPU는 byte 단위로만 매채에 접근이 가능함)
- Secondary : CPU에서 직접 접근할 수 없는 Memory storage 매체
* 이들은 sector 단위로 이루어짐.
- Caching : CPU가 명령어를 처리하는데 있어, 속도 차이를 완충하기 위해, 중요한 정보나 반복되는 정보를 캐시 메모리에 올려서 효율적으로 사용하는 것. 이는 보통 재사용을 목적으로 함.
5. 프로그램의 실행 (메모리 load)
* file system : 전원이 나가도 보관되는 데이터(HDD), swap areea : 전원이 나가면 사라지는 데이터
* swap area는 메모리 공간의 한계로 메모리 연장공간으로서 사용하는 것이고, file system은 비휘발성의 용도로 사용됨.
* 함수(function)
a. 사용자 정의 함수 : 자신의 프로그램에서 정의한 함수b. 라이브러리 함수 : 자신의 프로그램에서 정의하지 않고 갖다 쓴 함수로, 프로그램 실행 파일에 포함되어 있다.c. 커널 함수 : 운영체제 프로그램의 함수. (커널 함수의 호출 = 시스템 콜)
** 커널 또한 주소공간이기 때문에, code / data / stack의 구조로 이루어져 있다.
6. 커널 주소 공간의 내용
1) 커널의 Code 부분
- 자원을 효율적으로 관리할 수 있도록 하는, 그리고 사용자에게 편리한 인터페이스를 제공할 수 있도록 하는 관련 코드들이 존재함.
- 즉 os는 interrupt를 통해 cpu제어권을 얻게 되는데, 그 각각의 interrupt마다 어떻게 처리할 것인지와 관련한 코드들이 들어있을 것임.
2) 커널의 Data 부분
- os가 사용하는 여러 가지 자료구조 부분
- 하드웨어 종류마다 자료구조를 하나씩 구성해서 관리하고 있을 것임.
- 더불어 프로세스들 또한 하나씩 구성해서 관리하고 있음.
* 각 프로그램들이 독자적인 주소공간을 지니고 있지만, 이들을 os가 관리하기 위해서는 따로 자료구조가 필요함. 이를 PCB라고 부름
3) 커널의 Stack 부분
- os 또한 함수구조로 코드가 사용되기 때문에, stack 영역을 활용해야 함.
* 운영체제의 코드들을 사용자 프로그램(시스템 콜)들의 요청에 따라 불러서 쓸 수 있음.
7. 프로그램의 실행
* 일반적인 실행과정
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |