[운영체제] 컴퓨터 시스템 구조

이민선(Jasmine)·2023년 9월 30일
0

[CS] 운영체제

목록 보기
3/8
post-thumbnail

컴퓨터 시스템 구조

컴퓨터:

  • CPU: 매 clock cycle마다 메모리에서 instruction을 하나씩 읽어서 실행
    • Program Counter (PC): CPU가 다음 번에 실행할 명령어의 메모리 주소를 저장
  • 메모리: CPU의 작업 공간.

I/O 장치: 디스크(input-읽어들임/output-처리 결과를 파일 시스템에 저장), 키보드(input), 프린터, 모니터(output)

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

  • 동기식 입출력 (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의 완료는 인터럽트로 알려줌.

모든 입출력 명령은 특권 명령이다.
인터럽트 당한 시점의 레지스터와 program counter를 save한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다.

인터럽트
현대의 운영체제는 인터럽트에 의해 구동된다.

  • 좁은 의미 (하드웨어 인터럽트): 하드웨어(타이머, I/O device 등)가 발생시킨 인터럽트
  • 넓은 의미 (하드웨어 인터럽트 + 소프트웨어 인터럽트)
    • Exception: 프로그램이 오류를 범한 경우
    • System call: 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 경우. 사용자 프로그램이 interrupt line을 세팅.

사용자 프로그램은 어떻게 I/O를 하는가?
1. I/O를 요청하기 위해서는 소프트웨어 인터럽트를 건다.
시스템 콜(system call): 사용자 프로그램이 운영체제에게 I/O 요청 (커널의 함수를 호출: 프로그램이 직접 interrupt line을 세팅하는 함수를 실행)하면 CPU는 mode bit을 0으로 전환하고 운영체제에게로 제어권 넘어감
trap(software interrupt)을 사용하여 인터럽트 벡터의 특정 위치로 이동
제어권이 인터럽트 벡터(각각의 인터럽트 종류마다 해당 인터럽트의 처리 루틴 주소를 가지고 있는 테이블)가 가리키는 인터럽트 서비스 루틴(= 인터럽트 핸들러, 해당 인터럽트를 처리하는 커널 함수)으로 이동
2. I/O 요청이 완료되면 하드웨어 인터럽트를 건다.
I/O 완료 시 인터럽트 서비스 루틴이 실행되어 I/O 작업 완료를 처리하고, 제어권을 시스템 콜 다음 명령으로 옮겨서 중단되었던 지점에서 실행 재개.

  • device controller(장치 제어기): 해당 I/O 장치 유형을 전담하는 작은 CPU 역할을 함. 하드웨어임.
    • I/O가 끝났을 경우 interrupt로 그 사실을 알림
    • 제어 정보(CPU의 명령 관련 정보)를 위해 control register, status register를 가짐.
    • ex) disk controller: 디스크에서 헤드가 어떻게 움직이고 어떤 데이터를 읽을지 디스크 내부를 통제.

  • device driver(장치 구동기)와 구분! OS 코드 중 각 장치별 처리 루틴 -> 소프트웨어임. 컴퓨터의 운영체제와 하드웨어 디바이스 간의 중개자 역할을 하는 소프트웨어 구성 요소.
  • local buffer: 일종의 data register (device controller의 작업 공간)
    • I/O는 실제 device와 local buffer 사이에서 일어남.
    • CPU도 local buffer 접근 가능. (ex. 디스크의 local buffer에 있는 데이터를 메인 메모리에 copy) 하지만 CPU가 매번 local buffer에 접근하는 것의 오버헤드는 너무 크기 때문에, DMA controller가 local buffer의 데이터를 메인메모리로 copy해주는 역할을 담당한다.

CPU 레지스터: 메모리보다 더 빠르면서 정보를 저장할 수 있는 작은 공간

CPU mode bit:

  • 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호장치 필요.

  • Mode bit을 통해 하드웨어적으로 두 가지 모드의 operation 지원 (지금 CPU에서 실행되는 것이 운영체제인지 사용자 프로그램인지를 구분해줌)

    • 사용자모드 (1): 사용자 프로그램 수행
    • 모니터모드(= 커널 모드, 시스템 모드) (0): OS 코드 수행
    • 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 특권 명령으로 규정
    • interrupt나 excetption 발생 시 하드웨어가 mode bit을 0으로 바꿈.
    • 사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 셋팅 (한정된 instruction만 실행 가능)

interrupt line: CPU가 메모리에 있는 instruction을 순차적으로 실행을 하다가, 외부 장치로부터 발생하는 I/O 작업(ex. 디스크에서 무언가를 읽어옴, 키보드 입력 발생 등)이 있을 때 CPU에게 현재 실행 중인 프로세스를 일시 중단하고 인터럽트 요청을 우선적으로 처리해야함을 알리는 역할. CPU는 메모리에 있는 instruction 실행 -> interrupt line 확인 -> instruction 실행 -> interrupt line 확인 -> ...을 반복한다.

CPU는 I/O작업이 필요할 때 직접하는 것이 아니라 device controller에게 시키고, 다시 메모리 접근을 통해 instruction을 계속 실행한다.

타이머:

  • 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시킴
  • 타이머는 매 clock tick마다 1씩 감소.
  • 타이머 값이 0이 되면 타이머 인터럽트 발생
  • CPU를 특정 프로그램이 독점하는 것으로부터 보호
  • 타이머는 time sharing을 구현하기 위해 널리 이용된다.
  • 타이머는 현재 시간을 계산하기 위해서도 사용된다.
    (특정 프로그램이 CPU를 독점하는 것을 막고 time sharing을 가능하게 하기 위해 존재. 운영체제가 CPU를 사용자 프로그램에 넘겨줄 때 타이머에 특정 값을 세팅함. 할당된 시간이 되면 타이머가 CPU에게 인터럽트를 걸고 CPU의 제어권이 운영체제로 자동으로 넘어간다.)
  • ex) CPU가 무한루프를 도는 프로그램을 만났을 때 다른 프로그램으로 못 넘어가면 어쩌지? No worries. 타이머가 세팅되어 있으니 다른 프로그램으로 CPU가 넘어갈 수 있다.

사용자 프로그램이 disk에서 파일을 읽어오도록 요청했을 때 어떤 일이 발생하나?
1. 프로그램이 운영체제에게 파일 읽어오는 것을 요청하도록 system call을 걸고 CPU 제어권이 운영체제로 넘어간다.
2. CPU가 disk controller에게 파일을 읽어들이라고 명령한다.
3. disk controller가 local buffer에 파일을 적재하는 동안 CPU는 다른 프로세스의 instruction을 실행하고 있는다.
4. CPU가 interrupt line을 확인했는데 disk controller로부터 파일을 모두 적재했다는 interrupt 신호가 와있으면, interrupt의 type을 확인하고, 실행중인 프로세스의 상태를 저장하고, 인터럽트 핸들러를 실행(local buffer에 적재된 데이터를 시스템콜을 요청한 프로세스의 메모리 영역으로 copy하거나, 데이터를 요청한 프로세스에게 알리는 작업 등)한다.
5. 프로세스 큐에서 system call을 시작한 프로세스가 다시 실행될 차례가 되면 디스크에서 읽어들인 파일 데이터를 필요한 작업에 사용한다.

DMA(Direct Memory Access):

  • CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송
  • 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴.
    원래 메모리에 접근할 수 있는 장치는 CPU 밖에 없지만, DMA가 있으면 CPU를 거치지 않고 I/O 장치가 직접 메모리에 접근하여 데이터를 읽고 쓸 수 있음. I/O 장치가 인터럽트를 자주 발생시켜 CPU를 방해하는 대신, DMA는 큰 블록의 데이터를 local buffer로부터 메모리로 전송하고, 전송이 완료되었을 때만 CPU에 인터럽트를 발생시켜 통지한다. -> 인터럽트 발생 빈도가 줄어 시스템의 오버헤드 감소.
  • CPU와 DMA controller가 동시에 메모리에 접근할 경우 memory controller가 중재를 담당.

저장 장치 계층 구조

CPU 내부 register - cache memory (SRAM으로 구성됨) - main memory (DRAM으로 구성됨) - magnetic disk - optical disk - magnetic tape
<-------------------primary(executable: CPU가 직접 접근 가능)------------------> <-------------------secondary--------------->
<--- speed, cost, volatility---

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

프로그램은 보통 실행 파일 형태로 파일 시스템(하드 디스크 등)에 저장이 되어 있음. 실행 시키면 (가상 메모리가) 물리 메모리로 올라감. 중간에 가상 메모리라는 단계를 한 번 더 거침.
프로그램을 실행시키면 프로그램의 독자적인 메모리 주소 공간(가상 메모리, 각 프로그램마다 0번지부터 시작)이 만들어짐. 가상 메모리는 code, data(전역 변수 등), stack(함수의 실행 순서 관리)으로 구성됨.
커널은 부팅 이후 메모리에 상주해있지만, 프로그램은 실행시키면 생기고 종료하면 없어짐. 이 때 가상 메모리를 통째로 물리메모리에 다 올리는 것이 아니라 필요한 일부분만 올림. 물리 메모리에 올라가있더라도 프로세스가 종료되기 전에 불필요해질 경우 (하드 디스크 내부의) swap area로 쫓겨남.
가상 메모리가 물리 메모리로 올라갈 때 주소 변환 필요.

커널 주소 공간의 내용

  • 코드: 커널 코드
    • 시스템 콜, 인터럽트 처리 코드
    • 자원 관리를 위한 코드
    • 편리한 서비스 제공을 위한 코드
  • 데이터: 운영체제가 사용하는 여러 자료구조들이 정의되어 있음.
    • CPU, memory, disk마다 자료구조들이 있음.
    • PCB (Process Control Block): 프로세스를 관리하기 위한 자료구조
  • 스택:
    • 사용자 프로그램마다 커널 스택을 따로 둠. (프로그램마다의 커널 코드 실행 순서)

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

user mode에서 실행됨

  • 사용자 정의 함수

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

    • 자신의 프로그램에서 정의하지 않고 누군가 만들어놓아서 가져다 쓴 함수
    • 자신의 프로그램의 실행 파일에 포함되어 있다.

kernel mode에서 실행됨

  • 커널 함수
    • 운영체제 프로그램의 함수
    • 커널 함수의 호출을 하려면 interrupt line을 세팅하여 시스템 콜을 해야 한다. (프로그램의 실행파일이 아닌 커널의 코드에 들어 있으므로)

참고:

profile
기록에 진심인 개발자 🌿

0개의 댓글