System Structure & Program Execution

이연중·2021년 10월 27일
0

OS

목록 보기
2/9
post-custom-banner

본격적으로 운영체제에 대한 학습을 시작하기 전 컴퓨터 하드웨어의 동작에 대해 학습하는 챕터

컴퓨터 시스템 구조


I/O= Input/Output. I/O Device의 데이터가 Computer로 들어가는 것을 Input. Computer에서 I/O Device로 데이터를 내보내는 것을 Output

I/O Device:

  • Keyboard, mouse: Input Device
  • Printer, Monitor: Output Device
  • Disk: Input/Output Device
  • Device Controller: Device를 전담하는 작은 CPU(Disk 내부 통제 등), 제어 정보(CPU로부터 할당받은 Instruction 저장)를 위해 Control RegisterState Register를 가짐. 데이터를 저장하는 Local Buffer를 가짐
  • Local Buffer: Device Controller의 작업 공간

Memory: CPU의 작업 공간

  • Memory Controller: CPU와 DMA Controller가 동시에 접근할 때, 접근을 조율하는 역할을 수행

CPU: 매 Clock Cycle마다 메모리에서 기계어를(Instruction) 하나씩 읽어 실행.(Instruction의 주소는 CPU Register의 PC라는 곳에 있음) Memory에도 접근할 수 있고 Local Buffer에도 접근할 수 있음

  • Register: 메모리보다 더 빠르면서, 정보를 저장할 수 있는 공간

  • Mode Bit: CPU에서 실행되는 것이 OS인지, 사용자 프로그램인지 구분해주는 것(For 보안)

    • 0: 운영체제가 CPU 제어권을 가지고 있는 경우(커널 모드). 모든 일을 처리할 수 있음(메모리 접근, I/O Device 접근 등). 운영체제에 CPU 제어권이 넘어갈 때 Mode Bit을 0으로 바꿈
    • 1: 사용자 프로그램이 CPU 제어권을 가지고 있는 경우(사용자 모드). 제한된 일처리만 가능(I/O Device 접근 불가). 사용자 프로그램에 CPU 제어권을 넘겨줄 때 OS는 Mode Bit을 1로 바꿈
  • Interrupt Line: 인터럽트가 발생했을 때, 로깅해놓는 곳(CPU는 매 Instruction이 끝날때마다 Interrupt Line에서 인터럽트 발생 여부를 체크함)

    (I/O Device 관련 Instruction 처리 매커니즘)

    프로그램 A에서 I/O Device 관련 기계어(Instruction)를 실행할 경우, CPU를 운영체제에게 넘겨줌(사용자 프로그램은 I/O Device에 접근할 수 없고, 운영체제만이 접근할 수 있음. System Call(프로그램이 직접 Interrupt를 발생시킴=직접 Interrupt Line 세팅)) ->

    올바른 요청인지 확인 ->

    운영체제는 Device Controller에 일을 시킴 ->

    운영체제는 다른 프로그램 B에 CPU를 넘겨줌 ->

    Device Controller는 해당 명령을 수행하면서 얻은 데이터들을 자신의 Local Buffer에 저장함 ->

    시킨일을 모두 처리하면 Device Controller는 CPU에 Interrupt를 발생 시킴 ->

    프로그램 B는 CPU 제어권을 운영체제에 넘김 ->

    운영체제는 I/O Device 관련 Instruction 처리를 요청한 프로그램 A의 메모리 공간에 결과 데이터를 복사해주고, CPU 제어권을 프로그램 B(B에게 할당된 시간이 남아있다면) or 다른 프로그램에게 넘겨줌 ->

Timer: 특정 프로그램이 CPU 독점하는 것을 막는 역할(처음에 운영체제가 CPU를 가지고 있다가 사용자 프로그램이 실행되면, Timer에 해당 프로그램이 CPU를 사용할 수 있는 시간을 기록하고, 사용자 프로그램에게 CPU를 넘겨줌 -> 할당된 시간이 다 지나면 Timer는 CPU에 Interrupt 발생 -> CPU의 제어권은 사용자 프로그램에서 운영체제로 자동으로 넘어감(다른 사용자 프로그램이 CPU를 사용하는 경우가 있을때는 위 과정이 반복))

DMA Controller: 직접 메모리에 접근할 수 있는 컨트롤러. I/O Device의 과도한 인터럽트로 인해 CPU가 영향받는 것을 방지하기 위해 I/O Device에서 작업이 끝나면, Local Buffer에 있는 결과값을 Memory에 옮겨줌. 이후 CPU에 결과값을 복사 완료했다는 Interrupt 한번만을 발생시킴(바이트 단위로 발생시키던 인터럽트를 block 단위로 발생시킴)

인터럽트


인터럽트 당한 시점의 레지스터와 Program Counter를 Save한 후, CPU의 제어권을 인터럽트 처리 루틴에 넘김. 현대의 운영체제는 인터럽트에 의해 수행됨(인터럽트가 발생할때만 CPU 제어권이 운영체제에 넘어감)

  • 하드웨어 인터럽트: 하드웨어가 발생시킨 인터럽트(I/O Device나 Timer가)
  • 소프트웨어 인터럽트(Trap):
    • Exception: 프로그램이 오류를 범한 경우(0으로 나누는 연산 등)
    • System Call: 프로그램이 커널 함수를 호출하는 경우(사용자 프로그램이 운영체제에 I/O 디바이스 관련 처리를 부탁할 때)
  • 인터럽트 벡터: 해당 인터럽트의 처리 루틴 주소를 가지고 있음(인터럽트 종류마다 실행되는 함수의 주소를 정의 해놓은 테이블)
  • 인터럽트 처리 루틴: 해당 인터럽트를 처리하는 커널 함수(인터럽트 별로 처리될 실제 코드가 담긴 함수)

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


동기식 입출력

  • I/O 요청 후 입출력 작업이 완료된 후 제어가 사용자 프로그램에 넘어감
  • 구현 방법1
    • I/O가 끝날 때까지 CPU를 낭비
    • 매 시점 하나의 I/O만 일어남
  • 구현 방법2
    • I/O가 완료될 때까지 해당 프로그램에게서 CPU를 뺏음
    • I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
    • 다른 프로그램에게 CPU를 넘겨줌

비동기식 입출력

  • I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감

두 경우 다 입출력 작업이 완료되면 인터럽트를 발생시킴

서로 다른 입출력 명령어


왼쪽 그림이 일반적인 I/O 방식. CPU에서 실행할 수 있는 Instruction이 Memory만 접근하는거 따로, I/O 장치에 접근하는거 따로 있다.

오른쪽은 메모리 접근 Instruction을 통해서 I/O 장치에 접근를 하는 방식(Memory Mapped I/O).

저장장치 계층 구조


맨 위에는 CPU

CPU가 직접 접근해서 처리 가능한 저장장치를 Primary or Executable라고 함(바이트 단위로 접근 가능)

CPU가 직접 접근해서 처리 불가능한 저장장치를 Secondary라고 함(바이트 단위로 접근 불가능)

위로갈수록 속도는 높고, 가격은 높고, 용량은 적음. 메인 메모리까지는 휘발성(전원꺼지면 데이터 날아감)

CPU는 보통 1 Clock Cycle에 하나의 Instruction을 처리하지만 DRAM(Main Memory)은 10~100 Clock Cycle이 걸림.

이러한 속도 차이를 완충하기 위해 중간에 Cache Memory를 두고, Register에서 데이터를 읽어들임.

Cache Memory는 메인 메모리보다는 용량이 작음. 그래서 필요한 것들만 메인 메모리에서 읽어서 씀(Caching: 빠른 장치로 데이터를 읽어들여 사용 For 재사용(최근에 사용한 데이터에 대해서는 읽어오는 작업없이 곧바로 사용할 수 있음. 새로운 데이터를 읽어오면, 기존에 데이터 중 어떤 것을 내보낼지에 대한 정책 존재))

프로그램의 실행


메모리 load

파일 시스템(전원 Off 시에도 데이터 보존)에 있는 실행파일을 실행시키면 프로그램의 주소공간이 형성이 됨

각 프로그램마다 만들어지는 독자적인 주소공간(Virtual Memory은 code(Instruction 코드 담고 있음), data(자료구조 저장), stack(함수 호출/리턴 시 사용)으로 구성됨

OS는 컴퓨터 부팅 시부터 항상 (메모리의)커널 영역에 상주하고 있음

일반 프로그램의 주소공간의 모든 요소들이 물리적 메모리에 다 올라가지는 않음(memory 낭비때문에). 필요한 요소만 물리적 메모리에 올라가고, 나머지 부분들은 하드디스크의 Swap Area(전원 Off 시 데이터들 사라짐. 메모리의 연장의 의미로 사용되기 때문)에 들어감.

주소공간의 요소들이 물리적 메모리로 올라갈 때 주소가 변환됨(로지컬 메모리 주소 -> 피지컬 메모리 주소. 주소변환. 하드디스크의 주소변환 계층이 해당 역할 수행)

커널 주소 공간의 내용

운영체제는 하드웨어와 소프트웨어를 관리하는 역할을 수행

code 영역에는 위와 같이 코드가 담겨져 있고,

data 영역에는 각 프로세스를 관리하는 PCB(Proccess Control Block. 프로세스를 관리하는 자료구조), 각각 CPU, Memory, Disk를 관리하는 자료구조가 있고,

stack 영역에는 사용자 프로그램마다 사용하는 커널 함수들이 스택에 쌓임

A 프로그램의 실행 -> 종료 단계

user mode와 kernal mode의 반복

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


함수

  • 사용자 정의 함수
    • 자신의 프로그램에서 정의한 함수
  • 라이브러리 함수
    • 자신의 프로그램에서 정의하지 않고 가져다 쓴 함수
    • 자신의 프로그램의 실행 파일에 포함됨

사용자 프로세스의 코드 영역에 존재(같은 논리적 공간에 위치. 논리적 주소에서의 점프 가능)

  • 커널 함수
    • 운영체제의 함수
    • 커널 함수의 호출= System Call

사용자 프로세스의 코드 영역에 존재하지 않음(다른 논리적 공간, 같은 물리적 공간. 물리적 주소에서의 점프 불가능)

참고

https://core.ewha.ac.kr/publicview/C0101020140307151724641842?vmode=f

profile
Always's Archives
post-custom-banner

0개의 댓글