본문 바로가기

운영체제

[운영체제]3. System Structure & Program Execution(2)

PC(Program Counter) -CPU에는 여러 레지스터들이 존재하는데, 그 중 PC(Program Counter)는 CPU가 다음 인스트럭션을 읽어와야 할 주소가 적혀있다.

보통 인스트럭션 하나가 4바이트를 감안했을때, PC는 한 공간에 4바이트씩 저장이 되어있고, 그 인스트럭션을 CPU가 순차적으로 읽게된다.

컴퓨터가 실행되면 cpu는 항상 pc에 따라서 다음일만 처리할 뿐이다. 위의 그림처럼  pc에 있는 내용을 1,2,3,4,5 순으로 순차적으로 처리하다가 그 중간중간에 Interrupt line에서 체크를 하게되고, 인터럽트가 들어왔다면, cpu는 하던 작업을 멈추게되고 , cpu의 제어권이 운영체제로 넘어가게 된다 (mode bit = 0)

그 후 운영체제는 왜 인터럽트가 걸렸는지 운영체제 내부에 있는 

1.커널 함수로 판단을 하게되고

2.어떤식으로 처리를 할것인가(cpu가 그 인터럽트에 대해서 어디에 있는 인스트럭션을 실행 할 것인가)  를 

운영체제 안에 있는 인터럽트 벡터에 의해서 판단을 하게 된다.

그 인터럽트 벡터에 의해서 cpu는 인터럽트 요청에 대한 해결 방향을 갖게된다.

해결 방향을 찾는 법은, 인터럽트를 처리하기 위해서 알아낸 함수를 실행한다. (이 해결함수 또한 cpu안에있고, 그것이 바로 인터럽트 처리 루틴이다.)

그래서 그 함수를 실행시키고 나서, 운영체제에서 다시 cpu점유권을 반환하게 되고, cpu는 다시 인터럽트가 일어나기 전의 실행하던 프로그램으로 돌아가서 계속적으로 사용자프로그램을 실행하게 된다.


ex) IO장치를 접근 할 수 있는것은 모드빗이 0일때(cpu를 운영체제가 점유할때만)만으로 막아놨음 ( 보안상의 이유 )

그래서, 모드빗이 1일때 사용자 프로그램을 하다가, IO요청이 들어왔으면 모드빗을 0으로 바꾸고, 운영체제한테 IO에 접근 해달라고 요청을 하는것.

이 모드빗을 0으로 바꾸기 위해서는 사용자프로그램이 시스템콜을 사용한다. (사용자 프로그램에서 바로 운영체제로 메모리 점프가 불가능하기 때문에) 의도적으로 Interrupt line을 세팅함. 

이러한 인터럽트도 전 포스팅에서 했던대로 하드웨어 인터럽트와 소프트웨어 인터럽트(Trap)으로 나뉘는데,  이 시스템 콜은 소프트웨어 인터럽트 중에 System call 에 해당한다.

메모리 영역 점프가 불가능하기 때문에 system call을통해서  cpu가 운영체제로 소유권이 넘어가게 됨.

타임쉐어링을 위해서 timer라는 하드웨어를 설정해놓고, 사용자프로그램이 cpu를 독점적으로 차지하지 못하게 해놓음, 그러므로써 os는 cpu를 여러 프로그램에 할당 가능하게 해줌.



동기식 입출력(synchronous I/O)

io장치까지 직접 가서 결과를 보고오는것..

요청이 다 끝난 다음에야 다음일을 할 수 있는것.

사용자프로그램이 io요청을 운영체제 커널한테 하게 되면 그 io장치에 맞는 디바이스 드라이버를 거치고

실제 하드웨어를 통해서 io를 읽거나 쓰는 작업을 함.

근데 이 작업은 시간이 좀 걸릴것. 시간이 흘러야지만 io가 끝난걸 도착을하고 그걸 보고서 사용자가 다음작업을 하니까.



비동기식 입출력(asynchronous I/O)

io장치까지 직접 보지 않아도 (확인하지 않아도,,)

던져 놓고 직접 보지 않아도 다음일을 할 수 있는것

사용자 프로그램이 io요청을 운영체제 커널한테 해서 실제로 io작업이 진행 되는데 그것을 기다리지않고

io요청만 해놓고 바로 cpu 제어권을 얻어서 다른 작업들을 하는것.


두 경우 모두 IO의 완료는 인터럽트를 통해서 알려주게 된다.


비동기식이 빠르다고 할 수 있겠는데, 동기식의 구현법은 2가지가 있다.


동기식 구현 1 

IO요청이 끝날때까지 cpu를 사용하지 않고 기다림 -> cpu 낭비

이런 방식으로는 매 시점에서 io가 하나만 일어나야 한다.


동기식 구현 2

IO요청을 하고, 다른 프로세스에게 cpu를 넘겨준다. 계속적으로 넘겨주게 되면, IO 여러개가 동시에 일을 할 수 있고

cpu도 낭비가 없게된다.



DMA Controller(Direct Memory Access)

만약 DMA가 없다면? 키보드 입력 -> cpu가 local buffer에 있는 내용을 메모리에 복사, 복사, 인터럽트, 복사, 인터럽트, 복사 하면 엄청난 오버헤드가 뒤따름

그래서 DMA Controller라는것을 중간에 설치해놓음.

DMA controller는 local buffer에 데이터가 어느정도 쌓인 후 메모리 영역에서 그 내용을 복사하고, 그 내용이 끝났다고 CPU한테 한번만 인터럽트를 걸어줌.

메모리에는 하나의cpu만 접근 할 수 있기때문에 cpu와 DMA가 동시에 같은 메모리 영역을 접근 할 경우 memory controller에 의해서 막아주게 된다.


IO를 할 수 있는 2가지 방법

첫번째는 메모리만 접근하는 인스트럭션과 io장치를 접근하는 인스트럭션이 따로 있음

두번째는 io장치에도 메모리주소를 할당해줘서 메모리에 접근하는 인스트럭션을 통해   io 하는법도 잇음 -> Memory Mapped I/O






컴퓨터 저장장치의 계층구조 ↑


최상위에는 사실 CPU가 있고 위로갈수록 휘발성, 단위 공간당 가격비쌈, 속도빠름


Primay 영역

CPU에서 직접 접근 할 수 있는 저장장치

CPU가 직접 접근을 하려면 바이트 단위로 접근 가능한 매체여야 한다.

Main Memory(DRAM)는 바이트 단위로 주소를 갖기 때문에 CPU에서 직접 접근이 가능하다.

CPU는 빠르게는 1클락당 인스트럭션 하나를 처리하나, 메인메모리(DRAM)은 하나 처리할때 10 ~ 100클락이 걸림

그 속도 차이를 완충하기 위해서 중간에 Cache Memory라는 장치를 두는것.

캐시메모리는 메인메모리보다 용량이 작아서 모든걸 담지 못하는데, 

당장 필요한것만 Secondary에서 Primary로 올려서 사용하게 된다. 그것을 Caching이라고 칭함.

일단 한번 Caching을 한 뒤 빠른 매체로 정보를 올려서 읽고 바로바로 접근 할 수 있도록 함, 올린 내용을 어떻게 내보낼 것인가? (용량문제로) - 캐싱과 관련된 중요한 이슈이다.


Secondary 영역

CPU에서 직접 접근 할 수 없는 저장장치

하드디스크는 Sector단위여서 CPU에서 직접 접근 불가



프로그램은 보통 실행파일 형태로 파일시스템(하드디스크)에 저장되어 있다.

그런 실행 파일을 실행시켜서 메모리로 올라가서 프로세스가 되는 것인데, 물리적인 메모리 (Phsical Memory)에 메모리가 바로 올라가지 않고, 중간에 가상메모리 (Virtual Memory)라는 단계를 거치게 된다.

Virtual Memory라는 adress space이 형성되고 0번지 부터 시작되는 그 프로그램만의 독자적인 공간이 생성된다.

가령 예를들어 파일시스템에서 실행파일 A를 실행하게 되면, A프로세스가 실행되고, adress space가 0번지부터인 Virtual memory가 생성됨

이런 주소공간은 [stack, data, code] 영역으로 나뉘게 된다.


code 영역: cpu에서 실행 할 기계어 코드를 갖고 있음 

data 영역 : 전역, 지역 변수등 데이터를 저장

stack 영역 : 코드가 함수 구조로 이루어져 있기 때문에 함수를 호출,리턴할때 데이터 쌓았다가 꺼내가는 용도로 사용


이러한 모든 프로그램이 독자적인 주소공간을 갖고있는 것인데, 이것을 Physical Memory 영역에 올려놓고 실행을 시키는 것이다.

모든 virtual memory가 올라가게되면 메모리 낭비가 발생하므로, 당장 필요한 내용만 (프로세스 A의 함수를 실행하면 그 부분만) 올려놓다가 사용이 끝나면 Physical memory 부분에서 퇴출시킴.

퇴출을 그냥 시키는 것이 아닌, Swap area라고 하는 디스크에다 내려놓게 된다. 

Virtual Memory는 실제 저장공간이 아니고, 각각 쪼개져서 실행이 필요한 부분만 물리메모리와 swap area부분에 나눠져있다.


File system과 Swap area 두 하드디스크는 다른 용도이다. File System은 비휘발성, Swap area는 컴퓨터가 꺼지면 지워지는 휘발성영역

Virtual memory주소번지와 physical memory에 실제로 들어가는 주소번지는 다르다. 이것을 어떤 영역의 주소인지 논리적인 주소를 물리적인 주소로 변환해 주어야 하는것이 필요하다.


운영체제 커널또한 이런 virtual memory로 구성이 되는데 

이런식으로 되어있다.

데이터 영역은 운영체제가 사용하는 여러 자료구조 등 정의

각 실행되는 프로세스를 관리하기 위한 공간이 필요한데, 그것들을 PCB 라고 부름 (Process Control Block)

프로그램이 실행되면, 그 프로그램을 관리하기 위한 자료구조가 운영체제 커널에 하나씩 만들어짐, 그것이 PCB이다.

운영체제도 함수구조여서 함수 호출, 리턴시 stack 영역을 사용


일반적으로 사용자 프로그램도 모두 함수구조이다 virtual memory 영역에 code 부분에 사용자 정의 함수와, 라이브러리 함수가 저장되어있다.

반면에 커널함수는 그곳에 저장되어 있지 않고, 운영체제 안에서만 정의되어 있어서 호출만 가능하다. 사용할때는 커널 영역으로 넘어가서 사용해줘야함.

그래서 아까전에 설명한 사용자 프로그램을 사용중에 커널함수를 호출할때 점프가 불가능하고, 인터럽트 라인을 세팅해서 제어권을 운영체제로 넘긴다음에, 커널함수를 실행 할 수 있다.    


A주소공간을 사용하다가, 시스템콜, 커널로 넘어감, 다시 A주소공간, 시스템콜 , , 

A주소공간의 코드 실행, 커널 함수 실행, A코드 실행, 커널 실행..............후 종료 ..

프로그램 실행 과정이다.


'운영체제' 카테고리의 다른 글

[운영체제]5. Process(2)  (1) 2018.01.11
[운영체제]4. Process(1)  (3) 2018.01.09
[운영체제]2. System Structure & Program Execution  (3) 2017.12.27

Today :
Yesterday :
Total :