본문 바로가기

OS

[운영체제] 시스템 구조 및 프로그램 실행

728x90

컴퓨터 시스템

위의 사진은 컴퓨터 시스템의 하드웨어 구조를 간략하게 요약한 것이다.

 

✔️ CPU와 Memory로 구성된 것을 보통 컴퓨터라고 하며 

✔️ I/O device의 데이터가 컴퓨터로 들어가는 것은 input / CPU 처리 후 다시 I/O device로 나가는 것을 Output이라고 한다.

 

메모리는 CPU의 작업 공간이며, 매 clock cycle마다 메모리의 instruction(= 명령어)를 읽어서 실행한다.

여기서 instruction은 PC(Program Counter)에 저장되어 있다.

 

CPU는 이 주소에 저장되어 있는 instruction을 실행하고 또 그 다음의 명령어를 읽고 실행하고 .. 의 과정을 반복한다.

 

Interrupt

CPU는 PC의 값을 읽을 때마다 Interrupt line이 setting되어 있는지 검사하는데, 만약 set으로 되어 있는 경우 인터럽트가 발생한 경우이므로 인터럽트를 처리하며 그렇지 않은 경우에는 다음 instruction을 수행한다.

 

시스템 콜

만약 어떤 코드에서 분기, 함수를 호출하면 다른 주소 공간으로 이동한다.(jump 한다.)
그런데 이동해도 사용자 공간임은 변하지 않는다. (mode bit : 1)

하지만 만약 입출력 요청을 해야 하는 코드를 실행하게 된다면, 사용자 프로세스는 이를 직접 하지 못한다.
이럴 때 시스템 콜이 발생한다.
CPU 제어권을 운영체제에게 넘겨 대신 입출력 요청을 해달라고 부탁하는 것이다. (mode bit : 0)

사용자 프로세스는 interrupt line을 set하고 CPU는 PC를 확인하기 전에 interrupt line을 검사하는데 set이 되어 있는 것을 확인하고 인터럽트 벡터 테이블에서 수행해야 할 작업을 찾은 후 커널 공간으로 이동하여 I/O 작업을 수행한다.

 

Mode Bit

모드 비트는 CPU를 사용자 프로세스가 갖고 있는지 / 운영체제가 갖고 있는지 표시하기 위해 사용한다.

0인 경우는 커널 모드로, OS 코드가 수행 중인 것을 의미하며

1인 경우는 사용자 모드로, 사용자 프로그램이 수행 중인 것을 의미한다.

 

이렇게 커널 모드와 사용자 모드로 나눈 이유는 사용자 프로그램이 잘못된 수행으로 시스템에 치명적인 피해를 주지 않기 위해서이다.

(32bit를 기준으로 각각의 프로세스는 4GB의 가상 공간을 사용할 수 있는데, 2GB씩 커널 공간, 사용자 공간으로 나뉘어진다. 이 때, 커널 모드인 경우 커널, 사용자 공간 모두 접근할 수 있지만 사용자 모드인 경우에는 사용자 공간만 접근할 수 있다.)

 

 

Timer

하드웨어 장치로

CPU의 제어권이 A 프로세스에서 B 프로세스로 넘어갈 때 타이머에 특정 값을 세팅한다. 그리고 B 프로세스는 이 값의 시간만큼 CPU를 사용할 수 있으며 시간이 지난 뒤에는 interrupt line을 set하여 C 프로세스에게 CPU를 넘겨준다. 

마찬가지로 타이머에 값을 세팅해서 넘겨준다/

 

이 때 만약, C 프로세스가 디스크의 데이터를 필요로 하면 어떻게 될까?

이런 경우, C 프로세스는 CPU를 운영체제에게 넘겨주고 CPU는 디스크의 데이터를 직접 읽지 않고 device controller에게 시킨다.

 


동기식 입출력 VS 비동기식 입출력 

동기식 입출력

I/O 요청 후 입출력 작업이 완료된 후에 제어가 사용자 프로그램으로 넘어가며 구현 방법은 두 가지가 있다.

 

  1. I/O가 끝날 때까지 CPU를 낭비 시킨다. 매시점 하나의 I/O만 일어날 수 있다.
  2. I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗는데. I/O 처리를 기다리는 줄에 그 프로그램을 줄을 세우고 다른 프로그램에게 CPU를 넘긴다.

 

비동기식 입출력

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

 

 

✅ 두가지 경우 모두 입출력 완료는 인터럽트로 알려준다.

 


Direct Memory Access

✔️ 키보드/마우스로부터 입력을 받거나

✔️ 디스크의 데이터를 읽어 오는 경우

.. device controller는 그 내용을 읽어서 local buffer에 저장한 후 CPU에 인터럽트를 날린다.

 

 

그런데 만약 여러 입출력 장치들이 CPU에게 매번 인터럽트를 걸면 CPU가 일을 하는데 비효율적이다.

그래서 DMA가 필요하다.

 

DMA는 CPU가 I/O가 읽은 데이터를 해당 프로세스의 메모리 공간에 copy해주는 일을 대신해준다.

그리고 DMA는 CPU에게 인터럽트를 걸어 "제가 local buffer에 있는 데이터를 프로세스에 다 옮겨놨습니다"라고 인터럽트로 알려준다.

 

원래 memory에 접근할 수 있는 건 CPU만 가능한데 DMA까지 접근하게 되니 충돌할 수가 있다.

-> 이런 부분을 통제하는 것이 memory controller이다.

 


프로그램의 실행 

메모리에 로드되는 것

 

디스크에 있는 프로그램을 실행시키기 위해서는 메모리에 올려 CPU를 할당 받는 것이다.

이렇게 CPU를 할당 받을 수 있는 상태를 프로세스라고 한다.

 

프로세스는 바로 물리 메모리에 올라가는 것이 아니라, 독자적으로 virtual memory라는 가상 주소 공간을 갖게 된다.

가상 주소 공간은 시스템마다 다르지만 32bit를 기준으로 4GB의 크기를 갖고 각 프로세스가 물리 메모리와는 상관 없이 하나의 프로세스가 혼자서 4GB 공간을 모두 사용할 수 있는 것과 같은 효과를 갖게 한다.

 

가상 주소 공간은 code, data, stack, heap으로 나뉜다.

 

각 프로세스의 가상 주소공간에서 실제로 프로그램을 실행하는데 필요한 부분은 block단위로 물리 메모리에 올라가게 된다. 굳이 현재 실행되는데 필요한 부분은 물리 메모리에 올리지 않는 것이다. 

 

만약 물리 메모리에 block을 올릴 수 있는 자리가 부족하게 되면 swap area라는 디스크영역에 block을 잠시 보관한다.

여기서 각 프로세스 가상주소 공간의 block을 물리 메모리로 올리는데 주소를 변환하여 올리는데 이를 관리하는 하드웨어 장치가 따로 있다.

이렇게 디스크에 존재하는 프로그램은 각각의 가상 주소공간을 가지며 실제로 필요한 부분만 물리 메모리에 올라가 CPU를 할당받고, 경우에 따라 swap area에 잠시 보관되기도 한다.