본문 바로가기
운영체제(OS)

[OS] SystemStructure & Program Execution 1

by 도전하는 린치핀 2023. 10. 4.
 
  • CPU + Memory → Computer
  • I/O device
    • Input : I/O device에서 입력된 데이터가 컴퓨터로 보내지는 방향
    • Output → 컴퓨터에서 데이터를 처리 후 그 결과를 필요한 device로 내보내는 방향

1. CPU

cpu는 pc가 가리키는 메모리주소에 있는 Instruction을 읽고 실행하는 것.
다음 Instruction을 읽기 전에 Interrupt line을 체크하여 Interrupt가 있다면 기존에 실행중인 작업 멈추고 cpu를 누가 쓰고 있었든 상관없이 cpu제어권이 운영체제에게 넘어가게 된다.

운영체제는 매 Interrupt 마다 Interrupt가 걸린 이유가 os 안의 커널 함수로 정의되어 있다.

Interrupt Vector(인터럽트 번호와 주소의 쌍) / 실제 해야 하는 일은 인터럽트 처리 루틴

2. Memory

CPU의 작업 공간으로 CPU는 매 클럭 사이클마다 Memory에 저장된 기계어를 하나씩 읽어서 실행한다.

 

3. I/O Device

별개의 디바이스들

CPU와 I/O device는 처리 속도 차이가 굉장히 많이 난다.

  • 키보드, 마우스 → input device
  • 모니터, 프린터 → output device
  • 하드디스크 → 보통 하드디스크의 경우 보조기억장치로 생각하지만, 어떤 방면에서는 I/O device로 볼수 있음.
    • 데이터를 읽어서 컴퓨터에 보내기도 하고, 데이터를 받아서 파일 저장 장치에 저장하기도 하는 input, output 두 가지의 역할을 수행하는 장치이기 때문에 I/O device로 볼 수 있다.

4. Local buffer

각각의 PC에 메인 cpu와 메인 메모리가 있듯이 각 I/O device마다 있는 device controller에도 작은 작업 공간이 필요한데, 그것을 local buffer라고 한다.

5. Register

CPU에는 memory보다 더 빠르면서 정보를 저장할 수 있는 작은 공간들이 있는데 그것이 register이다.

 -> Memory보다 빠르지만 데이터를 저장할 수 있는 공간이 훨씬 적다.

6. Mode bit

사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호장치 필요하다.
mode bit은 지금 이 CPU에서 실행되는 것이 운영체제인지, 아니면 사용자 프로그램인지를 구분하기 위한 bit이다

mode bit을 통해 하드웨어적으로 두 가지 모드의 operation을 지원한다.

  • mode bit = 1 (사용자모드) : 사용자 프로그램 수행
    • 보안상의 문제로 제한된 Instruction만 CPU에서 실행하게 한다.
    • 일반 명령만 수행 가능
    • interrupt나 Exception 발생 시 CPU제어권이 운영체제에게 넘어가며 하드웨어가 mode bit을 0으로 바뀐다.
  • mode bit = 0 (모니터모드, 커널모드, 시스템모드) : 운영체제가 CPU에서 실행중인 것 - OS코드 수행
    • 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 ‘특권 명령’으로 규정
    • 사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 바꾼 후 넘겨준다.
    • I/O device를 접근하는 Instruction도 실행 가능

7. Interrupt line

CPU의 경우 매 클럭 사이클마다 Memory에 존재하는 Instruction을 읽은 후 실행하고 다음 실행할 Instruction의 주소값이 증가하며 다음 Instruction을 수행한다.

이때, I/O device에서 들어온 입출력에도 CPU가 필요한데 I/O device에 존재하는 데이터나 입출력이 들어온 현황을 전달하기 위해 Interrupt Iine이 있다. 

8. Timer

특정 프로그램이 CPU를 독점하는 것을 막기 위해 운영체제가 사용자프로그램에게 cpu를 넘겨줄 때 타이머에 시간을 할당한다.

  • 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트를 발생 시킴
  • 타이머는 매 클럭 사이클마다 1씩 감소
  • 타이머 값이 0이 되면 타이머 인터럽트 발생 →  운영체제가 그 프로그램으로부터 CPU를 강제적으로 뺏음
  • cpu를 특정 프로그램이 독점하는 것으로부터 보호

타이머는 timesharing을 구현하기 위해 널리 이용된다.

타이머는 현재 시간을 계산하기 위해서도 사용된다.

 

9. Device controller

각각의 I/O device들은 그 디바이스들을 관리하는 작은 CPU 같은 것이라고 생각하면 된다.
디스크에서 헤드가 어떻게 움직이고, 어떤 데이터를 읽을지 내부를 통제하는 것은 device controller가 그런 작업을 하게 된다.

 I/O device controller

  • 해당 I/O 장치유형을 관리하는 일종의 작은 CPU
  • 제어 정보를 위해 control register(CPU가 일을 시킬 때 지시하기 위한 register), status register를 가진다.
  • local buffer를 가진다. (일종의 data register(I/O device에서 담은 데이터를 메모리에 옮겨주거나 화면에 출력하기 위해서 데이터를 담는 register))

I/O는 실제 device와 local buffer 사이에서 일어남

Device controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알림

 

device driver(장치구동기) : OS 코드 중 각 장치별 처리 루틴 → software

device controller(장치제어기) : 각 장치를 통제 하는 일종의 작은 CPU → hardware

 

10. DMA controller(Direct Memory Access controller)

기존에는 메모리에 접근할 수 있는 장치는 CPU만 가능했다. DMA Controller를 둔다면, 메모리를 CPU뿐 아니라 DMA Controller도 접근할 수 있다. 

기존에는 메모리에 접근할 수 있는 장치는 CPU만 존재했다. 하지만 I/O device에 있는 local buffer에 있는 내용들을 CPU가 계속 받아야 하기 때문에 Interrupt가 너무 많이 일어났다.

그래서 CPU가 아닌 Memory에 접근할 수 있는 DMA Controller를 두어 CPU가 Interrupt가 발생하는 일을 줄일 수 있다.

  1.  CPU는 계속해서 Memory에 있는 Instruction을 수행한다.
  2. 만약 I/O device에서 I/O 작업이 끝난다면 DMA Controller가 그 device의 Local buffer에 있는 데이터를 메모리에 복사해준다.
  3. 메모리에 데이터 복사가 끝난다면 그때 CPU에 interrupt를 실행하여 CPU가 새로운 작업을 수행할 수 있게 한다.

이때, 두 개의 장치가 다 특정 메모리 영역을 동시에 접근한다면 문제가 생길 수 있기 때문에 memory controller가 이것을 중재하는 역할을 담당한다.

11. 입출력(I/O)의 수행

모든 입출력 명령은 특권 명령이다.(사용자 프로그램이 직접 I/O를 하지 못하고 OS를 통해서만 I/O 장치로 접근할 수 있다.)

사용자 프로그램은 어떻게 I/O를 하는가?

  • 시스템 콜 (system call)
    • 사용자 프로그램은 운영체제에게 I/O 요청 (사용자 프로그램이 운영체제 커널을 호출하는 것.)
  • trap을 사용하여 인터럽트 벡터의 특정 위치로 이동
  • 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동
  • 올바른 I/O 요청인지 확인 후 I/O를 수행
  • I/O 완료 시 제어권을 시스템콜 다음 명령으로 옮김

사용자 프로그램을 실행하다 보면 함수 호출을 해야 하는 부분이 있다. 처음에 프로그램이 main 실행하다가 다른 함수 호출하면 JUMP를 한다.
이렇게 내 프로그램 안에서의 함수 호출은 이 안에서 메모리 주소를 바꾸는 것인데, 프로그램이 실행되다가 I/O를 호출하기 위해서 운영체제 함수 호출하는 그것이 system call이다.
이것은 그냥 메모리 주소를 바꾸면 되는 일이 아니고, device controller들이 CPU에 interrupt를 거는 것처럼 내 프로그램을 실행하다가 I/O 해야 하면 직접 OS로 주소점프를 하지 못하고 (MODEBIT==1이기 때문에) 프로그램이 직접 interrupt line을 세팅하는 그러한 instruction을 실행한다.

 

12. 인터럽트 (Interrupt)

  • 인터럽트 당한 시점의 레지스터와 program conter를 save한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다.

넓은 의미에서의 Interrupt

  1. Interrupt (하드웨어 인터럽트) : 하드웨어가 발생시킨 인터럽트 (timer, i/o controller) → 보통의 인터럽트
  2. Trap (소프트웨어 인터럽트)
    • Exception : 프로그램이 오류를 범한 경우 → 0으로 나누는 경우
    • system call : 프로그램이 커널 함수를 호출하는 경우

 

  • 인터럽트 벡터 : 해당 인터럽트의 처리 루틴 주소를 가지고 있음 (각 인터럽트 종류마다 그 인터럽트가 생겼을 때 어디 있는 함수를 실행해야 하는지 그 함수의 주소를 정의해 놓은 테이블)
  • 인터럽트 처리 루틴 (=Interrupt Service Routine, 인터럽트 핸들러) : 해당 인터럽트를 처리하는 커널 함수 (각각의 인터럽트마다 해야 할 실제 코드)

 

그래서 I/O를 실행하기 위해 두 가지 인터럽트가 걸린다.

처음엔 사용자 프로그램에서 I/O를 요청하기 위해 systemcall을 한다 그럼 os가 일을 시키고, (cpu는 다른 프로그램에게 넘어감.) 그 후 일을 끝나면 하드웨어 인터럽트를 통해 끝남을 알려준다.

 

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

 

운영체제는 cpu를 사용할 일이 없다. 인터럽트가 걸려올 때만 cpu가 운영체제에게 넘어가는 거지 그렇지 않으면 운영체제는 항상 사용자 프로그램이 쓰고 있는 것