호우동의 개발일지

Today :

  • 다섯 가지 중요한 범주로 묶을 수 있음
    프로세스 제어, 파일 조작, 장치조작, 정보 유지 보수, 통신보호

1. 프로세스 제어

  • 실행 중인 프로그램은 수행을 정상적 또는 비정상적으로 멈출 수 있어야 한다.

 


시스템 종류에 따른 제어 차이

  • 정상 또는 비정상적인 상황에서, 운영체제는 명령 인터프리터로 제어를 전달한 상태
    ← 사실 운영체제는 명령 인터프리터로 제어를 전달해야 함
  • 대화식 시스템
    • 단순히 다음 명령을 계속 수행
    • 사용자가 오류에 대응하여 적절한 명령을 내릴 것이라고 가정함(사용자에게 맡김)

  • GUI 시스템
    • 비정상적인 상황이라면, 팝업창이 사용자에게 오류를 알리고 지시를 기다림

  • 기타 시스템
    • 오류가 발생한 경우, 제어 카드를 사용하여 특별한 복구 조치를 지시
    • 오류 발견 뒤 비정상적으로 종료하기를 원한다면, 프로그램 오류 수준을 정의할 수도 있음
      • 더 높은 등급의 오류 매개변수를 전달함으로써 더 치명적인 오류를 나타냄
      • 정상 종료를 등급 0의 오류로 정의하여 정상 종료와 비정상 종료를 결합
        → 명령 인터프리터는 오류 등급을 사용하여 다음 행동을 자동 결정 가능

 


적재(load) 후, 실행(execute)

  • 한 프로그램을 실행하고 있는 프로세스가 다른 프로그램을 적재(load)하고 실행할 수 있음
    • ex : 명령 인터프리터의 사용자 명령, 마우스 클릭 이벤트로 프로그램 실행

  • 적재된 프로그램이 실행되는 방식
    1. 기존 프로그램이 유실 → 적재된 프로그램 실행
    2. 기존 프로그램이 보관 → 적재된 프로그램 실행
      • 적재된 프로그램 종료 시 제어가 기존 프로그램으로 돌아감
        • 한 프로그램이 다른 프로그램을 호출하는 기법
        • 해당 방식을 사용하기 위해서는 기존 프로그램의 메모리 이미지를 미리 보관해야 함

    3. 두 프로그램이 병렬(동시에)하게 수행
      • 다중 프로그래밍할 새로운 프로세스를 생성한 것 → 프로세스의 집합 형성
      • 프로세스 집합의 실행을 제어할 수 있어야 함 → 프로세스 제어 능력이 중요함

 


프로세스 제어

  • 잡(job) 혹은 프로세스의 속성들을 결정하고 재설정할 수 있는 능력이 필요
    • 예 : 잡의 우선순위 설정, 최대 허용 실행 시간 설정
    • get-process_attributes() , set_process_attri-butes

  • 생성한 잡이나 프로세스를 종료할 수 있다.
    • 종료하는 이유 → 프로세스나 잡이 잘못되었거나 더 이상 필요 없기 때문
    • terminate_process()

  • 프로세스를 생성 후, 해당 프로세스 실행이 종료될 때까지 기다릴 수 있어야 한다. → wait_time()
    • cf. 특정 이벤트가 일어날 때까지 가다는 것 → wait_event()
      • 이 경우, 프로세스들은 이벤트가 발생하면 신호를 줘야 함 → signal_event()
      • wait_time보다 발생 가능성이 더욱 큰 경우임

  • 운영체제는 프로세스가 공유 데이터를 잠글(Lock) 수 있는 시스템 콜을 제공
    → 잠금이 해제될 때까지 어떤 프로세스도 데이터에 접근할 수 없음
    • 공유되는 데이터의 일관성을 보장하기 위해 제공
    • 시스템 콜 : acquire_lock() release_lock()

 


파일 관리

  • 파일을 생성(create())하고 삭제(delete()) 할 수 있어야 한다.
    • 해당 시스템 콜은 파일 이름이나 파일 속성의 일부를 요구

  • 열고(open()), 닫을(close()) 수 있어야 한다.
  • 읽고(read()), 쓸 수( write()) 있어야 한다.
    • 쓰는 과정에서 위치변경(re-position())(예를 들어 되감기(rewind())를 할 수 있다.

  • 파일을 조직하기 위한 디렉터리 구조를 가진다면 연산 집합이 필요함
  • 파일이나 디렉터리에 대해 속성의 값을 결정할 수 있어야 하고 재설정 가능해야 함
    • 파일의 속성 : 파일 이름, 유형, 보호 코드, 회계 정보 등
    • 이러한 기능을 위해 최소한 파일 속성 획득(get_file_attribute()),
      파일 속성 설정(set_file_attribute())의 두 시스템 콜이 필요

  • 운영체제에 따라 파일에 관한 시스템 콜을 더 많이 제공할 수도 있고,
    다른 시스템 콜을 이용하여 동일한 작업을 수행하는 API를 제공할 수도 있다.

 


장치 관리

  • 운영체제에 의해 제어되는 다양한 자원들은 장치로 간주
    • 물리 장치 : 디스크 드라이브
    • 가상 장치 : 파일

  • 다수가 동시 사용하는 시스템은 독점 장치 사용을 보장받기 위해 그 장치를 요청(request()) 해야 함
  • 프로세스는 작업을 계속 수행하기 위해 추가 자원이 필요
    → 추가 자원을 주기억 장치, 디스크 드라이브, 파일에 접근해서 가져와야 함

  • 자원이 사용 가능하면 자원이 주어지고, “제어”가 사용자 프로그램으로 복귀가 된다.
    그렇지 않으면, 자원 사용이 가능해질 때까지 대기한다.
  • 장치(자원) 사용 과정
    1. 장치를 요청 후 할당받음
    2. 장치를 읽고, 쓰고, 어쨌든 사용
      • 파일의 시스템 콜과 비슷함
    3. 사용이 끝나면 그 장치를 반드시 방출(release())한다.

  • 파일-장치 구조(file device structure)
    • 시스템 콜이 파일과 장치에 대해 사용
    • 때때로 입출력 장치들은 특별한 파일 이름, 디렉터리 배치 또는 파일 속성으로 식별
    • 입출력 장치와 파일 간에 유사성이 매우 많기 때문에 가능

 


정보 유지 관리

  • 많은 시스템 콜은 단순히 사용자 프로그램과 운영체제 간의 정보 전달을 위해 존재
    • time()과 date() 시스템 콜

  • 많은 운영체제는 프로그램의 시간 프로파일(time profile)을 제공
    • time profile
      • 해당 프로그램이 특정 위치, 혹은 위치의 집합에서 수행한 시간의 양
      • 시간 프로파일은 추적설비 혹은 정규 타이머 인터럽트가 필요
        → 타이머 인터럽트가 발생할 때마다, 프로그램 카운터의 값이 기록

      • 타이머 인터럽트가 빈번하게 발생하면, 프로그램의 소비 시간을 통계적인 그림으로 확인 가능

  • 운영체제는 현재 운영되고 있는 모든 프로세스에 관한 정보를 가지고,
    이 정보에 접근하기 위한 시스템 콜 존재
    • get_process_attributes()set_process_attributes()

 


통신 - 2가지 모델

  1. 메시지 전달 모델
    • 통신하는 두 프로세스가 정보 교환을 위해 서로 메시지를 주고받음
    • 두 프로세스 사이에서 직접적 교환 혹은 우편함을 통한 간접적 교환 가능
    • 통신 전에 반드시 연결되어있어야 함
    • 어떤 상대 통신자이든 간에 반드시 호스트 이름을 알고 있어야 통신이 됨
      • 상대 통신자의 종류
        • 동일한 CPU에 있는 프로세스
        • 통신 네트워크에 의해 연결된 다른 컴퓨터에 있는 프로세스

      1. 호스트 이름과 프로세스 이름은 운영체제 의해 동등한 식별자로 변환됨
        • 호스트 이름 : 네트워크의 각 컴퓨터의 이름
        • 해당 식별자는 운영체제가 프로세스를 가리키는 데 사용
        • 이러한 시스템 콜 : get_hostid() get_processid()

      2. 이후, 식별자들은 통신 모델에 따라 구분되어 전달됨
        • 파일 시스템에 의해 제공되는 범용의 open()과 close() 호출에 전달
        • 특정 open_connection()과 close_connection() 시스템 콜에 전달

      3. 수신 프로세스는 통신이 일어나도록 자신의 허가를 제공 → 수신 디먼
        • 연결을 위해 대기호출을 수행하고 연결이 이루어질 때 깨어남

      4. 통신의 출발지(클라이언트)와 서버(수신 디먼)는 시스템 콜에 의해 메시지 교환
      5. close_connection() 호출로 통신 종료

  1. 공유 메모리 모델
  • 프로세스들은 공유 영역에서 데이터를 읽고 씀으로써 정보를 교환
  • 다른 프로세스가 소유한 메모리 영역에 대한 접근을 위해 시스템 콜을 사용하는 것
    • 시스템 콜 → shared_memory_create() , shared_memory_attach()

  • 정상적으로 운영체제는 한 프로세스가 다른 프로세스의 메모리에 접근하는 것을 막음
    → 공유 메모리는 이러한 제한을 제거하는 것
  • 데이터의 형식은 프로세스들에 의해 결정
  • 운영체제가 아닌 프로세스들이 동일한 위치에 동시에 쓰지 않도록 책임져야 함
  • 위 2가지 방법이 보편적이며, 시스템에서 둘 다 구현
    • 메시지 전달
      • 소량의 데이터를 교환할 때 유용 ← 피해야 할 충돌이 없기 때문
      • 메모리 공유보다 구현하기 쉽다.

    • 공유 메모리
      • 한 컴퓨터 안에서 메모리 전송 속도로 수행할 수 있음 → 최대 속도와 편리한 통신 제공
      • 보호와 동기화 부분에서 문제점

 


보호

  • 컴퓨터 시스템이 제공하는 자원에 대한 접근을 제어하기 위한 기법 지원
  • 초기 : 다중 프로그램 시스템에서만 고려되는 문제
    → 서버에서 휴대용 컴퓨터까지 모든 컴퓨터 시스템에서 보호를 고려해야 함

  • 보호를 지원하는 시스템 콜
    • set_permission() get_permission() : 자원의 허가 권한을 설정
    • allow_user() deny_user() : 특정 사용자가 지정된 자원에 대해 접근이 허가됐는지 명시