ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쉽게 배우는 운영체제
    2022. 1. 17. 11:12

    좋은 개발자가 되기 위해서, 대체하기 어려운 개발자가 되기 위해서,

    기본이 정말 중요하다.(단순 라이브러리를 사용해서 코딩하는 개발자가 되기 싫다)

     

    좋은 개발자가 되기 위해서 기본을 갖추고자 내가 선택한 방법은 책을 통해 지식을 습득하는 것이다.

    어찌 어찌 책은 다 읽었지만, 모르는 내용이 수두룩......

    그래도 컴퓨터과 어떻게 작동하는 지 조금은 이해한 듯 싶다. (그냥 내 느낌....)

     

    책을 읽으면서 읽은 내용을 요약하고 정리할려고 하였는데,

    게으른 나의 천성을 이기지 못하고, 요약하지 못할 때가 너무 많았다.

    이 점을 반성한다. 읽은 내용을 밖으로 끄집어 내자. 조금씩 요약하고 정리하자.

    어쨋든, 끝까지 책을 읽을 수 있어서 감사

     


    1. 운영체제란?

    • 운영체제가 무엇인가요?
    • 컴퓨터의 자원을 관리하는 일종의 컴퓨터 소프트웨어입니다.
    • 운영체제가 없는 컴퓨터가 존재하나요?
    • 네 존재합니다. 애니악이라는 컴퓨터는 운영체제가 없는 단순 계산용도로만 사용되어지는 컴퓨터 입니다.
    • 운영체제가 필요한 이유는 무엇인가요?또한, 제한된 컴퓨터의 자원을 효율적으로 관리하고, 보호하기 위해서 운영체제가 필요합니다.
    • 첫째로 기기의 성능을 쉽게 향상시키기 위해서 필요합니다.
    • 운영체제가 어떻게 자원관리를 하나요?
    • 운영체제는 사용자가 직접 자원에 접근하는 것을 막음으로써 컴퓨터 자원을 보호합니다. 운영체제가 제공하는 사용자 인터페이스와 하드웨어 인터페이스를 이용하여 자원에 접근합니다.
    • 운영체제의 역할
      • 자원의 관리 → 효율성
      • 자원의 보호 → 안정성
      • 하드웨어 인터페이스 제공 → 확장성
      • 사용자 인터페이스 제공 → 편리성
    • 운영체제의 역사
      • 1940년대 운영체제 없음. 애니악 컴퓨터
      • 1950년대 일괄 작업시스템
      • 1960년대 초반 대화형 시스템
      • 1960년대 후반 시분할 시스템
      • 1970년대 분산 시스템
      • 1990년대 클라이언트/서버 시스템
      • 2000년대 P2P 시스템, 그리드 시스템, 클라우딩 컴퓨팅
    • 커널이란?
      • 운영체제의 핵심적인 기능을 모아 놓은 것(프로세스 관리, 메모리 관리, 입 출력 관리, 파일 시스템 관리, 프로세스 간 통신 관리 )
      • 단일형 구조 커널 - 모듈간의 구분 없이 하나로 구성되어 있는 형태
      • 계층형 구조 커널 - 비슷한 기능을 가진 모듈을 묶어서 하나의 계층을 만든 형태
      • 마이크로 구조 커널 - 프로세스 관리, 메모리 관리, 프로세스 간 통신 관리 등 가장 기본적인 기능만 운영체제에서 제공

    2. 컴퓨터의 기본 구성

    • 필수 장치
      • CPU, 메인 메모리
    • 주변 장치
      • 입력 장치, 출력 장치, 저장 장치
    • 폰 노이만 구조
      • 모든 프로그램은 메모리위에서 실행 되어야 한다.
    • 요리사 모형을 통한 컴퓨터 구성 설명
      • CPU: 요리사
      • 메인 메모리: 도마
      • 보관 창고: 저장 장치
    • CPU
      • CPU는 명령어를 해석하여 실행하는 장치
      • 산술논리 장치, 제어장치, 레지스터로 구성된다.
      • 일정 간격으로 틱을 만들며 거기에 맞추어 CPU 안의 모든 구성부품이 작업을 한다. 이러한 틱을 클록이라고 한다
    • 시스템 버스와 내부버스
      • 시스템 버스 : 메모리와 주변장치를 연결하는 버스로 Front-Side Bus 라고 한다
      • CPU 내부버스: CPU 내부에 있는 장치를 연결하는 버스 Back-Side Bus
    • 레지스터의 종류
      • 데이터 레지스터 - 메모리에서 가져온 데이터를 임시로 보관할 때 사용
      • 주소 레지스터 - 데이터 또는 명령어가 저장된 메모리의 주소
      • 프로그램 카운터(PC) - 다음에 실행할 명령어의 주소를 기억를 기억
      • 명령어 레지스터 - 현재 실행 중인 명령어를 저장한다
      • 메모시 주소 레지스터 (MAR) - 메모리에서 데이터를 가져오거나 메모리로 데이터를 보낼 때 주소를 지정
      • 메모리 버퍼 레지스터(MBR) - 메모리에서 테이터를 가저오거나 옮겨 갈 데이터를 임시로 저장.
    • 버스 - CPU와 메모리, 주변장치 간에 데이터를 주고 받을 때 사용하는 통로
      • 제어 버스
      • 주소 버스
      • 데이터 버스
    • 메모리 종류
        • 휘발성
        • 비휘발성
    • 버퍼
      • CPU와 메모리 , 주변장치의 작업속도는 다르다. 즉, CPU 내부 버스의 속도와 시스템 버스의 속도의 차이가 있는데, 이 차이를 완하하는 것이 버퍼이다.
      • 귤을 창고에서 여러번 갖고 오는 대신, 귤 바구니에 귤을 담아서 가져오면 된다. 귤 바구니가 버퍼이다.
    • 스풀
      • CPU와 입출력 장치가 독립적으로 동작하도록 고안된 소프트웨어적인 버퍼
      • 예로는 프린터가 있다.
    • 캐시
      • 메모리와 CPU간의 속도 차이를 안화하기 메모리의 데이터를 미리 가져와 저장해두는 임시 장소
    • 인터럽트
      • CPU가 직접 입출력장치에서 데이터를 가져오거나 보내는 방식을 폴링이라고 함.
      • 이러면 CPU의 작업 효율이 떨어짐. 그래서 고안된 것이 인터럽트
      • CPU는 입출력 관리자에게 입출력 명령을 보낸다
      • 입출력관리자는 명령받은 데이터를 메모리에 가져다 놓거나, 저장장치로 옮긴다
      • 데이터 전송이 완료되면 입출력 관리자는 완료 신호를 CPU에 보낸다
      • 이 신호를 인터럽트라고 한다.
    • 직접 메모리 접근(DMA)
      • CPU가 입출력 관리자에게 메모리에 접근할 수 있는 권한
    • 병렬처리 - 동시에 여러 개의 명령을 처리하여 작업의 능률을 올리는 방식
      • 병렬 처리 시 고려 사항
        • 상호 의존성이 없어야 병렬 처리가 가능하다.
        • 각 단계의 시간을 거의 일정하게 맞춰야 병렬 처리가 원만하게 이루어진다.
        • 전체 작업 시간을 몇 단계로 나눌지 잘 따져보아야 한다.
    • CPU에서 명령어가 실행되는 과정
      • 명령어 패치(Instruction Fetch)
      • 명령어 해석(Instruction Decode)
      • 실행(EXecution)
      • 쓰기(Write Back)
      ⇒ 이러한 명령어 전체의 과정을 하나의 스레드라고 함. 스레드를 이루는 각 단계는 CPU의 클록과 연동되어 한 클록에 한번 씩 이루어진다.
    • 병렬처리 기법
      • 파이프라인 기법 - 하나의 코어 안에서 여러 작업단위(스레드)로 쪼개서 병렬처리를 하는 기법
      • 슈퍼스칼라 기법 - 둘 이상의 코어를 사용히야 복수의 명령어가 동시에 실행하도록 하는 기법
      • 슈퍼파이프라인 기법 - 하나의 클록에 여러가지 명령어를 실행 할 수 있도록 하여, 작업의 속도를 향상 시킨다.
      • 슈퍼파이프라인 슈퍼스칼라 기법 - 슈퍼파이프라인과 슈퍼스칼라를 합친 기법
      • VLIW - CPU가 병렬 처리를 지원하지 않을 경우, 소프트웨어적으로 병렬 처리를 하는 방법

    3. 프로세스

    하드디스크의 저장장치의 정적인 상태로 있는 것을 프로그램이라고 합니다. 폰 노이만 구조 이론에 따라 이 프로그램이 메모리에 올라 가서 동적인 상태가 프로세스 라고 합니다.

    요리에 비유해서 쉽게 이해를 해보겠습니다. 레시피를 프로그램이라고 합니다. 레시피를 가지고 요리를 할 때 일련의 과정을 프로세스라고 하고 할 수 있습니다. 요리를 할 때는 어떤 음식을 요리해야하는지 알려주는 작업 지시서가 필요한 데, 컴퓨터에서는 이를 프로세스 제어 블록(Process control block)이라고 합니다. 즉, 어떤 레시피(프로그램)를 가지고 요리(프로세스) 하기 위해서는 작업지시 서(PCB)가 필요합니다. ⇒ 어떤 프로그램이 프로세스가 되었다는 것은 운영체제로 부터 PCB를 받았다는 의미입니다.

    PCB를 구성하는 항목이 여러가지 있는데, 그 중 3가지를 살펴 보겠습니다.

    첫번 째, 프로세스 구분자입니다. 이 구분자를 통해서 시분할 시스템에 있는 여러 프로세스를 구분할 수 있습니다. (반면, 일괄 처리 시스템에서는 프로세스가 하나밖에 없다)

    두번 째, 메모리 정보 입니다. 앞에서 말했듯이, 프로그램이 메모리 위에 올려져서 사용되는 것을 프로세스라고 합니다. 메모리의 위치 정보를 담고 있습니다.

    세번 째, 각 종 중간 값 입니다. 시분할 방식에서는 여러 프로세스를 처리 해야 하기 때문에, 프로세스의 작업 진행 상태를 저장 해야 합니다. 대표적으로, 다음 작업을 저장하는 프로그램 카운터 레지스터가 있습니다.

    프로세스에는 5가지의 상태가 있습니다

    생성상태, 준비상태, 실행상태, 대기상태, 완료상태가 있는데요.

    생성상태는 프로그램이 메모리에 올라온, 즉 운영체제에 PCB가 만들어진 상태입니다.

    준비상태는 실행을 기다리는 모든 프로세스가 자기 차례를 기라리는 상태입니다. 이때 다수의 준비큐가 운영됩니다. CPU 스케쥴러가 dispatch를 실행하면 실행상태로 바뀌게 됩니다.

    실행상태는 프로세스가 CPU를 할당받아 실행되는 상태입니다.

    대기상태는 프로세스가 입출력 처리를 요청하고, CPU가 입출력관리자에게 일을 시키고 입출력관리자가 처리하기를 기다리른 상태입니다. 입출력이 완료되면 인터럽트가 발생하고, 대기 상태에 있는 여러 프로세스 중 해당 인터럽트로 깨어날 프로세스를 찾습니다.

    완료상태는 프로세스가 모든 일을 처리한 상태입니다. 이때, 데이터와 메모리를 삭제하고, PCB를 폐기합니다.

    프로세스는 코드 영역, 데이터 영역, 스택영역으로 구성됩니다.

    코드 영역은 프로그램의 본문이 기술된 텍스트 영역입니다. 프로그래머가 작성한 코드가 일기 전용으로 처리됩니다

    데이터 영역은 변수나 파일등의 각종 데이터를 모아놓은 곳입니다

    스택영역은 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳입니다.

    **fork()**는 실행중인 프로세스로부터 새로운 프로세스를 복사하는 함수입니다. 이 때 실행하던 프로세스는 부모프로세스 이고, 새로 생긴 프로세스는 자식 프로세스입니다.

    exec() 이미 만들어진 프로세스의 구조를 재활용하는 것입니다. 프로세스의 코드영역에 있는 기존 내용을 지우고 새로운 코드로 바꾸워 버립니다.

    4. 스레드

    프로세스 코드에 작성된 절차에 따라 정의된 CPU에 작업 요청을 하는 실행 단위입니다.

    요리를 예로 들면, 안심스테이크 주문이 들어오면 이 요리 자체는 프로세스입니다. 요리 안에서, A요리사는 고기를 굽고 B요리사는 소스를 만드는 데, 이러한 작업이 스레드라고 보시면 됩니다.

    스레드는 프로세스의 단점 때문에 생겼습니다. 앞에서 보았던, fork()와 exec()를 통해 프로세스를 복제하면, 부모 자식 간의 프로세스가 생깁니다. 중복된 프로세스가 생길 경우 PCB, 코드, 메모리 영역이 중복되어 낭비가 발생합니다. 이러한 낭비를 없애고자, 하나의 프로세스 내부에서 CPU의 작업요청 하는 단위를 나누었는데, 이것이 바로 스레드입니다.

    5. 스케쥴링

    스케쥴링은 어떤 작업에 CPU를 배정할 지 결정하는 것입니다.

    스케쥴링의 목적은 공평성, 효율성, 안정성, 확장성상, 반응 시간 보장, 무한 연기 방지가 있습니다.

    6.공유자원과 임계구역

    여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일등을 공유자원이라고 합니다.

    공유 자원 접근 순서에 따라 프로세스의 실행 결과가 달라지는 프로그램의 영역을 임계구역이라고 합니다.

    예를 들어, 예금을 하는 프로그램이 있다고 가정합니다. 현재 예금 잔액은 10만원이고 A와 B라는 과정을 통해서 예금을 할 수 있습니다. A 10만원을 입금하는 동시에 B가 15만원을 입금했을 때, 정상적이라면 25만원의 예금 잔액이 있어야 합니다. 여기서 예금은 임계구역(critical section)입니다.

    여러 프로세스가 실행되는 시스템에서는 임계구역이라는 문제를 해결하는 방법은 중요한 문제인데요.

    임계구역 해결 조건에는

    • 상호 배제
    • 한정 대기
    • 진행의 융통성

    이 있습니다.

    7~8. 요약 못함.. 왜??? 게을러서

    9. 가상 메모리 관리

    메모리 관리자는 가져오기 정책, 배치 정책, 재배치 정책을 가지고 메모리를 관리합니다.

    이번에는 특별히, 메모리 가져오기 정책에 대해서 알아봅시다.

    가져오기 정책은 프로세스가 실행에 필요한 데이터를 메모리로 가져오는 정책입니다. 이를 요구 페이징이라고 합니다.

    가상 메모리 시스템에서 사용자 프로세스는 물리 메모리와 스왑메모리의 영역 둘중에 한 군데에 있습니다.

    페이지 엔트리(PTE)라는 것은 페이지 테이블의 한행을 의미 합니다. PTE의 구성을 살펴 보면 페이지 번호, (접근 비트, 변경 비트, 유효 비트, 읽기쓰기실행 권한 비트 ), 프레임 번호가 있습니다. 이 중에서 유효 비트를 통해서 프로세스가 물리 메모리에 있는지 스왑에 있는지 확인 할 수 있습니다. 유효비트가 1일 때 물리 메모리에 있고, 0일 때 스왑에 있습니다.

    어떤 프로세스가 A라는 메모리가 필요할 때, 페이지 테이블의 유효 비트를 통해서 물리 메모리에 있는지 스왑에 있는지 확인할 수 있고 스왑에 있는 것을 페이지 부재라고 합니다.

    메모리가 가득 찼을 경우, 메모리 관리자는 재배치 정책을 통해, 어떤 페이지를 스왑영역으로 보낼지 결정하는 데요. 재배치 정책에는 무작위, FIFO, 최적, LRU, LFU, NUR, 2차 기회, 시계 알고리즘이 있습니다. 무작위 알고리즘은 말 그대로, 무작위로 물리 메모리에서 스왑영역으로 보낼 페이지를 선택하는 것입니다. 구현은 쉬우나 좋은 성능을 기대하기 어렵습니다. FIFO 알고리즘은 물리 메모리에 들어온 페이지를 먼저 스왑영역으로 보내는 알고리즘인데, 이 또한 좋은 성능을 기대하기 어렵습니다. 처음 들어온 페이지라도 자주 쓰이는 페이지를 교체하면 안되니깐요.. 최적 알고리즘은 앞으로 프로세스가 어떤 페이지를 미리 예측하여, 사용되지 않을 페이지를 교체하는 방법인데요... 현실적으로 구현하기가 어렵습니다. 그래서 최적근접 알고리즘이라고 해서 LRU, LFU, NUR 알고리즘이 등장했습니다. LRU 알고리즘은 Least Recently Used 라고해서 페이지에 접근한 지 가장 오래된 페이지를 교체합니다. 카운터에 기반하여 구현할 수 도 있고, 참조 비트 시프트 방식으로도 구현할 수 있습니다.

    하지만, 접근 시간이나 참조 비트를 유지하기 위해 추가 메모리가 필요하기 때문에 낭비되는 공간이 많다는 단점이 있습니다.

    LFU 알고리즘은 Least Frequently Used 라고 해서 최소 빈도 사용 알고리즘입니다. 현재 프레임에 있는 페이지마다 사용되는 횟수를 세어 횟수가 가장 적은 페이지를 스왑영역으로 보냅니다. 이 또한 횟수를 저장하는 비트를 필요로하기 때문에, 추가 메모리가 필요합니다.

    NUR 알고리즘은 Not Used Recently라고 해서 최근 미사용 교체 알고리즘입니다. LFU와 비슷하지만, 불필요한 공간 낭비 문제를 해결한 알고리즘입니다. 앞서 살펴 보았던, PTE의 있는 참조비트와, 변경 비트를 확인하여, 교체하는 페이지를 선정합니다.

    10. 입출력장치와 저장장치

    컴퓨터의 주요장치에는 CPU, 메인메모리, 주변장치인 입출력장치, 저장장치가 있습니다.

    각 장치에는 메인 보드에 있는 버스로 연결됩니다.

    입출력 장치는 저속 주변장치와 고속 주변장치로 구분이 되는데 키보드, 마우스와 같이 주변장치와 메모리 사이의 오고가는 데이터가 적은 장치를 저속 주변장치라고 합니다. 반면, 그래픽카드와 같이 주변장치와 메모리사이의 오고가는 데이터가 많을 경우 고속 주변장치라고 합니다.

    앞에서 공부했듯이, CPU의 작업 속도가 주변장치보다 작업 속도보다 빠릅니다.

    그렇기 때문에, 하나의 버스만을 사용한다면 분명 병목현상이 발생할 것입니다. (이전에는 하나의 버스에서 CPU가 입.출력 작업까지 담당하였는데, 이러한 작업 방식을 폴링이라고 하였다.)

    CPU의 작업을 담당하는 메인 버스와 입출력 작업을 담당하는 입출력 버스로 분리 되었습니다. 또한 입출력 작업을 CPU가 직접 담당하기보다는 입출력 제어기에게 맡기는 구조로 바뀌었습니다. 입출력 제어기에는 메모리에 직접 접근할 수 있는 DMA 제어기를 가지고 있습니다.

    메인 메모리는 CPU가 작업하는 공간입니다. 그런데 DMA제어기가 입출력장치에서 가져온 데이터, 혹은 입출력장치로 가져갈 데이터가 있을 때도 이 공간을 사용합니다. CPU의 작업공간과 DMA 작업공간이 겹치는 문제를 방지하고자 메인메모라에 입출력 메모리라는 별도의 공간을 확보하였는데, 이를 메모리 앱 입출력이라고 합니다.

    입출력 장치의 작업이 끝나게 되면 입출력 제어기는 CPU로 인터럽트를 보냅니다. 인터럽트는 주변장치의 입출력 요구나 하드웨어의 이상현상을 CPU에게 알려주는 신호를 말합니다.

    인터럽트 종류에는 외부 인터럽트, 내부 인터럽트, 시그널이 있습니다. 입출력 및 하드웨어 관련 인터럽트는 외부 인터럽트, 프로세스의 오류로 발생하는 인터럽트는 내부 인터럽트, 사용자의 요청으로 발생하는 인터럽트를 시그널이라고 합니다. CPU는 어떤 장치로부터 인터럽트가 발생하는 지 알기 위해, 각각의 장치마다 IRQ라는 번호를 매깁니다.

     

     

     

Designed by Tistory.