운영체제

yg kim·2023년 10월 12일
0

공부하기

목록 보기
11/14

운영체제

운영체제 구조 (4가지)

  • GUI / CUI
    • GUI - 사용자가 전자 장치와 상호 작용하기 위한 사용자 인터페이스의 형태
    • CUI - 그래픽이 아닌 명령어로 처리하는 인터페이스(리눅스)
  • 커널
    • 운영체제의 핵심 부분이자 시스템콜 인터페이스를 제공하며 보안, 메모리, 프로세스, 파일 시스템, I/O 디바이스, I/O 요청 관리 등 운영체제의 중추 역할
  • 드라이버 - 하드웨어를 제어하기 위한 소프트웨어
  • 시스템 콜 ( 추상화 계층)운영체제가 커널에 접근하기 위한 인터페이스
    • 운영체제가 커널에 접근하기 위한 인터페이스
    • 유저 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출할때 사용
    • 프로세스나 스레드에서 운영체제로 요청을 할 때 시스템 콜로 인터페이스와 커널을 거쳐 운영체제에 전달 함

컴퓨터의 요소

  • CPU
    • 산술 논리 장치, 제어장치, 레지스터로 구성
    • 운영체제의 커널이 프로그램을 메모리에 올려 프로세스로 만들면 CPU가 처리
    • 제어장치 (CU, Control Unit)
      • 프로세스 조작을 지시하는 CPU의 부품
      • 입출력장치간 통신을 제어
    • 레지스터
      • CPU 안에 잇는 매우 빠른 임시기억장치
      • 처리 속도가 메모리보다 훨씬 빠름
    • 산술논리연산장치 (ALU, Arithmetic Logic Unit)
      • 산술연산 및 논리연산을 계산하는 디지털 회로
    • CPU의 연산처리
      • 제어장치가 메모리에 계산할 값 로드 및 레지스터에 로드
      • 제어장치가 레지스터에 있는 값을 계산하라고 산술논리연산장치에 명령
      • 제어장치가 계산된 값을 다시 '레지스터에서 메모리로' 계산한 값을 저장
    • 인터럽트
      • 어떤 신호가 들어왔을때 CPU를 잠깐 정지 시키는 것
        • I/O 디바이스 인터럽트
        • 0으로 숫자를 나누는 산술 연산 인터럽트
        • 프로세스 오류 등
  • DMA 컨트롤러
    • I/O 디바이스가 메모리에 직접 접근 할 수 있도록 하는 하드웨어 장치
    • CPU의 보조 일꾼
  • 메모리 (RAM, Random Access Memory)
    • 전자회로에서 데이터나 상태, 명령어 등을 기록하는 장치
  • 타이머
  • 디바이스 컨트롤러
    • 컴퓨터에 연결되어 있는 IO 디바이스들의 작은 CPU를 말함

메모리

메모리 계층

  • 레지스터
    • CPU 안에 있는 작은 메모리, 휘발성, 속도 가장 빠름, 기억용량이 가장 적음
  • 캐시 (L1, L2 캐시)
    • 데이터를 미리 복사해 놓는 임지 저장소이자 속도가 빠른곳과 느린곳의 차이를 줄여 병목현상을 줄이기 위한 메모리
    • 지역성의 원리
      • 시간 지역성 - 최근 사용한 데이터에 다시 접근하려는 특성
      • 공간 지역성 - 최근 접근한 데이터를 이루고 있는 공간이나 그 가까운 공간에 접근하는 특성
    • 캐시히트 / 캐시미스
      • 캐시 히트 - 캐시에서 원하는 데이터를 찾는 것
        • 캐시 미스 - 찾으려는 데이터가 캐시에 없어 메모리에서 데이터를 찾아오는 경우
    • 캐시 매핑
      • 캐시가 히트되기 위해 매핑하는 방법(CPU의 레지스터와 메모리간의 데이터를 주고받을 떄를 기반)
    • 웹브라우저 캐시
      • 쿠키 - 만료기한이 있는 키-값 저장소
        • 로컬 스토리지 - 만료기한이 없는 키-값 저장소 / 브라우저를 닫아도 유지되며 도메인 단위로 저장, 생성됨 (HTML5)
        • 세션 스토리지 - 만료기한이 없는 키-값 저장소 / 탭 단위로 세션 스토리지 생성되며 탭을 닫을 때 데이터 삭제(HTML5)
    • 데이터 베이스 캐싱 계층
      • 메인 데이터베이스 위에 redis 데이터 베이스 계층을 '캐싱 계층'으로 둬서 성능을 향상시키기도 함.
  • 주기억장치 / 메모리 (RAM)
  • 저장장치(HDD, SSD) / 보조기억장치

메모리 관리

  • 가상 메모리
    - 페이지 - 가상 메모리를 사용하는 최소 크기 단위
    • 프레임 - 실제 메모리를 사용하는 최소 크기 단위
    • 컴퓨터가 실제로 이용 가능한 메모리 자원을 추상화하여 이를 사용하는 사용자들에게 매우 큰 메모리로 보이게 만드는 것
    • 가상주소 -> MNU -> 실제주소 (프로세스 주소 정보가 들어있는 '페이지 테이블'로 관리)
    • 속도 향상을 위해 TLB(메모리와 CPU사이에 있는 주소변환을 위한 캐시) 사용
    • 스와핑
      • 가상메모리에 존재하지만 RAM에 데이터가 없을 때 페이지 폴트가 발생함 -> 이때 메모리에서 당장 사용하지않는 영역을 하드디스크로 옮기고 하드디스크에서 데이터가 있는 부분을 메모리처럼 불러와서 페이지 폴트가 일어나지 않은것 처럼 보이게 하는것
    • 페이지 폴트
      • 프로세스의 주소 공간에는 존재하지만 RAM에는 없는 데이터를 접근하는 경우 발생
  • 스레싱(thrashing)
    • 메모리의 페이지 폴트율이 높은것을 의미 -> 컴퓨터 성능저하를 초래
    • 메모리에 너무 많은 프로세스가 동시에 올라가게 되면 스와핑이 많이 발생하여 생기는 현상
    • 운영체제에서 스레싱을 발지하는 방법
      • 작업 세트 - 프로세스의 과거 사용 이령인 지역성을 통해 결정된 페이지 집합을 만들어서 미리 메모리에 로드
      • PFF(Page Fault Frequency) - 페이지 폴트 빈도를 조절하는 방법으로 상한선과 하한선을 지정하는 방법
  • 메모리 할당
    • 연속 할당
      • 메모리에 연속적으로 공간을 할당하는 것
      • 고정 분할 방식 - 메모리를 미리 나누어 관리하는 방식
      • 가변 분할 방식 - 매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 사용 -> 최초 적합/ 최적 적합/ 최악 적합
    • 불연속 할당
      • 페이징 기법 - 메모리를 동일한 크기의 페이지(보통4KB)로 나누고 프로그램마다 페이지 테이블을 두어 이를 통해 메모리에 프로그램을 할당 -> 홀의 크기가 균일하지 않은 문제가 없어지지만 주소 변환이 복잡해짐
      • 세그멘테이션 - 페이지가 아닌 세그먼트로 나누는 방식 -> 보안과 공유에 좋지만 홀의 크기가 균일하지 않음
      • 페이지드 세그멘테이션 - 세그먼트로 나누고 임의의 길이가 아닌 동일한 크기의 페이지 단위로 나눔
    • 페이지 교체 알고리즘
      • 스와핑 발생이 적게 일어나도록 설계 해야함
      • 오프라인 알고리즘
        • FIFO (First In First Out)
        • LRU (Least Recentle Used) - 각 페이지 마다 계수기, 스택을 둬서 가장 참조가 오래된 페이지를 확인.
        • NUR (Not Used Recently) - Clock 알고리즘이라고도 불림(최근 참조된 프로세스를 1로 변경하고 참조되지 않은 0인 프로세스를 찾아다니며 변경)
        • LFU (Least Frequently Used) - 가장 참조 횟수가 적은 페이지

프로세스와 스레드

  • 프로세스 - 컴퓨터에서 실행되고 있는 프로그램
  • 스레드 - 프로세스 내 작업의 흐름

프로세스와 컴파일 과정

  • 컴파일 과정
    • 전처리 - 소스 코드의 주석을 제거하고 헤더 파일을 병합하여 매크로를 치환
    • 컴파일러 - 오류 처리, 코드 최적화 작업을 하며 어셈블리어로 변환
    • 어셈블러 - 어셈블리어는 목적 코드로 변환
    • 링커
      • 프로그램 내의 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행파일 생성
      • 정적 라이브러리 - 프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식
      • 동적 라이브러리 - 프로그램 실행 시 필요할 때만 DLL이라는 함수 정보를 통해 참조하여 라이브 러리를 쓰는 방법

프로세스의 상태

  • 생성 상태 - fork() / exec() 함수로 생성, PCB 할당
  • 대기 상태 - 메모리 공간이 충분하면 메모리를 할당받고 아니면 아닌 상태로 대기하고 있다가 CPU 스케줄러로 부터 CPU 소유권이 넘어오길 기다리는 상태
  • 대기 중단 상태 - 메모리 부족으로 일시 중단된 상태
  • 실행 상태 - CPU 소유권과 메로리를 할당받고 지시 수행중인 상태
  • 중단 상태 - 이벤트 발생 후 기다리며 프로세스가 차단된 상태(ex. I/O 디바이스 인터럽트 -> 프린트 할때?)
  • 일시 중단 상태 -> 대기 중단가 비슷
  • 종료 상태 -> 메모리와 CPU 소유권 모두 놓는 것 / 자연스럽게 될 때도 있지만 부모가 자식 프로세스를 강제로 비자발적 종료(abort)도 있음

프로세스의 메모리 구조

  • 동적 영역(스택/ 힙)
    • 동적할당은 런타임 단계에서 메모리를 할당 받는 것
  • 정적 영역(데이터 영역(BSS Segment, Data Segment/ 코드 영역)
    • 정적 할당은 컴파일 단계에서 메모리를 할당하는 것

PCB (Process Control Block)

  • 프로세스에 대한 메타데이터를 저장한 데이터
  • 컨텍스트 스위칭
    • PCB 교환 과정
    • 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생

멀티 프로세싱

  • 여러개의 프로세스
  • 동시에 두가지 이상의 일을 수행할 수 있는 것 -> 병렬로 일처리 가능해짐
  • 웹 브라우저
  • IPC(Inter Process Communiation)
    • 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 매커니즘
    • ex. 클라이언트와 서버가 데이터를 요청하고 응답하는 것
    • 공유 메모리
      • 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한을 부여하여 통신함
      • 데이터 자체를 공유하도록 지원
      • 한 프로세스에서 변경한 메모리 공간의 내용을 다른 프로세스에서 접근할 수 있음(동기화)
      • 공유 메모리는 커널에서 관리
    • 파일
      • 디스크에 저장된 데이터 도는 파일 서버에서 제공한 데이터
    • 소켓
      • 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터 (TCP, UDP)
    • 익명 파이프 (unamed pipe)
      • 프로세스 간 읽히는 임시 공간인 파이프를 기반으로 데이터를 통신(단방향)
      • 부모 자식 프로세스 간에만 사용 가능
    • 명명된 파이프 (named pipe)
      • 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 단방향 또는 양방향 파이프
      • 상호 관련 없는 프로세스 간에도 사용 가능
    • 메시지 큐
      • 메시지를 큐 데이터 구조 형태로 관리하는 것
        • 큐는 커널에서 관리

스레드와 멀티스레딩

  • 스레드
    • 프로세스의 실행 가능한 가장 작은 단위
    • 프로세스는 여러 스레드를 가짐
    • 스레드는 각 프로세스마다 생성하는 프로세스와 달리 스택을 제외한 코드, 데이터, 힙은 스레드 끼리 공유 함
  • 멀티스레딩
    • 프로세스내 작업을 여러개의 스레드로 처리
    • 한 스레드가 중단 되어도 다른 스레드는 실행 상태 일수 있기 때문에 중단되지 않는 빠른 처리 가능(동시성 상승)
    • 한 스레드에 문제가 생길 경우 다른 스레드도 문제가 발생 할 수 있음

공유 자원 / 임계 영역

  • 공유 자원 - 시스템 안에서 각 프로세스, 스레드가 함께 접근 할 수 있는 자원이나 변수 등을 의미
  • 임계 영역 - 둘 이상의 프로세, 스레드가 공유 자원에 접근 할 때 순서등의 이유로 결과가 달라지는 코드 영역
  • 임계 영역 해결 방법
    • 뮤텍스(Mutex)
      • 프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠근 해제하는 객체
    • 세마포어(Semaphore)
      • 일반화된 뮤텍스
      • 간단한 정수 값, wait() 및 signal()로 공유 자원에 대한 접근 처리
      • 바이너리 세마포어, 카운팅 세마포어
    • 모니터
      • 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대한 인터페이스만 제공
      • 모니터 큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리

교착상태(Deadlock)

  • 두개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
  • 원인
    • 상호배제 - 한 프로세스가 자원을 독점하여 다른 프로세스들이 접근 못함
    • 점유 대기 - 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
    • 비선점 - 다른 프로세스가 보유한 자원을 강제적으로 가져올 수 없음
    • 환형 대기 - 프로세스가 서로의 자원을 요구하는 상황
  • 해결 방법
      1. 자원 할당 시 조건에 성립되지 않도록 설계
      1. 교착 가능성이 없을때만 자원 할당, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 은행원 알고리즘 사용
      • 은행원 알고리즘 - 총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정 또는 불안
      1. 교착상태 발생시 사이클을 확인하고 관련된 프로세스 하나씩 삭제
      1. 교착상태는 처리하는 비용이 크기 때문에 사용자가 직접 처리하는 방식

CPU 스케줄링 알고리즘

비선점 방식

  • FCFS
  • SJF(Shortest Job First)
    • 수행시간이 가장 짧은 프로세스 먼저
    • 긴 시간을 가진 프로세스가 실행되지 않는 Starvation이 일어날 수 있음
  • 우선순위
    • 오래된 작업에 우선순위를 높이는 방법을 줘서 단점 보완

선점 방식

  • RR (Round Robin)
    • 우선순위 스케줄링
    • 각 프로세스는 동일한 할당 시간을 주고 그 시간안에 끝나지 않으면 다시 준비 큐의 뒤로가는 알고리즘
    • 로드밸런서에서 트래픽 분산 알고리즘으로 활용
  • SRF(Shortest Remaining Time First)
    • 중간에 더 짧은 작업이 들어오면 수행하던 프로세스를 중지하고 해당 프로세스를 수행하는 알고리즘
  • 다단계 큐
    • 우선순위에 따른 준비 큐를 여러개 사용하고, 큐마다 라운드 로빈이나 FCFS 등 다른 스케쥴링 알고리즘을 적용한 것
profile
발전하고 싶은 사람

0개의 댓글