본문 바로가기
🚗 Major Study (Bachelor)/🟧 Operating System

[OS / 운영체제] System View, Interrupt, Intel Processor Event-Vector Table, HardWare Process, Modern Computer System (cont'd)

by H_uuuk 2022. 3. 3.
728x90

 

Kernel은 운영체제 중 항상 메모리에 올라가 있는 운영체제의 핵심 부분으로써 Hardware와 응용 프로그램 사이에서 Interface를 제공하는 역할을 한다. 하지만 커널은 항상 컴퓨터 자원들을 보고 있기 때문에 User와 상호작용을 하지 않는다. 따라서 사용자와 직접적인 상호작용을 위해 프로그램을 제공한다.   

 

 

Component of Computer System

 

Hardware가 바닥에 존재한다. 그 위에 운영체제가 돌아간다. OS는 하드웨어를 독점적, 직접적으로 다룰 수 있는 소프트웨어이다. 하드웨어를 건드릴때 항상 OS를 통해서 접근하게 된다. 특권 계층이 존재한다. 그 위에서 도는 프로그램은 응용프로그램,  어플리케이션 프로그램이라고 부른다. 시스템 프로그램, 그냥 응용프로그램으로 나뉜다. 시스템 프로그램은 응용프로그램에서 제공해주는 것을 의미한다. 컴파일러가 그 예이고, 이것을 통해서 개발을 할 수 있고, 시스템을 도와주는 프로그램인데 일반적으로 시스템 프로그램이라고 말한다. application에 속한다고 말할 수 있다. 어떤 테스크를 수행할 때 도와주는 것을 어플리케이션 프로그램에 속한다. 사용자 User는 어플리케이션을 통해서 사용을 한다. 사람일수도 있고 기계일 수도 있다. 

 

 

What Operating System do

환경을 제공해준다. 이 관점은 운영체제를 기준으로 봤을 때 위에서 아래를 내려다보았을 떄를 기준으로 한다. 밑에서 보게 되면 하드웨어 입장에서 운영체제는 하드웨어의 관리자가 된다. 하드웨어를 직접 건드릴수있는 것은 운영체제가 유일하다. 모든 하드웨어를 관리해주는 관리자 역할이다.

 

 

User view

PC 환경에서 GUI 같은 체제가 중요하고, Performance도 중요하다. 이런 것들이 개인용 컴퓨터에서 중요하다. 모바일 기기에서는 터치 스크린, 음성 인식, 그리고 베터리 수명도 중요하다. 불필요하게 메모리 접근을 하게되면 베터리를 많이 사용하게 된다. 계산을 하더라도 베터리를 적게 사용하는 것이 중요하다. Multi user system에서 여러개의 컴퓨팅을 하게 되는데 Resource Utilization이 중요하다. 컴퓨터 resource를 교대로 사용해야 하는데 이 것을 효율적으로 사용할 수 있어야 한다. 스케줄링이 필요한데 이것이 잘못되면 resource가 남아돌게 된다. 그런일이 없도록 최대한 시스템을 효율적으로 만들어주는 것이 중요하다. Network-based, Embedd 등도 존재한다

 

 

System View

OS가 하는 일. 하나는 Resource allocater의 역할. 예를 들어 파일에 접근하는 것을 생각해보자. 열고 쓰고 저장한다. fopen을 할때 디스크의 일부 특정 영역이 파일인데 오픈하고 닫기 전까지 나 혼자 쓰겟다고 요청을 하는 것이다. os가 보기에 문제가 없으면 writing할 수 있는 권한을 독점적으로 주는 것이다. 독점적이지 않다다면 다른 사람이 이것을 열어서 사용할 수 있기 때문이다. OS의 종류에 따라 독점적 권한이 다르다. Reading 만을 공유하는 경우 동시에 읽을 수 있기 때문에 기능이 다르다. 프린터를 사용하는 경우 다른 사람이 그 문서를 편집하는 경우 섞이게 되므로 동시에 사용하는 것을 허용하면 안돼므로 독점적 권한을 부여한다. 다른 예로 malloc이 있다. 동적 메모리 블록이란.. 메모리 공간은 하드웨어 리소스인데 남들하고 같이 사용하는 resource이다. 정상적으로 실해하기 위해서 메모리를 사용하고 있는 도중에는 남들이 접근할 수 없도록 해야한다. 일반화하면 resource allocation이 된다. 메모리, 파일 오픈, 파일 저장, IO 기기들이 그 예가 된다. 

 두 번째의 관점. 여러개의 프로그램이 돌기 때문에 생기는 문제. 예) 포인터를 잘못썼다는 얘기는 주소값을 잘못 썻다는 신호이다. 접근을 할때 정상적인 주소를 가지고 접근을 하는데 다른 곳을 포인터할 때 엉뚱한 곳을 가리키게 되는 버그가 존재한다. OS 입장에서 할당되지 않은 영역에 접근을 하려고 하는 구나라고 인식하고 프로그램이 terminate되도록 한다. 그것이 os의 역할이다. 리소스는 공용의 것이기 때문에 컨트롤을 해주는 것이다. 

 

 

Computer System Operation

Booting을 할때 무슨일이 일어나는가. 메인보드에는 작은 프로그램이 들어가있다. 컴퓨터를 시작하면 무조건 그 프로그램이 실행되게 되어있다. 그 프로그램은 두가지의 일을 한다. 그 시스템을 Bootstrap loader라고 한다. Bios 라고도 부른다 . 그 기능을 알아보자 . 하나는 현재 시스템, 하드웨어를 체크한다. 키보드의 유무 등을 체크하고 초기화를 한다. 초기화에는 cpu의 래지스터 설정 이런것들이 있다. 두 번째는 OS를 load 한다. OS를 어떻게 찾아서 부팅을 시키는 가?  Bootstrap loader는 어떤 OS인지 신경도 안쓴다. 브트스트랩의 0번 블록을 올려서 실행을 시킨다. 누군가가 0번 블록에 그 OS를 올려놓는 것이다. 로드될 때 부팅이 이루어진다. 데이터 구조를 초기화하거나 필요한 프로세스를 런칭하는 일을 한다.

예) 운영체제에 동시에 수십개의 프로그램이 돌아가기 위해서 정보가 저장되는 공간이 있어야 한다. 그런 linked list 형태의 구조가 초기화가 되면 Booting이 끝난다. OS는 Booting이 되면 아무것도 이제 하지 않는다. 요청을 그저 기다리고 있는다. 다음 요청을 그저 기다릴 뿐이다.

예) 프로그램을 실행할때 아이콘을 더블 클릭을 하는 명령이 간다. 마우스 클릭으로 신호(Interrupt)를 발생시킨다. 그 신호가 OS에 전달이 되면 그 신호를 받아서 처리를 한다. OS는 그 마우스르 움직여주고 더블클릭할 때 event가 발생을 하고 (Event는 추상적인 말이고 Interrupt는 구체적인 디테일에 대응한다) 그 좌표를 보고 아이콘에 해당하는 소프트웨어를 실행한다. 그 과정이 이벤트를 처리해주는 요청을 수행하는 과정이다. 더블클릭 == 약속, 그리고 요청을 기다린다. Interrupt driven program이라고 오늘날 불리고 있다.

 

 

Modern Computer System

컴퓨터 시스템 중앙에 CPU가 존재하지 않는다. Bus, 데이터가 전송되는 Common Bus가 존재한다. Bus는 여러 개의 장치들을 연결하고 있는 공용 버스이다. 왜 공용인가? CPU에서 Disk 로 갈때, 다양한 경우에 sharing할 때 사용하는 공용 버스라고 부른다. 여러 장치를 매달아 놓으면 연결이 간단해지고 확장성이 좋아질 수 밖에 없다. 중요한 성질이 존재한다. Bus라는 데이터 Path는 굉장히 크고 빠르다.

 

 장치가 어떻게 붙는가?? disk는 bus에 비해 엄청나게 느리다. 무엇인가 문제가 발생할 것이다. 그래서 그 중간에 controller라는 것이 존재한다. controller를 기준으로 아래에 위치한 것이 내부가 되고 위의 것이 외부가 된다. bus와 직접적으로 device가 연결할 수 없으므로 controller가 있는데 그 안에 buffer가 존재한다. 속도가 맞지 않으므로 buffer에다가 정보를 집어넣게 된다. IO에서 읽고 쓸때는 일단 buffer에 집어넣고 Bus가 가져온다는 것이다. 드라이버와 controller가 어떻게 다른가..?! controller는 하드웨어이다. 드라이버는 소프트웨어이다. 

 

Modern Computer System (cont'd)

 구조의 중요성이 존재한다. 각 Device가 동시에 도달할 수 있다는 것이다. Disk가 읽거나 쓰는 동안에 cpu가 다른 일을 수행할 수 있다는 점이다. 동시적으로 사용이 가능하다는 점!! 다음은 메모리의 특징이 있다. Bus 중심의 구조에서 메모리가 그 데이터를 움직이는데 허브의 역할을 하는 경우가 많다. disk에서 cpu를 직접 읽어올 수 없는 경우가 존재한다. 키보드 타입의 경우 controller에서 cpu로 바로 가는 것이 아니라 메모리가 관여한다. Graphic adapter에서 cpu와 정보를 주고 받을 때 메모리가 매개체가 되는 경우가 존재한다.

 Interrupt에 대한 설명. CPU가 돌다가 disk controller가 disk한테 데이터를 가져오는 동안 cpu는 다른 작업을 진행할 수 있다. Disk에 있는 내용을 다 읽어왔을 때, CPU에게 완료 신호를 보내게 된다. 그 Event를 발생시키게 된다. Interrupt를 handling 해야한다. 내가 뭔가를 하고 있는데 어떤 신호가 갑자기 탁 하고 알림이 오는 것을 의미한다. 

 

 

Interrupt

Asynchronous signal, 무슨 뜻인가? 예측할 수 없는 신호라는 것이다. 마우스를 생각해보면 내가 하고 싶을 때 클릭을 하고 움직인다는 것을 보면 이해할 수 있다. 특히 하드웨어에서 나오는 Interrupt가 asynchronous하다. CPU가 disk accessc를 하기 위해서 내 어플리케이션이 disk controller에게 직접 요청을 할 수 없다. 그래서 Interrupt를 통해서 요청을 하게 된다. HW interrupt, 마우스 클릭, 키보드의 입력이 그 예이다. Asynchronous 하다.

 SW Interrupt 는 시스템 콜이라는 것이 있다. OS에 요청하기 위해서 Interrupt 를 발생시키게 되는데 예외가 있다. 0으로 나누게 되는 수식을 진행한 경우, 프로그램이 죽게 된다. 0으로 나누는 순간에 Interrupt가 나오게 되고 OS가 프로그램을 죽여버리게 되는 것이다.. Invalid memory access, 포인터의 경우 이상한 메모리에 접근하는 경우 Interrupt를 발생시키고 프로그램을 종료시킨다. 이런 오류들은 의도적으로 발생시킨 것이 아니다. 이런 것들을 Exception이라고 본다.

 

 

Intel Processor Event-Vector Table

Interrupt에는 종류가 다르고 고유한 번호가 매겨져 있고 IRQ 번호라고 부른다. Interrupt Request 번호라고 부른다. Interrupt Handler는 여러 개가 존재한다. 5번 Interrupt가 발생했을 때는 5번 Handler가 작동해야 한다. 표를 하나 만들고 Interrupt handler의 시작 주소를 만들면 된다. 그 표를 Interrupt vector라고 부른다. 

 

 

HardWare Process

실행하게 되면 프로그램은 Intruction들에 의해서 구성이 된다. Jump는 어떻게 처리를 하는가. PC program counter가 존재하고, 일종의 포인터 변수이고 현재 실행해야하는 Instruction의 주소를 가지고 있다. jump할 곳의 주소를 PC에 집어넣게 된다. 일반적인 상황에서 Interrupt_Request는 false이지만 예를 들어 완료되었다는 Interrupt가 발생하면 True가 된다. 메모리 상의 PC 번째의 Instruction을 래지스터로 가져오고 PC를 증가시킨다. 그리고 실행하고 다음 PC를 실행하기 전에 Interrupt가 발생했는지 유무를 확인한다. 발생했다면 Interrupt Handler로 가야하는데 그 전에 현재 위치를 저장해야 한다. 현재 있는 PC의 값을 저장하게 된다. 그리고 IRQ에 해당하는 곳으로 이동하게 된다.