| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 백준 10819
- 백준 14499
- CI/CD
- 백트래킹
- 백준 파이썬
- 스레드
- 자바스크립트
- 후위 표기식
- 락
- 다익스트라
- 파이썬
- 운영체제
- Spring
- 백준 2529
- CS
- 9465 스티커
- 네이버
- 코딩테스트
- 코테
- 백준 1120
- 스프링
- docker
- 도커
- Spring Security
- 백준 2302
- 증가하는부분수열
- 프로세스
- 백준 15686
- 백준
- 프로그래머스
- Today
- Total
개발
운영체제 2 본문
본격적인 운영체제의 학습에 앞서 공부할 내용이다.
컴퓨터 시스템 구조

CPU
CPU의 동작 순서
CPU는 기억장치에 저장되어 있는 프로그램 코드인 명령어를 실행함으로써 프로그램 수행이라는 컴퓨터의 기본적인 기능을 수행하는 장치이다. CPU가 수행하는 세부적인 동작들은 순서는 다음과 같다.
1) 명령어 인출: 기억장치로부터 명령어를 읽어온다.
2) 명령어 해독: 수행해야 할 동작을 결정하기 위하여 명령어를 해독한다.
3) 데이터 인출: 명령어 실행을 위하여 데이터가 필요한 경우에는 기억장치 혹은 입출력 장치로부터 그 데이터를 읽어온다.
4) 데이터 처리: 데이터에 대한 산술적 혹은 논리적 연산을 수행한다.
5) 데이터 저장: 수행한 결과를 저장한다.
여기서 1번과 2번은 모든 명령어에서 공통적으로 실행되지만 3번부터의 동작들은 명령어에 따라 필요한 경우에만 수행된다.
CPU의 기본 구조
![]()
[출처: 컴퓨터구조론 김종현]
CPU는 ALU(산술논리연산장치)와 레지스터 세트 및 제어 유니트로 구성된다.
ALU는 각종 산술 연산(사칙연산)들과 논리 연산(AND, OR, NOT 등)들을 수행하는 회로들로 이루어진 하드웨어 모듈이다.
레지스터는 CPU 내부에 위치한 기억장치로서, 액세스 속도가 컴퓨터의 기억장치 중 가장 빠르다. 하지만 내부 회로가 복잡하고 비교적 큰 공간을 차지하기 때문에 많은 수의 레지스터를 CPU에 포함시킬 수 없으며 따라서 지정된 용도로 사용되는 특수 목적용 레지스터들과 적은 수의 일반 레지스터들만이 포함된다.
제어 유니트(Control Unit) 는 프로그램 코드(명령어)를 해석하고, 그것을 실행하기 위한 제어 신호들을 순차적으로 발생하는 하드웨어 모듈이다. 명령어 실행에 필요한 각종 정보들의 전송 통로와 방향을 지정해주고, CPU 내부 요소들과 시스템 구성 요소들의 동작 시간도 결정해준다.
CPU 내부 버스 이 버스는 ALU와 레지스터들 간의 데이터 이동을 위한 데이터 선들과 주소선들, 그리고 제어 유니트로부터 발생하는 제어 신호들을 전송하는 선들로 구성된다. 이러한 내부 버스 선들은 외부의 시스템 버스와 직접적으로 연결되지는 않고 반드시 버퍼 레지스터 혹은 인터페이스 회로를 통하여 시스템 버스와 접속된다.
이중 모드

운영체제라는 프로세스는 존재하지 않는다. 운영체제는 코드 데이터 형태로 라이브러리처럼 메모리 공간상 어딘가에 존재하고, 실행중인 프로그램(프로세스)이 언제든지 호출할 수 있게 준비된 형태이다. 사용자 프로그램을 실행하다가 입출력이 필요할 때 인터럽트 형태로 시스템 호출를 실행해서 운영체제 코드를 실행하는 것이다. 사용자 프로그램이 직접 입출력 장치를 구동하게 되면 보안이나 충돌과 같은 여러 문제가 발생하기 때문에 이를 해결하기 위해 CPU는 기본적으로 이중 모드를 지원한다. 운영체제 코드를 실행할 때 CPU는 커널 모드 상태로 실행하고 사용자 프로그램을 실행할 때 CPU는 유저 모드 상태로 실행한다. CPU 내부에 PSW(Program Status Word) 레지스터에 현재 CPU의 모드가 커널 모드인지 유저 모드인지 확인하는 Mode Bit가 있다.
- 유저 모드
- Less-privileged mode 이다.
- 사용자 프로그램은 일반적으로 유저 모드에서 실행이 된다.
- 인터럽트나 트랩(소프트웨어 인터럽트로 Exception과 System call이 있다.)는 유저 모드에서 커널 모드로 변경할 수 있다. (시스템 호출은 사용자 프로그램이 운영체제 코드를 실행하기 위해 커널 함수를 호출 하는 것이다.)
- privileged instruction들을 실행할 수 없다.
- 커널 모드
- more-privileged mode 이다.
- 운영체제 코드들은 커널 모드에서 실행이 된다.
- privileged instruction들을 실행할 수 있다.
- Privileged instructions
- I/O instructions
- 프로세서 즉 CPU의 상태를 변경하는 instructions
- 메모리 공간에 접근할 수 있는 instructions (응용 프로그램은 자신의 메모리 영역밖에 접근 불가능하지만 커널 모드일때는 가능)
주변장치 장치와 DMA
주변 장치는 저장 장치와 입출력 장치를 뜻하고, 주변 장치에는 각각 CPU가 컴퓨터 시스템을 제어하는 것처럼 주변 장치를 제어하는 Device Controller가 존재한다. 주변장치의 데이터는 Device Controller에 의해 Local Buffer로 이동한다. 기본적으로 Device Controller는 입출력이 끝났을 경우 인터럽트로 CPU에게 그 사실을 알린다. 그러나 전송할 데이터가 많은 경우, CPU가 직접 주변 장치의 Local Buffer에 접근해서 데이터를 메인 메모리에 적재하는 것은 엄청 큰 오버헤드이다. 이를 해결하기 위해 DMA(Direct Memory Access)를 이용한다. 기본적으로 메인메모리에 접근하는 것은 CPU만 가능하지만 DMA 방식은 CPU가 아닌 DMA Controller가 데이터를 직접 메인 메모리에 적재하고 완료되면 CPU에 데이터 이동이 완료되었다는 인터럽트를 발생시킨다.
타이머(Timer)
특정 프로그램이 오랜 시간동안 CPU를 독점해서 사용하는 경우를 해결하기 위해 사용되는 것이다. 정해진 시간이 넘어가면 타이머는 CPU에게 인터럽트를 걸고 커널 모드로 전환이 된다. 그 후 CPU 스케쥴링에 의해 결정된 사용자 프로그램에게 CPU의 사용 권한을 넘긴다.
인터럽트
인터럽트 벡터(Interrupt Vector) 는 인터럽트가 발생했을 때, 그 인터럽트를 처리할 수 있는 서비스 루틴들의 주소를 가지고 있는 공간이다. 인터럽트 핸들러(Interrupt Handler) 또는 인터럽트 서비스 루틴(Interrupt Service Routine, ISR)은 인터럽트 접수에 의해 발생되는 인터럽트에 대응하여 특정 기능을 처리하는 기계어 코드 루틴이다.
Synchronous 및 Asynchronous I/O

입출력 동기화에는 Synchronous I/O 와 Asynchronous I/O의 두 가지 유형이 있다. Synchronous I/O에서 스레드는 입출력 작업을 시행하고 입출력 요청이 완료될 때까지 즉시 대기 상태로 전환된다. Asynchronous I/O에서 스레드는 적절한 함수를 호출하여 커널에 입출력 요청을 보낸다. 커널에서 요청을 수락하는 경우 호출 스레드는 커널이 입출력 작업이 완료되었음을 스레드에 알릴 때까지 다른 작업을 계속 처리한다. 두 경우 모두 입출력이 끝난 경우 인터럽트를 통해 CPU에게 완료를 알려준다.
- 입출력 맵 입출력(I/O mapped I/O)
메모리와 입출력의 주소 공간을 분리하여 메모리에 액세스하는 방식이다. 보통 입출력 회로가 메모리보다 속도가 느리고 공간이 작다고 가정하기 때문에 두 공간을 분리하면 속도와 메모리 공간의 효율을 얻을 수 있다. 그러나 주소 공간을 분리하려면 기계어 명령어 역시 분리해야하는 단점이 있다. - 메모리 맵 입출력(Memory-mapped I/O)
CPU가 입출력 장치를 액세스 할 때, 입출력과 메모리의 주소 공간을 분리하지 않고 하나의 메모리 공간에 취급하여 배치하는 방식이다. 전체 메모리의 주소공간에 입출력 장치의 메모리와 레지스터를 메모리로 취급하여 전체 메모리의 일부분으로 특정영역에 할당한다. 입출력 장치의 메모리 주소가 나뉘어 있지 않기 때문에 메모리를 액세스 할 때 메모리와 같은 주소공간이므로 같은 기계어 명령어로 수행한다.
저장장치 계층 구조

레지스터, 캐시, 메인 메모리는 바이트 단위로 접근이 가능한 매체로 CPU로 직접 접근이 가능하고 속도가 빠르다. 계층이 낮아질수록 접근 시간이 길어지기 때문에 더 빠른 저장장치에 데이터를 복사해서 저장하는 캐싱이 중요하다.
프로그램의 실행
프로그램은 주로 파일 시스템에 파일 형태로 하드디스크에 저장되어 있다. 프로그램을 실행하면 그 프로그램을 0번지 부터 시작하는 독자적인 주소공간 즉 가상주소가 생성된다. 가상 메모리에서의 주소 공간, 즉 가상 주소 공간은 프로세스가 참조할 수 있는 주소들의 범위이며 일반적으로 스레드는 프로세스 내의 주소 공간을 공유한다. 이 가상 주소를 물리적인 메모리 주소로 변환해서 메인 메모리에 적재해서 프로그램을 실행한다.