일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 코틀린
- 프로젝트
- 자료구조
- Brute-force
- back-end
- 네트워크
- Spring
- kotlin
- 백트래킹
- 스프링
- algorithm
- programmers
- DFS
- java
- Java8
- 알고리즘
- BFS
- 프로그래머스
- baekjoon
- 모던자바
- 운영체제
- LEVEL2
- backtracking
- 백준
- TDD
- lambda
- DP
- 자바
- 그래프
- OS
- Today
- Total
요깨비's LAB
2. 컴퓨터 시스템의 동작원리 본문
2-1 컴퓨터 시스템의 구조
-
내부장치: CPU, Memory
-
외부장치: 디스크, 키보드, 마우스, 모니터, 네트워크 장치 등
-
Controller: 일종의 작은 CPU로, 컴퓨터 전체에 CPU라는 중앙처리 장치가 있듯이 Controller는 각 하드웨어 장치마다
존재하면서 이들을 제어함
- Local Buffer: 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리
2.2 CPU와 I/O 연산
-
입출력 장치와 메인 CPU는 동시 수행이 가능하다. => 두가지 일이 다른곳에서 발생하므로!!
ex) 현재 CPU를 할당받고 프로그램을 수행중인 A프로그램, 하드디스크에서 어떠한 정보를 읽어오고 있는 B프로그램
- 외부장치에서 데이터를 읽어오는 경우, 우선 로컬 버퍼에 데이터가 임시로 저장된 후 메모리에 전달된다.
이때, 장치에서 로컬 버퍼로 읽어오는 일은 컨트롤러가 담당한다.
ex) 프로그램 B가 수행중에 디스크에서 데이터를 읽어오라는 명령을 내리면 디스크 컨트롤러가 물리적인 디스크에서
내용을 읽어 이를 로컬 버퍼에 저장한다. 원하는 데이터를 로컬버퍼로 다 읽어오고 나면, B는 자신이 필요한 데이터를
다 읽어왔으므로 메인 CPU에서 다음일을 수행할 수 있다. - 데이터를 모두 가지고 왔는지 확인하는 작업은 메인 CPU가 일일이 체크하는 것이 아니라 장치에 있는 컨트롤러가
인터럽트를 발생시켜 CPU에게 보고한다. - 인터럽트: 컨트롤러들이 CPU의 서비스가 필요할 때 할당을 요청하는 방법
- CPU는 명령 하나를 수행할 때 마다 인터럽트가 발생했는지를 체크!
2.3 인터럽트의 일반적 기능
-
운영체제 커널에는 인터럽트가 들어왔을 때 해야 할 일을 미리 다 프로그래밍해서 보관하고 있음.
1. 로컬 버퍼에 있는 내용을 프로그램 B가 사용할 수 있도록 메모리에 전달.
2. B가 CPU를 할당받을 경우 다음 명령(instruction)을 수행할 수 있음을 표시. -
인터럽트가 발생하면 CPU는 하던 일을 멈추고 인터럽트를 처리하기 위한 루틴(운영체제 커널 내부 코드)에 들어가서
정의된 일을 찾게 된다. 운영체제는 할일을 쉽게 찾아가기 위해 인터럽트 벡터를 가지고 있다. -
인터럽트 벡터: 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야 할 코드가 위치한 부분을 포인터로 가리키고
있는 자료구조. -
실제 처리해야 할 내용은 인터럽트 서비스 루틴( Interrupt Service Routine)이라는 다른 곳에서 정의
- 인터럽트 서비스 루틴을 통해 해당하는 인터럽트 처리를 완료하고 나면 원래 수행했던 작업으로 돌아가 정지 되었던 일을
계속해서 수행
* 프로그램 메모리 주소
-
Stack: 실행 중인 함수에서 다른 함수를 호출한 경우 호출된 함수의 종료 후 원래 함수의 실행 중이던 위치로 돌아가기 위해
복귀 주소를 저장하는 영역 -
Data: 전역 변수 등 프로그램이 사용하는 각종 데이터가 저장되는 공간. 데이터 영역에 저장되는 전역 변수들은 동일한 프로그램 내의
모든 함수들이 공유해 사용할 수 있다. -
Code: 프로그래머가 작성한 코드가 기계어 명령 형태로 저장되는 영역. CPU는 매시점 코드 부분에 있는 명령을 하나씩 읽어와서 수행.
2.4 인터럽트 핸들링
-
프로그램 A가 수행되고 있을때 인터럽트가 발생하면 A의 현재 상태 저장
-
CPU에서 명령이 수행될 때는 CPU 내부에 있는 임시기억 장치인 레지스터에 데이터를 읽어오거나 쓰면서 작업을 수행하는데,
이때 인터럽트가 발생해 새로운 명령을 수행하면 기존의 레지스터 값들이 지워지게 되므로 레지스터 값 등 CPU내의 하드웨어 상태를
저장해두어야 함 이둘을 모두 저장해야 인터럽트 처리가 일어날 수 있다!!
-
운영 체재 커널 영역에는 현재 시스템 내에서 수행되는 프로그램들을 관리하기 위한 PCB를 두고 있다.
-
현재 처리중인 인터럽트 보다 더 높은 우선순위의 인터럽트가 발생하다면 현재 처리중이던 인터럽트 코드의 수행지점을 커널 스택에
저장하고 우선순위가 높은 인터럽트를 처리. 처리가 끝나면 커널 스택에 저장된 주소로 복귀해 이전에 수행하던 인터럽트 처리 코드를
마저 수행
-
H/W => 인터럽트(각종 하드웨어 장치) S/W => 트랩(Exception, System call)
-
운영체재가 직접 CPU를 점유하는 경우 인터럽트에 의하지 않고는 발생하지 않는다.
2.5 입출력 구조
-
입출력(I/O): 컴퓨터 시스템이 컴퓨터 외부의 주변장치들과 데이터를 주고 받는것.
-
동기식 입출력(Synchronous I/O) => 주로 읽어오는 작업을 동기식으로 구현, 확실한 write작업을 원할때..
- I/O 요청 후 작업이 완료된 후에야 제어가 사용자 프로그램으로 넘어감. ex) 프로그램이 디스크에서 어떠한 정보를
읽어오라는 요청을 했다고 할때 디스크 입출력이 완료되기까지는 어느정도 시간 소요.
<구현 방법 1>
I/O가 끝날때까지 CPU를 낭비시킴, 매시점 하나의 I/O만 일어날 수 있음.
CPU의 명령 수행속도는 빠른 반면 외부장치에서 데이터를 읽어오는 등의 입출력 연산은 상대적으로 느리다.
그럼에도 입출력이 완료될 때까지 CPU가 아무일도 못하기 때문에 자원 낭비 발생.
<구현 방법 2>
I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음. I/O 처리를 기다리는 줄에 그 프로그램을 줄세움
다른 프로그램에게 CPU를 줌 -
비동기식 입출력(Asynchronous I/O) => 주로 쓰기 작업을 할때 구현, 읽어온 Data에 상관없는 작업
I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감!
* 두 경우 모두 I/O의 완료는 인터럽트로 통보!!
2.6 DMA (Direct Memory Access)
-
빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용
-
CPU의 중재없이 Device Controller가 device의 Buffer Storage의 내용을 메모리에 Block 단위로 직접 전송
-
byte 단위가 아닌 Block 단위로 인터럽트를 발생시킴
예를들어 Keyboard 입력 하나씩 계속적으로 인터럽트가 발생하면 CPU에 너무 자주 인터럽트가 걸림 따라서 DMA가 로컬버퍼에서
메모리로 읽어오는 작업을 대행하여 byte 단위가 아닌 Block이라는 큰 단위로 정보를 메모리로 읽어온 후에 CPU에게 인터럽트를
발생시켜서 해당작업의 완료를 알린다.
2.7 커널 주소공간의 내용
2.8 사용자 프로그램이 사용하는 함수
'컴퓨터 공학기초 > 운영체제' 카테고리의 다른 글
프로세스(2) (0) | 2020.09.02 |
---|---|
프로세스(1) (0) | 2020.09.02 |
3. 인터럽트의 원리(2) (0) | 2020.01.23 |
3. 인터럽트의 원리(1) (0) | 2020.01.23 |
1. Introduction to Operation System (0) | 2019.11.26 |