운영체제_프로세스 기술과 제어_프로세스 제어

미뇽·2024년 4월 9일
0

운영체제(강의)

목록 보기
8/43
post-thumbnail

프로세스 제어

수행 모드(Modes of Execution)

대부분의 처리기는 최소한 두 가지 수행 모드를 지원한다. 권한에 따라 특정 명얼러의 수행이나 다른 제어 등이 제한된다.

권한을 덜 가진 모드를 보통 사용자 모드(user mode), 더 높은 권한을 가진 모드는 시스템 모드(system mode), 제어 모드(control mode), 커널 모드(kernel mode) 등으로 불린다.

커널(kernel)은 중요한 시스템 기능들을 포함하는 운영체제의 일부로 다음과 같은 요소들을 가진다.

  • 프로세스 관리
    - 프로세스 생성과 종료
    - 프로세스 스케줄링과 디스패칭
    - 프로세스 교환
    - 프로세스 동기화와 프로세스 간 통신 지원
    - 프로세스 제어블록 관리
  • 메모리 관리
    - 프로세스에 주소공간 할당
    - 스와핑(swapping)
    - 페이지와 세그먼트 관리
  • 입출력 관리
    - 버퍼 관리
    - 프로세스에 입출력 채널과 장치 할당
  • 지원 기능
    - 인터럽트 핸들링
    - 어카운팅
    - 모니터링

두 가지 모드를 사용하는 이유는 사용자 프로그램의 간섭으로부터 운영체제 및 프로세스 제어블록과 같은 주요 운영체제 테이블을 보호할 필요가 있기 때문이다. 사용자 프로그램의 경우 그리 높은 수준의 제어 수준이 필요하지 않고, 안전을 위해서도 이러한 권한 자체를 제한해 놓는 것이 바람직하다.

프로그램 모드를 변경하려면 프로그램 상태 워드(PSW)의 한 비트를 사용하여 수행 모드를 나타낼 수 있다. 해당 비트는 특정 사건에 따라서 변하는데, 사용자가 운영체제 서비스를 호출하거나 인터럽트가 운영체제의 한 경로의 수행을 촉발시킬(trigger) 때 모드는 커널 모드로 설정된다.

대표적인 예로 인텔 ITanium 처리기의 경우 4레벨 모드로 나뉘어 2비트의 cpl(current privilege level)필드를 포함하는 처리기 상태 레지스터(psr, processor status register)를 가진다. 0(최상위)~3(최하위)까지의 레벨이 있다.

인터럽트가 발생하면 처리기는 cpl 필드 포함 psr에 있는 비트 대부분을 리셋하여 cpl을 레벨0으로 설정한다. 인터럽트 핸들링 마지막 명령어는 irt(interrupt return)인데, 처리기를 인터럽트된 프로그램의 psr로 복구시켜 프로그램의 권한 레벨이 복원되는 방식이다.
응용이 미리 정의된 영역에 시스템 호출 식별자와 시스템 호출 인자들을 위치시키고, 다음으로 사용자 레벨의 수행을 인터럽트하여 커널로 제어를 넘겨주는 특별한 명령를 수행함으로써 시스템 호출을 수행한다.

프로세스 생성

실제로 프로세스를 생성하는데 필요한 단계들은 아래와 같다.

  1. 새로운 프로세스에 유일한 프로세스 식별자 할당
  2. 프로세스에 공간 할당
    • 사용자 주소공간, 사용자 스택, 프로세스 제어 블록을 위한 공간을 결정하고 생성
    • 이미 존재하는 주소공간이 새로 생성된 프로세스에 의해 공유되면 적절한 연결(linkage)을 설정
  3. 프로세스 제어블록 초기화
    • 프로세스의 ID 및 또 다른 ID, 부모 프로세스의 ID와 같은 정보가 포함
    • 처리기 상태정보 중 프로그램 카운터, 시스템 스택 포인터 제외 대부분 항목이 0으로 초기화
  4. 적절한 연결 설정
    • 스케줄링 큐를 연결 리스트로 유지하고 있다면 새로운 프로세스를 준비/보류 리스트에 놓음
  5. 추가적 자료구조 생성
    • 프로세스에 대한 과금 or 어카운팅 파일 유지

프로세스 교환(Process Switching)

프로세스 교환의 경우 수행 중인 프로세스가 어느 시점에 인터럽트되면, 운영체제는 다른 프로세스를 수행 상태로 바꾸고 그 프로세스에게 제어를 넘긴다. 여기서 설계 시 고려해야 할 점은

  1. 어떤 경우에 프로세스 교환을 유발시킬 것인가?
  2. 모드 전환(mode switching)과 프로세스 교환의 차이는 무엇인가?
  3. 프로세스 교환을 위해 운영체제의 자료구조들을 어떻게 다를 것인가?
    등이 있다.

프로세스의 교환 시점

운영체제가 현재 수행 중인 프로세스로부터 제어를 넘겨받을 때마다 프로세스 교환이 발생한다. 이러한 사건들은 아래 표와 같다.

기법원인사용
인터럽트현재 명령어 수행의 외부비동기적인 외부 사건에 반응
트랩현재 명령어 수행과 관련오류나 예외 상황 처리
수퍼바이저 호출명시적 요청운영체제 기능에 대한 호출

인터럽트

  • 클럭 인터럽트(clock interrupt)
    - 현재 수행중인 프로세스가 자신에게 허용된 시간 할당량(time slice) 를 모두 사용했는지 여부 판단.
    - 시간 만료된 프로세스는 준비 상태가 되고 다른 프로세스가 디스패치
  • 입출력 인터럽트
    - 발생된 입출력 동작이 하나 이상의 프로세스가 대기하고 있던 사건과 관련이 있다면, 운영체제는 그 사건에 대해 블록되어 있던 모든 프로세스를 준비 상태로 전이(블록/보류 -> 준비/보류)
  • 메모리 폴트(Memory fault, 메모리 부재)
    - 주기억장치에 있지 않은 워드에 대한 가상메모리 주소 참조를 처리할 때
    - 해당 참조(주소)를 포함하고 있는 메모리 블록(페이지/세그먼트)을 보조기억장치로부터 주기억장치로 가져와야 함
    - 메모리 블록 가져오기 IO 요청 후 메모리 폴트를 유발시킨 프로세스는 블록 상태
    - 원하던 블록이 메모리로 적재되면 이전에 메모리 폴트를 유발시킨 프로세스는 준비 상태가 됨

트랩(trap)

트랩이 발생하면 관련 오류 또는 예외 조건이 치명적인지 아닌지에 따라서 처리 여부가 나뉘어진다.

  • 치명적일 경우 -> 현재 수행되고 있는 프로세스는 종료 상태로 전이 + 프로세스 교환
  • 치명적이지 않을 경우 -> 오류의 특성과 운영체제 설계에 따라 복구 프로시저 수행 or 사용자 통보 등 다르게 동작. 프로세스 교환/수행 재개될 수도 있음

수퍼바이저 호출(Kernel 진입)

운영체제 코드에 속한 어떤 루틴으로 제어를 넘기게 되며, 이 시스템 호출로 인해 해당 사용자 프로세스는 블록 상태로 전이

모드 전환

인터럽트 단계에서 처리기는 인터럽트 시그널 존재여부를 가지고 인터럽트가 발생되었는지 검사한다.
대기하고 있는 인터럽트가 없다면 처리기는 반입 단계를 계속 수행하여 해당 프로그램의 다음 명령어를 가져온다. 대기하고 있는 인터럽트가 있는 경우 처리기는

  1. 프로그램 카운터의 값을 인터럽트 핸들러 프로그램의 시작 주소로 설정
  2. 사용자 모드를 커널 모드로 전환시켜 인터럽트 처리 코드가 특권 명령어(privileged instruction) 을 수행할 수 있도록 함
    의 작업을 수행한다.

이 과정에서 인터럽트된 프로세스 문맥은 인터럽트된 프로그램의 프로세스 제어 블록에 저장된다. 처리기 상태 정보, 프로그램 차운터와 처리기의 다른 레지스터들의 내용, 스택 정보 등이 저장된다.

이렇게 계속 반입 단계를 계속 수행하여 인터럽트를 처리하는 인터럽트 핸들러 프로그램은 인터럽트가 존재하는지를 나타내는 플래그나 지시자(indicator)를 초기화시킨다.
이후 인터럽트 핸들러가 오류 조건을 검사하고 오류가 발생되었다면 입출력 동작을 요구한 프로세스에게 시그널을 보내거나, 클럭 인터럽트의 경우는 제어를 스케줄러에 넘겨주게 된다.

그렇다고 인터럽트 발생이 항상 프로세스 교환이 필요한 것은 아니다. 인터럽트 핸들러가 수행된 후 현재 수행중인 프로세스의 처리기 상태 정보를 저장한 후 인터럽트 되었던 프로그램으로 제어가 다시 넘어왔을 때 현재 수행 중인 프로세스의 정보를 복구하여 재개될 가능성도 있다. 주로 이러한 저장과 복구 기능은 하드웨어적으로 이루어진다.

프로세스 상태 변경

모드 전환은 현재 수행 상태에 있는 프로세스의 상태를 바꾸지 않고 수행될 수 있다는 점에서 프로세스 교환과는 다른 개념이다.

모드 전환 과정에서 문맥을 저장하거나 나중에 복구할 때 생기는 오버헤드는 거의 없지만 현재 수행상태인 프로세스가 다른 상태(준비 상태 or 블록 상태 등)로 전이되면, 운영체제의 환경은 크게 변경된다.

완전한 프로세스의 교환 순서는 아래와 같다.

  1. 프로그램 카운터와 다른 레지스터들을 포함한 처리기 문맥 저장
  2. 현재 수행 상태의 프로세스 제어 블록 갱신 후 다음 상태(준비 상태,블록 상태, 준비/보류 상태, 종료 상태)로 전이
  3. 해당 프로세스의 프로세스 제어블록을 적절한 큐(준비큐, 블록큐, 준비/보류 큐 중 1)로 옮김
  4. 다음에 수행시킬 다른 프로세스 선택
  5. 선택된 프로세스의 프로세스 제어블록 갱신. 수행 상태로 전이
  6. 메모리 관리와 관련된 자료구조 갱신
  7. 선택된 프로세스가 이전의 수행 상태에서 사용했던 처리기의 문맥 복원(이전에 저장했던 처리기 문맥의 값을 처리기로 적재)

이러한 프로세스의 상태 전이를 거치므로 프로세스 교환은 모드 전환에 비해 상당히 많은 작업을 요구한다.

profile
문이과 통합형 인재(人災)

0개의 댓글