CS/운영체제

[운영체제] ch02. System structure & program excution

rngPwns 2025. 4. 21. 08:57

컴퓨터 시스템 구조


🖥 구성 요소 정리

  • OS가 설치된 부분, 사용자 프로그램 영역으로 나뉘어 있음.
  • 프로세스는 이 메모리 영역에서 동작함.

1. CPU (중앙처리장치)

  • Interrupt 발생 시 제어 흐름 전환: 사용자 모드에서 → "monitor 모드(커널 모드)"로 전환.
  • OS는 CPU가 Interrupt를 감지하고 처리할 수 있도록 감시함.
  • interrupt vector 를 통해 적절한 서비스 루틴으로 점프함.

2. Interrupt Line

  • CPU와 각 장치 컨트롤러 사이에 존재.
  • 특정 장치에서 Interrupt를 발생시키면, 이 선을 통해 CPU에 신호를 보냄.
  • CPU는 해당 interrupt를 감지하고, Interrupt Service Routine(ISR)을 실행함.

3. Interrupt Controller

  • 각 장치에서 발생한 Interrupt를 우선순위에 따라 처리할 수 있게 관리해주는 하드웨어.
  • 키보드처럼 입력이 빠르게 들어오는 장치는 고우선 순위를 가지기도 함.
  • interrupt 번호를 사용하여 ISR 위치를 결정.

4. 각 장치 컨트롤러 (Disk, Timer, etc.)

  • 각 I/O 장치들에는 자체 controller가 존재.
  • 예: Disk controller는 Disk와 연결되어 I/O 요청을 처리함.
  • DMA controller는 CPU의 개입 없이 데이터 전송을 수행.

📝 너의 필기 요약

  • key 입력이 발생 → 해당 interrupt가 발생하여 CPU가 처리하게 됨.
  • interrupt 1, 2, 3 은 각 장치에 따라 다름 (예: 키보드, 프린터 등).
  • interrupt가 발생하면 → interrupt vector를 참조하여 ISR로 이동.
  • CPU는 monitor 모드로 전환됨.
  • DMA를 통해 CPU를 거치지 않고 memory ↔ I/O 장치 간의 직접 통신 가능.

🔄 흐름 요약

  1. 사용자 프로그램 실행 중 → 입력 이벤트 발생 (예: 키 입력)
  2. I/O 장치에서 Interrupt 발생
  3. Interrupt line 통해 CPU로 신호 전달
  4. Interrupt controller가 우선순위에 따라 처리
  5. CPU는 현재 작업을 잠시 중단하고, Interrupt vector를 통해 ISR(Interrupt Service Routine) 실행
  6. Interrupt 처리 후, 원래 작업으로 복귀

✅ 컴퓨터 시스템 구조

📍 이 그림은 컴퓨터 하드웨어(HW)와 운영체제(OS)의 구성 및 입출력 장치 간의 인터럽트 처리 흐름을 설명한 구조도야. 


🧩 구성 요소 및 기능

  1. CPU
    • 인터럽트 처리 기능이 있는 핵심 연산 장치
    • ⭕ 표시: CPU가 **"monitor 모드"**로 진입한다는 뜻
    • 인터럽트를 받으면 mode를 monitor 모드로 전환
    • Interrupt 발생 시 → 해당 interrupt vector 번호를 이용해 ISR(Interrupt Service Routine) 실행
  2. Interrupt line
    • 각 장치에서 오는 인터럽트를 CPU로 전달하는 선로
  3. Memory Controller
    • memory I/O 관리
    • interrupt 정보도 메모리 통해 전달됨
  4. DMA Controller / Timer Controller
    • DMA: 직접 메모리 접근을 담당함
    • Timer: 타이머 인터럽트 발생 가능
  5. Interrupt Device Controller
    • 하단 디바이스들(1~4번 장치)의 인터럽트를 받아 CPU로 전달함
    • interrupt 신호가 Controller로 먼저 모여서 CPU로 감

🖥️ 하단 I/O 디바이스 흐름

  1. Disk (장치 ①)
    • interrupt → controller → CPU 전달됨
    • 📝 메모: "key 입력"도 발생 가능
  2. Printer (장치 ②)
    • Interrupt 시 CPU가 반응
  3. Monitor (장치 ③)
    • Display 출력 관련 장치
  4. Keyboard (장치 ④)
    • Key 입력 시 인터럽트 발생
    • Local buffer에 저장된 데이터를 interrupt 통해 CPU로 보냄
    • 🔹 필기: “interrupt 발생 → CPU가 monitor 모드로 전환”

🔁 인터럽트 처리 흐름 요약

  • 장치(1~4)에서 interrupt 발생
  • Interrupt device controller가 수신
  • CPU에 인터럽트 전달
  • CPU는 interrupt vector를 통해 ISR 호출
  • ISR 실행 시 OS가 개입
  • 이후 원래 실행 중이던 사용자 프로그램으로 복귀

📝 키워드 정리

  • monitor 모드: 커널 모드. CPU가 OS 기능 실행할 수 있는 모드
  • interrupt vector: 각 인터럽트에 고유하게 부여된 번호로 ISR 식별에 사용됨
  • ISR (Interrupt Service Routine): 인터럽트를 처리하는 OS 함수

 
 

입출력 IO의 수행

I/O 처리 흐름과 Interrupt 처리 과정


🧭 전체 흐름 설명

📌 상황 예시:

사용자가 키보드 입력을 하여 read(1)을 호출했을 때,
어떻게 OS가 해당 입력을 받아오는지를 구체적인 흐름으로 보여주는 그림.


🔄 흐름 단계별 정리

단계설명
① read(1) 호출 사용자 프로그램이 시스템 콜 read(1)을 호출함. (예: 터미널 입력 요청)
② OS read(1) 진입 시스템 콜 인터페이스를 통해 커널 내부의 OS의 read 함수로 진입
③ 실제 입력 대기 사용자 입력을 받기 위해 **키보드 장치의 ISR(Interrupt Service Routine)**에서 대기
④ 키보드 입력 발생 사용자가 키를 누르면, 키보드가 Interrupt를 발생시킴
⑤ Interrupt 발생 키보드 → Interrupt controller → CPU에 전달
⑥ ISR 실행 CPU는 interrupt vector를 참조하여 **ISR(키보드용)**으로 이동하여 실행
⑦ 입력 처리 ISR은 키보드 버퍼로부터 데이터를 읽어오고, 이를 OS의 read로 넘김
⑧ 사용자에 결과 전달 OS는 read(1)의 결과로 읽은 문자를 사용자 프로그램에 반환함

📝 네 필기 반영

  • "read(1)" → "os의 read(1)" → ISR → 값 읽기
     : 시스템콜 → 커널 read 함수 → 인터럽트 서비스 루틴을 거쳐 입력값 전달
  • "key 입력 → interrupt → ISR 실행 → 데이터 읽기"
     : 키를 누르면 인터럽트 발생 → ISR 실행 → 키보드 버퍼에서 데이터 읽음
  • "vector 번호"
     : 어떤 장치에서 interrupt가 발생했는지 구분하기 위한 interrupt vector 번호
     → 이를 기반으로 ISR 위치 결정됨

📌 Interrupt Vector Table이란?

각 I/O 장치에 대해 해당 interrupt가 발생했을 때 호출할 ISR의 주소를 저장한 테이블
예: 키보드는 33번, 타이머는 32번 등


👁️ 한눈에 보는 흐름 요약 (전체 연결)

 
사용자 프로그램 ↓ read(1) ↓ OS의 read(1) ↓ 키 입력 발생 ↓ Interrupt 발생 ↓ Interrupt vector lookup ↓ ISR 실행 (키보드) ↓ 키보드 버퍼에서 값 읽기 ↓ OS read 함수로 반환 ↓ 사용자에게 문자 반환

 


🔑 키워드 요약

용어설명
System Call 사용자 → OS 요청 인터페이스
ISR Interrupt 발생 시 실행되는 커널 함수
Interrupt Vector 각 장치 interrupt 번호 → ISR 위치 연결
read(1) 터미널에서 문자 1개 읽는 대표적 시스템 콜

 

 

📄 동기식 입출력(Synchronous I/O) vs 비동기식 입출력(Asynchronous I/O)

🟧 공통 구조 개요

  • 각 그림의 흐름도는 시간 흐름에 따른 입출력 처리 순서를 나타냄.
  • 수직선은 kernel과 user 영역을 구분.
  • 주요 컴포넌트:
    • Hardware: 실제 장치 (예: 프린터)
    • Interrupt Handler: 인터럽트 처리 루틴(ISR)
    • Device Driver: 장치 제어를 위한 커널 내부 소프트웨어
    • Requesting Process: 입출력을 요청한 사용자 프로세스

(a) 동기식 입출력 (Synchronous)

📌 PPT 원문 + 필기 정리

  • 📄 PPT 설명:
    • 요청한 프로세스는 입출력이 끝날 때까지 기다린다.
    • 시스템 콜 이후 → waiting 상태로 진입
    • 작업이 끝난 뒤 wake-up
  • 📝 필기:
    • “CPU가 I/O 작업 끝날 때까지 기다림” (기다리는 동안 idle 상태)
    • 커널 → 사용자 영역 복귀 없음 (blocking call)
    • print → 다 출력할 때까지 기다림

🔁 흐름 설명

  1. 사용자 프로세스가 print 요청 → 커널에 system call
  2. 커널이 디바이스 드라이버에게 작업 요청
  3. 하드웨어에서 데이터 전송 시작
  4. 작업 끝날 때까지 프로세스는 waiting
  5. 장치가 작업 완료 → 인터럽트 발생
  6. 인터럽트 핸들러(ISR) 실행
  7. 프로세스가 wake-up 되어 재진입

특징: 프로세스는 입출력이 끝날 때까지 아무 작업도 못 함


(b) 비동기식 입출력 (Asynchronous)

📌 PPT 원문 + 필기 정리

  • 📄 PPT 설명:
    • 프로세스는 I/O 요청 후 즉시 다음 작업 수행 가능
    • 시스템 콜 이후 blocking 없이 진행됨
  • 📝 필기:
    • “CPU가 다른 작업 수행 가능”
    • print → 요청만 하고 끝까지 기다릴 필요 없음
    • 장치 완료되면 인터럽트 발생 → 커널이 처리 → 결과 전달

🔁 흐름 설명

  1. 사용자 프로세스가 print 요청 → system call
  2. 커널이 device driver에게 요청
  3. 하드웨어에서 데이터 전송 시작
  4. 프로세스는 바로 다음 코드 수행 가능
  5. 입출력이 끝나면 → 인터럽트 발생
  6. ISR 처리 → 이후 결과를 프로세스에 알려줌

특징: 입출력 중에도 CPU는 다른 일을 할 수 있음


🔍 차이 요약

구분동기식 I/O비동기식 I/O
시스템 콜 이후 프로세스가 기다림 즉시 반환 후 다음 작업 가능
CPU 활용 비효율적 (idle time) 효율적 (다른 작업 수행 가능)
인터럽트 사용 완료 후 wake-up 완료 시 결과 알림

 
 

📄  프로그램의 실행 (메모리 load)

📌 전체 흐름 개요

  • 사용자가 .c 파일을 컴파일하면 → 실행파일(.exe)이 생성
  • 이 실행파일은 OS에 의해 DRAM에 적재되어 실행됨
  • 실행 중인 프로그램 = 프로세스(Process)

📥 실행 흐름 (PPT + 필기 반영)

  1. 사용자가 a.c를 compile
    • 🔸 → compile A → A.exe
    • ✍️ 필기: compile을 하면 실행파일(.exe)이 만들어진다
  2. 실행 시, OS가 .exe 파일을 메모리에 올림
    • 🔸 파일 시스템(File system) → 실행파일(.exe) → DRAM
    • ✍️ 필기: 실행파일 A → 코드/데이터가 DRAM에 올라감
  3. DRAM에 적재된 실행파일은 프로세스로 전환됨
    • 🔸 코드(Code), 데이터(Data), 스택(Stack) 등으로 분할
    • ✍️ 필기: 코드가 올라간 영역은 read only
  4. CPU는 메모리에 올라간 코드를 fetch하여 실행
    • ✍️ 필기: CPU는 코드 실행 중, DRAM의 코드 영역 참조함

🧠 핵심 구조: 실행파일 → 메모리 적재 → 실행 중 프로세스

  • 🔹 Physical Memory(DRAM): 실제 실행 중인 프로세스가 위치
  • 🔹 CPU: 코드 fetch & 실행
  • 🔹 Kernel 영역: 운영체제 핵심 코드(커널 코드)는 별도 위치에 있음

💡 보충 개념

  • 코드(Code): 실행 명령어, 읽기만 가능 (read-only)
  • 데이터(Data): 전역변수 등
  • 스택(Stack): 함수 호출 시 지역변수 저장, 호출 순서 저장
  • 파일 시스템(File System): .exe가 존재하는 저장소

🔐 필기 강조 내용 요약

  • 코드는 read only (수정 불가)
  • 실행파일은 커널에 의해 DRAM으로 적재됨
  • 메모리에 올라간 순간부터 ‘프로세스’라고 부름
  • CPU가 DRAM에서 코드 fetch → 명령어 실행

 

📄 사용자 프로그램의 주소 공간 (메모리 load)

 

📌 전체 구조 설명

  • 이 슬라이드는 가상 메모리(Virtual Memory) 구조를 설명함
  • 사용자 프로그램은 자신만의 논리적 주소 공간(Address Space) 을 가짐
  • 실제 물리 주소(Physical Memory)와는 다르며, 주소 변환(Address Translation) 이 일어남

🧠 주요 구성요소

Virtual Address Space (가상 주소 공간)

  • 사용자 프로세스는 자신만의 주소 공간을 갖는다 (ex. 0, 100, 200 등)
  • 구성:
    • Code: 프로그램 코드 (read only)
    • Data: 전역변수, 초기화된 데이터 등
    • Stack: 함수 호출 시 지역변수 저장, 호출 순서 저장
  • PPT 구조에서 stack은 주소가 높은 곳부터 낮은 쪽으로 자람 (Stack grows downward)

Physical Address Space (물리 주소 공간)

  • DRAM 상의 실제 메모리
  • 커널이 관리하는 영역과 사용자 프로세스 메모리 영역이 있음
  • 주소 예시: 2100, 2200, 2300 등

Address Translation (주소 변환)

  • CPU가 참조하는 가상 주소를 실제 메모리 주소로 변환
  • OS + MMU(HW)가 매핑을 관리함
  • 예:
    • 사용자 A: 0 → 물리 2100
    • 사용자 B: 0 → 물리 2300
  • 서로 다른 프로세스는 같은 가상 주소를 써도 실제 메모리 위치는 다름

📝 필기 내용 정리

  • 가상 메모리를 쓰기 때문에 실제 주소는 다름
  • 프로세스 A의 0주소는 실제로 2100일 수도 있음
  • stack grows downward (위에서 아래로 자람)
  • 실행파일이 DRAM에 올라감 (OS가 적재)
  • 실제 주소는 주소 변환 통해 알아냄

암기 포인트

  • 가상 메모리(Virtual Memory) 는 실제 물리 메모리와 분리됨
  • Address Translation 을 통해 가상 주소 → 물리 주소로 변환
  • stack은 높은 주소에서 낮은 주소로 성장
  • 각 프로세스는 독립된 주소 공간을 갖는다
  • 코드 영역은 read only (수정 불가)

 
 

사용자 프로그램이 사용하는 함수

📌 전체 구조 설명

  • 이 슬라이드는 사용자 프로그램이 사용하는 함수의 종류와 호출 방식을 설명해.
  • 사용자 프로그램은 다양한 함수를 호출하며, 이 함수들은 크게 두 가지로 나뉘어.

🧠 주요 구성요소

1. 사용자 정의 함수 (User-defined Function)

  • 사용자가 직접 작성한 함수로, 프로그램 내부에 정의되어 있어.
  • 예를 들어, int add(int a, int b) 같은 함수가 이에 해당해.
  • 이러한 함수들은 컴파일 시 프로그램에 포함되며, 실행 중에는 프로세스의 코드 영역에 위치해.

2. 라이브러리 함수 (Library Function)

  • 운영체제나 컴파일러에서 제공하는 함수로, 표준 라이브러리에 포함되어 있어.
  • 예를 들어, printf(), scanf() 같은 함수들이 이에 해당해.
  • 이러한 함수들은 컴파일 시 링크되어 프로그램에 포함되며, 실행 중에는 프로세스의 코드 영역에 위치해.

📝 필기 내용 정리

  • 사용자 프로그램은 직접 작성한 함수와 라이브러리 함수를 호출한다.
  • 이러한 함수들은 모두 프로그램의 코드 영역에 위치하며, 실행 중에 호출된다.

암기 포인트 요약

  • 사용자 프로그램이 사용하는 함수는 사용자 정의 함수와 라이브러리 함수로 나뉜다.
  • 이러한 함수들은 모두 프로그램의 코드 영역에 위치한다.
  • 함수 호출은 실행 중에 이루어지며, 호출된 함수의 주소로 프로그램의 흐름이 이동한다.

 
 
 
 

📄 커널 주소 공간의 내용

 

🧠 전체 구조 설명

이 그림은 OS 커널 내부 주소 공간의 구성과, 커널이 인터럽트, 시스템 콜, 프로세스 관리 등을 어떻게 처리하는지를 보여줌.

  • 주소 공간은 코드, 데이터, 테이블 등 다양한 요소들로 구성돼 있음.
  • 각 요소는 특정 기능을 맡고 있고, 커널은 이걸 통해 시스템 전체를 통제함.

📌 커널 영역 구성 요소 설명

구성 요소역할필기 내용 포함 설명
code (kernel code) 커널이 실행하는 명령어 코드 시스템 콜, 인터럽트 등 핵심 실행 코드 포함 (✍️ kernel source, code 영역)
data (커널 데이터 영역) 전역변수/자료구조 저장 예: PCB 저장, 프로세스/메모리 상태 관리
table (데이터 구조) 프로세스 테이블, 파일 테이블 등 PCB, 페이지 테이블 등 관리용 구조체 포함
object (하드웨어 객체) CPU, 메모리, 디스크 등의 제어 인터페이스 ✍️ Hardware 제어 위한 object 로 이해 가능

🧾 필기 설명 정리

  • ✍️ privileged instructions → 커널 코드에서만 실행 가능
  • ✍️ ISR, system call 등은 모두 커널 내부 코드에서 처리됨
  • ✍️ 커널은 자원 관리 및 하드웨어 제어를 위해 이 구조를 가짐

⚙️ 프로세스 관리 관련 구성

  • PCB (Process Control Block):
    • 각 프로세스의 상태 정보 저장 (ex. Process A의 PCB, Process B의 PCB)
    • ✍️ 프로세스 A가 실행 중일 때는 Process A의 PCB 정보가 사용됨
  • Stack 영역:
    • 시스템 콜 수행 시, 사용자 스택과 커널 스택 구분
    • ✍️ 시스템 콜 발생 시 커널 스택에 jump
    • ✍️ kernel stack = 함수 호출 기록, 지역 변수 저장

🔄 인터럽트 및 시스템 콜 흐름

  • 사용자 프로그램에서 system call 발생
    trap → 커널 코드 실행 (read 등)
    → 커널 스택 사용
    → 작업 완료 후 원래 사용자 모드 복귀
    → ✍️ interrupt도 마찬가지로 커널 내부에서 처리

암기 포인트 요약

  • 커널 주소 공간은 code, data, table, object로 구성된다.
  • 커널 코드는 시스템 콜, 인터럽트 등의 핵심 기능을 처리한다.
  • ISR, system call은 모두 커널 모드에서 수행된다.
  • PCB는 각 프로세스의 상태 정보를 저장하는 자료구조이며, 커널 영역에 위치한다.
  • 커널 스택은 시스템 콜, 인터럽트 처리 시 사용하는 스택이다.