운영체제

시스템 구조 및 프로그램의 실행 Part1

whitedeveloper 2023. 3. 5. 02:24

#.컴퓨터 시스템의 구조

-컴퓨터 : CPU + Memory(cPU 작업공간)

  > CPU : Memory의 instruction 사용, interrupt line 확인 과정 반복

    >> 컴퓨터 on : os가 가지고 있음

    >> register : 정보를 저장하는 공간

    >> mode bit : cpu 안에서 사용되는 것이 운영체제인지 사용자 프로그램인지 구분하는 것

    >> interrupt line : cpu로 현재 수행 중인 모든 작업을 중지하고 다른 작업을 수행하도록 지시하는 신호

                                하나의 instruction 마친 후, interrupt 발견될 경우 cpu가 사용자 프로그램으로부터 자동 os로 넘어감

    >> I/O device : Disk, 키보드 모니터 등등

                            각 I/O device 마다 device controller(작은 cpu + local buffer)

 

#.mode bit 

- 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호장치

-mode bit 통해 하드웨어적으로 두 가지 모드 operation 지원

  > 커널 모드(모니터 모드, 시스템 모드) : os 코드 수행

    >> os에서 cpu를 가지고 있는 경우

    >> 모드 비트가 0 으로 세팅되어 있으며, 모든 명령 수행할 수 있음

  > 사용자 모드 : 사용자 프로그램 수행 

    >> 사용자 프로그램이 cpu를 가지고 있는 경우

    >> 모드 비트가 1 로 세팅되어 있으며, 제한된 명령 수행할 수 있음

  > 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 "특권명령"으로 규정

  > interrput 나 Exception 발생 시 하드웨어가 mode bit을 0으로 바꿈

  > 사용자 프로그램에게 cpu를 넘기기 전에 mode bit 1로 셋팅

 

#.Timer

- 특정 프로그램이 cpu를 독점하는 것을 막기 위함

  > 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 interrupt 발생

  > 매 클럭 틱 때 마다 1씩 감소

  > 값이 0 이 되면 timer interrupt 발생

- cpu 의 time sharing 구현하기 위해 널리 이용됨

- 현재 시간을 계산하기 위해 사용

 

!!간단 정리

컴퓨터 켰을 경우 : 운영체제가 cpu 가지고 있음

사용자 프로그램이 실행될 경우 timer에게 어떤 값을 설정한 후, cpu 넘겨줌

사용자 프로그램 A 이 실행

  • I/O device 사용이 필요할 경우 사용자프로그램이 interrupt를 걸어서 cpu를 os에게 넘겨줌
    • os가 device controller에게 해당 작업을 명령
    • device controller 의 요청한 작업이 끝나기전까지 다른 프로그램 B 에게 cpu를 넘김
    • 언제 다시 cpu를 얻는지 ?
      • device controller 의 요청한 작업이 끝나서 interrupt를 보냄
        • interrupt가 들어올 경우 다른 프로그램이 실행중이더라도 cpu 제어권 os에게 넘어감 ?
      • B 프로그램의 남은 timer 만큼 돌린 후, A 프로그램을 실행 (스케줄링 종류에 따라 다름)
  • timer 시간안에 실행이 될 경우
    • cpu는 다음 instruction 을 실행
  • timer 시간안에 실행되지 않는 경우
    • timer에서 cpu에게 interrupt 보냄
    • cpu는 실행중이던 instruction 끝낸 후 interrupt line 확인함 interrupt 확인이 되면 cpu를 자동 os로 넘김
    • 다음 프로그램에게 timer 를 세팅해서 cpu를 넘겨줌

 

#.Device Controller

- Device Controller는 I/O 장치들을 전담하는 작은 cpu이며, 제어 정보를 위해 Controller register, status register를 가진다.

- 장치들에게 입출력할 실제 데이터를 저장하는 local buffer를 가짐

- 메인 메모리는 cpu에만 접근하고 I/O 장치에는 직접 접근하지 않는다. 각 장치들을 통제하는 것은 CPU가 아닌 Device Controller

 

! - I/O장치들이 너무 자주 인터럽트를 발생시키면 빠른 장치인 CPU가 성능을 발휘하지 못한다. 이를 해결하기 위해 *DMA Controller를 사용

 

-Device Controller(장치 제어기)는 각 장치를 통제하는 일종의 작은 CPU인 하드웨어

-Device Driver(장치 구동기)는 OS 코드 중 각 장치를 처리하기 위해 접근할 수 있는 인터페이스를 제공하는 소프트웨어

 

#.입출력과 인터럽트(Input- Output and interrupt)

 

- 사용자 프로그램이 cpu를 사용하다가  입출력이 발생하면 I/O장치에 직접 접근하지 못하고 운영체제를 통해 접근해야한다. 그러면 사용자 프로그램은 자진해서 운영체제에 입출력을 수행해달라고 CPU를 넘겨준다. => *시스템 콜(System Call)

 

-인터럽트란?

  > 프로그램을 실행하는 도중에 예기치 않은 상황(입출력 등)이 발생할 경우 현재 실행 중인 작업을 중단하고, 발생된 상황에 대한 우선 처리가 필요함을 CPU에 알리는 것

  > 입출력 연산이 CPU 명령 속도보다 현저히 느리기 때문에, 주변장치와 입출력 장치는 인터럽트 메커니즘을 통해 관리된다.

 

  > 인터럽트는 2 가지 종류로 분류 

    >> 하드웨어가 발생시킨 인터럽트

    >> 소프트웨어가 발생시킨 인터럽트(Trap)

      >>> Excption : 프로그램이 오류를 범한 경우

      >>> System call : 프로그램이 커널 함수를 호출하는 경우

 

-인터럽트 서비스 루틴(ISR) : 인터럽트를 처리하는 커널 함수, 운영체제의 코드 영역에는 인터럽트 별로 처리해야하는 내용이 존재 = 인터럽트 핸들러

 

- 인터럽트 벡터 : 인터럽트 서비스 루틴의 보관 공간, 해당 인터럽트의 처리 루틴 주소를 가지고 있다.

 

인터럽트 과정

  1. process A가 실행 중
  2. process A가 시스템 콜을 통해 (ex. 키보드 입력) 인터럽트 발생
  3. 현재 실행중인 프로세스 정보(문맥)를 저장(PCB에 저장)
  4. 인터럽트 백터에서 해당 ISR을 찾는다.
  5. 키보드 처리를 위한 ISR 주소로 변경
  6. 키보드 인터럽트 처리
  7. ISR의 끝에 IRET(Interrupt Return) 명령어에 의해 인터럽트가 해제
  8. IRET 명령어가 실행되면, 대피시킨 PC(Program Counter) 값을 복원하여 이전 실행 위치로 복원

#. 시스템 콜 (System call)

- 사용자 프로그램이 운영체제의 서비스를 받기 위해 부탁하는 것. 즉. 사용자 프로그램이 운영체제의 커널 함수를 호출하는 것

 

- 운영체제는 커널 모드와 사용자 모드로 나뉘어 구동

- 운영체제에서 프로그램이 구동되는데 있어 파일을 읽고 쓰거나, 화면에 메세지를 출력하는 등 많은 부분이 커널 모드를 사용

-시스템 콜은 이러한 커널 모드의 영역을 사용자 모드가 사용 가능하게, 즉 프로세스가 직접 접근해서 필요한 기능을 사용할 수 있게 해줌

 

? - 시스템 콜은 왜 필요할까?

-우리가 일반적으로 사용하는 프로그램은 응용프로그램이다.

-유저 레벨의 프로그램은 유저레벨의 함수들만으로는 많은 기능을 구현하기 힘들기 때문에, 커널의 도움을 반드시 받아야한다, 이러한 작업은 응용프로그램으로 대표되는 유저 프로세스에서 유저 모드에서는 수행 불가

-반드시 커널에 관련된 것은 커널 모드로 전환해야 해당 작업을 수행할 *권한이 생긴다.  커널 모드를 통한 이러한 작업은 반드시 시스템 콜을 통해 수행하도록 설계되어 있다.

 

*권한은 왜 필요한가?

-해커가 피해를 입히기 위해 악의적으로 시스템 콜을 사용하는 경우나 초보 사용자가 하드웨어 명령어를 잘 몰라서 아무렇게 함수를 호출했을 경우, 시스템 전체를 망가뜨릴 수 있기 때문

-이러한 명령어들은 특별하게 커널 모드에서만 실행할 수 있도록 설계되었고, 만약 유저 모드에서 시스템 콜을 호출할 경우에는 운영체제에서 불법적인 접근이라 여기고 trap을 발생시킨다.

 

- 시스템 콜 예시

- cp in.txt out.txt

-윈도우 운영체제라면 마우스가, 리눅스라면 키보드가 사용자로부터 입력을 받는데 이 때 I/O 시스템 콜을 사용

-위와 같은 문장을 입력 받아서 ‘cp’ 프로그램을 실행시키면 먼저 ‘in.txt’ 파일이 현재 디렉토리에서 접근할 수 있는 파일인지 검사하기 위해 시스템 콜을 호출

-존재하지 않는다면 에러를 발생시키고, 프로그램을 종료하는데 이 때 시스템 콜을 사용

-존재한다면, 복사한 파일을 저장하기 위해 ‘out.txt’ 파일명이 있는지 검사

-마찬가지로 이 파일 명이 존재하는지 검사하기 위해 시스템 콜을 통해 확인

파일 명이 이미 존재한다면, 덮어 씌워야 할지 아니면, 이어서 붙여야 하는지 User에게 물어볼 수 있습니다. 만약 저장하고자 하는 파일 이름이 겹치지 않다면, 파일을 저장해야 하는데 이 때도 시스템 콜을 이용합니다.