[운영체제] 2. 컴퓨터 시스템과 운영체제

황재성·2022년 5월 30일
0

운영체제

목록 보기
2/9

컴퓨터 시스템과 하드웨어

컴퓨터 시스템의 범위

  • 컴퓨터 시스템의 계층
    - 응용프로그램 층
    - 운영체제 층
    - 컴퓨터 하드웨어 층

  • 컴퓨터 시스템 계층 구조의 특징
    - 사용자는 응용프로그램/도구프로그램을 통해 컴퓨터 활용
    - 하드웨어는 모두 운영체제의 배타적 독점적 지배를 받음
    - 사용자나 응용프로그램의 하드웨어에 대한 직접 접근 불허 (반드시 운영체제를 통해서만 접근 가능)

  • 계층 구조에서 보는 운영체제의 기능
    - 사용자가 하드웨어에 대해 몰라도 컴퓨터를 사용할 수 있도록 함
    - 응용프로그램과 하드웨어 사이의 중계

컴퓨터 하드웨어 구성

컴퓨터 하드웨어 설명

  • CPU (Central Processing Unit)
    - 프로그램 코드, 기계 명령을 해석하여 실행하는 중앙처리장치
    - 컴퓨터의 가장 핵심 장치
    - 전원이 공급될 때 작동 시작, 메모리에 적재된 프로그램 실행

  • 메모리
    - 반도체 메모리 RAM
    - CPU에 의해 실행되는 프로그램 코드와 데이터가 적재되는 공간
    - 프로그램은 실행되기 위해서 반드시 메모리에 적재되어야 함

  • 캐시 메모리(Cache Memory)
    - CPU 처리속도가 메모리 속도에 비해 빠르게 향상 -> CPU는 느린 메모리 때문에 대기시간이 늘게 되었음
    - CPU의 프로그램 실행 속도를 높이기 위해, CPU와 메모리 사이에 설치되는 소량의 빠른 메모리, 고가의 메모리
    ※ 온칩 캐시 - CPU 내부에 설치되는 캐시
    ※ 옵치 캐시 - CPU 외부에 설치되는 캐시
    - 캐시 메모리가 있는 경우 CPU는 캐시 메모리에서만 프로그램 실행 (실행하고자하는 프로그램과 데이터는 먼저 메모리에서 캐시로 옮겨져야 함)

  • 장치들
    - 키보드, 프린터, 스캐너 등

  • 버스
    - 하드웨어들이 데이터를 주고받기 위해 0과 1의 디지털 신호가 지나가는 여러 가닥의 선을 다발로 묶어 부르는 용어
    - 버스의 종류 : 주소 버스, 데이터 버스, 제어 버스
    - 주소

    • 메모리나 입출력 장치나 저장 장치 내에 있는 저장소에 대한 번지
    • 가장 작은 번지는 0번지이고 그 외는 양의 정수
    • 주소 버스는 주소 값이 전달되는 여러 선의 다발을 부름 (16bit면 16가닥)
    • CPU는 메모리나 입출력 장치에 값을 쓰거나 읽을 때 반드시 주소를 발생시킴

버스는 목적에 따라 구분

시스템 버스입출력 버스
CPU, 캐시, 메모리 등 빠른 하드웨어들 사이에 신호 전송상대적으로 느린 입출력 장치들로부터 입출력 데이터 전송
비유 : 고속도로비유 : 일반도로
  • 입출력 제어 장치 및 시스템 제어 회로
    - 입출력 장치에게 명령을 하달
    - 메모리와 입출력 장치 사이에 혹은 CPU와 입출력 장치 사이에 데이터가 전달 중계
    - DMAC(Direct Memory Access Controller), 인터럽트 제어장치(Interrupt Controller, INTC) 등 포함

CPU와 메모리의 관계

  • CPU
    - 능동적 소자, 메모리 액세스 시 주소 발생
    - 32비트 CPU, 32비트 운영체제, 32비트 컴퓨터

    • CPU에 32개 주소선

    • CPU가 액세스하는 주소 범위 : 0~ 2³² -1 번지

    • CPU가 최대 액세스할 수 있는 메모리의 크기 : 4GB

    • 한 번지의 저장공간이 1바이트이므로, 2³² 바이트 = 4GB

    • 32비트 CPU를 가진 컴퓨터에 4GB이상 메모리를 달아도 소용없음

    • CPU에 입출력되는 32개의 데이터 선 ( 한 번에 32비트 읽고 쓰기 가능 )

    • 32비트 CPU는 32개 데이터선을 통해 32비트를 한 번에 메모리에서 읽고 쓰고 한 번에 32비트 더하기를 한다.

[참고]
-> 210 = 1KB
-> 220 = 210 x 210 = 1MB
-> 230 = 220x 210 = 1GB
-> 232 = 22 x 230 = 4 x 1GB = 4GB

  • CPU와 메모리는 시스템 버스를 통해서 소통을 하면서 데이터를 주고 받는다.
  • 메모리의 역할은 CPU에게 데이터를 전달하거나 CPU에서 처리된 데이터를 저장하는 역할을 한다.
  • CPU와 메모리가 연결된 버스는 크게 3가지가 있다.
    - 컨트롤 버스 : CPU가 메모리에게 데이터를 요청하거나 저장하라고 하는 정보를 주고받는 버스
    - 주소 버스 : 메모리에서 해당 데이터의 주소 정보를 주고 받는 버스
    - 데이터 버스 : 실제 주소에 저장되어 있는 데이터를 주고 받는 버스

명령

1) 명령 처리 과정

  • CPU 레지스터들
    - PC(Program Counter) - 다음에 실행할 명령의 메모리 주소 저장
    - IR(Instruction Register) - 현재 실행하기 위해 메모리로부터 읽어 온 명령 저장
    - SP(Stack Pointer) - 스택의 톱 메모리 주소 저장
    - 데이터 레지스터들(data registers) - 연산에 사용될 데이터들을 저장
    - 상태 레지스터(status register) - CPU의 상태 정보나 인터럽트 금지 등의 제어 정보 저장
    - 기타 여러 레지스터 - 페이지 테이블이 저장된 메모리 주소를 가리키는 레지스터 등

  • 명령어 사이클(Instruction cycle)
    - CPU 하나의 명령을 실행하는 과정. CPU는 전원이 켜진 후 단순하게 명령 사이클 반복

  • 명령어 사이클 사례 : 메모리 100번지에 저장된 다음 명령을 실행하는 사례

2) 명령 처리 과정 예시

- mov eax, [300] ; 메모리 300 번지 값을 읽어 eax 레지스터에 저장

1) CPU는 PC 레지스터가 가리키는 주소(100)을 주소 버스에 싣는다.
2) 메모리는 100번지에 저장된 데이터(mov eax, [300])을 데이터 버스에 싣는다.
3) CPU는 데이터 버스에 담긴 바이너리 값들은 IR 레지스터에 저장. PC는 다음 번지로 수정한다.
4) CPU는 연산에 필요한 데이터를 읽기 위해 데이터의 주소(300)을 주소 버스에 싣는다.
5) 메모리는 300번지에 저장된 50을 데이터 버스에 싣는다.
6) CPU는 데이터 버스로부터 50을 임시 데이터 레지스터에 저장한다.
7) 이제 CPU는 명령을 해석하고 명령을 실행한다. 명령 실행 결과, 50이 eax 레지스터에 저장된다.

스택은 어디 있는가?

프로그램이 실행되기 위해 운영체제에 의해 메모리에 할당되는 4개 공간
- 코드 공간 - 프로그램 코드 적재
- 데이터 공간 - 전역 변수들이 적재되는 공간
- 힙 공간 - 프로그램 동적으로 저장할 데이터를 위한 공간
- 스택 공간 - 함수가 호출될 때 매개변수, 지역변수 등 저장

  • 스택 : 운영체제에 의해 프로그램마다 메모리에 할당된 일부 영역
    - 스택이라는 별도의 하드웨어 메모리가 있는 것은 아님
    - 메모리의 일부를 스택으로 사용하도록 할당된 공간
    - 각 프로그램에게 자신만의 스택 공간 할당
    - CPU의 SP 레지스터가 현재 프로그램의 스택 꼭대기 주소를 가리킴
    - 스택에 저장되는 내용
    • 함수의 지역변수들
    • 함수가 호출될 때 전달받은 매개변수 값들
    • 함수를 실행한 후 돌아갈 주소
    • 함수 코드가 의도적으로 저장해 두기 위한 값

컨택스트

  • 컨텍스트 : 프로그램이 실행 중인 일체의 상황 혹은 상황 정보 -> 메모리 (프로그램 코드와 데이터, 스택, 동적할당 받아 저장한 값)
    - CPU 레지스터들의 값
    - PC에는 코드의 주소
    - SP에는 스택의 주소
    - 다른 레지스터는 이전의 실행 결과나 현재 실행에 사용될 데이터들

  • 축소정의 : 현재 CPU에 들어 있는 레지스터들의 값들

  • 컨텍스트 스위칭
    - 현재 실행중인 프로그램의 컨텍스트(CPU레지스터들의 값)를 저장
    - 다른 프로그램의 저장된 컨텍스트(CPU레지스트들의 값)를 CPU에 복귀
    - 발생

    • CPU가 현재 프로그램 실행을 중지하고 다른 프로그램을 실행할 때

멀티코어 CPU

  • 2001년 IBM에 의해 PowerPC라는 멀티코어 CPU 개발
    - CPU 내부에 2개의 프로세서 포함
    - 2개의 프로그램을 동시에 실행
    - 코어는 완벽한 처리기, 과거 개념의 CPU

컴퓨터 시스템과 운영체제

컴퓨터 시스템이 계층 구조로 설계된 이유

: 계층 간 독립성 확보를 위해

  • 사용자 : 운영체제나 하드웨어에 대해 몰라도 응용프로그램으로 컴퓨터 활용 가능

1) 응용프로그램

  • 컴퓨터 하드웨어 타입이나 구조, 제어 방법을 몰라도 개발 가능
    - CPU 크기, 메모리 크기가 얼마인지 모르고 프로그램 작성
    - 저장 장치가 하드디스크인지 SSD인지, 저장 장치의 크기는 얼마인지, 디스크 헤드는 몇 개 있는지 몰라도 파일 입출력 프로그램 작성
  • 운영체제에게 요청하여 해결
  • 컴퓨터 하드웨어가 바뀌어도 응용프로그램을 다시 작성할 필요 없음

2) 운영체제

  • 운영체제는 장치 관련된 모든 작업을 디바이스 드라이버에게 요청
  • 응용프로그램과 하드웨어 사이의 인터페이스

왜 운영체제가 필요한가?

  • 운영체제가 없다면
    - 응용프로그램이나 사용자가 직접 하드웨어를 제어해야 함
    - 하드웨어에 대한 지식, 충돌, 관리, 보안의 문제 발생
  • 운영체제의 필요성 : 자원에 대한 충돌 해결, 성능 최적화, 사용자의 시스템 사용의 효율화

운영체제와 응용프로그램 사이의 관계

1) 응용프로그램

  • 워드, 웹브라우저 등 사용자가 컴퓨터를 활용하도록 작성된 다양한 프로그램들

2) 응용프로그램에 대한 운영체제의 역할

  • 응용프로그램이 직접 하드웨어를 다루지 못하도록 차단
    - 운영체제가 하드웨어 완벽히 독점 장악
    - 이유 : 응용프로그램들 사이의 하드웨어 사용 충돌을 막기 위함

3) 응응프로그램은 하드웨어를 사용하고자 할 때

  • 반드시 운영체제에게 요청 -> 운영체제가 대신하여 하드웨어 조작
  • 유일한 요청 방법 : 시스템 호출

4) 응용프로그램과 하드웨어 사이의 인터페이스

5) 응용프로그램들의 실행 순서 제어

6) 응용프로그램들 사이의 통신 중계

운영체제와 사용자의 관계

  • 사용자는 응용프로그램을 통해 컴퓨터 활용 : 탐색기, 메모장 등

  • 사용자에 대한 운영체제의 역할
    - 사용자가 하드웨어에 관한 지식이 없어도 컴퓨터 다루기 용이
    - 사용자가 하드웨어를 설치하거나 변경하는 것에 도움
    - 사용자에게 컴퓨터 시스템을 사용할 때 편리한 인터페이스 제공 ( UI, 마우스, 음성 명령 등 )
    - 컴퓨터의 사용을 돕는 여러 도구 응용프로그램(유틸리티) 제공 ( Windows 의 탐색기와 작업관리자 )
    - 사용자 계정관리
    - 사용자의 컴퓨터 사용 시간 계산, 과금 처리 등

운영체제와 하드웨어의 관계

  • 하드웨어를 제어하는 것은 전적으로 운영체제의 몫
    - 응용프로그램에서 printf("hello") : 디스플레이 장치에 "hello"를 출력하는 일을 운영체제가 함
    - 응용프로그램에서 scanf() : 키보드로부터 문자를 입력받는 일은 운영체제가 함

운영체제

  • 운영체제

    • 사용자/응용프로그램과 하드웨어 사이의 매개체
    • 하드웨어 제어는 전적으로 운영체제의 기능
      - 하드디스크에서 파일을 읽거나 쓰기
      - 마우스의 클릭
      - 키보드의 입력 받기
      - 네트워크를 통한 데이터 전송 혹은 수신
      - 디스플레이에 텍스트나 이미지, 그래픽 등 출력
  • 운영체제의 전체기능

1) 프로세스와 스레드 관리

  • 프로세스/스레드의 실행, 일시 중단, 종료, 스케줄링, 컨텍스트 스위칭, 동기화

2) 메모리 관리

  • 프로세스나 스레드에게 메모리 할당, 메모리 반환, 다른 프로세스/스레드로부터 메모리 보호
  • 메모리를 하드 디스크의 영역까지 확장하는 가상 메모리 기술

3) 파일 관리 혹은 파일 시스템 관리

  • 파일 생성, 저장, 읽기, 복사, 삭제, 이동, 파일 보호

4) 장치 관리

  • 키보드, 마우스, 프린터 등 입출력 장치, 하드 디스크 등 저장 장치 제어
  • 입출력

5) 사용자 인터페이스

  • 라인 기반 명령 입출력 창, 마우스와 그래픽 사용 GUI 인터페이스

6) 네트워킹

  • 네트워크 인지, 연결, 닫기, 데이터 송수신

7) 보호 및 보안

  • 바이러스나 웜, 멀웨어, 해킹 등의 외부 공격이나 무단 침입으로부터 보호

운영체제의 구성 요소와 커널

운영체제 구성

운영체제 = 커널 + 툴 + 디바이스 드라이버

1) 커널

  • 운영체제의 핵심 부분, 좁은 의미의 운영체제
  • 부팅 후 메모리에 상주하는 코드와 데이터
  • 커널 코드는 함수들의 집합의 구성
  • 커널 기능을 이용하려면 응용프로그램은 반드시 시스템 호출을 사용

2) 도구(tool) 소프트웨어와 GUI

  • 사용자가 컴퓨터를 편리하게 사용할 수 있도록 제공하는 툴 소프트웨어 혹은 툴 응용프로그램
  • Windows 경우, 바탕화면 GUI, 탐색기, 명령창, 작업 관리자, 제어판

3) 디바이스 드라이버

  • 장치를 직접 제어하고 입출력하는 소프트웨어
  • 장치마다 전담 디바이스 드라이버 있음
  • 일반적으로 장치 제작자에 의해 작성되어 배포됨
  • 사례 : 키보드 드라이버, 디스크 드라이버, SCSI 드라이버, 마우스 드라이버, 그래픽 드라이버, 네트워크 드라이버 ...

** 운영체제 커널 인터페이스 : 시스템 호출과 인터럽트

시스템 호출

  • 커널과 응용프로그램 사이의 인터페이스

  • 응용프로그램에서 커널 기능을 사용할 수 있는 유일한 방법
    - 시스템 호출 라이브러리를 통해 다양한 시스템 호출 함수 제공
    - 예 : open(), close(), read(), write(), fork(), exit(), wait() 등의 시스템 함수 호출

인터럽트

  • 커널과 하드웨어 장치 사이의 인터페이스

  • 장치들이 입출력 완료, 타이머 완료 등을 CPU에게 알리는 하드웨어적 방법 (인터럽트 하드웨어 신호가 직접 CPU에 전달)

  • CPU는 하는 일을 중단하고 인터럽트 서비스 루틴 실행
    - 인터럽스 서비스 루틴은 커널이 적재된 메모리 영역에 있는 코드
    - 인터럽트 서비스 루틴은 일반적으로 디바이스 드라이버 내에 있음
    예 : 키를 입력하면 커널의 키보드 인터럽트 서비스 루틴 실행, 키를 읽어 커널 버퍼에 저장
    - 인터럽트 서비스 루틴의 실행을 마치면 하던 작업 계속

  • 인터럽트 활용
    - 운영체제가 장치에게 지시한 입출력 작업의 완료, 예고 없는 네트워크 데이터의 도착, 키모드나 마우스의 입력, 부족한 배터리의 경고등 장치와 관련된 모든 이벤트 처리

커널과 시스템 호출

응용프로그램의 자원 접근 문제

  • 오늘 날 운영체제는 다중프로그래밍 운영체제
    - 응용프로그램이 직접 컴퓨터 자원에 접근하면 충돌과 훼손 발생

  • 다른 응용프로그램이 적재된 메모리 훼손 가능

  • 다른 응용프로그램이 만든 파일 삭제 및 훼손 가능

  • 응용 프로그램이 커널이 적재된 영역 훼손 가능

해결책

  • 응용프로그램의 자원 접근 불허
  • 메모리 공간을 사용자 공간과 커널 공간으로 분리
  • CPU의 실행 모드를 사용자 모드와 커널 모드로 분리
    - 응용프로그램은 사용자 모드에서만 실행
    - 커널 코드는 커널 모드에서만 실행
    - 사용자 모드에서 커널 코드를 접근하면 응용프로그램 강제 종료

사용자 공간과 커널 공간

** 운영체제는 컴퓨터 메모리를 두 공간으로 분리

  • 사용자 공간 : 모든 응용프로그램들이 나누어 사용하는 공간 (응용프로그램들이 적재되는 공간)
  • 커널 공간 : 커널만 사용할 수 있는 공간
    - 커널 코드, 커널 데이터 등 커널에 의해 배타적으로 사용되는 공간
    - 디바이스 드라이버 포함

사용자 공간 크기

  • 한 응용프로그램의 최대 크기
    - 프로그램 코드 + 데이터(전역변수) + 동적할당 + 스택을 합친 크기
    예 : 32비트 Windows 운영체제에서 사용자 공간 2GB -> 응용프로그램의 크기가 최대 2GB

  • 사용자 공간의 주소 범위
    - 응용프로그램은 운영체제가 설정한 사용자 공간의 주소 범위를 넘어설 수 없음

주소 공간은 가상 주소 공간


[참고]
Memory Management는 CPU가 가상주소체계를 통해 실제물리주소에 존재하는 프로그램을 읽고 실행시키기 위해 필요한 과정을 관리해주는 알고리즘을 말한다. 만약 MMU가 지원되지 않으면 물리메모리에 직접 접근해서 프로그램을 동작시켜야 하기 때문에, 가상메모리만으로도 물리 메모리를 신경쓰지 않고 해결할 수 있도록 해주는 것이 MMU이다.

가상메모리를 통해 우리는 우리에게 실제로 할당된 물리메모리 이상을 사용할 수도 있고, 또한 메모리를 어떻게 할당해주어야 할지에 대한 고민없이 프로그래밍을 할 수 있다. 즉, 아래 3가지가 가능해진다.
1) 사용자가 기억장소를 일일이 할당하는 불편을 없애준다.
2) 프로세스의 크기가 실제 메모리의 총량을 초과해도 사용할 수 있다.
3) 설사 물리적 메모리의 용량이 충분히 크다고하더라도 다중 프로그래밍이 가능하다.

그러니까, 실제적으로 각 프로그램의 일부만이 메모리로 계속 올라가는 것이므로, 어느 시점에서 보면 프로세스의 개수는 많다고 하지만, 실제로 메모리로 올라가는 크기의 총합은 결코 메모리를 초과하지 않는다. 그렇지 만들지 않는다. 설사 메모리가 가득차게 된다고 하더라도 swapping 기술이 적용되어 해결된다.

RAM 공간이 부족할 때 HDD에 파일 형태로 따로 확장하는 가상 메모리 공간

사용자 모드와 커널 모드

** CPU는 사용자 모드와 커널 모드 중 한 모드로 실행 (CPU 내부에는 모드 상태를 나타내는 모드 레지스터가 있음)

1) 사용자 모드

  • CPU의 모드 비트 = 0
  • CPU는 사용자 공간에 있는 코드나 데이터를 액세스 하는 중
  • CPU의 커널 공간 접근 불허 -> 응용프로그램으로부터 커널 영역 보 호
  • 특권 명령 실행 불허

** 특권 명령 : 입출력 장치 등 하드웨어나 시스템 중단 등 시스템 관련 처리를 위해 설계된 특별한 명령

2) 커널 모드

  • CPU의 모드 비트 = 1
  • CPU가 커널 공간에서 실행하는 중, 혹은 사용자 코드를 실행하는 중
    - 특권 명령 사용 가능

3) 사용자 모드에서 커널 모드로 변경되는 경우

  • 시스템 호출과 인터럽트 발생의 2가지 경우에만 변경
  • 시스템 호출 과정은 커널 모드로 변경하는 특별한 기계 명령 사용
    - CPU의 '모드 레지스터'의 값을 커널 모드로 수정
    - int 0x80/sysenter/trap/syscall 등 CPU 마다 다름
사용자모드커널모드
CPU의 메모리 액세스 범위사용자 공간에 국한, 커널 공간 액세스 불가커널 공간을 포함한 모든 메모리 공간
CPU의 하드웨어 액세스 여부불가모든 하드웨어 액세스 가능
CPU가 처리 가능한 명령특권 명령을 제외한 모든 CPU 명령특권 명령을 포함한 모든 CPU 명령
오류 발생 시 처리사용자 프로그램만 실행 종료. 시스템이 종료되지 않으므로 안전시스템에 심각한 오류가 발생한 것으로 시스템 종료

특권 명령

** 특권 명령 : 커널 모드에서 실행할 특별한 목적으로 설계된 CPU 명령

  • 특권 명령 종류 ( 운영체제만 할 수 있는 것들 )

1) I/O 명령

  • 하드웨어 제어 및 장치로부터의 입출력
    예 : in eax, 300 : I/O 포트 300번지에서 값을 읽어 eax 레지스터에 저장
    out 301, eax : eax 레지스터에 있는 값을 I/O 포트 301번지에 쓰기

2) Halt 명령

  • CPU의 작동을 중지 시키는 명령. CPU를 유휴 상태로 만듬

3) 인터럽트 플래크 켜고 끄는 명령

  • CPU 내에 있는 인터럽트 플래그 비트를 제어하여 CPU가 인터럽트를 허용하거나 무시하도록 지시
    예 : cli / sti 명령

4) 타이머 설정 명령

5) 컨텍스트 스위칭 명령

6) 메모리 지우기 명령

7) 장치 상태 테이블 수정 등의 명령

실행 모드와 관련된 다양한 이슈

  1. 사용자 모드와 커널 모드는 CPU의 기능인가 아니면 운영체제의 기능인가?
  • 모드는 CPU의 기능이다.
  • CPU 내부에 모드를 나타내는 레지스터 존재
  • 운영체제는 CPU 모드 레지스터를 이용하여 커널 영역 지킴
  1. 사용자 응용프로그램이 커널 코드를 호출할 일이 있는가?
  • 사용자 응용프로그램은 직접 커널 코드 호출 불가
  • 시스템 호출을 통해서만 가능
  1. CPU가 평균적으로 커널 모드에서 많이 실행될까 사용자 모드에서 많이 실행될까?
  • 커널 모드에서 많이 실행
  1. 운영체제가 사용자 모드와 커널 모드로 나누어 작동시키는 이유는?
  • 커널공간에 대한 보안과 보호
  • 악의적 사용자와 오류 프로그램으로 커널 공간 지킴
  • 사용자 응용프로그램은 사용자 모드에서 아무리 심각한 오류가 발생해도 사용자 프로그램만 종료. 시스템을 중단시키는 못함

커널

** 커널의 실체

  • 커널은 부팅 시에 커널 공간에 적재 함수들과 데이터의 집합
    - 커널은 컴파일된 바이너리 형태, 하드디스크 특정 영역에 저장
    - 부팅 시에 커널 공간의 메모리에 적재

  • 커널 코드는 함수들의 집합

  1. 커널은 스스로 실행되는 프로세스인가? NO
  • 커널은 단순함수들의 집합, 시스템 호출을 통해 호출되는 함수들
  • 커널이 스케줄링한다 ( X )
    - 커널 프로세스가 실행되면서 주기적으로 스케줄링 하는게 아니고 시스템 호출과 인터럽트 서비스 루틴에 의해 필요한 경우 스케줄러 함수 실행
  1. 커널은 실행 중이다? NO
  • 커널은 프로세스도 스레드도 아니므로 NO
  • 커널이 실행 중인 게 아니고 응용프로그램이 시스템 호출을 실행하면 커널 코드가 실행되는 것
  • 인터럽트가 발생하면 인터럽트 서비스 루틴이 실행
  1. 커널은 스택이나 힙을 가지는가? NO
  • 프로세스나 스레드가 스택이나 힙 소유함

  • 커널 공간에 스레드를 위한 스택이 만들어진다. 스레드가 커널 코드를 실행하고 있을 때 커널 스택 형성

  • 커널의 존재
    - 커널은 스스로 실행되는 코드(프로세스)가 아님

  • 커널이 스케줄링 한다 -> (커널 속의)스케줄링 함수가 실행된다.

응용프로그램 빌딩

  • 라이브러리
    - 응용프로그램에서 활용하도록 미리 함수들을 작성하여 컴파일하고 바이너리 형태로 만든 파일
    ( 바이너리 형태면 CPU 가 바로 이해할 수 있어서 Memory 에 탑재했을 때 바로 사용 가능하다 )
    - 라이브러리를 활용하지 않고 응용프로그램 작성이 불가능

-응용프로그램이 활용하는 라이브러리는 2가지 유형

  1. 표준 라이브러리
  • 운영체제나 컴퓨터 하드웨어에 상관없이 이름과 사용법 동일
  • 사용자가 작성하기 힘든 함수 제공
  1. 시스템 호출 라이브러리
  • 시스템 호출을 진행하여 커널 모드로 바꾸고 커널로 진입하여 커널에 만들어진 함수 실행 ( 커널의 다양한 기능 수행 )
  • 운영체제마다 함수의 이름이 서로 다름
  • 커널 API(Application Programming Interface) 라고도 부름

함수 호출과 시스템 호출

1) 함수 호출

  • 사용자 공간에 적재된 함수가 다른 함수나 라이브러리 함수 호출

  • 사용자 공간에서, 사용자 모드에서 실행

  • 실행 과정
    - 사용자 공간의 스택에 돌아올 주소, 매개변수 전달, 호출된 함수의 지역변수 생성
    - 호출된 함수가 끝나면 함수를 호출한 곳으로 복귀

2) 시스템 호출

  • 응용프로그램이 운영체제의 기능을 사용하고자 하는 경우

  • 커널에 작성된 함수를 실행하고자하는 경우

  • 시스템 호출 라이브러리에서 커널 기능 요청

  • 사용자 모드에서 커널 모드로 변경된 후 커널 함수 실행

  • 실행 과정
    - 시스템 호출을 일으키는 특별한 기계 명령 실행 ( 커널 함수마다 매겨진 고유 번호 전달, 사용자 모드에서 커널 모드로 변경 )
    - 커널의 시스템 호출 핸들러 실행 ( 이 핸들러가 커널 함수의 고유 번호를 분석하여 해당 커널 함수 호출 )

함수 호출시스템 호출
메모리 영역사용자 영역의 코드에서 사용자 영역의 함수 호출사용자 영역의 코드에서 커널 함수 호출
CPU 실행 모드사용자 모드사용자 모드에서 커널 모드로 전환
비용함수 호출에 따른 비용커널 모드로 전환하는 등 함수 호출에 비해 큰 비용

시스템 호출

1) 시스템 호출

  • 사용자 공간의 코드에서 커널 서비스를 요청하는 과정
    - 사용자 공간의 코드가 커널 함수를 호출하는 과정
    - 커널 콜, 트랩으로도 불림
    - 응용프로그램에서 커널 기능을 활용하도록 만들어놓은 기능

  • 시스템 호출 라이브러리 제공
    - 시스템 호출 함수 혹은 커널 API
    - Unix/Linux 의 커널 API - open(), read(), write(), fork(), exit()
    - Windows의 커널 API - CreateProcess(), WaitForSinlgeObject()
    - 대략 200개 이상

  • 시스템 호출을 일으키는 기계 명령

CPU마다 시스템 호출을 실행하는 특별한 기계 명령 제공

2) 사례

  • int 0x80 - 인텔의 x86 계열의 CPU, 32비트에서 사용
  • syscall/sysret - ADM에서 최초 구현, 64비트에서만 작동
  • sysenter/sysexit - Intel 에서 최초 구현, X86/64 CPU, AMD

3) 라이브러리를 통해 간접적으로 이루어지는 시스템 호출

  • 응용프로그램 -> 시스템 호출 라이브러리의 시스템 호출 함수 -> 시스템 호출 CPU 명령
  • 응용프로그램 -> 표준 라이브러리 함수 -> 시스템 호출 라이브러리의 시스템 호출 함수 -> 시스템 호출 CPU 명령

printf() 가 직접 디스플레이에 출력할까?

  • printf() 함수는 표준 라이브러리 함수이다.
  • printf() 함수를 호출하면 시스템 호출이 일어날까?
    - 디스플레이에 접근하는 것은 커널만 가능
    - printf() 함수는 디스플레이에 직접 출력 불가능
    - printf()는 C 표준 라이브러리의 버퍼에 출력
    - 버퍼가 꽉 차 있으면 printf()는 시스템 호출 함수 write() 함수 호출 ( printf() 함수가 시스템 호출 함수인 write() 함수 호출해서 운영체제(커널)에 의해서 디스플레이에 출력 )
    - write() 함수는 '시스템 호출 CPU 명령' 실행
    - 커널에 작성된 함수가 디스플레이에 "hello" 출력

[참고 : 버퍼의 개념]

  • 단순히 메모리상에 있는 값을 화면에 바로 출력하거나 입력한 값을 메모리상에 바로 저장하기전에 겉으로 보이지않는 버퍼(buffer) 라는 것을 통하게 된다. 버퍼란 사전적의미 그대로 데이터 전송시 양쪽의 속도차를 보완하기 위해 만들어진 개념이다. 버퍼가 없다면 컴퓨터는 바이트단위로 데이터를 읽거나 출력하기위해 메모리에 접근하는 횟수가 엄청나게 늘어나게되고 CPU에도 부하가 많이 걸리게 될 것이다. 그래서 버퍼라는 공간에 입출력할만큼 데이터를 받아놓고 전송하게 되는 것이다.

시스템 호출 비용 : fread() 와 read() 의 비교

  • 시스템 호출은 함수 호출에 비해 많은 시간 비용
    - 시스템 호출을 많이 할 수록 프로그램 실행 속도 저하

  • 파일에서 100바이트를 읽는 2가지 유형의 코드. 실행 비교 결과는?

1) 함수 호출 fread()와 시스템 호출 read() 비교

  • 표준 라이브러리 함수, fread(fp, buf, size) 동작
    - fread() 를 처음 호출하면 라이브러리 내 버퍼가 비어 있음
    - read() 를 호출하여 라이브러리 내 버퍼를 채운다
    - 라이브러리 버퍼에서 요청한 size 만큼 buf 로 복사한다.
    - 라이브러리 버퍼가 비거나 부족하면 그때 read() 호출

  • 시스템 호출 함수, read(fd, buf, size) 동작
    - 시스템 호출을 이용하여 커널 코드 실행
    - 커널 코드에서 디스크 읽기
    - 라이브러리를 거치지 않고 바로 buf로 읽어들임

운영체제와 인터럽트

인터럽트

** 인터럽트 : CPU가 현재 하는 일을 중단하고 다른 일을 하도록 시키는 비동기적 방법

1) 하드웨어 인터럽트

  • 장치들이 어떤 상황 발생을 CPU에게 알리는 하드웨어 신호
  • 인터럽트 발생 -> CPU는 인터럽트 서비스 루틴 실행

2) 소프트웨어 인터럽트

  • CPU 명령어에 의해 하드웨어 인터럽트를 수신한 것과 동일한 처리

3) 컴퓨터에서 인터럽트 활용

  • 마우스를 움직이거나 클릭하는 등 마우스 조작
  • 키보드 입력
  • 네트워크로부터 데이터 도착
  • 하드디스크의 쓰기 종료
  • 시스템 클럭으로부터 일정한 시간 간격으로 알림
  • 컴퓨터의 리셋 버튼 누르기
  • USB 메모리 부착 혹은 해제

인터럽트 서비스 루틴

** 인터럽트 핸들러라고도 부른다.
위치 : 디바이스 드라이버나 커널 코드, 임베디드 컴퓨터 ROM

인터럽트는 다중프로그래밍의 key

  • 다중 프로그래밍이란?
    - 여러 프로세스를 동시에 실행
    - 한 프로세스가 입출력을 시행하면 다른 프로세스로 교체 실행
    - 입출력이 완료될 때, 장치로부터 입출력 완료 통보를 받는 방법 필요 -> 인터럽트
    • 입출력 완료를 계속 검사하는 폴링(Polling)방법은 CPU에 의해 이루어지므로 매우 비효율적 (반면 인터럽트는 CPU가 아니라 디바이스 드라이버에서 이루어짐)

이 글이 문제가 된다면 삭제하겠습니다.

profile
데이터사이언스와 자연어처리를 공부하고 있습니다.

0개의 댓글