엘리스 CS 지식 공유 스터디 2회차
주제 : 커널의 개념과 커널이 프로세스를 관리하는 방식
목차
1. 운영체제란?
2. 하드웨어 장치들 간 동작 원리
3. 프로그램의 실행을 위한 주소 공간
1. 운영체제란?
운영체제의 개념
의미
- 운영체제(Operating System, 이하 OS)란 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로, 사용자 및 다른 모든 소프트웨어와 하드웨어를 연결한다.
- 좁은 의미의 OS → 커널 : 운영체제의 핵심으로, 컴퓨터가 켜진 후 항상 메모리에 상주하는 부분
- 넓은 의미의 OS → 커널을 포함해서 주변의 시스템 유틸리티(메모리에 상주하지 않는 별도의 독립적인 프로그램들)를 모두 포괄하는 개념
→ (전공자 입장에서의) OS는 보통 커널만을 의미함
역할
-
OS의 중간적 위치에 따른 두 가지 역할
- 하드웨어 윗부분 계층 → 하드웨어(자원)의 효율적 관리
- 사용자 및 소프트웨어 아랫부분 계층 → 사용자가 컴퓨터를 편리하게 사용할 수 있는 환경(인터페이스) 제공
이미지 출처
-
자원을 효율적으로 관리 → 자원 관리자
c.f
자원(Resource) : CPU, 메모리, I/O 장치 등의 하드웨어 자원 + 프로세스, 파일, 메세지 등의 소프트웨어 자원을 의미 → OS는 두 종류의 자원을 모두 관리
운영체제의 분류
- 동시 작업 가능 여부에 따라
- 단일 작업만 지원 : 한 번에 하나의 작업만 처리 ex) MS-DOS
- 다중 작업을 지원 (현대의 운영체제) : 여러 프로그램이 동시에 실행되는 것을 지원해서 하나의 명령의 수행이 끝나기 전에 다른 명령이나 프로그램을 수행 가능 ex) 유닉스, 윈도우 등
- 지원하는 사용자의 수에 따라
- 단일 사용자만 지원 ex) MS-DOS, 윈도우
- 다중 사용자를 지원 : 여러 사용자가 컴퓨터 한 대에 동시에 접속해서 사용 가능 → 하나의 서버에 여러 개의 계정을 만들고 여러 사람들이 동시에 접속해서 서버를 사용 ex) 유닉스
- 처리 방식에 따라
- 시분할 방식(time sharing)
- 현대 운영체제의 방식
- 여러 작업을 일정한 시간 단위로 나누어서 CPU를 번갈아 할당
- 각각의 사용자 입장에서는 인터랙티브한 결과를 받아볼 수 있음 (응답 시간이 짧다는 의미)
- But 사용자가 많아지면 느려질 수 있음
- 실시간 처리방식(realtime OS)
- 데드라인이 있어서 정해진 시간 안에 반드시 결과가 나오는 것을 보장해주는 방식
- vs 시분할 방식은 데드라인이 없음
- Special Purpose System : 특수한 목적성을 가진 방식이기 때문에 엄격한 기준에 의해 관리되어야 하는 분야에 사용됨 ex) 원자로 제어, 미사일 제어, 반도체 장비 제어 등
- 일괄처리 방식(batch processing)
- 작업을 일정량 모아서 한꺼번에 처리
- 인터랙티브하지 않음 → 역사 속의 시스템
- 작업 카드에 마킹(구멍을 뚫는 다든지)을 해서 전산소에 제출하면 컴퓨터가 컴파일해서 하루 뒤에 결과를 알려줌 (오류나면...ㅎ)
c.f
용어정리
- 멀티 태스킹(multi tasking) : 컴퓨터가 여러 작업을 동시에 수행하는 행위 전반을 의미
- 멀티 프로그래밍(multi programming) : 메모리에 여러 프로세스가 동시에 올라가 있는 것
- 시분할(time sharing) : CPU의 시간을 분할해서 쓰는 것을 강조한 용어
- 멀티 프로세서 (multi processor) : 하나의 컴퓨터에 여러 개의 CPU(프로세서)가 붙어있는 것 → 멀티 코어(multi core)와는 다른 개념
운영체제가 하는 일
-
하드웨어 관리
-
CPU : 어떤 프로세스에게 CPU를 줄지 결정 → CPU 스케쥴링
-
메모리 : 한정된 메모리를 어떻게 쪼개서 쓸지 결정 → 메모리 관리
- 어떤 프로세스를 메모리에 올려놓고 어떤 프로세스를 메모리에서 쫓아내야 할지 결정 → 미래를 예측하는 것이기 때문에 판단 근거가 필요 : 메모리의 지역성
-
디스크 : 디스크의 파일 관리 → 디스크 스케쥴링
-
디스크는 헤드가 움직이면서 파일을 읽어내기 때문에 헤드와 가까이 있는 파일을 먼저 읽어내는 방식이 더 효율적임 like 엘리베이터
c.f
CPU 스케쥴링 vs 디스크 스케쥴링
-
CPU 스케쥴링 : CPU가 너무 빠르기 때문에 어떤 것부터 처리할 것인지 결정하는 것
-
디스크 스케쥴링 : 디스크의 헤드가 물리적으로 움직이기 때문에 최대한 움직임을 줄이는 방식을 고려해서 어떤 파일부터 읽어올 것인지 결정하는 것
-
I/O 장치 : CPU나 메모리같은 컴퓨터 디바이스보다 훨씬 느리기 때문에 I/O 장치와 컴퓨터 간에 어떻게 정보를 주고 받게 할지를 관리 → 입출력 관리
- 인터럽트(interrupt)를 통해 CPU에게 요청
-
소프트웨어 관리 : 프로세스 관리 → 프로세스의 생성과 삭제, 자원 할당 및 반환, 프로세스 간 협력 등
-
그 외 : 보호 시스템, 네트워킹, 명령어 해석기(CLI, Command Line Interpreter)를 다룸
2. 하드웨어 장치들 간 동작 원리
이미지 출처
컴퓨터 시스템 구조
-
컴퓨터 (호스트)
- CPU : 매 클럭마다 메모리에서 기계어로 된 명령(instruction)을 읽어서 실행
- 메모리 : CPU의 작업 공간
- 인터럽트 라인(Interrupt Line) : I/O 요청이 들어왔을 때를 알아차리기 위한 장치
- 인터럽트(Interrupt) : CPU가 실행하던 일을 멈추고 인터럽트를 통해 들어온 요청을 먼저 처리할 수 있도록 말그대로 CPU에 끼어드는 것
- I/O 요청 → 시간이 오래 걸리기 때문에 요청을 보내놓고 CPU는 그 시간에 다른 일을 하고 있다가 interrupt가 들어오면 요청 결과를 확인하게 됨
- interrupt는 interrupt line에 쌓이게 됨
- CPU는 프로그램의 실행 명령 하나가 끝나면 인터럽트 라인을 체크함
- interrupt가 들어오면 사용자 프로그램에게 있던 CPU의 제어권이 OS로 넘어가게 됨
- 타이머 : 특정 프로세스가 CPU를 독점하는 것을 방지하기 위한 하드웨어 장치 (형평성 목적)
- 프로세스 당 일정한 시간을 세팅해놓고, 세팅된 시간이 지나면 CPU에게 interrupt를 걸어서 알려줌
- 하나의 프로세스가 일단 CPU를 차지하면 그게 끝날 때까지 OS는 CPU를 되찾아올 방법이 없다. 그래서 타이머의 interrupt를 통해 CPU 제어권이 사용자 프로그램으로부터 OS로 넘어가게 된다.
- 모드 비트(Mode Bit) : CPU의 제어권을 누가 가지고 있는지를 체크하는 장치
- CPU를 OS가 가지고 있는지 혹은 사용자 프로그램이 가지고 있는지에 따라 mode bit이 0이 되었다가 1이 되었다가 함
-
I/O 장치 : 키보드, 마우스, 프린터, 화면, 하드디스크 등
c.f
하드디스크가 왜 I/O장치일까? 데이터를 읽어오는 input device 역할 및 파일을 저장하는 output device 역할을 수행하기 때문
- 각각의 I/O device에는 내부를 통제하는 컨트롤러와 작업 공간인 Local Buffer가 존재
모드 비트(Mode Bit )
- 0 : CPU가 OS의 코드를 실행하고 있음 → 커널 모드 / 모니터 모드 / 시스템 모드
- 모든 장치에 대한 CPU 접근 허용 → 일반 명령 실행
- 1 : CPU가 사용자 프로그램을 실행하고 있음 → 사용자 모드
- 제한된 명령만 CPU에서 실행 가능 (보안 상의 목적) → 특권 명령 실행
- OS가 사용자 프로그램에 CPU를 넘겨줄 때 mode bit을 1로 바꿔서 넘겨줌
- interrupt가 발생하면 하드웨어가 mode bit을 0으로 변경
DMA 컨트롤러 (Direct Memory Access Controller)
- 메모리에 직접 접근할 수 있는 장치
- 원래 메모리에 접근할 수 있는 장치는 CPU뿐인데, interrupt가 너무 자주 들어오면 CPU는 자꾸 실행을 멈췄다가 다시 실행해야 해서 CPU의 효율성이 떨어지게 됨
- 그래서 CPU의 일을 덜어줄 수 있도록 DMA 컨트롤러가 여러 interrupt를 한꺼번에 처리한 다음 CPU에게는 한 번의 interrupt만을 걸게 됨
- DMA 컨트롤러는 buffer에 어느 정도의 데이터가 쌓이면 CPU에 알리고(=interrupt를 걸고) 메모리에 이 데이터를 직접 전송함
- 바이트 단위가 아니라 블럭 단위로 interrupt를 발생시킴
- 메모리 컨트롤러 : CPU와 DMA 컨트롤러가 동시에 메모리의 같은 공간에 접근하는 것을 막아주는 역할
컴퓨터 시스템 간 동작 원리
개괄적인 동작 과정
- CPU에서 실행 중인 프로그램 A가 디스크(또는 다른 I/O 장치)에 입력 요청을 보내야 할 일이 생긴다.
- CPU가 디스크에서 데이터를 읽어올 때, CPU는 직접 디스크에 접근하지 않고 디스크 컨트롤러에 명령을 해 놓는다.
- CPU는 명령을 던져놓고 자기는 다른 작업(다른 프로세스 B의 실행)을 계속 한다. (CPU는 매우 빠른 속도로 일하기 때문에 쉴 틈이 없다)
- 디스크가 요청이 들어온 데이터를 찾으면 local buffer에 넣어 놓는다.
- 디스크 컨트롤러는 buffer에 데이터가 들어오면 CPU에 interrupt를 건다.
- CPU가 interrupt line을 확인하고 interrupt가 들어온 게 있음을 확인한다.
- CPU의 제어권이 OS한테 넘어간다.
- OS는 왜 interrupt가 들어왔는지 살펴보고 요청을 보냈던 데이터가 들어왔음을 확인한다.
- OS는 입력된 값을 요청을 보냈던 프로그램 A의 메모리 공간에 카피를 해준 다음, 이미 실행되고 있었던 프로세스 B에 할당된 시간이 끝나기를 기다렸다가 끝나면 프로그램 A한테 CPU를 넘겨 준다.
시스템 콜을 통한 I/O의 수행
-
사용자 프로그램은 OS를 통해서만 I/O 장치에 접근 할 수 있음 (직접 접근은 불가능)
-
시스템 콜 : 사용자 프로그램이 커널 함수를 호출해서 I/O 장치에 대한 접근을 요청하는 것
→ interrupt의 일종
-
동작 과정
- 사용자 프로그램은 직접 OS의 함수를 호출하지는 못한다. mode bit이 1일 때는 사용자 프로그램의 특권명령만 수행할 수 있기 때문이다.
- 그래서 사용자 프로그램은 CPU의 interrupt line에 interrupt를 걸어 놓는다.
- CPU가 interrupt line을 확인하면 mode bit이 0으로 바뀌고 CPU가 OS에 넘어가게 된다.
- OS가 CPU를 통해 I/O 요청을 보낸다.
-
시스템 콜 = 소프트웨어 interrupt (trap)
-
현대의 운영체제는 interrupt에 의해 구동된다.
인터럽트
3. 프로그램의 실행을 위한 주소 공간
프로그램의 주소 공간
가상메모리(virtual memory)
- 프로그램은 실행 파일의 형태로 디스크에 저장되어 있다가 실행될 때 메모리로 올라가서 프로세스가 되어 실행되는데, 물리적인 메모리에 올라가기 전에 한 단계를 더 거친다. 바로 가상 메모리 단계이다.
- 가상 메모리 단계에서 프로그램은 독자적인 메모리 주소 공간이 생기게 된다.
- 코드 영역 : 코드가 담기는 부분
- 데이터 영역 : 전역변수, 자료구조 등이 담기는 부분
- 스택 영역 : 함수를 호출할 때 생기는 데이터(지역변수 등)가 쌓이는 부분
- 이 중 당장 필요한 부분만 물리적인 메모리에 올렸다가 필요하지 않으면 디스크의 Swap Area에 내려놓는다.
- 디스크의 swap area는 메모리의 용량에 한계가 있기 때문에 메모리 연장의 목적으로 사용되는 공간으로, 의미 없는 정보(휘발성을 띠는 데이터)를 담고 있다. (이곳의 데이터는 전원이 나가면 데이터가 사라지는 정보임)
- 이 주소 공간은 프로그램이 종료되면 사라진다.
- 가상 메모리 → 각 프로그램마다 가지고 있는 독자적인 주소 공간
- 가상 메모리의 주소 변환 : 가상 메모리 → 물리 메모리에 올라갈 때 주소가 변환된다 (logical memory address → pysical memory address)
커널 주소 공간의 내용
커널도 메모리에 상주하는 부분이기 때문에 주소 공간을 가진다.
이미지 출처
- 코드 영역 : 이미지 참고
- 데이터 영역
- 하드웨어(CPU, 메모리, 디스크)를 관리하고 통제하기 위한 각각의 자료구조
- PCB(Process Control Block) : 프로세스 관리를 위한 자료구조 → 사용자 프로그램이 실행되면 각각의 프로세스를 관리하기 위한 자료구조가 생성됨
- 스택 영역
- 사용자 프로그램이 커널 함수를 호출하게 되면 사용자 프로그램마다 각자의 커널 스택이 생성됨
프로그램의 실행
프로그램이 사용하는 함수
-
프로그램의 실행 파일 안에 포함되어 있는 함수 → 메모리 점프 가능
- 사용자 정의 함수 : 자신의 프로그램에서 직접 정의한 함수
- 라이브러리 함수 : 가져다 쓰는 함수
-
프로그램의 실행 파일 안에 포함되어 있지 않은 함수 → 메모리 점프 불가능
- 커널 함수 : 커널 코드 안에 들어있는 함수이기 때문에 사용자 프로그램 안에는 함수가 정의되어 있지 않다. 그래서 메모리 점프가 불가능하기 때문에 호출(→ 시스템 콜)을 통해 사용하게 된다.
c.f
메모리 점프 : 프로세스의 메모리 주소를 변경하는 것
프로그램의 실행
- 사용자 모드 : 프로그램이 직접 CPU를 붙잡고 있을 때
- 사용자 정의 함수나 라이브러리 함수의 호출 시
- 커널 모드 : CPU가 OS에게 넘어갔을 때
한 줄 요약
- 커널의 개념 : 컴퓨터가 켜진 후부터 메모리에 상주하는 운영체제의 실행 코드 모음으로, 하드웨어 및 사용자 프로그램 관리자 역할을 수행
- 커널의 프로세스 관리 방식 : Interrupt를 통해서 이루어짐.
- I/O 요청을 할 때 : 사용자 프로그램이 인터럽트를 걸면 CPU가 OS에게 넘어가서 OS가 해당 인터럽트에 해당하는 코드(인터럽트 처리 루틴)를 실행
- I/O 요청의 결과를 받았을 때 : I/O 디바이스의 컨트롤러가 CPU에게 인터럽트를 걸면 OS가 확인하고 결과값을 요청한 프로그램에게 제공한 다음 CPU가 작업을 끝내면 결과를 받은 프로그램에게 CPU를 할당
참고한 자료
KOCW 운영체제 강의 (이화여자대학교, 반효경, 2014년 1학기) 를 듣고 정리한 내용입니다.