데브코스 TIL - CS 파트2
1. 컴퓨터 구조의 설계와 구현
✅ 컴퓨터 하드웨어의 구성
- 중앙처리장치: CPU (central processing unit)
- 주기억장치: Memory (RAN/ROM)
- 보조기억장치: Storage (HDD,SDD, optical discs …)
- 입출력장치: I/O Devices (keyboard, mouse, display, printer, networks …)
🔍 중앙처리장치 (CPU)
- 제어장치: 명령어를 해석하여 그 실행에 필요한 제어 신호를 발생시킴
- ALU(산술 논리 연산 장치): 산술 및 논리 연산 등을 수행
- CPU 내부 버스: 연산 대상을 잠시 저장해두는 곳
- 레지스터: 연산의 대상 및 연산 결과 등을 저장
🔍 ISA (Instruction Set Architecture)
- 마이크로프로세서가 인식해서 기능을 이해하고 실행할 수 있는 명령어들의 집합 (기계어 명령어)
- 중앙처리장치가 표현할 수 있는 자료형 정의
- 중앙처리장치에 명령할 수 있는 기계어 명령어들의 종류 정의
- 주소지정법 (addressing modes) 정의
기계어는 사람이 알아보기 불편하므로 주로 어셈블리(assembly)로 표현
※마이크로 아키텍처 (Microarchitecture)” 명령어 집합 구조를 물리적으로 구현한 것
🔍 명령어 기능 및 종류
1. 산술 및 논리 연산 명령
- ADD, SUB, MUL, DIV …
- AND, OR, NOT …
2. 데이터 전송 명령
- 레지스터/메모리/입출력장치 사이에 데이터 전송
3. 실행 제어 명령
- 프로그램의 실행을 순차(메모리에 저장되어 있는 순서)에서 벗어나 다른 곳으로 옮김
- 브랜치: 조건을 검사하고, 실행 조건이 만족할 때 실행조건이 변경되는 컨디션
- 점프: 언컨디션 브랜치
4. 기타
- 인터럽트 제어
- 명령어 실행 권한을 변경
✅ CISC vs RISC
서로 다른 설계 철학으로 만들어진 아키텍처
🔍 CISC (Complex Instruction Set Computing)
- intel
- 여러 동작을 한꺼번에 할 수 있는 여러 가지 명령어들을 제공 (명령어 하나가 하는 일이 많음)
- 명령어들의 형식과 길이가 다양하고, 주소 지정 방식도 다양
- 주로 마이크로프로그램 제어 방식의 프로세서로 구성
🔍 RISC (Reduced Instruction Set Computing)
- ARM
- 고정된 길이의 최소 종류의 명령어들을 제공
- 주소 지정 방식 최소화, Load/Store 방식의 메모리 접근 (연산하는 명령어 제공X)
- 한 클록 사이클에 하나의 명령을 실행할 수 있도록 설계 (처리 속도가 빠름)
※ 클록 사이클: 컴퓨터 시스템에서 기본적인 작업 단위 (CPU가 명령어를 실행하는데 걸리는 시간)
✅ 명령어 파이프라인 (Instruction Pipeline)
모든 명령어의 실행을 동일한 단계들로 나누고, 한 클록 사이클에 한 단계씩 진행하도록 하여 동시에 여러 명령어들의 서로 다른 단계를 실행
출처: 위키백과
- 녹색으로 칠해진 단계에서는 서로 다른 스테이지를 실행
- 기대 효과: 이론적으로는 5배의 성능 개선을 얻을 수 있음
🔍명령어 파이프라인 5단계
- Instruction Fetch
- Instruction Decode
- EXecute
- MEMory access
- WriteBack
✅ 기억장치(Memory) 구성
메모리 계층 구조 (memory hierarchy) 구성
🔍 메모리 계층 구조 (memory hierarchy)
출처: 나무위키
- 상단에 위치한 것일수록 크기가 작음
- 상단으로 올라갈수록 접근속도가 빠름
- 하단으로 내려갈수록 비트당 비용이 낮음
🔍 메모리 주소 공간
메모리 내의 매 바이트마다 독립된 주소를 부여하는 것이 일반적
출처: 위키백과
2. 프로그램의 번역과 실행
✅ 프로그래밍 언어의 분류
크게 고수준 프로그래밍 언어, 어셈블리, 기계어로 구분
- 고수준 프로그래밍언어에 가까울수록 복잡한 설계와 소프트웨어 상호작용을 표현하기에 적합하며 하드웨어 의존성이 낮음(최소)
- 기계어에 가까울수록 하드웨어에 특화된 프로그래밍 가능
🔍 고수준 프로그래밍 언어
- C++, Java, Python
🔍 어셈블리(Assembly)
- 기계어를 1:1로 사람이 알아볼만한 기호로 표현
🔍 기계어 (Machine language)
- 기계어(CPU)가 바로 이해할 수 있는 언어
✅ 프로그램 번역
원시코드를 목적 코드로 번역 (시스템 소프웨어가 담당)
✅ 프로그램 번역 단계
원시코드 → 어셈블리 코드 → 목적코드
🔍 원시코드
- 고수준 프로그래밍 언어 이용
- 프로그래머가 작성
- 어느 기계에 실행할지에 따라 크게 다르지 않음
🔍 원시코드 → 어셈블리 코드
- 프로그래밍 언어에 따라 다른 번역기 사용
- 구문 구조를 해석하고 특정 기계를 대상으로 어셈블리 코드 생성
🔍 어셈블리 코드 → 목적코드
- 어셈블러에 의하여 1:1로 번역됨
🔍 목적코드
- 기계가 이해할 수 있는 명령어들의 집합
- 0과 1만으로 이루어진 코드 나열
- 서로 다른 컴퓨터에서 다르게 표현됨
✅ 프로그램 번역/실행 모델
프로그래머가 코드를 작성하면, 컴퓨터 하드웨어가 코드를 실행
🔍 컴파일러
- 실행하기 이전에 번역
- 번역을 실행 이전에 하므로 코드를 최적화할 수 있음
- 코드 실행의 효율이 높음
🔍 인터프리터
- 런타임때 번역
- 다른 컴퓨터로 옮겨서 실행하는 것이 편리
- 대화형 개발이 가능
🔍 가상기계를 이용한 모델
- 동일한 바이트 코드를 실행할 수 있는 가상기계를 이용하는 방식
- 컴파일러 방식과 인터프리터 방식의 장점을 사용하려는 의도
- 컴파일러에 의하여 코드 최적화가 가능하며 실행 효율이 높음
- 동일한 모델의 가상기계를 사용하는 모든 컴퓨터에서 실행 가능
- 자바나 파이썬에서 이용
🔍 컴파일러와 링커/로더
💡 링커 (linker)
- 보통 컴파일러와 함께 실행됨 (눈에 잘 보이지는 않음)
- 적재 가능한 모듈을 만들어내는 것 (코드 엮기)
- 여러 덩어리의 목적 코드를 연결
- 서로 다른 모듈 사이의 주소 상호 참조를 해결
💡 로더 (loader)
- 운영체제의 일부로서 프로그램 실행을 담당
- 적재 가능한 모듈을 실행하는 것
- 프로그램 파일을 저장장치로부터 메모리에 적재
- 동적 적재 문제도 해결
※ 동적 적재 문제: 필요할 때 가져다가 실행
3. 운영체제의 역할과 구조
✅ 소프트웨어 분류
소프트웨어는 크게 시스템 소프트웨어, 응용 소프트웨어로 구분
🔍 시스템 소프트웨어
- 컴퓨터 시스템을 운영하거나 소프트웨어 개발을 지원하는 데 이용되는 소프트웨어 모음
- 운영체제 (operating system)
- 컴파일러 (compiler)
- 링커/로더 (linker/loader)
- 라이브러리 (library)
- 시스템 운용 도구들
🔍 응용 소프트웨어
- 컴퓨터 시스템이 응용될 분야에 따른 기능을 수행하도록 만들어진 소프트웨어
- 워드 프로세서 (word processor)
- 스프레드 시트 (spreadsheet)
- 웹 브라우저 (web browser)
- 게임 (game)
✅ 운영체제
컴퓨터 시스템이 살아가기 위하여 반드시 필요한 소프트웨어
✅ 운영체제의 역할
1. 컴퓨터 시스템 자원을 관리 (메인)
프로세스 관리, 메모리 공간 관리, 입출력 장치 관리, 파일 시스템 관리 등
2. 사용자에게 시스템 자원을 활용할 수 있는 기능 제공
응용프로그램이 효율적으로 사용할 수 있도록 관리 (자원 배분)
- 단일 사용자 시스템의 경우, 다소 간단
- 다중 사용자 시스템의 경우, 다소 복잡
✅ 운영체제의 종류
윈도우, 리눅스, macOS, UNIX, iOS, 안드로이드
✅ 운영체제의 분류 기준
1. 운용 대상 시스템의 종류는?
- 범용 (general purpose)
- 내장형 (embedded)
2. 여러 사용자들에게 서비스를 제공하는가?
- 단일 사용자 (single-user)
- 다중 사용자 (multi-user)
3. 여러 개의 중앙처리장치로 이루어진 시스템을 지원하는가?
- 단일 프로세서 (uniprocessor)
- 다중 프로세서 (multiprocessor)
4. 어떤 방식으로 복수의 작업을 수행하는가?
- 시분할 방식 (batch processing)
- 다중 프로그래밍 (multiprogramming)
✅ 운영체제 커널 (kernel)
운영체제의 핵심 부분에 위치 (core)
- 시스템의 모든 측면에 대한 완전한 권한을 가지고 있음
- 사용자 간 충돌 또는 침해로부터 보호
- 효율적이면서 공정한 자원 공유를 담당
- 시스템의 하드웨어 및 소프트웨어 리소스를 관리
- 하드웨어와 직접적으로 상호작용하기 때문에 시스템 자원을 완전한 제어를 가지기 위해서는 하드웨어의 지원이 필요함
- 커널 외의 부분을 이루는 코드는 시스템 자원 접근을 위해 커널의 서비스를 이용 (시스템 콜)
🔍 시스템 콜
운영체제 커널이 제공하는 서비스에 대한 응용 프로그램의 요청을 가능하게 하기 위한 프로그래밍 인터페이스 (프로그램이 운영체제의 기능을 사용할 수 있도록 도와주는 다리의 역할)
4. 프로세스 관리와 스케줄링
✅ 프로세스
컴퓨터 시스템에서 CPU 및 메모리를 이용하여 실행 중인 작업 (소프트웨어의 생명체)
- 컴퓨터 시스템에서 실행되는 모든 소프트웨어는 하나 이상의 프로세스를 이룸
- 생명주기(life cycle)을 가지며, 운영체제가 관리
✅ 프로세스 관리
운영체제는 각 프로세스 상태를 유지관리하고 시스템 자원을 사용할 수 있도록 관리하고 있음
✅ 프로세스 상태
💡 start
프로그램 생성의 상태
💡 ready
처음 만들어져있을 때의 상태 (CPU를 실행하면 바로 실행할 수 있는 상태)
💡 running
CPU에서 실행되고 있는 상태
interrupt
: 하나의 프로세스가 오래도록 실행되고 있을 때 ready 상태로 변경하는 과정
💡 waiting/blocked
I/O wait
: I/O 작업이 끝나기를 기다리는 과정I/O completion
: I/O이 끝나면 ready상태로 변경하는 과정
✅ 프로세스와 스레드
💡 single-threaded process
- ready상태로 가거나 wait 상태로 가면 스레드는 멈춰있음
- 자신의 문맥을 가지고 있음
💡 multithreaded process
- 한 프로세스 내에서 여러 개의 독립적인 실행을 가지고 있음
- 서로 다른 상태로 실행되고 있기 때문에, 문맥이 다름
- 구글 크롬 브라우저
✅ 동시성 (concurrency)
동시성을 가지는 일들을 처리할 때에는 동기화가 필요함
Context Switches (문맥전환)
스레드 전환
- 시간과 비용이 듬
✅ 스케줄링
어느 순간 어느 작업을 수행할 것인지 결정
💡 효율성
- 응답 시간(response time)을 최소화
- 시스템 처리율(throughput: 단위 시간당 처리한 작업량)을 극대화
💡 공정성
- 우선순위가 낮은 작업은 영원히 기다려야하기 때문에 공정성을 해치면 안됨
✅ 스케줄링 알고리즘 - FCFS
First-come, first-served scheduling
먼저 도착한 것을 먼저
#예시 1
작업 | 소요시간 |
---|---|
P1 | 24 |
P2 | 3 |
P3 | 3 |
- 대기시간: P1 = 0, P2 = 24, P3 = 27
- 평균 대기시간: 17 ((0 + 24 + 27) / 3)
- 평균 응답시간: 27 ((24 + 27 + 30 / 3))
#예시 2
작업 | 소요시간 |
---|---|
P2 | 3 |
P3 | 3 |
P1 | 24 |
- 대기시간: P2 = 0, P3 = 3, P3 = 6
- 평균 대기시간: 3 ((0 + 3 + 6) / 3)
- 평균 응답시간: 13 ((3 + 6 + 30 ) / 3)
예시2가 예시1보다 평균 대기시간과 평균 응답시간이 짧다.
✅ 스케줄링 알고리즘 - SJF
Shortest Job First
먼저 작업이 끝나는 것을 먼저
먼저 작업이 끝나는 것을 예측할 수 있어야 함 (비선점 방식)
✅ 스케줄링 알고리즘 - SRTF
Shortest Remaining Time First
새로운 작업이 도착하고, 새로운 작업을 더 일찍 끝낼 수 있다면 새로운 작업을 먼저
매 순간, 남아 있는 작업량이 가장 적은 것을 선택하여 스케줄 (선점 방식)
5. 메모리와 입출력관리
✅ 시스템 자원의 추상화
💡 프로세스
- CPU 시간에 대한 추상화
- 각각 프로세스는 CPU 시간 중 일부가 자신에게 주어지는 것으로 가상할 수 있음
💡 가상메모리
- 메모리 공간에 대한 추상화
- 전체 주소 공간을 모두 자신에게 할당된 메모리로 사용할 수 있다고 가상
💡 파일 시스템
- 입출력 장치들을 일관된 인터페이스로 추상화
✅ 메모리 계층 구조 (memory hierarchy)
- 레지스터: CPU 안에 있으며, 하드웨어에 의해 제어
- 캐시메모리: CPU 안에 있거나 가까이에 있으며, 하드웨어에 의해 제어
- 주기억장치: CPU와 메모리 버스로 연결되어 있으며, 하드웨어에 의해 제어
- 보조기억장치: 운영체제와 하드웨어의 협력에 의하여, 주기억장치에 대한 가상화 제공 (가상메모리)
✅ 가상 메모리 (Virtual Memory)
메모리가 실제 메모리보다 많아 보이게 하는 기술
운영체제의 역할
- 프로세스에게 메모리를 할당해 주고, 프로세스가 반환하는 메모리를 이용 가능한 것으로 관리
- 서로 다른 프로세스가 메모리를 침범하지 못하도록 보호
가상메모리 및 페이징기법에 대한 포스트글
✅ 요구 페이징 (Demand Paging)
페이지 폴트(page fault)를 줄이는 것은 전체 시스템 향상에 매우 중요
- 캐시 메모리의 관리와 유사한 방법
- 지역성에 근거하여 자주 참조될 것 같은 것을 메인 메모리에 저장
※ 페이지 폴트(page fault): 페이지가 물리 메모리가 없는 경우
※ 시간적 지역성(temporal locality): 지금 참조된 주소는 가까운 미래에 다시 참조될 가능성이 높음
※ 공간적 지역성(spatial locality): 지금 참조된 주소와 가까운 주소가 미래에 참조될 가능성이 매우 높음
✅ 파일 시스템
- 운영체제는 저장파일을 파일시스템으로 추상화
- 많은 종류의 장치들을 파일로 간주하는 추상화 방식을 사용하여 일관된 방법으로 장치에 접근할 수 있도록 관리