운영체제 동기, 비동기, DMA

최동혁·2022년 12월 6일
0

운영체제

목록 보기
5/10

동기식 입출력과 비동기식 입출력

  • 동기식 입출력 (synchronous I/O)
    • I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감.
    • 구현 방법 1
      • I/O가 끝날 때까지 CPU를 낭비시킴
      • 매시점 하나의 I/O만 일어날 수 있음
    • 구현 방법 2
      • I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음
      • I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
      • 다른 프로그램에게 CPU를 줌
  • 비동기식 입출력 (asynchronous I/O)
    • I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감

두 경우 모두 I/O의 완료는 인터럽트로 알려줌

I/O는 커널을 통해서만 할 수 있다.

Synchronous

  • 사용자 프로그램이 I/O 요청을 운영체제(커널)에게 하게 되면, 그 I/O 장치에 맞는 device driver를 거치고 실제 하드웨어를 통해서 읽거나 쓰는 작업을 한다.
  • I/O가 끝나고 나서 사용자가 다음 작업을 한다.

Asynchronous

  • 사용자 프로그램이 I/O 요청을 운영체제(커널)에게 해서 실제로 I/O 작업이 진행됨.
  • 요청만 하고 바로 CPU 제어권을 얻어서 다른 작업을 함.
  • I/O 작업이 끝나면 이것도 Synchronous와 같이 인터럽트를 통해 알려줌.

구현 방법 2

  • 한 프로세스에서 I/O 작업이 이루어지면 CPU를 줘봤자 일을 못하기 때문에 다른 프로세스에게 CPU를 넘김.
  • 그런데 넘겨받은 프로세스가 또 I/O 작업을 한다면?
    • 또 다른 프로세스에게 CPU를 넘김.
    • CPU가 놀지 않고 일을 할 수 있다는 장점.
    • I/O 장치도 여럿이 동시에 실행될 수 있음.
  • 보통 동기식 입출력을 구현할 때 이러한 방법을 쓴다.

DMA (Direct Memory Access)

  • DMA (Direct Memory Access)
    • 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용
    • CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송
    • 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴.

    위에서 설명했음!
    

서로 다른 입출력 명령어

1. I/O를 수행하는 special instruction에 의해

일반적인 I/O 방식

  • CPU에서 실행할 수 있는 기계어(인스트럭션)에는 메모리에만 접근하는 인스트럭션이 따로 있고, I/O 장치에 접근하는 spcial 인스트럭션이 있다.
  • 메모리도 주소가 있듯이, I/O device에도 주소가 있다.

2. Memory Mapped I/O에 의해

  • 메모리 주소에 연장 주소를 붙여서 100번지에 메모리 접근하는 인스트럭션을 실행 하면 그것은 메모리 접근, 1000번지에 메모리 접근하는 인스트럭션을 실행 하면 I/O 접근

저장장치 계층 구조

  • 맨 위에는 CPU가 있음.
  • CPU 안에는 Register라는 것이 있다.
  • 캐시 메모리도 있다.
  • DRAM으로 구성된 메인 메모리가 있다.
  • 아래 부분은 Secondary Storage로써 하드디스크나 마그네틱 테입 같은 것들
  • 위로 갈수록 속도가 빠름. 대신에 단일 공간당 가격이 비싸기 때문에 위로 갈수록 용량이 적다.
  • 아래 Secondary는 전원이 나가도 내용이 살아지지 않는다. 이것을 비휘발성 매체다.
  • 위에 Primary는 전원이 나가면 내용이 살아져서 휘발성 매체다.

CPU에서 직접 접근할 수 있는 메모리를 Primary(Executable)라고 부른다.

CPU가 직접 접근해서 처리하지 못하는 것을 Secondary라고 부른다.

  • CPU가 직접 접근하려면 byte 단위로 접근이 가능한 매체여야 한다.
  • DRAM 메모리 같은 경우 byte 단위로 주소를 매겨서 byte 단위로 접근이 가능하기 때문에 executable. 그 자리에서 CPU가 읽어서 실행할 수 있음.
  • 반면 하드디스크 같은 경우는 byte 단위 접근이 안됨. 섹터 단위 접근임.

프로그램의 실행 (메모리 load)

  • 프로그램은 실행 파일의 형태로 File system에 저장한다.
  • 실행 파일을 실행시키게 되면 메모리로 올라가서 프로세스가 된다.
  • 물리적인 메모리에 바로 올라가는 것이 아닌 한단계를 더 거치게 되는데, 그 단계가 virtual memory이다.

  • 실행 파일을 실행시키게 되면 그 프로그램의 독자적인 메모리 주소 공간이 형성 된다.
    1. stack
      1. 함수에서 쓰이는 지역변수나, 매개변수 저장
    2. data
      1. 전역변수 저장
    3. code
      1. 코드를 짜서 컴파일을 한 이후에 기계어로 번역된 코드들을 적재해주는 영역.
      2. CPU가 이 코드 영역을 읽어서 처리함.
  • 커널 같은 경우는 컴퓨터를 부팅하고 나면 항상 메모리 공간에 상주하고 있지만, 사용자 프로그램은 실행을 시키면 주소 공간이 생겼다가, 프로그램을 종료시키면 사라짐.
  • 실행시켰을때 만들어진 주소 공간을 전부 물리적인 메모리 공간에 올려놓는 것이 아니다.
    • a라는 함수를 실행시킬 경우 code 부분만 올려놓고 나머지는 올려놓지 않는다.
    • 왜냐면 메모리 공간을 낭비할 수 있기 때문에
    • 나중에 또 사용이 안되면 물리적 메모리 공간에서 쫓아냄.
    • 당장 사용하는 것을 제외한 나머지는 디스크의 Swap area라는 곳에 내려놓게 됨.
    • 그래서 stack, data, code는 연속적으로 메모리가 존재하는 것이 아니라서 가상 메모리라고 부른다.
    • 당장 쓰는 것만 물리적 메모리 공간에 놓고 나머지는 디스크에 존재하기 때문.
  • 파일 시스템은 전원이 나가더라도 유지가 되어야 하지만, Swap area는 다 지워짐.
    • 왜냐? 전원이 나가면 프로세스들은 다 종료가 되기 때문에 필요가 없는 데이터들이다.
  • 물리적인 메모리 공간에서 커널이 있는 곳이 출발점인데 그곳이 0번지이다.
    • 위로 올라갈수록 주소가 증가하는데, 가상 메모리 공간의 특정 프로세스의 data가 1000번지인데, 물리적인 메모리에서는 3000번지라면?
      • 주소가 바뀌어야 하는데 그걸 Address translation(주소 변환)이라고 한다.
      • 그것은 운영체제가 아닌 하드웨어적으로 따로 해주는데 여기서는 안다룸.

커널 주소 공간의 내용

  • 운영체제 커널의 주소 공간에 있는 내용이다.
  • code
    • 운영체제가 자원을 효율적으로 관리하는 역할을 하기 때문에 그것과 관련된 코드
    • 사용자에게 편리한 인터페이스를 제공해야 하기 때문에 그것과 관련된 코드
    • 운영체제는 인터럽트가 들어왔을때 CPU를 얻게됨. 그래서 각각의 인터럽트마다 어떻게 처리해야 하는지 관련된 코드
  • data
    • 운영체제가 사용하는 여러 자료구조들
    • 운영체제는 CPU, memory, disk 요런 하드웨어들을 직접 관리하고 통제함.
    • 이런것들을 관리하기 위해 각 하드웨어마다 자료구조를 하나씩 만들어서 관리
    • 운영체제는 프로세스들을 관리함. 각 프로그램들이 독자적인 주소 공간들을 가지고 있지만, 그것들을 관리하기 위한 자료구조가 필요함. 그것을 PCB라고 부름.
      • 프로세스마다 PCB가 하나씩 만들어서 관리됨.
  • stack
    • 운영체제도 함수 구조로 코드가 짜여져 있기 때문에 함수를 호출하거나 리턴할때 stack 영역을 사용해야함.
    • 운영체제의 code는 여러 사용자 프로그램들이 요청에 따라서 불러서 사용할 수 있다.
    • 사용자 프로그램들이 운영체제의 코드를 불러서 실행하기 때문에 함수 호출을 하게 되면 커널 스택을 쓸 때, 어떤 사용자 프로그램이 커널의 코드를 실행중인가에 따라서 사용자 프로그램마다 커널 스택을 따로 두고 있다.

사용자 프로그램이 사용하는 함수

  • 함수 (function)

    • 사용자 정의 함수
      • 자신의 프로그램에서 정의한 함수
  • 라이브러리 함수

    • 자신의 프로그램에서 정의하지 않고 갖다 쓴 함수
    • 자신의 프로그램의 실행 파일에 포함되어 있다.
  • 커널 함수

    • 운영체제 프로그램의 함수
    • 커널 함수의 호출 = 시스템 콜

  • 프로그램을 실행시키게 되면 함수는 사용자 프로세스의 코드 영역에 들어있기 때문에 함수 호출을 하더라도 사용자 프로세스 code 영역 안에서 점프를 하면서 실행이 됨.
  • 내 프로그램이 만약 커널 함수를 호출한다면?
    • 프로세스 주소 공간에 있는 것이 아닌 커널 주소 공간에 있어서 시스템 콜을 통해 호출을 하게 됨.
    • 메모리 주소를 프로세스 주소 영역에 있는 상태에서 커널 영역으로 점프하는 것이 사실상 불가능.
    • 그래서 커널 함수를 호출하기 위해서는 시스템 콜을 통해 인터럽트 라인을 임의로 세팅을 해서 CPU 제어권이 운영체제로 넘어가게 해서 커널 함수를 호출하게 됨.

프로그램의 실행

프로그램이 실행되는 단계

  1. 프로그램이 직접 CPU를 잡고 있으면 user mode에 있다고 부름.
    1. 자신이 정의한 함수 호출
    2. 시스템 콜을 한다면
  2. 프로그램의 주소 공간에 있는 코드를 실행하는 것이 아닌, 커널 주소 공간에 있는 코드가 실행이 됨. 그때는 kernel mode라고 함.
    1. 함수를 수행하고 시스템 콜이 끝나게 되면?
  3. 다시 A라는 프로세스한테 CPU 제어권이 넘어온다.
    1. 본인의 주소 공간에 있는 코드를 실행
    2. 경우에 따라서는 라이브러리에 있는 함수도 호출

프로그램은 태어나서 죽을때 까지 user mode, kernel mode로 실행을 하다가 코드가 전부 실행되면 프로그램이 닫힘.

운영체제 5번째 수업 (프로세스1)

프로세스의 개념

  • Process is a program in execution
  • 프로세스의 문백 (context)
    • CPU 수행 상태를 나타내는 하드웨어 문맥
      • Program Counter(PC)
      • 각종 register
        • 프로세스가 CPU를 잡게 되면 PC라는 레스스터가 프로그램의 코드의 어느 부분을 가리키고 있고, 매순간 기계어를 하나씩 읽어서 CPU로 불러들임.
        • 그래서 레지스터에 어떠한 값을 넣고, 산술논리연산장치(ALU)에서 어떠한 연산을 하고, 그 결과를 레지스터에 저장하거나, 또는 바깥의 메모리에 저장을 한다.
        1. 코드가 실행되면서 함수 같은 것이 호출되면 함수에서 쓰이는 지역변수나 매게변수가 쌓임.
        2. data에는 바뀐 변수의 값들이 얼마인지 저장됨.
        3. 프로그램이 실행되면서 레지스터에 어떠한 값을 넣어놓고 어떤 인스트럭션까지 실행했는가
        4. 이런 모든 것들을 다 알아야 프로세스의 현재 상태를 나타낼 수 있다.
        5. 이러한 것들을 프로세스의 문맥이라고 부른다!
    • 프로세스의 주소 공간
      • code, data, stack
        • 현재 이 주소 공간에 어떠한 값들이 들어있는지 알아야 현재 프로세스의 상태를 정확하게 나타낼수 있다.
    • 프로세스 관련 커널 자료 구조
      • PCB (Process Control Block)
      • Kernel stack
        • 프로세스가 하나 생길 때마다 운영체제가 그 프로세스들을 관리하기 위해 자신의 데이터 영역에 자료구조를 하나씩 두고 있음.
          • 그것을 PCB라고 함.
            • 이 친구한테 CPU를 얼마나 줘야할지, 메모리를 얼마나 줘야할지 관리하는 역할
          • 프로세스가 자기 자신의 코드를 실행 중 일때는 함수 호출이 이루어 질때마다 리턴하고 관련된 정보들을 자신의 stack에 쌓음.
          • 그런데 시스템 콜로 자신이 할 수 없는 일을 운영체제에게 요청을 한다면 PC가 그 프로세스의 code 부분을 가리키는게 아닌 커널의 code쪽을 가리킨다.
          • 커널의 code도 함수들로 구현되어 있어서 관련된 함수를 호출하면 커널의 stack에 관련된 정보들을 쌓아놓음.
          • 그런데 커널의 code는 여러 프로세스들이 공유하는 code임.
          • 커널이 어떤 프로세스의 부탁을 받고 실행하는지 다 다름.
          • 그래서 커널의 stack에는 프로세스 별로 어떤 프로세스가 커널 함수를 호출했는지 stack을 별도로 생성함.

프로세스의 상태 (Process State)

  • 프로세스는 상태 (state)가 변경되며 수행된다
    • Running
      • CPU를 잡고 instruction을 수행중인 상태
    • Ready
      • CPU를 기다리는 상태 (메모리 등 다른 조건을 모두 만족하고)
      • 보통 Ready 상태에 있는 프로세스들이 CPU를 번갈아가면서 잡았다 놨다 하면서 time sharing을 구현하고 있다.
    • Blocked (wait, sleep)
      • CPU를 주어도 당장 instruction을 수행할 수 없는 상태
      • Process 자신이 요청한 event (예: I/O)가 즉시 만족되지 않아 이를 기다리는 상태
      • 예) 디스크에서 file을 읽어와야 하는 경우
      • 그리고 프로세스를 실행할 때에는 프로세스의 주소 공간 전체를 메모리에 올려놓고 실행하지 않는다.
        • 그렇기 때문에 만약 실행시켜야 하는 부분이 메모리에 안올라와있으면, 당장 실행할 수 없다.
    • New : 프로세스가 실행중인 상태
    • Terminated : 수행 (execution)이 끝난 상태

프로세스 상태도

  1. new
    1. 프로세스 생성 중인 상태
  2. ready
    1. CPU만 얻으면 실행 가능한 상태
    2. 최소한의 메모리는 가지고 있어야함.
      1. 당장 CPU에서 인스트럭션을 실행하는데 필요한 부분
  3. running
    1. ready 상태에서 본인 차례가 되서 CPU를 얻은 상태
  4. CPU 뺏기거나 내놓기
    1. waiting (blocked)
      1. 자진해서 CPU를 내놓은 상태
      2. I/O 같은 오래 걸리는 작업을 해야되기 때문에 CPU를 가지고 있어봐야 아무것도 못하기 때문.
    2. ready
      1. Timer interrupt가 들어와서 CPU를 뺏긴 경우.
  5. terminated
    1. 본인의 역할을 다하고 프로세스 종료

컴퓨터 시스템 입장에서의 프로세스 상태

  • 하나의 프로세스가 CPU에서 Running중
  • 뺏기고 다시 Ready queue로 가서 줄섬.
  • 그 다음 친구가 다시 CPU를 얻음.
  • I/O 작업을 해야한다면, Running → blocked로 상태가 바뀜
  • device의 서비스를 받는 곳에 프로세스가 또 줄을 서게 됨 (I/O queue)
  • device controller의 지휘하에 순서대로 처리
  • 작업이 끝나면 CPU에 인터럽트를 검.
  • CPU는 하던 작업을 중단하고 CPU 제어권이 운영체제에게 넘어감 (인터럽트가 걸렸기 때문에)
  • 해당 I/O 작업이 끝난 프로세스의 메모리 영역에 결과물을 copy 하고 그 프로세스의 상태를 blocked에서 Ready로 바꿈.
  • 하드웨어의 서비스를 기다리면서 줄을 서는 경우도 있지만, 자원중에는 소프트웨어 자원도 있다.
    • 예를 들면 공유 데이터라는 것이 있는데 이 공유데이터에 여러 프로세스가 동시 접근하면 안되기 때문에 Resource queue에 가서 줄을 섬.
    • 이런 상태에도 그 프로세스는 blocked 상태이다.

  • 이런 queue라는 것은 운영체제 커널이 본인의 데이터 영역에 자료구조로 큐를 만들어놓고 프로세스의 상태를 바꿔가면서 ready 상태에 있는 친구한테 CPU를 주고, blocked 상태에 있는 친구한테는 CPU를 안주고 이런 식으로 운영을 함.

Process Control Block (PCB)

  • PCB
    • 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
    • 다음의 구성 요소를 가진다 (구조체로 유지)
      1. OS가 관리상 사용하는 정보
        1. Process state, Process ID
          1. state는 ready냐 running이냐 blocked이냐
          2. 프로세스마다 고유 ID가 있음.
        2. scheduling information, priority
          1. CPU를 순서대로 그냥 주는게 아닌 여러 알고리즘이 있음.
      2. CPU 수행 관련 하드웨어 값
        1. Program counter, registers
          1. 프로그램의 문맥
      3. 메모리 관련
        1. Code, data, stack의 위치 정보
      4. 파일 관련
        1. Open file descriptors…

문맥 교환 (Context Switch)

  • CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
  • CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행
    • CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
    • CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴

System call이나 Interrupt 발생시 반드시 context switch가 일어나는 것은 아님

  • 사용자 프로세스에서 운영체제로 CPU에게 제어권이 넘어간 것을 context switch라고 부르지 않는다.
  • 밑에 ISR은 Interrupt Service Routine이다.
    • 인터럽트가 들어왔을때 어떤 함수를 호출할지에 대한 루틴이다.

  • (1)의 경우에도 CPU 수행 정보 등 context의 일부를 PCB에 save해야 하지만 문맥교환을 하는 (2)의 경우 그 부담이 훨씬 큼 (eg. cache memory flush)
  • timer interrupt는 다른 사용자 프로세스에게 CPU를 넘기기 위한 인터럽트
    • 그래서 또 다른 사용자에게 CPU를 넘기니깐 이건 context switch
  • I/O 작업 같은 오래 걸리는 작업을 요청.
    • 그러면 I/O가 실행되는 동안 이 프로그램에 CPU를 줘봤자 당장 인스트럭션 실행이 불가
    • 사용자 프로세스 A는 blocked가 되었기 때문에 ready 상태에 있는 또 다른 프로세스 B에게 CPU를 주니깐 context switch

프로세스를 스케줄링하기 위한 큐

  • Job queue
    • 현재 시스템 내에 있는 모든 프로세스의 집합
  • Ready queue
    • 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
  • Device queues
    • I/O device의 처리를 기다리는 프로세스의 집합
  • 프로세스들은 각 큐들을 오가며 수행된다.

Ready Queue와 다양한 Device Queue

  • 운영체제가 PCB를 관리하는 자료구조이다.
  • PCB를 줄세우는것
  • PCB 자료구조를 보면 포인터가 있는데 그것을 연결해서 줄세움
  • 기다리는 프로세스들을 줄 세운것이라고 생각하면됨.

프로세스 스케줄링 큐의 모습

  1. 프로그램 시작되면 레디큐에 가서 줄을 선다.
  2. 자신의 차례가 되면 CPU 제어권을 얻음
  3. 작업
    1. I/O 작업이 오래걸리기 때문에 I/O 큐에 가서 줄을 서고 I/O를 완료한 후 다시 레디 큐에 가서 줄을 선다
    2. 자신의 할당 시간이 다 끝나면 다시 레디큐에 와서 줄을 선다.
    3. 자식 프로세스를 만든다.
      1. 다음 챕터에서 더 자세히 다룸
    4. 인터럽트가 걸리면 CPU를 빼앗기기 때문에 위의 그림과는 약간 다름. 다음 시간에 더 자세히 다룰 것
  4. 종료

밑에서 부터는 인강 다시 보면서 필기하기! (42분)(process1)

스케줄러 (Scheduler)

  • Long-term scheduler (장기 스케줄러 or job scheduler)

    • 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
    • 프로세스에 memory(및 각종 자원)을 주는 문제
    • degree of Multiprogramming을 제어
    • time sharing system에는 보통 장기 스케줄러가 없음 (무조건 ready)
  • Short-term scheduler (단기 스케줄러 or CPU scheduler)

    • 어떤 프로세스를 다음번에 running 시킬지 결정
    • 프로세스에 CPU를 주는 문제
    • 충분히 빨라야 함 (millisecond 단위)
  • Medium-Term Scheduler (중기 스케줄러 or Swapper)

    • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
    • 프로세스에게서 memory를 뺏는 문제
    • degree of Multiprogramming을 제어

프로세스의 상태 (Process State)

  • 프로세스의 상태
    • Running
      • CPU를 잡고 instruction을 수행중인 상태
    • Ready
      • CPU를 기다리는 상태 (메모리 등 다른 조건을 모두 만족하고)
      • 보통 Ready 상태에 있는 프로세스들이 CPU를 번갈아가면서 잡았다 놨다 하면서 time sharing을 구현하고 있다.
    • Blocked (wait, sleep)
      • CPU를 주어도 당장 instruction을 수행할 수 없는 상태
      • Process 자신이 요청한 event (예: I/O)가 즉시 만족되지 않아 이를 기다리는 상태
      • 예) 디스크에서 file을 읽어와야 하는 경우
      • 그리고 프로세스를 실행할 때에는 프로세스의 주소 공간 전체를 메모리에 올려놓고 실행하지 않는다.
        • 그렇기 때문에 만약 실행시켜야 하는 부분이 메모리에 안올라와있으면, 당장 실행할 수 없다.
    • Suspended (stopped)
      • 외부적인 이유로 프로세스의 수행이 정지된 상태
      • 프로세스는 통째로 디스크에 swap out 된다
      • 예) 사용자가 프로그램을 일시 정지시킨 경우 (break key)
        • 시스템이 여러 이유로 프로세스를 잠시 중단시킴
          • 메모리에 너무 많은 프로세스가 올라와 있을 때
    • Blocked : 자신이 요청한 event가 만족되면 Ready
    • Suspended : 외부에서 resume해 주어야 Active

프로세스 상태도

profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글