운영체제, OS(Operating System) 란?
사용자가 컴퓨터 쉽게 쓰게 도와줌. (인터페이스 말하는거)
소프트웨어가 컴퓨터 자원 잘 쓰게 도와줌.
프로그래머가 소프트웨어 개발할 때 도움 줌. (*API)
운영체제는 컴퓨터 구조 잘 알아서 일 잘 처리함.
*API(Application Programming Interface) : 프로그래머가 소프트웨어 개발할 때 쓰는 도구임. 쉽게 말해서, 프로그램끼리 서로 기능을 쓸 수 있게 해주는 약속 같은 건데, 예를 들어 네이버 지도 API를 쓰면 내 앱에서 네이버 지도를 불러올 수 있는 거임. 그래서 직접 지도 만들 필요 없이 걍 가져다 쓰면 되는 거.
폰 노이만 머신(Von Neumann Machine)


폰 노이만 이전의 컴퓨터
한번에 하나의 연산만 가능
프로그램은 하드웨어에, 데이터는 메모리에 따로 저장됨. (예전 컴퓨터들은 프로그램이 하드웨어에 직접 박혀 있어서 바꾸려면 하드웨어 자체를 바꿔야 했던거임)
폰 노이만 머신
범용 컴퓨터 (여러 작업 가능)
프로그램도 메모리에 저장, 데이터도 메모리에 저장
그래서 이걸 “저장 프로그램 구조(stored-program architecture)”라고 부름
장점은 프로그램을 쉽게 바꿀 수 있음

문제 1: 폰 노이만 병목 현상
문제: 폰 노이만 병목 현상 = 버스
버스를 통해 너무 많은 데이터를 이동해야 해서 속도가 느려짐
해결책: 캐시
캐시: 최근에 사용된 데이터나 프로그램을 저장하는 임시적인 빠른 메모리
코드 최적화: 더 효율적인 방식으로 데이터를 처리하기 위한 최적화 기법
결론:
폰 노이만 구조에서 데이터와 명령어가 버스를 통해 전달될 때 병목 현상이 발생하는데, 이를 해결하기 위해 캐시 메모리를 사용하고, 코드 최적화를 통해 속도를 높일 수 있음.
문제 2: 폰 노이만 구조의 문제
문제: 프로그램과 데이터가 같은 메모리에 저장됨
프로그램이 메모리 내의 명령어를 덮어쓸 수 있어서 명령어가 망가질 위험이 있음.
해결책: 하버드 아키텍처
하버드 아키텍처: 데이터 메모리와 프로그램 메모리를 분리해서 사용함
메모리 제한: 데이터를 변경하는 부분 외에는 메모리 접근을 제한하여 프로그램이 덮어쓰지 못하게 함

결론:
폰 노이만 구조는 프로그램과 데이터가 같은 메모리를 사용하니까 충돌이 일어날 수 있는데, 하버드 아키텍처에서는 이를 분리해서 데이터를 안전하게 처리할 수 있도록 하는 방식임.
문제 3: 폰 노이만 구조의 문제
문제: 프로그램과 데이터가 같은 버스를 사용함
명령어와 데이터를 가져오는 경로(버스)가 하나뿐이라 동시에 접근 불가능
명령어와 데이터를 순차적으로 가져와야 해서 속도가 느려짐(폰 노이만 병목현상)
해결책: 하버드 아키텍처
명령어 버스와 데이터 버스를 분리하여 병령 처리 가능
명령어와 데이터를 동시에 가져올 수 있어 성능 향상
CPU가 더 빠르게 동작하며, 데이터 처리 속도 증가
결론:
폰 노이만 구조는 하나의 버스 때문에 속도가 느려지지만, 하버드 아키텍처는 버스를 분리하여 더 빠르고 효율적인 데이터 처리 가능
VNA(폰 노이만 정리)
폰 노이만 구조 이해
문제점과 해결책 이해
CPU가 프로그램을 실행하는 방식
메모리에 프로그램을 불러와 실행
명령어를 순차적으로 실행
컴퓨터가 여러 작업을 동시에 수행하는 방법
인터럽트(Interrupts) 사용
최종 정리
1. 폰 노이만 구조는 프로그램과 데이터를 같은 메모리에 저장하므로, 하나의 버스를 사용해야 해서 병목현상이 발생한다.
해결: 캐시(최근 사용한 프로그램, 명령어 저장하는 메모리), 코드 최적화
2. 폰 노이만 구조에서는 실행 중에 프로그램이 명령어를 덮어쓸 위험이 있다.
해결: 하버드 아키텍처(프로그램 & 데이터(명령어) 분리)
3. 폰 노이만 병목현상 해결 방법으로 캐시 메모리를 추가하거나, 아예 하버드 아키텍처로 변경할 수 있다. 즉, 캐시를 쓰면 폰 노이만 구조를 유지하면서 속도를 높일 수 있고, 하버드 구조를 쓰면 더 빠르고 안전한 시스템을 만들 수 있다.

명령어를 가져오고 실행
프로세서(CPU)는 메모리에서 명령어를 가져와서 IR(Instruction Register)에 저장한다.
PC(Program Counter)는 다음에 가져올 명령어의 주소를 저장한다.
>>> PC는 명령어를 가져올 때마다 1씩 증가한다.
프로세서는 명령어를 해석하고, 필요한 작업을 실행한다.
Processor-memory: 메모리와의 작업
Processor-I/O: 입출력 장치와의 작업
Data processing: 데이터 처리 작업
Control: 제어 작업

0001 Load, 메모리에서 AC로 값 로드
0010 Store, AC의 값을 메모리에 저장
0101 Add, 메모리에서 값을 가져와 AC에 더함
부호비트 0이면 양수, 1이면 음수
PC(메모리주소 저장, 저장하면 1씩 증가), 즉 주소(300) 저장, PC = 300
IR(명령어 저장, 1940), 이거 16진수인데 앞자리 1은 0001(Load)>> 뒷자리 940(주소)에서 0003(명령어)을 AC에 저장
PC = 300, AC = 0003, IR = 1940
PC(메모리주소 저장, 1 증가), 즉 주소(301) 저장, PC = 301
IR(명령어 저장, 5941), 이거 16진수인데 앞자리 5는 0101(Add)>> 뒷자리 941(주소)에서0002(명령어)을 AC에 더함, 즉 0003 + 00002 >> 0005
PC = 301, AC = 0002, IR = 5941
PC(메모리주소 저장, 1증가), 즉 주소(302) 저장, PC = 302
IR(명령어 저장, 2941), 이거 16진수인데 앞자리 2는 0010(Store) >> 뒷자리 941(주소)에 AC에 있는 0005(데이터) 저장
결론:
PC에 주소300저장, IR에 주소300안에 있는 명령어1940 저장, 명령어1940에서 부호비트 1(0001 – Load) 제외한 주소940에서 데이터0003을 AC에 저장
PC에 주소 저장해서 1증가해서 주소301저장, IR에 주소 301안에 있는 명령어5941 저장, 명령어5941에서 부호비트 5(0101-Add) 제외한 주소941에서 데이터0002가져와서 AC에 있는 0003과 더하기. 즉, AC에 0005저장
PC에 주소 저장해서 1증가해서 주소302저장, IR에 주소302 안에 있는 명령어 2941 저장, 명령어2941에서 부호비트 2(0010-Store) 제외한 주소941에 AC에 있는 데이터0005 저장
Interrupt
프로세서의 정상적인 처리 순서를 중단시키는 방식으로, 이것을 통해 프로세서의 자원을 효율적으로 활용하려고 한다.
대부분의 입출력(I / O) 장치가 프로세서보다 느리기 때문에, 프로세서는 장치가 작업을 완료할 때까지 잠시 멈춰야 한다. 이 과정은 프로세서 자원의 낭비를 유발할 수 있다.
예를 들어, 프로세서가 데이터를 저장하는 작업을 요청하고 하드 드라이브가 이를 처리할 때까지 기다린다고 가정해보면, 하드 드라이브가 상대적으로 느리기 때문에 프로세서는 그동안 아무 일도 하지 않고 기다린다. 이 과정에서 프로세서의 계산 능력이 낭비된다.
일반적인 인터럽트의 종류 (Table 1.1 인터럽트 종류)
프로그램
특정 조건이 발생하면 생성되는 인터럽트로, 예를 들어 산술 오버플로(overflow), 0으로 나누기, 잘못된 기계어 명령 실행 시도, 사용자가 허용된 메모리 공간을 벗어난 참조 등 있음
타이머(Timer)
프로세서 내의 타이머에 의해 생성되는 인터럽트로, 운영체제가 정기적으로 특정 기능을 수행할 수 있도록 한다. 예를 들어, 전원 관리(CPU나 하드웨어의 전력 소비를 최적화하기 위해 타이머 인터럽트를 활용한다. 일정 시간 동안 사용자가 입력을 하지 않으면 화면으로 자동으로 꺼지는 기능)
입출력(I/O)
I/O 컨트롤러에 의해 생성되는 인터럽트로, 정상적인 작업 완료를 알리거나 다양한 오류 상태를 알리는데 사용된다. 예를 들어, USB 장치 연결/제거 감지(USB 메모리를 컴퓨터에 연결하면 USB 컨트롤러가 인터럽트를 발생시켜 운영체제가 장치를 인식하도록 한다. 마찬가지로 USB를 제거하면 제거 인터럽트가 발생하여 안전하게 제거된다.)
하드웨어 오류(Hardware failure)
전원 장애 또는 메모리 패리티 오류와 같은 하드웨어 고장으로 인해 발생하는 인터럽트이다. 예를 들어, 노트북이 배터리 부족 상태가 되면, 운영체제가 자동으로 절전 모드로 전환하는 것.
인터럽트 없이 제어 흐름

1. 사용자 프로그램이 실행된다.
2. 프로그램이 WRITE(출력 명령)을 수행하면, I/O 작업이 시작된다.
3. CPU는 I/O 작업이 끝날 때까지 대기하며 다른 작업을 수행하지 못한다.
4. I/O 프로그램이 명령을 수행한 후 결과를 반환한다.
5. I/O 작업이 끝나야만 다음 명령이 실행된다.
문제점
1. CPU가 비효율적으로 사용됨.
I/O가 끝날 때까지 아무 작업도 하지 못하고 대기해야 함
2. 처리 속도 저하
다중 작업이 어려워 시스템 성능 낮아짐
3. I/O 작업이 많은 경우 더 심각한 성능 저하 발생



인터럽트가 있으면 다른 작업하다가 인터럽트 신호보내서 명령어대로 수행한거 처리한다음에 다시 원래 코드로 돌아갈 수 있음.
인터럽트 제어 흐름
1. 사용자 프로그램이 실행됨
2. 프로그램이 WRITE(출력 명령)을 수행하면, I/O 작업이 시작된다.
3. CPU는 I/O가 끝날 때까지 기다리는 대신, 다른 작업을 수행함
4. I/O가 완료되면 인터럽트가 발생하여 CPU가 이를 감지하고 결과를 처리함
5. CPU는 인터럽트 핸들러(명령어)를 실행하여 I/O 작업을 마무리한 후, 원래 작업으로 복귀함
장점
1. CPU가 대기하지 않고 다른 작업을 수행 가능
CPU 활용도가 높아짐
2. I/O가 끝나는 즉시 인터럽트가 발생하여 처리됨
반응 속도 향샹
3. 멀티태스킹 지원 가능
여러 작업을 동시에 수행 가능

· Fetch Stage: "명령어 가져오자!" (준비 과정)
· Fetch Next Instruction: "명령어 가져옴!" (실제 동작)
· Execute Instruction: "명령어 실행!"
· Execute Stage: "다음 명령어 실행 준비!"

'운영체제' 카테고리의 다른 글
Pipe 파이프, Motivation 동기 (0) | 2025.04.05 |
---|---|
fork, IPC (0) | 2025.03.30 |
Processes, Scheduling, fork() (0) | 2025.03.24 |
메모리, 마이크로커널 / 모놀리식 시스템 구조, 프로세스 (0) | 2025.03.17 |