728x90

운영체제와 컴퓨터

  • 운영체제의 역할

    • CPU 스케줄링과 프로세스 관리
      • CPU 소유권을 어떤 프로세스에 할당할지, 프로세스의 생성과 삭제, 자원 할당 및 반환을 관리
    • 메모리 관리
      • 메모리를 어떤 프로세스에 얼만큼 할당해야하는지를 관리
    • 디스크 파일 관리
      • 디스크 파일을 어떤 방법으로 보관할지 관리
    • I/O 디바이스 관리
      • 마우스, 키보드 등 입출력 장치와 컴퓨터 간에 데이터를 주고받는 것을 관리
  • 운영체제의 구조

    • GUI
      • 명령어가 아닌 아이콘과 마우스를 이용한 클릭 등으로 컴퓨터와 상호작용할 수 있는 인터페이스
    • CUI
      • 그래픽이 아닌 명령어로 처리하는 인터페이스
    • 드라이버
      • 하드웨어를 제어하기 위한 소프트웨어
    • 커널
      • 시스템콜 인터페이스를 제공하며 보안, 메모리, 프로세스, 파일 시스템, I/O 디바이스, I/O 요청 관리 등 운영체제의 중추적인 역할
    • 시스템콜
      • 운영체제가 커널에 접근하기 위한 인터페이스
      • 유저 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출할 때 사용됨
      • 프로세스와 스레드에서 운영체제로 어떤 요청을 할 때 시스템콜이라는 인터페이스와 커널을 거쳐 운영체제에 전달됨
  • modebit

    • 시스템콜이 작동될 때 유저 모드와 커널 모드를 구분할 때 사용되는 플래그 변수
  • 컴퓨터의 요소

    • CPU (Central Processing Unit)
      • 산술논리연산장치, 제어장치, 레지스터로 구성되어 있는 컴퓨터 장치
      • 메모리에 존재하는 명령어를 해석해서 실행하는 역할
      • 운영체제의 커널이 프로그램을 메모리에 올려 프로세스로 만들면 CPU가 처리
      • 산술논리연산장치 (Arithmetic Login Unit)
        • 덧셈, 뺄셈 등 두 숫자의 산술 연산과 배타적 논리합, 논리곱 같은 논리 연산을 계산하는 디지털 회로
      • 제어장치 (Control Unit)
        • 프로세스 조작을 지시하는 CPU의 한 부품
        • 입출력장치 간 통신을 제어하고 명령어를 읽고 해석하며 데이터 처리를 위한 순서를 결정
      • 레지스터
        • CPU안에 있는 임시기억장치
        • CPU는 자체적으로 데이터를 저장할 방법이 없기에 레지스터를 거쳐 데이터를 전달
      • 인터럽트
        • 어떤 신호가 들어왔을 때 CPU를 일시정지 시키는 것
        • 인터럽트 발생 시 핸들러 함수가 있는 인터럽트 벡터로 가서 핸들러 함수가 실행됨
        • 우선 순위가 존재하며 우선 순위에 따라 실행됨
      • 하드웨어 인터럽트
        • I/O 디바이스에 의해서 발생하는 인터럽트
        • 인터럽트 라인이 설계된 후 순차적인 인터럽트 실행을 중지하고 운영체제에 시스템콜을 요청해서 원하는 디바이스를 향해 디바이스에 있는 작은 로컬 버퍼에 접근하여 수행
      • 소프트웨어 인터럽트
        • 트랩(trap)이라고도 하며 프로세스 오류 등으로 프로세스가 시스템콜을 호출할 때 발동
    • DMA 컨트롤러
      • I/O 디바이스가 메모리에 직접 접근할 수 있도록 하는 하드웨어 장치
      • CPU에 많은 인터럽트 요청이 올 경우 부하가 발생하므로 CPU를 보조하는 역할
    • 메모리
      • RAM(Random Access Memory)라고도 불리며 데이터의 상태, 명령어 등을 기록하는 장치
    • 타이머
      • 특정 프로그램에 시간 제한을 거는 역할
    • 디바이스 컨트롤러
      • 컴퓨터와 연결되어 있는 I/O 디바이스들의 작은 CPU
  • 메모리

    • 메모리 계층
      • 레지스터
        • CPU안에 있는 작은 메모리
        • 휘발성, 속도 가장 빠름, 기억 용량 가장 적음
      • 캐시
        • L1, L2 캐시를 지칭, L3 캐시도 있음
        • 휘발성, 속도 빠름, 기억 용량 적음
      • 주기억장치
        • RAM
        • 휘발성, 속도 보통, 기억 용량 보통
      • 보조기억장치
        • HDD, SDD
        • 휘발성, 속도 낮음, 기억 용량 많음
    • 캐시
      • 데이터를 미리 복사해 좋는 임시 저장소
      • 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리
      • 시간 지역성
        • 최근 사용한 데이터에 다시 접근하려는 특성
      • 공간 지역성
        • 최근 접근한 데이터를 이루고 있는 공간이나 그 가까운 공간에 접근하는 특성
    • 캐시히트와 캐시미스
      • 캐시히트
        • 캐시에서 원하는 데이터를 찾는 것
      • 캐시미스
        • 데이터가 캐시에 없을 경우 주메모리로 가서 데이터를 찾아오는 것
    • 캐시매핑
      • 캐시가 히트되기 위해 매핑하는 방법
      • 직접 매핑
        • 처리가 빠르지만 충돌 발생이 잦음
      • 연관 매핑
        • 순서를 일치시키지 않고 관련 있는 캐시와 메모리를 매핑
        • 충돌이 적지만 모든 블록을 탐색해야 해서 속도가 느림
      • 집합 연관 매핑
        • 직접 매핑과 연관 매핑을 합친 방법
        • 순서를 일치시키지만 집합을 둬서 저장하며 블록화되어 있기 때문에 검색은 좀 더 효율적
    • 웹 브라우저의 캐시
      • 쿠키
        • 만료기한이 있는 키-값 저장소
        • same site 옵션을 strict로 설정하지 않은 경우 다른 도메인에서 요청했을 때 자동 전송됨
        • 4KB 까지 저장가능
        • httponly 옵션 적용 시 js에서 접근 불가능
      • 로컬 스토리지
        • 만료기한이 없는 키-값 저장소
        • 10MB 까지 저장가능
        • 웹 브라우저를 닫아도 유지되며 도메인 단위로 저장, 생성됨
        • HTML5 를 지원하지 않는 브라우저에서는 사용 불가능
        • 클라이언트에서만 수정 가능
      • 세션 스토리지
        • 만료기한이 없는 키-값 저장소
        • 탭 단위로 생성되며 탭을 닫을 때 데이터 삭제
        • 5MB 까지 저장가능
        • HTML5 를 지원하지 않는 브라우저에서는 사용 불가능
        • 클라이언트에서만 수정 가능
  • 메모리 관리

    • 가상 메모리
      • 컴퓨터가 실제로 이용 가능한 메모리 자원을 추상화하여 이를 사용하는 사용자들에게 매우 큰 메모리로 보이게 만드는 메모리 관리 기법
      • 가상적으로 주어진 주소를 가상 주소라 하며, 실제 메모리상에 있는 주소를 실제 주소라고 함
      • 가상 주소는 메모리관리장치에 의해 실제 주소로 변환되며, 이 덕분에 사용자는 실제 주소를 의식할 필요 없이 프로그램을 구축 가능
    • TLB
      • 메모리와 CPU 사이에 있는 주소 변환을 위한 캐시
    • 스와핑
      • 당장 사용하지 않는 영역을 하드디스크로 옮겨 필요할 때 다시 RAM으로 불러와 올리고, 사용하지 않으면 다시 하드디스크로 내림을 반복하여 RAM을 효과적으로 관리하는 것
    • 페이지 폴트
      • 프로세스의 주소 공간에는 존재하지만 RAM에는 없는 데이터에 접근했을 경우 발생
      • 페이지 폴트와 스와핑 과정
        • CPU는 물리 메모리를 확인하여 해당 페이지가 없을 경우 트랩을 발생해서 운영체제에 알림
        • 운영체제는 CPU의 동작을 잠시 멈춤
        • 운영체제는 페이지 테이블을 확인하여 가상 메모리에 페이지가 존재하는지 확인
        • 페이지기 없으면 프로세스를 중단하고 현재 물리 메모리에 비어있는 프레임이 있는지 탐색
        • 물리 메모리에도 없다면 스와핑이 발동됨
        • 비어 있는 프레임에 해당 페이지를 로드, 페이지 테이블 최신화
        • 중지되었던 CPU 재시작
      • 페이지
        • 가상 메모리를 사용하는 최소 크기 단위
      • 프레임
        • 실제 메모리를 사용하는 최소 크기 단위
    • 스레싱
      • 메모리의 페이지 폴트율이 높은 것을 의미
      • 컴퓨터의 심각한 성능 저하를 초래
      • 메모리에 너무 많은 프로세스가 동시에 올라갈 경우 스와핑이 많이 일어나서 발생
      • 페이지 폴트 발생 시 CPU 이용률이 낮아지고 운영체제에서는 가용성을 높이기 위해 메모리에 더 많은 프로세스를 올리게 됨, 그 과정이 반복되며 발생
      • 해결방법으로는 메모리를 늘리거나, HDD를 SSD로 교체, 작업세트, PFF 등이 있음
      • 작업 세트
        • 프로세스의 과거 사용 이력인 지역성을 통해 결정된 페이지 집합을 만들어서 미리 메모리에 로드하는 것
      • PFF (Page Fault Frequency)
        • 페이지 폴트 빈도를 조절하기 위해 상한선과 하한선을 만드는 방법
    • 메모리 할당
      • 연속 할당
        • 메모리에 '연속적으로' 공간을 할당하는 것
      • 고정 분할 방식
        • 메모리를 미리 나누어 관리하는 방식
        • 내부 단편화 발생
      • 가변 분할 방식
        • 매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 관리하는 방식
        • 외부 단편화 발생 가능
        • 최초 적합
          • 위쪽이나 아래쪽부터 시작해서 홀을 찾으면 바로 할당
        • 최적 적합
          • 프로세스의 크기 이상인 공간 중 가장 작은 홀부터 할당
        • 최악 적합
          • 프로세스의 크기와 가장 많이 차이가 나는 홀에 할당
      • 내부 단편화
        • 메모리를 나눈 크기보다 프로그램이 작아서 들어가지 못하는 공간이 많이 발생하는 현상
      • 외부 단편화
        • 메모리를 나눈 크기보다 프로그램이 커서 들어가지 못하는 공간이 많이 발생하는 현상
        • 할당할 수 있는 비어있는 메모리 공간
      • 불연속 할당
        • 메모리를 동일한 크기의 페이지로 나누고 프로그램마다 페이지 테이블을 두어 메모리에 프로그램을 할당하는 것
      • 페이징
        • 동일한 크기의 페이지 단위로 나누어 메모리의 서로 다른 위치에 프로세스를 할당
        • 주소 변환이 복잡해짐
      • 세그멘테이션
        • 페이지 단위가 아닌 세그먼트로 나누는 방식
        • 홀 크기가 균일하지 않은 문제 발생
      • 페이지드 세그멘테이션
        • 공유나 보안을 세그먼트로나누고, 물리적 메모리는 페이지로 나누는 것
    • 페이지 교체 알고리즘
      • 오프라인 알고리즘
        • 먼 미래에 참조되는 페이지와 현재 할당하는 페이지를 바꾸는 알고리즘
        • 미래에 사용되는 프로세스를 알 수 있는 방법은 없기에 다른 알고리즘과의 성능 비교에 대한 기준을 제공
      • FIFO (First In First Out)
        • 가장 먼저온 페이지를 교체 영역에 가장 먼저 놓는 방법
      • LRU (Least Recently Used)
        • 참조가 가장 오래된 페이지를 교체하는 방법
        • '오래된' 것을 파악하기 위해서 각 페이지마다 계수기, 스택을 두어야 함
      • NUR (Not Used Recently)
        • 참조되었음을 구분하기 위한 비트를 사용하여 우선순위를 정하고 우선 순위에 따라 프로세스를 교체하는 방법
      • LFU (Least Frequently Used)
        • 가장 참조 횟수가 적은 페이지를 교체하는 방법

프로세스와 스레드

  • 프로세스
    • 컴퓨터에서 실행되고 있는 프로그램
    • CPU 스케줄링의 대상이 되는 작업
    • 프로그램으로부터 인스턴스화 된 것
  • 스레드
    • 프로세스 내 작업의 흐름
  • 프로그램이 메모리에 올라가면 프로세스가되는 인스턴스화 발생, 이후 운영체제의 CPU 스케줄러에 따라 CPU가 프로세스를 실행
  • 컴파일
    • 프로그램이 컴파일러를 거쳐 컴퓨터가 이해할 수 있는 기계어로 번역되어 실행될 수 있는 파일이 되는 것
    • 아래의 컴파일 과정 설명은 C언어 기반의 프로그램을 대상으로 한 설명입니다.
    • 전처리
      • 소스코드의 주석을 제거하고 #include 등 헤더 파일을 병합하여 매크로를 치환
    • 컴파일러
      • 오류 처리, 코드 최적화 작업 진행, 어셈블리어로 변환
    • 어셈블러
      • 어셈블리어를 목적 코드로 변환
    • 링커
      • 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행 파일 생성
  • 프로세스의 상태
    • 생성 상태
      • 프로세스가 생성된 상태
      • fork(), exec() 함수를 통해 생성
        • fork()
          • 부모 프로세스의 주소 공간을 그대로 복사하며, 새로운 자식 프로세스를 생성하는 함수
          • 주소 공간만 복사하며 부모 프로세스의 비동기 작업 등을 상속하지 않음
        • exec()
          • 새로운 프로세스를 생성하는 함수
      • PCB가 할당됨
    • 대기 상태
      • CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태
    • 대기 중단 상태
      • 메모리 부족으로 일시 중단된 상태
    • 실행 상태
      • CPU 소유권과 메모리를 할당받고 인스트럭션을 수행중인 상태
    • 중단 상태
      • 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태
    • 일시 중단 상태
      • 중단된 상태에서 프로세스가 실행되려 했지만 메모리 부족으로 일시 중단된 상태
    • 종료 상태
      • CPU소유권과 메모리를 모두 놓고 가는 상태
  • 프로세스의 메모리 구조
    • 동적 영역
      • 스택
        • 지역변수, 매개변수, 함수가 저장되고 컴파일 시에 크기가 결정되며 '동적'인 특징이 있음
        • 함수가 함수를 재귀적으로 호출하면서 동적으로 크기가 늘어날 수 있는데 힙과 스택의 메모리 영역이 겹치면 안되기 때문에 둘 사이의 공간은 비워 놓음
        • 동적 할당할 때 사용됨
        • 런타임 시 크기가 결정됨
    • 정적 영역
      • 데이터 영역
        • 전역변수, 정적변수가 저장되며 프로그램이 종료되면 사라지는 변수가 들어있는 영역
        • BSS 영역
          • 초기화 되지 않은 변수가 0으로 초기화 되며 저장됨
        • Data 영역
          • 0이 아닌 다른 값으로 할당된 변수들이 저장됨
      • 코드 영역
        • 프로그램에 내장되어 있는 소스 코드가 들어가는 영역
        • 수정 불가능한 기계어로 저장되어 있음
  • PCB (Process Control Bolck)
    • 운영체제에서 프로세스에 대한 메타데이터를 저장한 '데이터'
    • 프로세스 생성 시 운영체체는 해당 PCB를 생성
    • 구조
      • 프로세스 스케줄링 상태
        • 프로세스가 CPU에 대한 소유권을 얻은 이후 또는 이후 경과된 시간과 같은 기타 스케줄링 정보
      • 프로세스 ID
        • 프로세스 ID, 해당 프로세스의 자식 프로세스 ID
      • 프로세스 권한
        • 컴퓨터 자원 또는 I/O 디바이스에 대한 권한 정보
      • 프로그램 카운터
        • 프로세스에서 실행해야할 다음 명령어의 주소에 대한 포인터
      • CPU 레지스터
        • 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보
      • CPU 스케줄링 정보
        • CPU 스케줄러에 의해 중단된 시간 등에 대한 정보
      • 계정 정보
        • 프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보
      • I/O 상태 정보
        • 프로세스에 할당된 I/O 디바이스 목록
  • 컨텍스트 스위칭
    • PCB를 교환하는 과정
    • 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생
  • 멀티프로세싱
    • 동시에 두가지 이상의 일을 수행할 수 있는 것
    • 웹 브라우저
      • 브라우저 프로세스
        • 주소 표시줄, 북마크 막대, 뒤로가기 버튼 등을 담당하며 네트워크 요청이나 파일 접근 같은 권한을 담당
      • 랜더러 프로세스
        • 웹 사이트가 '보이는' 부분의 모든 것을 제어
      • 플러그인 프로세스
        • 웹 사이트에서 사용하는 플러그인을 제어
      • GPU 프로세스
        • GPU를 이용해서 화면을 그리는 부분을 제어
    • IPC (Inter Process Communication)
      • 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘
      • 공유 메모리
        • 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신할 수 있도록 공유 버퍼를 생성하는 것
        • 메모리 자체를 공유하기 때문에 불필요한 데이터 복사의 오버헤드가 발생하지 않음
        • 같이 메모리 영역을 여러 프로세스가 공유하기 때문에 동기화가 필요
      • 파일
        • 디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터
      • 소켓
        • 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터
      • 익명 파이프
        • 프로세스 간에 FIFO 방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터를 주고받으며, 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식
        • 부모, 자식 프로세스 간에만 사용 가능
      • 명명된 파이프
        • 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 또는 이중 파이프
        • 컴퓨터의 프로세스끼리 또는 다른 네트워크 상의 컴퓨터와 통신 가능
      • 메시지 큐
        • 메시지를 큐 데이터 구조 형태로 관리하는 것
        • 커널에서 관리되며 다른 IPC 방식에 비해서 사용방법이 직관적이고 간단
  • 스레드
    • 프로세스의 실행 가능한 가장 작은 단위
    • 프로세스와 달리 코드, 데이터, 힙 영역은 스레드끼리 공유
  • 멀티스레딩
    • 프로세스 내 작업을 여러개의 스레드로 처리하는 기법
    • 스레드끼리 자원을 공유하기에 효율성이 높음
    • 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 프로세스에 영향을 줄 수 있음
  • 공유 자원
    • 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 자원이나 변수
    • 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태라고 함
  • 임계 영역
    • 공유 자원에 접근할 때 순서, 타이밍 등의 이유로 결과가 달라지는 영역
    • 뮤텍스
      • 공유 자원을 사용하기 전에 설정하고 사용한 후에 해제하는 잠금
      • 잠금이 설정되면 다른 스레드는 잠긴 코드 영역에 접근 불가능
    • 세마포어
      • 일반화된 뮤텍스
      • 간단한 정수 값과 두 가지 함수 wait 및 signal로 공유 자원에 대한 접근을 처리
      • 조건 변수가 없고 프로세스가 세마포어 값을 수정할 때 다른 프로세스는 동시에 세마포어 값을 수정할 수 없음
      • 바이너리 세마포어
        • 0과 1 두 가지 값만 가질 수 있는 세마포어
        • 신호를 기반으로 상호 배제가 일어나는 신호 메커니즘
      • 카운팅 세마포어
        • 여러 개의 값을 가질 수 있음
        • 여러 자원에 대한 접근을 제어하는데 사용됨
    • 모니터
      • 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공
      • 모니터큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리
  • 교착 상태
    • 두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
    • 원인
      • 상호 배제
        • 한 프로세스가 자원을 독점하고 있으며 다른 프로세스들은 접근이 불가능
      • 점유 대기
        • 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
      • 비선점
        • 다른 프로세스의 자원을 강제적으로 가져올 수 없음
      • 환형 대기
        • 둘 이상의 프로세스가 서로의 자원을 요구하는 상황
    • 해결 방법
      • 자원 할당 시 애초에 조건이 성립되지 않도록 설계
      • 교착 상태 가능성이 없을 때만 자원 할당되며, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 '은행원 알고리즘' 사용
      • 교착 상태 발생 시 사이클이 있는지 탐색 후, 관련된 프로세스를 한 개씩 제거
      • 교착 상태 발생 시 사용자가 직접 작업 종료

CPU 스케줄링 알고리즘

  • CPU 스케줄러는 CPU 스케줄링 알고리즘에 따라 프로세스에서 해야하는 일을 스레드 단위로 CPU에 할당
  • CPU 스케줄링 알고리즘은 CPU 이용률은 높게, 주어진 시간에 많은 일을 하게, 준비 큐에 있는 프로세스는 적게, 응답 시간은 짧게 설정하는 것이 목표
  • 비선점형 방식
    • 프로세스가 스스로 CPU 소유권을 포기하는 방식
    • FCFS (First Come, First Served)
      • 가장 먼저 온 것을 가장 먼저 처리하는 알고리즘
      • 오래 실행되는 프로세스가 있다면 '준비 큐에서 오래 기다리는 현상(convoy effect)'이 발생할 수 있음
    • SJF (Shortest Job First)
      • 실행 시간이 가장 짧은 프로세스를 가장 먼저 실행하는 알고리즘
      • '긴 시간을 가진 프로세스가 실행되지 않는 현상(starvation)'이 발생할 수 있음
      • 실제 실행 시간에 대한 계산은 불가능 하기에 과거의 실행했던 시간을 토대로 추측해서 사용
    • 우선순위
      • SJF에서 오래된 작업일 수록 우선순위를 높이는 방법을 적용한 알고리즘
  • 선점형 방식
    • 사용 중인 프로세스를 강제 중단시키고 다른 프로세스에 CPU 소유권을 할당하는 방식
    • 라운드 로빈
      • 각 프로세스에 동일한 할당 시간을 주고 그 시간 안에 끝나지 않으면 다시 준비 큐의 뒤로 가는 알고리즘
    • SRF
      • SJF와 유사하지만 작업 도중 실행 시간이 더 짧은 작업이 들어올 경우 진행 중이던 프로세스를 중지하고 해당 프로세스를 수행하는 알고리즘
    • 다단계 큐
      • 운선순위에 따른 준비 큐를 여러개 사용하고, 큐마다 라운드 로빈이나 FCFS 등 다른 스케줄링 알고리즘을 적용한 것
      • 큐 간의 프로세스 이동이 불가

+ Recent posts