컴퓨터 시스템 구조

컴퓨터시스템구조

컴퓨터 시스템 구조: 컴퓨터+ IO device
컴퓨터: CPU+memory

CPU: 일만 함

  • 역할: 메모리에서 명령어를 읽어서 실행한다.
  • disk보다 훨배 빠르다.
  • memory에서 instruction 읽어서 실행 (ONLY memory에만 접근. io device에 접근X)
    • scanf 해야된다던가 io device 작업이 필요할땐 cpu가 명령어로 io컨트롤러한테 일을 시키고, 본인은 다른 명령어를 실행함 (입력값 버퍼에 들어오면 나한테 연락때려라~하고 자기 할일을 한다. 굉장히 빠른데 일만 한다. 쉬지 않음)

CPU의 구성요소

  1. register : 메모리보다 빠른 정보 저장 공간
  2. mode bit : 실행 중인게 os인지 유저프로그램인지 구분.
  3. interrupt line : cpu는 명령어 실행이 끝나면 메모리 주소값을 증가시켜서 다음 명령어 실행하는 것을 반복한다. 그 사이에 cpu가 다른 일 처리해야 하는 게 있다는 걸 알려주는 역할을 한다.

OS: CPU를 전체적으로 통제하는 역할

  • OS는 대부분 사용자 프로그램이 쓴다.

이때 만약 io 작업없이 CPU 무한루프 도는 프로그램이 있다면? 그 프로그램이 cpu 독점하게 될 수도 있다
이걸 막기 위해 존재하는 하드웨어가 '타이머'이다.

타이머: CPU 독점을 막는 하드웨어

  • 컴퓨터를 켜면 os가 cpu를 가지고 있다가 타이머 값을 세팅한 후 사용자 프로그램한테 넘겨준다. 프로그램은 그 시간 동안만 cpu를 사용할 수 있다.
  • 만약 할당된 시간 끝나면 CPU한테 타이머가 인터럽트 보내고, cpu 사용권이 사용자프로그램에서 os로 넘어간다. (사용자프로그램도 io device 접근 불가. os를 통해서만 접근 가능)

Interrupt

  • 입출력장치 버퍼에 인풋 들어옴 -> io controller가 "버퍼에 입력 들어왔다"하고 CPU한테 io interrupt 보냄 -> CPU 제어권이 OS로 넘어감 -> os가 io buffe의 데이터를 본인 메모리에 카피
  • 시스템 콜: 사용자 프로그램이 운영체제의 서비스를 받고자 운영체제(커널)을 호출하는 것. 소프트웨어 인터럽트의 일종이다.
    • 방식: 사용자 프로그램이 '일 다했다~'하고 인터럽트 라인을 세팅하면 (= 인터럽트를 걸면) CPU 제어권이 OS에게 넘어간다.
  • 소프트웨어 인터럽트(트랩) : Exception, System Call
  • 하드웨어 인터럽트(대부분의 인터럽트): 타이머 인터럽트, io controller 인터럽트 등
    • 예시: '할 일 다했다~' (타이머 인터럽트)

mode bit: 사용자가 cpu 악용하는 것을 막는 역할

  • 0 (모니터 모드, 커널모드): os 코드 수행중. 메모리접근, io 접근 등 다 가능
  • 1 (사용자 프로그램 모드) : 모든 명령은 커널모드에서만 사용가능하므로 사용자 프로그램은 '시스템 콜'로 os에게 IO 요청함. 바로 os에 접근할 수 없으므로 인터럽트를 일으켜 cpu의 제어권을 Os로 보낸다.

만약 io device에서 계속 CPU한테 인터럽트를 걸어서 메모리에 있는 데이터 보낸다면?
cpu가 인터럽트를 너무 많이 당함 -> 비효율적. 그래서 있는게 DMA Controller

DMA Controller

: Direct Memory Access Controller

  • Memory에 CPU, DMA Ctrl 둘다 접근 가능.
  • CPU 대신 DMA가 io device에게 직접 가서 로컬 버퍼의 데이터를 메모리에 복사해주고 CPU는 최종 인터럽트만 받도록 함
  • DMACtrl 덕분에 CPU는 instruction 메모리 주소를 메모리에서 PC(Program Counter) 형태로 받아와서 실행하는데 집중 가능
  • DMA가 버퍼에 있는 내용을 메모리로 카피, 모아서 block 단위로 직접 메모리로 전송 & CPU에게 인터럽트

Memory Controller: 교통정리

  • DMA 컨트롤러와 CPU가 동시에 특정 메모리에 접근하는 것 막는 역할

Device Driver

  • 소프트웨어. os 코드중 각 장치에 접근하는 처리루틴

Device Controller

  • 하드웨어. io device의 CPU 역할
  • local buffer 있음

Program Counter: 프로그램 카운터 라는 레지스터

CPU는 메모리 주소를 가리키는 레지스터(프로그램카운터레지스터)가 가리키는 메모리 위치에서 인스트럭션을 읽어와실행함 그다음 프로그램카운터레지스터는 다음 주소를 가리킨다. 인스트럭션 하나가 주로 4바이트. 다음 인스트럭션 주소는 pc가 4 증가. 왠만하면 순차적으로 실행. 함수/if문 쓰루하는 경우 등 다른 메모리주소로 점프해야할 땐 메모리 위치가 점프

  • 명령 끝나고 새로 시작할때마다 인터럽트 라인 확인.
  • 인터럽트 벡터: 해당 인터럽트를 처리할 수 있는 처리 루틴(커널 함수) 주소를 가짐

입출력 비교

  • 동기식 입출력: io 요청 후 입출력이 끝나길 기다린 후 제어가 사용자 프로그램으로 넘어감
  • 비동기식 입출력: io 작업 끝나는거 안 기다리고 제어가 사용자 프로그램으로 넘어감
    • e.g. 디스크에서 뭐읽어오는 작업할 경우 그 데이터를 몰라도 할 수 있는 작업을 한다. (주로 '쓰기'작업)

동기비동기 io 둘다 입출력작업 끝난건 인터럽트로 알려줌.

IO 방법

  • 일반적으로는 메모리, IO device에 접근하는 명령 따로따로
  • memory mapped io: io 장치도 메모리 주소에 연장 주소 붙임

저장장치의 계층 구조

CPU-register-cache memory-main memory(d ram)-...

  • 위로 갈수록 속도가 빠르고 비싸 용량이 적고, 대부분 휘발성이다.
  • secondary: cpu가 직접 접근 불가. cpu는 바이트 단위로 접근하는데 세컨더리는 바이트 단위로 불가해 unexecutable
  • 캐싱은 재사용을 목적으로함. 미리 위까지 읽어놓으면 아래에서 읽어올 필요없음.

프로그램의 실행

  • 주로 .exe
  • 프로그램을 실행시키면 그 실행파일의 독자적인 주소 공간(virtual memory)이 생긴다. 이 공간은 프로그램 종료시 사라짐.
  • 주소공간(Address space): 코드, 데이터, 스택으로 이루어짐 (0번지부터 시작)
  • 이 주소공간을 물리적인 메모리에 올려 실행. 근데 주소공간의 전부를 다 올리지 않고 당장 필요한 코드 부분만 물리적인 메모리에 올림
  • 어느 부분은 physical memory에 일부는 swap area에 나눠져있기도 함. (virtual memory 기법)
  • swap area: 전원이 꺼지면 다 지워진다. 메모리 연장 공간으로 사용됨.

커널 주소공간의 내용

커널 주소공간 = 버츄얼 메모리

  • 커널도 하나의 프로그램이므로 주소공간으로 구성돼있음.
  • os는 자원을 효율적으로 관리하는 역할 하므로 관련 된 코드가 code 안에 있음
  • os는 인터럽트가 들어오면 cpu를 가지므로 인터럽트, 시스템콜 처리 코드가 code 안에
  • os는 cpu, memory, disk 등 하드웨어를 관리한다. 이때 관리를 위한 자료구조가 필요하다.
  • os는 프로세스를 관리. 프로세스 관리 위한 자료구조: PCB(Process Control Block) (프로세스마다 PCB가 하나씩 만들어짐)
  • 운영체제의 코드는 사용자 프로그램이 막 불러 실행하기 때문에 어떤 사용자 프로그램이 커널에 시스템콜을 하는지 저장하는 커널 스택도 있다.

함수

  • 사용자 정의 함수: 내가 만들고 내가 불러서 쓰는 함수
  • 라이브러리 함수: 누군가 만들어놓은 함수로, 내 실행 파일 안에 포함되어 있다. 사용자 프로세스의 주소 공간에 있음
  • 커널 함수: os 안에서 정의된 함수. 시스템 콜을 해서 쓸 수 있음. 커널의 주소공간 안에 들어있음.
  • 사용자 정의함수나 라이브러리함수에서 커널 함수를 호출하는 것은 메모리 주소가 점프해야하므로 불가능하다. 커널 함수를 호출할 땐 시스템 콜로 cpu 제어권을 os로 보내 실행함.

느낀 점

  1. 처음엔 내용이 정말 방대하구나 싶었다. 선구자들이 오랜 시간동안 연구하고 만들어온 거니 사실 당연한 거다. 강의를 들으면서 계속 새로운 장치와 개념이 나왔는데, 이것들이 다 연관되어있다는게 참 신기했다. 컴퓨터덕에 우리가 누리는 편리함과 즐거움을 생각하면 당연한 거지!!! 더이상 미룰수 없다 나의 운영체제 공부!!!
  2. 목표는 꾸준히, 그리고 반복해서 보기
  3. 컴퓨터를 더 잘 알고 더 나은 개발자가 되자.
  4. 시스템 콜이라는 개념이 흥미롭다. 나 다했어~~~하고 알림이 아니라 인터럽트를 걸어버리는 놈