cs 공부를 어떻게 시작할까 하다가 이화여대 반효경 교수님의 운영체제 강의로 cs준비를 했다는 글을 보고 수강하게 되었다.
이화여대 반효경교수님 운영체제 해당 강좌를 여름부터 듣긴 했는데, 강의 3개를 못벗어난다. 강의 자료가 없다는 점이 정리하기가 불편했다. 거기다 강의 너무 졸려서 완강을 못한다...
그렇지만 다시 들어야지... 책 혼자 보는 것보단 강의 보는 게 나을 것 같고, 강의 자료 없는건 그냥 내용 다 필기해서 정리하려고 한다.
첫 강의만 3번은 들었는데, 다시 또 들었고, 오늘부터 운영체제 정리 간다~!
운영체제를 설명하기에 앞서서 컴퓨터 하드웨어 적인 것을 설명하는 챕터이다. 본격적인 강의에 들어가기 전에 전체 흐름을 짚고 간다.
컴퓨터 시스템은 크게 cpu와 메모리 I/O device로 구성되어 있다.
cpu와 I/O device 의 처리하는 속도 차이가 많이 난다. disk만 해도 cpu에 비해 백만배 정도 느리다.
cpu는 매 쿨럭마다 메모리에서 인스트럭션을 하나씩 읽어서 처리하는 작업을 반복한다.
Register : cpu안에 있고, 메모리보다 더 빠르면서 정보를 저장할 수 있다.
Mode bit : 현재 cpu에서 실행되는 것이 운영체제인지 사용자 프로그램인지 구분해준다.
Interrupt Line : cpu는 항상 메모리에 있는 인스트럭션만 실행한다. 키보드 입력, 화면 출력, 디스크 입출력.
cpu는 I/O device에 직접 접근하지 않고, 게속 메모리에 접근해서 메모리에 있는 인스트럭션만 실행한다.
Timer : 특정 프로그램이 cpu를 독점하는 것을 막기 위한 것
cpu의 작업 공간
특정 프로그램이 cpu를 독점하는 것을 막기 위해서 운영체제가 사용자 프로그램한테 cpu를 넘겨줄 때는 타이머에다가 정해진 시간을 할당한 뒤에 넘겨준다.
타이머의 세팅된 시간이 쭉 지나서 0이 되면 인터럽트를 걸어서 프로그램으로 부터 cpu를 뺏을 수 있게 구현한 것이다.
device driver (장치 구동기) :
OS 코드 중 각 장치별 처리루틴 -> software
device controller (장치 제어기) :
각 장치를 통제하는 일종의 작은 CPU -> hardware
I/O device Controller는 I/O 장치를 전담하는 일종의 작은 CPU이다.
입출력 장치들의 I/O 연산은 입출력 컨트롤러가 담당하고, 컴퓨터 내에서 수행되는 연산은 메인 CPU가 담당한다.
인터럽트는 키보드 입력 혹은 요청된 디스크 입출력 작업의 완료 등 CPU에 알려줄 필요가 있는 이벤트가 일어난 경우 컨트롤러가 발생시키는 것이다.
CPU는 매 시점(쿨럭)마다 메모리에서 명령(instruction)을 하나씩 읽어와서 수행한다. 이때 CPU 옆에는 인터럽트 라인 이 있어서, CPU가 자신의 작업을 하던 중간에 인터럽트 라인에 신호가 들어오면 하던 일을 멈추고, 인터럽트와 관련된 일을 먼저 처리한다.
인터럽트 처리루틴
또는 인터럽트 핸들러
라고 불리는 다른 곳에 정의된다.인터럽트라고 하면 통상적으로 하드웨어 인터럽트를 의미하고, 소프트웨어 인터럽트는 트랩(trap)이라는 용어로 주로 불린다.
소프트웨어 인터럽트 = 트랩(trap)
ex) 예외상황(exception), 시스템 콜(system call)
시스템 콜 : 사용자 프로그램이 운영체제 내부에 정의된 코드를 실행하고 싶을 때 운영체제에 서비스를 요청하는 방법
사용자 프로그램에 정의되지 않고 운영체제 커널에 있는 코드를 사용자 프로그램이 실행하고자 할 때에는 인터럽트 라인 세팅을 통해 CPU 제어권을 운영체제로 넘겨 실행하게 되는 것이다.
시스템콜 이나 예외상황 은 모두 사용자 프로세스로부터 CPU의 제어권이 운영체제에 이양되어 처리되는데, 이 과정에서 프로그램 코드가 직접 인터럽트 라인을 세팅하는 명령을 실행하여 인터럽트를 발생시킨 후에 제어권이 넘어가게 되므로 이들도 넓은 의미에서는 인터럽트의 범주에 포함시킨다.
예를 들어, 프로그램이 실행되던 중에 인터럽트가 발생하면 그 프로그램의 실행 상태를 PCB에 저장한 후 CPU의 제어권이 인터럽트 처리루틴으로 넘어가게 되며, 인터럽트 처리가 끝나면 저장된 상태를 PCB로부터 CPU상에 복원해 인터럽트 당하기 직전의 위치부터 실행이 이어지게 되는 것이다.
모든 입출력 명령은 *특권 명령으로 규정해서 사용자 프로그램이 직접 입출력을 하는 것을 차단한다.
*특권명령 : 시스템의 보안과 관련된 명령
사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치
Mode bit을 통해 하드웨어적으로 두 가지 모드의 operation 지원
1 사용자 모드 : 사용자 프로그램 수행, 제한적인 명령만 수행할 수 있다.
0 모니터 모드(커널 모드) : 운영체제가 CPU 제어권을 갖고 운영체제 코드를 실행하는 모드
CPU가 보안과 관련된 명령을 수행하기 위해서는 항상 Mode bit이 0인 경우에만 수행한다.
그리고 운영체제가 CPU를 점유해 자신의 코드를 수행하다가 사용자 프로그램에게 CPU의 제어권을 넘길 때 Mode bit을 1로 세팅한다.
보안을 해칠 수 있는 중요한 명령어는 커널 모드에서만 수행 가능한 '특권 명령'으로 규정. 특권 명령은 Mode bit이 0일 때만 수행 가능
Interrupt나 Exception 발생시 하드웨어가 mode bit을 0으로 바꿈
사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 셋팅
사용자 프로그램은 수행되다가 하드웨어 접근 등 보안이 필요한 중요한 명령을 수행해야할 경우에는 시스템 콜을 통해 운영체제가 대신해줄 것을 요청한다.
인터럽트가 발생할 때 Mode bit은 자동으로 0이 세팅되므로 운영체제는 서비스에 필요한 모든 종류의 명령을 다 수행할 수 있다.
요청된 작업이 모두 끝난 후에는 Mode bit을 1로 만들어 사용자 프로그램에게 CPU를 넘겨준다.
★사용자 프로그램은 보안과 관련된 중요한 명령의 수행에 제약을 받게 되기 때문에 하드웨어를 보호할 수 있다.
하드웨어 일꾼들이 cpu한테 정보 교신을 하기 위해서 걸어줄 수 있고, 사용자 프로그램이 실행되다가 운영체제한테 처리 요청을 해야되는 상황에서도 인터럽트 라인을 세팅해서 os가 cpu한테 넘어갈 수 있다.
현대의 운영체제는 인터럽트에 의해 구동된다.
즉, 운영체제는 cpu를 사용할 일이 거의 없고, 인터럽트가 들어올 때만 cpu가 운영체제한테 넘어간다. 그렇지 않으면 CPU는 항상 사용자 프로그램이 쓰고 있다.
본 포스팅은 이화여대 반효경교수님 운영체제 강의를 바탕으로 작성하였습니다.