운영체제 1장

잠만보·2024년 9월 9일
0

운영체제

목록 보기
2/7

1 컴퓨터 하드웨어 복습

개인용 컴퓨터는 그림처럼 간략화 시킬 수 있다.
CPU, 메모리, I/O 장치들은 모두 시스템 버스에 연결되어 있고 버스를 통해 모든 통신이 이루어진다.

2 프로세서

  • CPU 는 컴퓨터의 뇌 이며 메모리에서 명령을 반입하여 실행한다.
    모든 CPU 의 기본적인 사이클은 명령어 반입 - 해석 - 실행 이다.
    이 사이클은 프로그램이 완료될 때 까지 계속 반복된다.

  • 명령이나 데이터를 가져오기 위해 메모리에 read 하는 시간이 명령을 실행하는 시간보다 훨씬 길기 때문에
    모든 CPU 에는 중요한 변수들과 임시 결과들을 저장할 레지스터가 있다.

  • 다음은 특별한 레지스터 들이다.

    • 프로그램 카운터(PC) : fetch 해야 하는 다음 명령의 메모리 주소를 저장하는 레지스터

    • 스택 포인터: 메모리에 있는 현 스택의 최상위를 가리키는 레지스터

    • PSW(Program Status Word) : 시스템 호출이나 I/O 에 중요한 역할, 비교 연산들에 의해 설정되는 조건 코드 비트들, CPU의 우선 순위, 사용자/커널 모드 전환, 각종 제어 비트 들이 포함된다.

      OS 는 모든 레지스터들에 대해 인식하고 있어야 한다.
      CPU 시간 다중화의 경우 실행하고 있는 프로그램을 멈출 때 마다 모든 레지스터를 저장해 두어야 나중에 프로그램이 다시 시작할 때 지장이 안생긴다.

• 커널모드 & 유저모드

대부분의 CPU 는 커널모드유저모드(사용자 모드) 라는 두개의 모드를 지원한다.
보통 PSW(Program Status Word) 에 있는 한 비트를 통해 모드를 조정한다.

  • 커널 모드

    • CPU 는 자기 명령 집합에 있는 모든 명령을 다 실행할 수 있고 하드웨어의 모든 기능도 사용할 수 있다.(하드웨어에 대한 완전한 접근이 가능)
  • 유저 모드

    • CPU 는 명령들의 일부만 실행할 수 있고 하드웨어 기능도 일부만 사용 가능하다.
    • I/O 와 메모리 보호 관련 명령 금지, 커널 모드로 진입하기 위해 PSW 의 비트를 조작하는것도 역시 금지

OS 로 부터 서비스를 받으려면 유저 프로그램은 커널로 트랩을 걸어서 OS 를 활용하도록 하는 시스템 호출을 요청해야 한다.

트랩 이라는 명령이 유저모드에서 커널모드로 변환을 일으키며 OS 를 시작한다.
일이 완료되면 제어권은 유저 프로그램으로 돌아오며, 시스템 호출을 요청한 명령 바로 다음 명령이 수행된다.

3 I/O 장치

운영체제는 CPU, 메모리, I/O 장치들과 많은 상호작용을 한다.

여기 그림처럼 I/O 장치는 대체로 컨트롤러장치 그 자체 두 부분으로 구성된다.

• I/O 장치 : 컨트롤러

컨트롤러는 칩 또는 칩의 집합으로 장치를 물리적으로 조정한다.
'장치로부터 데이터를 읽어라' 와 같은 운영체제의 명령을 받아서 수행한다.

• 컨트롤러 예시

운영체제에게 보다 간단한 인터페이스를 제공하는 역할을 한다.

예를 들어 디스크 컨트롤러가 디스크 2로부터 섹터 11206 을 읽으라는 명령을 받았을 때,

  • 컨트롤러는 이러한 선형적인 섹터 번호(11206) 을 실린더, 섹터, 헤드로 변환해야 한다.

  • 컨트롤러는 디스크 암이 현재 어느 실린더 위에 있는지 확인하고, 필요한 실린더만큼 앞 또는 뒤로 움직일 수 있도록 디스크 암에 적절한 펄스를 주어야 한다.

  • 컨트롤러는 적절한 섹터가 헤드 밑으로 오기까지 기다려야 하고 디스크로부터 나오는 비트들을 읽고 저장하면서 프리엠블을 제거하고 체크섬을 계산해주어야 한다.

  • 마지막으로 컨트롤러는 들어오고 있는 비트들을 워드들로 조립해야 하고 이들을 메모리에 저장해주어야 한다.

컨트롤러는 이러한 일을 하도록 프로그램 된 작은 임베디드 컴퓨터를 가지고 있다.

• I/O 장치 : 장치 그 자체

장치는 하는일이 그렇게 많지 않고 표준화 되어 있기 때문에 대체로 단순한 인터페이스를 가지고 있다.

실제적인 장치 인터페이스는 컨트롤러 뒤에 숨어있기 때문에 운영체제가 봐야하는 것은 컨트롤러에 대한 인터페이스 뿐이다.

• 장치 드라이버

컨트롤러와 이야기 하는(명령을 보내고 응답을 받는) 소프트웨어
각 컨트롤러 제작사는 자기가 지원하는 운영체제를 위한 드라이버를 제공해야 한다.

드라이버는 일반적으로 커널모드에서 동작하며 이를 위해 운영체제 내에 설치해야 한다.

모든 컨트롤러는 자기와 교신할 때 사용되는 레지스터들을 몇 개 가지고 있다.

예를 들어 아주 기본적인 디스크 컨트롤러는 다음과 같은 동작을 위한 레지스터들을 가지고 있다.

  • 디스크 주소
  • 메모리 주소
  • 섹터 카운트 & 방향

• I/O 수행방식 3가지

1. 바쁜 대기

  1. 사용자 프로그램이 시스템 호출 요청

  2. 커널은 이 요청을 받아 변환한 후 적절한 드라이버에게 함수 호출

  3. 드라이버는 I/O 를 시작하고 그 작업이 완료되었는지 확인하기 위해 장치를 계속 폴링하는 순환 루프를 돈다.

  4. I/O 완료 시 드라이버는 필요한 곳에 데이터를 넣음

  5. OS 는 제어권을 호출자에게 돌려줌

단점
장치가 완료되었는지를 폴링하기 위해 CPU를 계속 점유 하고 있어야 함

2. (중요!)인터럽트

드라이버가 장치를 시작해 놓고 마무리되면 인터럽트를 걸어달라고 설정, 이후 드라이버는 돌아온다

OS 는 호출자를 기다리게 하고 할 수 있는 다른 일을 찾아 처리한다.

I/O 장치 실행 & 인터럽트 받는 과정

  1. 디스크 드라이버는 어떤 일을 하라고 디스크 컨트롤러 에게 명령을 내린다.(장치 레지스터에 요쳥을 write 함으로써 이루어진다.)

  2. 디스크 컨트롤러 가 read/write를 완료하면 특정 버스 선을 이용해서 인터럽트 컨트롤러 칩 에게 신호를 보낸다.

  3. 인터럽트 컨트롤러 가 인터럽트를 받아들일 준비가 되어 있으면 CPU 칩의 특정 핀을 올려서 그 상황을 알린다.

  4. 인터럽트 컨트롤러장치 번호 를 버스에 올리므로 CPU 가 이를 읽고 어느 장치가 완료되었는지 알 수 있게 한다.

인터럽트 처리 과정

인터럽트 핸들러 : 인터럽트를 거는 장치의 드라이버(프로그램)의 일부

  1. CPU 가 인터럽트를 받아들이기로 결정하면 PC(프로그램 카운터)PSW(Program Status Word 레지스터) 를 현재 스택에 푸시하고 CPU 를 커널 모드로 전환한다.

  2. 인터럽트 핸들러가 시작되면 스택에 올려진 PC 와 PSW를 찾아서 저장해두고 장치의 상태를 파악하기 위해 질의를 보낸다.

  3. 인터럽트 핸들러 가 완료되면 전에 실행하던 사용자 프로그램의 실행되지 않은 명령으로 Return 한다.

인터럽트와 트랩의 차이?

둘다 모두 CPU 가 프로그램을 실행 중일때 프로그램을 중단해야 할 일이 발생한 경우 (파일 입출력, 에러 등등) 잠시 프로그램을 중단하고 해결한 후에 다시 실행중인 프로그램으로 돌아와 다시 실행하는 것을 말한다.

둘의 차이는 발생 위치에서의 차이이다.

  • 인터럽트(interrupt) 는 주로 I/O 장치 (CPU 외부) 에서 발생한다.

  • 트랩(TRAP)은 CPU 내부에서 발생한다.

    • 주로 소프트웨어에 의해 발생하며 실행 프로그램의 에러가 발생하는 Exeption 과 유저 프로그램의 요청이 들어오는 System Call 이 대표적이다.

3. 특수한 하드웨어 사용

CPU 의 계속적인 개입 없이 메모리와 특정 컨트롤러 간에 비트들의 흐름을 제어할 수 있는 DMA(Direct Memory Access) 칩을 이용한다.

• 버스

• 컴퓨터 부팅 순서

  1. 컴퓨터 부트 시 BIOS(Basic Input Output System)시작됨.
    RAM이 얼마나 있는지, 키보드 등의 기본 장치들이 설치되어있고 제대로 동작하는지 확인함

    BIOS 에는 키보드를 읽고 스크린에 쓰고 디스크 I/O를 하는 저수준의 I/O 소프트웨어가 있다.
    BIOS 는 메인보드에 존재하는 프로그램이다.

  2. BIOS 는 CMOS 메모리에 있는 장치들의 목록을 보고 부트 장치를 결정함
    보통 플로피 디스크 -> CD ROM -> 하드디스크 순으로 부팅 순서가 결정됨

  3. 부트 장치의 첫 섹터를 읽어서 메모리에 올려놓고 실행함

  4. 해당 파티션에서 두번째 부트 로더를 읽어들임, 이 로더가 활성 파티션으로부터 OS 를 읽어들이고 실행시킨다.

  5. OS 는 구성 정보를 받아오기 위해 BIOS 에게 문의한다.(각 장치에 대해 장치 드라이버가 있는지 확인)
    만약 드라이버가 없다면 유저에게 드라이버를 설치하라고 지시함.

  6. 모든 장치 드라이버들이 준비되면 OS 는 이들을 커널에 적재한다.
    관련 테이블들을 초기화하고 백그라운드 프로세스들을 생성하고 로그인 프로그램이나 GUI 를 시작한다.

4 많은 종류의 운영체제들

• 메인프레임 OS

한 번에 많은 작업을 처리하는 데 중점을 두고 있으며 대부분은 많은 양의 I/O가 필요하다
고급 웹 서버, 대규모 전자 상거래 사이트용 서버 및 기업 간 거래용 서버

세 가지 종류의 서비스가 있다.

1. 배치 시스템
사용자와 상호 작용이 전혀 없이 일상적인 작업 처리
예시) 보험 회사의 청구 처리 또는 상점 체인에 대한 판매 보고서

2. 트랜잭션 프로세싱 시스템
많은 작은 요청들을 처리해야 한다.
예시) 은행 또는 항공사 예약에서 처리 확인

3. 시분할
여러 원격 사용자가 한 번에 컴퓨터에서 작업을 실행할 수 있도록 허용
예시) 대규모 데이터베이스 쿼리

• 서버 OS

메인프레임 OS 한 단계 아래의 OS 이다.
네트워크를 통해 많은 사용자에게 서비스를 제공하며 HW와 SW 자원을 공유할 수 있게 해준다.

• 다중처리기 OS

높은 컴퓨팅 파워를 제공하기 위해 여러개의 CPU를 연결하여 하나의 시스템으로 만든 것

• 개인용 컴퓨터 OS

단일 사용자에게 좋은 인터페이스를 제공하는것이 목적
워드 프로세싱, 스프레드시트 및 인터넷 액세스에 사용된다.

우리가 흔히 아는 OS들

• 실시간 OS

시간을 주요 인자로 갖는다는 특징이 있다.
시간을 엄격하게 지키냐에 따라 Hard 와 Soft real-time OS 로 나뉜다

  • Hard real-time OS
    어떤 행동이 특정 시점에 반드시 이뤄저야 한다. 특정 시간에 특정 일이 일어날 것이라는 것을 절대적으로 보장해줘야 한다.
    예: 자동차 조립 라인, 비행 제어, 군사 장치 (조금이라도 시간에 오차가 있으면 망함)

  • Soft real-time OS
    가끔 시간을 지키지 못해도 괜찮다(바람직하진 않지만)
    예: 디지털 오디오, 멀티미디어 시스템

5 시스템 호출

• 시스템 호출 이란?

시스템 호출 이란?
사용자 프로그램이 자원이나 서비스를 필요로 할 때 운영체제에 요청하는 것이다

  • 사용자 모드에 있는 응용 프로그램이 커널의 기능을 사용할 수 있도록 한다.
  • 시스템 호출을 하면 사용자 모드에서 커널 모드Mode Switch 가 일어난다.
  • 커널에서 시스템 호출을 처리하면 커널 모드에서 사용자 모드로 돌아가 작업을 계속한다.

UNIX 에서의 시스템 호출은 3개의 인자를 갖는다.

  • 파일을 지정하는 인자.

  • 데이터를 어디에 두는 지를 알리는 인자.

  • 몇 바이트를 읽어야 하는지 알리는 인자.

• 시스템 호출 유형

프로세스 조작

프로세스 생성 및 종료
메모리에 로드, 실행
프로세스 속성 값 확인, 지정
wait 이벤트, signal 이벤트
메모리 할당

fork(), wait(), exec()

파일 관리

파일 생성, 파일 삭제
열기, 닫기, 읽기, 쓰기, Reposition
파일 속성 값 확인, 지정

open(), read(), write(), close()

장치 관리

디바이스 요청 및 해제
읽기, 쓰기, Reposition
디바이스 속성 확인, 지정
비 물리적인 디바이스 해제 및 장착

• 정보 관리

시간 확인, 시간 지정
시스템 데이터 확인, 지정
프로세스, 파일, 디바이스 속성 가져오기
프로세스, 파일, 디바이스 속성 설정하기

통신

커뮤니케이션 연결 생성 및 삭제
메시지 송신, 수신
상태 정보 전달
remote 디바이스 해제 및 장착

보안

Permission 획득
Permission 설정

• 시스템 호출 개요

  1. 어떤 프로세스가 유저 모드에서 유저 프로그램을 실행하다가 파일 데이터 read 같은 시스템 서비스 가 필요하다면 프로세스는 제어권을 OS 로 넘기기 위해 TRAP 명령을 실행한다.

  2. OS 는 호출한 프로세스가 무엇을 해달라고 하는 건지를 알아내기 위해 인자들을 확인한다.

  3. 그리고 나서 시스템 호출 을 실행하고 완료가 되면 제어권을 다시 유저 프로그램으로 넘긴다.

이제 시스템 호출의 절차를 그림을 보면서 이해해보자

• (중요!)시스템 호출 절차

1~3 단계
시스템 호출을 하는 프로그램read 시스템 호출을 실제로 하는 read 라이브러리 함수를 부르기 위한 준비로 인자들을 스택에 푸시 해 둔다.

4단계
read 라이브러리 함수에 대한 실제 호출이 일어난다.

5단계
운영체제가 예상하는 위치에 (특정 레지스터, 그림에서는 R0) 시스템 호출 번호(위의 코드에서 READ) 를 넣어 둔다.

6단계
TRAP 명령을 실행해서 유저모드에서 커널모드로 전환하고 커널의 특정 위치에서 실행을 시작시킨다.

7단계
TRAP 에 이어지는 커널 코드가 시스템호출 번호를 확인하고 이에 따라 적절한 시스템 호출 핸들러를 실행한다.
보통 시스템 호출 핸들러를 가리키는 포인터 들을 담은 테이블시스템 호출 번호인덱스해서 결정한다.
위에 READread() syscall 핸들러 포인터인덱스 인 것이다.

8단계
시스템 호출 핸들러가 실행된다.

9단계
시스템 호출 핸들러의 실행이 완료되면 유저 영역 라이브러리 함수에서 TRAP 명령 바로 뒤 명령으로 제어권이 넘어갈 수 있다.

왜 넘어갈 수 있냐면 시스템 호출이 호출자를 블록해서 진행을 못하고 있을 수도 있기 때문이다.
예를 들어 키보드 입력이 지연되면 호출자는 블록되고 OS 는 실행할 수 있는 다른 프로세스가 있는지 확인한다.
나중에 원했던 입력이 들어오면 다시 단계가 진행된다.

10단계
호출자(유저 프로그램) 에게 라이브러리 함수의 결과값이 반환된다.

11단계
일반적인 함수 호출 과정 처럼 스택을 정리한다.

6 운영체제 커널 구조

• 단일형(Monolithic) 커널 시스템

모든 운영체제를 하나의 프로그램으로 커널 모드에서 실행한다.
OS 는 여러 함수들의 모음으로 작성되어 하나의 거대한 이진 프로그램으로 링크시켜 만들어진다.

단일형 커널에서는 시스템 안에 있는 한 함수가 자기가 원하는 연산을 해줄 다른 함수를 언제나 호출할 수 있다.
따라서 아무렇게나 함수끼리 호출하는 환경은 복잡하고 이해하기 힘들다.

장점

  • 모듈 상호 작용 비용이 낮음(프로시저 호출)
  • 성능이 좋음

단점

  • 이해하기 어려움
  • 수정하기 어려움
  • 신뢰할 수 없음(시스템 모듈 간 격리 없음, 아무나 함수를 호출 가능)
  • 유지 관리가 어려움

• 계층 구조 커널 시스템

비슷한 기능을 가진 모듈을 묶어서 하나의 계층으로 만들고, 계층 간의 통신을 통해 운영체제를 구현하는 방식이다.

전통적인 접근 방식은 계층화

  • OS를 일련의 계층으로 구현
  • 각 계층은 위 계층에 대한 '가상 머신' 역할을 함

이 접근 방식에 대한 첫 번째 설명은 Dijkstra의 THE 시스템

  • 계층 0: 하드웨어
  • 계층 1: CPU 스케줄링
  • 계층 2: 메모리 관리(가상 프로세서 참조)
  • 계층 3: 콘솔 장치(VM 세그먼트 참조)
  • 계층 4: I/O 장치 버퍼링('가상 콘솔 참조)
  • 계층 5: 사용자 프로그램('가상 I/O 드라이버 참조)

장점

각 계층을 독립적으로 테스트 및 검증할 수 있음. (즉 오류와 버그의 수정이 용이하다)

단점

각 계층을 명확히 구분하기가 힘들다

• 마이크로 커널

계층형 구조에서 코드가 점점 무거워져 커널 소스가 방대해짐에 따라 오류를 처리하기 어려워졌고, 이를 해결하기위해 만들어진 커널이 바로 마이크로 커널이다.

마이크로 커널 설계의 기본 아이디어
OS를 작고 잘 정의된 모듈로 쪼개고 이들 중 하나만 '마이크로커널' 모드에서 실행하고
나머지는 보통의 권한없는 사용자 프로세스 로 실행하도록 하여 높은 신뢰성을 이루자는 것이다.

  • 커널의 버그가 시스템 전체를 다운시킬 수 있기 때문에 최소한의 내용을 커널 모드에 두자!

장점

  • 안정성 향상(구성 요소 간 격리, 중요한 것만 '마이크로커널 모드' 에서 실행)
  • 확장 및 커스터마이징 용이성

단점

  • 성능 저하(사용자/커널 경계 교차)
  • 커널과 서비스 간 데이터 공유가 불편함

profile
아프지 말자 - (잘못된 정보, 수정 사항 있으면 언제든지 알려주시면 감사하겠습니다!)

0개의 댓글