코드 훔쳐보는 변태 코더
춤 좋아하는 백엔드 개발자(였으면 좋겠다)
운영체제 이론 03-28 (정리) 프로세스와 커널

인터럽트

  • 입출력 장치들이 비동기적 사건을 CPU에게 알리는 행위
    • 비동기 → 동기와 다르게 요청을 보냈을 때 응답이 도착하지 않아도 요청을 보낼 수 있다.
    • 마우스 조작 , 키보드 입력
    • 네트워크로부터 데이터 도착 등등

인터럽트 발생 전 프로그램 실행 중 → 입력장치로부터 인터럽트 발생 → 인터럽트 메시지 CPU로 전송 → CPU코어로부터 전송 및 인터럽트 벡트 번호 반환 → 인터럽트 벡터 테이블에서 인터럽트의 서비스 루틴의 주소를 알아낸다. → 인터럽트 서비스 루틴 실행 → CPU는 인터럽트 발생 전에 하던 작업을 지속한다.

 

 

  • 인터럽트 서비스 루틴
    • ISR → 인터럽트 핸들러
    • 위치 : 디바이스 드라이버나 커널 코드, 임베디드 컴퓨터 ROM

인터럽트는 다중 프로그래밍 실현의 키이다.

  • 다중 프로그래밍 리뷰
    • 여러 프로세스를 동시에 실행한다. (멀티 프로그래밍)
    • 프로그래밍과 프로세서는 프로그램 하나가 프로세서 하나를 같이 운영 할 수 있다.
    • 한 프로세스가 입출력을 시행하면 다른 프로세스로 교체 실행된다.
    • 입출력이 완료될 때, 장치로부터 입출력 완료 통보를 받는 방법이 필요하고 그것이 바로 인터럽트이다.
      • 인터럽트가 없다면 ? → CPU는 폴링을 실행해야 하므로 비효율정이다.
        • 폴링 ⇒ 하나의 장치(또는 프로그램)가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식
      • 다중 프로그래밍 운영체제의 구현은 사실상 거의 불가능하다.
  • 인터럽트의 효과
    • 컴퓨터 시스템이 효율적으로 작동한다.
      • CPU 활용률이 높아진다. (시스템 처리율 향상)
    • 입출력 장치와 CPU가 동시에 각자의 작업을 실행한다.
      • 입출력 장치 → 지시받은 입출력 진행 / CPU → 다른 프로그램 실행
더보기

인터럽트는 프로세스가 입출력 등의 외부 사건에 의해 중단 후 처리 후에 다시 프로세스를 계속 실행시키는 것을 의미한다.

인터럽트 발생 시 ISR (Interrupt Service Routine) 혹은 Interrupt Handler 가 실행된다.

인터럽트가 존재하지 않는다면 다중 프로그래밍 운영체제의 구현은 사실상 불가능하다.

프로세스

  • 프로그램
    • 하드디스크 등의 저장 매체에 저장된다. (실행 파일의 형태)
  • 프로세스
    • 프로그램이 메모리에 적재되어 실행 되는 상태
      • 필요한 모든 자원을 할당받는다.
      • 코드공간, 데이터공간, 스택공간, 힙공간
    • 프로세스 특징
      • 운영체제는 프로그램을 메모리에 적재하고 프로세스로 다룬다.
      • 메모리를 할당 후 코드와 데이터 등을 적재한다.
      • 프로세스들은 서로 독립적인 메모리 공간을 가진다.
      • 운영체제는 프로세스마다 고유한 번호를 할당한다. ⇒ PID
      • 운영체제는 각 프로세스의 메모리 위치와 크기 정보를 관리한다.
      • 프로세스의 모든 정보는 커널에 의해 관리된다.
      • 프로세스는 실행 - 대기 - 잠자기 - 대기 - 실행 - 종료 등의 생명 주기를 가진다. (모든 관리는 커널에 의해 수행된다.)

  • 프로세서
    • CPU , 그래픽 프로세스 (실제 칩으로 되어있는 것들)
    • 하드웨어 처리기라는 의미를 갖고있다. (하드웨어 적인 부분)
  • 프로세스
    • 프로그램에 대한 실행 (소프트웨어적인 부분)

 

더보기

프로세스는 프로그램이 메모리에 적재되어 실행되는 상태를 뜻한다. 프로세스의 모든 정보는 커널에 의해 관리되며 프로세스마다 고유한 번호를 가지게 된다.

프로세스 관리

  • 프로세스의 생성에서 종료까지 관리는 모두 커널에 의해 이루어진다.
    • 커널 영역에 프로세스 테이블을 만들고 프로세스 목록을 관리한다.
  • 관리 내용
    • 프로세스 생성, 실행, 일시중단 및 재개, 정보 관리, 프로세스 통신, 프로세스 동기화, 프로세스 중단, 프로세스 컨텍스트 스위칭
  • 한 프로그램을 여러 번 실행시킬 때
    • 프로그램 실행 시 마다 독립된 프로세스 생성 → 프로세스들을 프로그램의 다중 인스턴스라고 부른다.
      • 각 프로세스에 독립된 메모리 공간을 할당
      • 각 프로세스를 별개의 프로세스로 취급한다.

 

더보기

프로그램을 여러 번 실행 시킬땐, 다중 인스턴스화 된다.

각 프로세스 마다 독립된 메모리 공간을 할당받는다.

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

  • 오늘날 운영체제는 다중 프로그래밍 운영체제이다.
    • 응용 프로그램이 직접 컴퓨터 자원에 접근하면 충돌과 훼손이 발생한다.
      • 다른 응용프로그램이 적재된 메모리를 훼손 할 수 있다.
      • 다른 응용프로그램이 만든 파일 삭제 및 훼손이 가능하다.
      • 응용 프로그램이 커널이 적재된 영역 훼손 가능
    • 해결 방안
      • 자원에 대한 모든 접근은 커널에만 부여한다.
  • 구체적인 해결 방법
    • 사용자 공간 → 응용 프로그램만 있는 공간
    • 커널은 커널 공간에만 적재한다.
    • CPU의 실행모드를 사용자 모드와 커널 모드로 분리한다.
    • 응용 프로그램이 커널 기능을 이용할 때, 시스템 호출을 잉요해서만 커널 코드를 이용하도록 한다.

사용자 공간과 커널 공간

  • 사용자 공간
    • 응용 프로그램들이 적재되는 공간
  • 커널 공간
    • 커널 코드, 커널 데이터 등 커널에 의해 배타적으로 사용되는 공간
    • 디바이스 드라이버를 포함한다.
  • 분리하는 이유
    • 커널 코드와 데이터를 악의적인 응용프로그램이나 코딩 실수로부터 지키기 위함이다.

 

더보기

프로그램이 직접 컴퓨터 자원에 접근하여 발생하는 충돌을 막기 위해 자원에 대한 접근은 커널에만 부여한다.

사용자 공간 크기의 의미

  • 한 응용프로그램의 최대 크기 결정
    • 프로그램 코드 + 데이터 (전역 변수) + 힙(동적 할당) + 스택
    • 운영체제에서 사용자 공간이 2GB → 응용프로그램을 2GB 크기 이상 개발 X
  • 사용자 공간의 주소 범위
    • 운영체제가 설정한 사용자 공간의 주소 범위를 넘어설 수 없다.
      • 바로 종료됨 (심각한 오류 예 : 블루스크린)

주소공간은 가상 공간이다. (사용자나 응용프로그램 관점에서 보는 주소 범위) / 사용자가 전체 메모리를 사용하고 있다고 착각하지만 실제론 아니다.

 

 

  • 사용자 공간의 충돌 해결 → 가상 주소 공간을 물리 메모리에 매핑한다.
    • 매핑 테이블 (주소 공간을 갖고 있는) → 운영체제가 소유하고 관리한다.
    • 물리 메모리를 여러 프로그램의 사용자 공긴이 나누어 사용
      • 실제로는 각 프로그램이 사용자 공간의 일부만 사용한다.
    • 커널 공간 역시 물리 메모리에 매핑 될 수 있다.
  • 물리 메모리가 작은 경우에는 하드 디스크에 저장하여 물리 메모리의 빈 영역을 확보한다. (가상 메모리 기법)

 

더보기

사용자 공간은 운영체제가 정한 범위 이상을 가질 수 없다.

해결 방법은 가상 주소 공간을 물리 메모리에 매핑하는 가상 메모리 기법 등이 있다.

 

 

사용자 모드와 커널 모드

  • CPU는 사용자 모드와 커널 모드 중 한 모드로 실행한다.
    • CPU 내부에 모드 레지스터 존재 → 모드 상태를 나타냄
  • 사용자 모드
    • CPU의 모드 비트 → 1
    • CPU는 커널을 쓸 수 없다. → 응용 프로그램으로부터 커널 영역을 보호한다.
    • 특권 명령 실행을 불허한다.
      • 특권명령 ? 입출력 장치 등 하드웨어나 시스템 중단 등 시스템 관련 처리를 위해 설계된 특별한 명령
  • 커널 모드
    • CPU의 모드 비트 → 0
    • CPU가 커널 공간에서 실행하는 중, 혹은 사용자 코드를 실행하는 중
    • 특권 명령 사용 가능
  • 사용자 모드에서 커널 모드로 전환하는 경우
    • 시스템 호출과 인터럽트
  • 시스템 호출
    • 특별한 기계 명령에 의해 진행된다.
      • 각 장비들마다 기계 명령이 다르다.
    • 기계 명령이 CPU의 모든 비트를 커널 모드로 전환한다.
  • 인터럽트
    • CPU가 인터럽트를 수신하면 커널 모드로 자동으로 전환한다.
    • CPU는 인터럽트 서비스 루틴을 실행한다.
    • 인터럽트 서비스 루틴이 끝나면 사용자 모드로 자동 전환한다.

더보기

사용자 모드에서 커널 모드로 전환하는 경우는 시스템 콜이 일어나거나 인터럽트가 발생했을때이다.

CPU는 인터럽트를 수신하면 커널 모드로 자동으로 전환 후 서비스 루틴이 끝나면 사용자 모드로 자동 전환한다.

특권 명령

  • 특별한 목적으로 설계된 CPU 명령
  • 커널 모드에서만 실행된다.
  • 종류
    • I/O 명령
    • Halt 명령
      • CPU 작동 중지 (유휴 상태로 만듬)
    • 인터럽트 플래그를 켜고 끄는 명령
      • CPU가 인터럽트를 허용하거나 무시하도록 지시한다.
    • 타이머 설정 명령
    • 컨텍스트 스위칭 명령
    • 메모리 지우기 명령
    • 장치 상태 테이블 수정 등의 명령
  • 사용자 모드와 커널 모드는 CPU에 의해 구현되는가, 운영체제에 의해 구현되는가
    • 운영체제는 CPU 모드 레지스터를 이용하여 커널 영역을 지킨다.
    • 모드는 CPU에 의해 구현, 운영체제가 활용할 수는 있다.
  • 운영체제가 사용자 모드와 커널 모드로 나누는 이유는?
    • 커널 공간에 대한 보안과 보호
    • 사용자 응용프로그램은 사용자 모드에서 심각한 오류가 발생해도 시스템을 중단시키지는 못한다.
  • 사용자 응용프로그램이 커널 코드를 호출하는 일이 있는가?
    • 직접 커널 코드 호출 불가
  • CPU가 커널 모드와 사용자 모드 중 어떤 모드로 많이 실행될까?
    • 시스템 전체 통계를 보면 커널 모드에서 많이 실행된다.
    • 장치 액세스의 경우가 많으면 커널 모드 시간 비율이 높아진다.
더보기

특권 명령은 커널 모드에서만 실행되는 CPU 명령이다.

커널

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

 

커널 자체가 프로세스가 될 순 없다.

 

  • 커널은 스스로 실행되는 프로세스가 아니다.
    • 함수들의 단순 집합, 시스템 호출을 통해 호출되는 함수들이다.
      • 시스템 호출인터럽트 서비스 루틴에 의해 커널 내 스케줄러 함수가 호출되어 실행된다.
  • 커널은 실행 중이 아니다.
    • 커널은 프로세스도 스레드도 아니다.
      • 커널 코드를 실행하고 있다 / 인터럽트 서비스 루틴이 실행되고 있다.
  • 커널은 스택이나 힙을 갖지 않는다.
    • 함수들의 단순 집합이기 때문 / 스레드가 가진다.
    • 스레드마다 사용자 스택과 커널 스택을 소유한다.
      • 스레드가 생성될 때 프로세스의 사용자 공간에 사용자 스택 할당 / 커널 공간에 커널 스택 할당 (시스템 호출을 통해)
더보기

커널은 컴파일 된 바이너리 형태의 함수들의 집합이다.

커널은 프로세스도 스레드도 아닌 단순 함수의 집합이다.

 

 

라이브러리

  • 프로그램에서 활용하도록 미리 작성된 함수들이 컴파일 되어 바이너리 형태로 제공되는 파일
  • 개발자는 라이브러리 활용이 없이는 응용프로그램 작성이 불가능하다.
  • 활용되는 라이브러리는 2가지 유형을 갖는다.
    • 표준 라이브러리
      • 사용자가 작성하기 힘든 함수를 제공한다.
      • 운영체제나 컴퓨터 하드웨어에 상관없이 이름과 사용법이 동일하다.
    • 시스템 호출 라이브러리
      • 시스템 호출 함수를 포함한다.
      • 시스템 호출을 진행하여 커널 모드로 바꾸고 커널로 진입하여 커널에 만들어진 함수를 실행한다.
      • 시스템콜 함수를 커널 API라고 부른다.
      • 운영체제마다 시스템콜 함수의 이름이 서로 다르다.

링킹

  • 실행 파일이 만들어지는 과정이다.
  • 응용프로그램이 사용자 공간에 적재 → 실행 파일 내 사용자 코드와 라이브러리 코드의 메모리 적재 → 사용자 전역 변수와 라이브러리의 전역 변수 모두 메모리에 적재 → 응용 프로그램은 사용자 모드로 실행 시작

함수 호출과 시스템 호출

  • 함수 호출로 라이브러리를 활용한다.
    • 사용자 공간에 적재된 함수가 사용자 공간에 적재된 다른 함수를 호출한다.
      • 스택에 돌아올 주소, 매개변수를 전달 → 호출된 함수의 지역 변수를 생성한다.
      • 사용자 공간에 적재된 함수의 주소로 점프
      • 함수가 끝나면 함수를 호출한 곳으로 복귀시킨다.
  • 시스템 호출로 커널 코드를 실행한다.
    • 커널에 작성된 함수 실행
      • 시스템 호출 라이브러리에 포함된 시스템 호출 함수가 시스템 호출을 일으킨다.
    • 기계 명령어를 실행한다.
    • 커널 모드로 전환되고 커널 함수마다 고유 번호를 전달한다.
    • 커널의 시스템 호출 핸들러를 실행한다.
    • 커널 함수의 고유 번호 분석, 해당 커널 함수 호출
    • 리턴할 때 사용자 모드로 전환, 사용자 프로그램으로 복귀

시스템 호출

  • 사용자 공간의 코드에서 커널 서비스를 요청하는 과정이다.
    • 커널 콜 / 트랩 이라고도 불린다.
    • 응용프로그램에서 커널 기능을 활용하도록 만들어 놓은 기능이다.
  • 운영체제는 시스템 호출 라이브러리를 제공한다.
    • 시스템 호출 함수 혹은 커널 API를 포함한다.
    • 대략 200개 이상의 시스템 호출 함수가 존재한다.
  • 시스템 호출을 일으키는 기계 명령
    • CPU마다 시스템 호출을 실행하는 특별한 기계 명령을 제공한다.

 

fread()와 read() 의 비교

  • 시스템 호출은 함수 호출에 비해 많은 시간 비용이 든다.
    • 시스템 호출을 많이 할수록 프로그램 실행 속도가 저하된다.
    • fread() ⇒ 1번의 시스템 호출
    • read() ⇒ 10번의 시스템 호출 (느리고 비효율적이다.)

프로세스 구성

  • 코드 영역
    • 프로그램 코드가 적재되는 영역
  • 데이터 영역
    • 프로그램에서 고정적으로 만든 변수 공간
    • 프로세스 적재시 할당, 종료시 소멸
  • 힙 영역
    • 프로세스의 실행 도중 동적으로 사용할 수 있도록 할당된 공간
  • 스택 영역
    • 함수가 실행될 때 사용될 데이터를 위해 할당된 공간
    • 함수 호출 외에 프로세스에서 필요시 사용이 가능하다.

프로세스 주소 공간

  • 실행중에 접근할 수 있도록 허용된 주소의 최대 범위 (범위를 벗어나지 않음)
  • 논리공간이다. (가상공간)
    • 0번지에서 시작하여 연속적인 주소를 가진다. (실제는 0번지가 아니라고 볼 수 있다.)
  • 32비트 CPU의 경우 4GB 까지 크기를 가질 수 있다.
  • 프로세스 크기 : 적재된 코드 + 전역 변수 + 힙 영역에서 할당받은 동적 메모리 공간 + 스택 영역에 현재 저장된 데이터 크기 로 매번 달라질 수 있다.

커널 공간

  • 시스템 호출을 통해 이용하는 커널 공간
  • 커널 코드 , 커널 데이터, 커널 스택(커널 코드가 실행될 때만) 이 존재한다.

결론

  • 프로세스의 코드와 데이터는 실행 파일에 결정된 상태로 코드 영역과 데이터 영역에 적재된다. → 실행 중에 크기가 변하지 않는다. (메모리를 아껴써야 한다.)
  • 프로세스는 사용자 공간의 최대 범위까지 동적할당 받으면서 힙 영역과 스택 영역을 늘려갈 수 있다.

커널 공간의 의미

  • 각 프로세스는 독립된 사용자공간을 소유하고 커널 공간을 공유한다.
    • 프로세스가 사용자 코드에서 시스템 호출을 통해 커널 코드를 실행할 때 커널 공간을 사용한다.
  • 결론
    • 프로세스마다 각각 사용자 주소 공간이 존재한다.
    • 시스템 전체에는 하나의 커널 주소 공간이 있다.
    • 모든 프로세스는 커널 주소 공간을 공유한다.

프로세스의 주소 공간

  • 프로세스의 주소 공간은 가상 공간이다.
    • 프로세스에서의 0번지는 가상 주소 0번지를 의미한다.
    • 가상 주소는 0번지부터 시작된다.
    • 코드 주소 변수 주소 등등은 모두 가상 주소이다.
  • 프로세스의 주소 공간은 각 프로세스마다 주어지고, 가상 주소가 물리 주소로 매핑되기 때문에 물리 메모리에서는 충돌하지 않는다.
  Comments,     Trackbacks