tlov

02-2. 시스템 구조와 프로그램 실행 본문

개발/운영체제

02-2. 시스템 구조와 프로그램 실행

nowitzki 2024. 8. 16. 11:46

이화여자대학교 (반효경, 2014) - 운영체제

 

컴퓨터 시스템

 

Computer를 Host라고도 함. 여기에 붙어 host에서 처리된 결과를 내놓거나 디스크를 읽는 등의 작업을 한다. 해당 i/o device의 작업 수행을 위해서 device controller 라는 것이 붙어있고 이 controller는 작업을 처리하면서 생긴 결과를 local buffer에 저장한다. 그리고, CPU에게 완료된 작업을 알려주기 위해 인터럽트를 건다.

 

CPU는 메모리에 올라와 있는 기계어 명령 4바이트를 하나씩 계속 수행한다. 메모리 어디 있는 기계어를 읽냐면 CPU 내의 레지스터에서 Program Counter라고 하는 것이 있는데 얘는 실행할 명령어의 메모리 위치를 가지고 있음. CPU가 해당 명령어를 수행하면 PC는 다음 명령어 주소를 가르킨다. 즉, 4바이트가 증가함. 하지만, 프로그램이 항상 순차적으로 실행되는 것은 아니고 함수호출, if문과 같은 상황이 있을 수 있다. 기계어 집합 중에서는 이렇게 메모리 주소를 이동(점프)하는 명령어 집합이 있다. 그래서 이런 명령을 만나면 메모리 주소를 점프하기도 한다.

 

이렇게 CPU는 메모리에 있는 명령어를 실행하는데, 명령을 실행하기 전 항상 Interrupt line을 확인한다. 만약 인터럽트가 들어왔으면 PC에 있는 메모리 주소의 명령어를 실행하는게 아니라 하던 일을 잠시 멈추고 운영체제에게 CPU 제어권을 넘김. 그럼 운영체제는 인터럽트마다 정해져있는 인터럽트 벡터를 통해 인터럽트 서비스 루틴을 수행한다.

 

mode bit이 0이냐 1이냐에 따라서 실행할 수 있는 명령어 집합이 정해진다.

 

I/O 장치에 접근하는 것도 mode bit이 0일 때만 할 수 있다. 그래서 사용자 프로그램이 I/O 장치에 접근하기 위해서 시스템 콜을 한다. 그럼 cpu에 인터럽트가 걸리고 os의 인터럽트 서비스 루틴이 처리된다.

 

 

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

 

- 동기식 입출력 (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가 끝났다는 인터럽트가 오면 그때부터 i/o 작업을 해야 처리할 수 있는 작업을 하는 것이다.

 

쓰는 경우에는 출력이 되었는지 확인해야 실행할 수 있는건 아니니까 비동기식이면 그냥 다음 작업을 처리한다. 동기식이면 내가 제대로 출력을 했는지 안했는지 확인을 하고 다음 작업을 하는 것이다. 즉, 구현하기 나름이다. 근데 동기식의 경우 i/o 작업 자체가 오래 걸리는 작업이라서 그동안에 해당 프로세스가 CPU를 점거하면 CPU를 낭비하는 것이 된다. 그래서 CPU를 다른 프로세스에 일단 넘겨주어 다른 프로세스를 실행시키는 구현 방법2를 사용한다.

 

 

DMA (Direct Memory Access)

cpu가 너무 많은 인터럽트를 담당하기 때문에 DMA Controller를 통해 i/o 인터럽트에 대해 처리하도록 함.

cpu의 중재없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송

바이트 단위가 아니라 block 단위로 인터럽트 발생 시킴

 

서로 다른 입출력 명령어

- i/o 장치의 접근을 수행하는 특별 명령어

- Memory Mapped i/o

 

i/o 디바이스도 주소가 있어서 i/o 접근하는 명령어로 그 디바이스를 접근하는 것이 일반적이나 i/o 디바이스에다가 메모리 주소를 줘서 메모리 접근을 통해 i/o 디바이스 접근을 할 수도 있다.

 

서로 다른 i/o 접근 명령어

 

 

저장장치 계층 구조

CPU가 직접 접근한다 = 주요 스토리지

CPU가 직접 접근하지 못한다 = 세컨드 스토리지

 

주요 스토리지 [레지스터 - 캐시 메모리 - 메인 메모리] - 세컨드 스토리지 [HDD - ODD - Tape]

왼쪽으로 갈수록 속도가 빠르고 휘발성이며 용량이 작다.

 

CPU가 직접 접근하려면 바이트 단위로 주소를 줘서 바이트 단위로 접근이 가능해야 함.

 

 

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

프로그램은 File System에 저장이 되어있고, 이를 실행하면 물리 메모리에 프로세스란 이름으로 올라간다. 정확하게는 물리 메모리에 바로 올라가는게 아니라 가상 메모리 단계를 거친다. 0번지부터 시작하는 각 프로그램만의 독자적인 주소 공간이 생긴다. 해당 주소 공간은 stack, data, code로 나뉜다. code는 기계어 코드를 담고있고, data는 전역 변수 같은 프로그램이 사용하는 자료구조를 담고있다. 또, stack은 함수를 리턴하거나 호출할 때 어떤 데이터를 담는 용도로 사용한다.

 

이러한 독자적인 주소 공간을 가상 메모리라 하고 이를 물리 메모리에 올린다. 다 올리는 것은 아니고 필요한 부분만 메모리에 올려 메모리를 효율적으로 사용한다. 사용하다 사용되지 않으면 메모리 공간에서 빼버린다. 이를 하드디스크의 Swap area라는 곳에 담아둠. 근데, 메모리에서 빼지않고 보관해야 할 부분이 있으면 냅둔다.

 

그리고 가상 메모리를 물리 메모리에 매핑하는 것은 주소 변환이라고 하는데, 이는 주소 변환을 해주는 하드웨어 장치가 해준다. 메모리 주소가 점프 한다는 것은 물리 메모리 주소를 점프하는 것이 아니라 가상 메모리 주소 상에서 점프하는 것이다.