프로그램 구조와 실행 [운영체제 정보 기술의 원리 4장]

Sanghoon Han·2022년 1월 9일
0
post-thumbnail

1. 프로그램의 구조와 인터럽트

주소 영역, 코드, 데이터, 스택 영역으로 구분

코드영역

  • 우리가 작성한 프로그램 함수들의 코드가 cpu에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되어 지는 부분

데이터 영역

  • 전역 변수(global varibal) 등 프로그램이 사용하는 데이터를 저장하는 부분

스택영역

  • 함수가 호출될 때 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터를 임시로 저장하는 데에 사용되는 공간

논리 정리

메인함수에서 실행 → 메인함수 다른함수 호출 → CPU 수행 위치 이동

→ 새로운 함수 위치로 점프및 실행→ 함수 수행 완료 → 원래 호출했던 함수 위치로 돌아옴

💡 돌아와야 하는 지점을 스택에 저장

⭐️ 인터럽트와 차이

  • 인터럽트 → 돌아갈 위치 PCB에 저장
  • 함수 → 스택에 저장

2. 프로그램 시스템의 작동 개요

CPU는 계산 속도는 빠르나 스스로 결정하는 능력은 없음
매 시점 메모리의 특정 주소에 존재하는 명령을 하나씩 읽어와 그대로 실행할 뿐

프로그램 카운터

  • CPU가 수행해야 할 메모리 주소를 담고 있는 레지스터

일반적으로 조건문, 반복문, 함수호출 등에 의한 주소 이동이 없는 이상 프로그램 카운터는 항상 바로 다음 명령을 가리키게 되어 코드의 순차적인 수행이 이루어 진다.

컴퓨터 시스템 동작이 CPU뿐 아니라 디스크에서 파일을 읽어오기도 하고 키보드로부터 입력을 받거나 처리 결과를 화면에 출력함

출력 컨트롤러

  • 입출력 장치별로 존재하는 작은 CPU

로컬버퍼

  • 입출력 장치별로 존재하는 작은 메모리

일반명령

  • 메모리에서 자료를 읽어와 CPU에서 계산하고 결과를 메모리에 쓰는 일련의 명령
  • 모든 프로그램이 수행할 수 있는 명령

특권명령

  • 운영체제만이 수행할 수 있도록 제한함
  • 보안이 필요한 입출력 장치, 타이머 등 각종 장치에 접근하는 명령

💡 이 두 명령의 실행가능성을 체크하기 위해 CPU 내에 모드비트를 둠

3. 프로그램의 실행

‘프로그램이 실행되고 있다’는 것은 컴퓨터 차원에서 볼 때 크게 두가지 중요한 의미를 가진다

첫 번째는 디스크에 존재하던 실행파일 이 메모리에 적재된다는 의미.

두 번째는 프로그램이 CPU를 할당받고 명령(instruction)을 수행하고 있는 상태라는 의미

💡 시간 단위로 CPU를 나누어 쓰고, 이를 프로그램이 메모리에 동시에 적재되어 있을 수 있으므로 여러 프로그램이 동시에 실행된다는말을 보편적으로 사용하는 것이다.

실행파일이 메모리에 적재될 때 실행파일 전체가 메모리에 한꺼번에 올라가기보다는 일부분만 메모리에 올라가고 나머지는 디스크의 특정 영역에 내려가 있는 것이 일반적임

가상메모리

  • 프로그램마다 독자적으로 존재하는 이와 같은 주소 공간을 가상메모리, 논리적 메모리라고 부름
  • 실제 물리적 메모리의 주소와 독립적으로 각 프로그램마다 독자적인 주소 공간을 가지기 때문

커널의 주소 공간

  • 하드웨어 자원을 효율적으로 관리
  • 사용자에게 편리한 서비스를 제공
  • 인터럽트 시스템 콜을 처리하기 위한 부분

커널의 데이터 영역

  • 각종 자원을 관리하기 위한 자료구조 저장

프로세스

  • 현재 수행 중인 프로그램임

커널의 스택

  • 일반 사용자 프로그램의 스택과 달리 현재 수행 중인 프로세스마다 별도의 스택을 두어 관리한다.
  • 이는 프로세스가 함수를 호출할 때 주소 영역 내부에 정의된 함수를 호출하면 자신의 스택에 복귀 주소를 저장하지 못함
  • 시스템 콜 내부에서 다른 함수를 호출 하는 경우 그 복귀 주소는 커널 내의 주소가 되어 사용자 프로그램의 스택과는 별도의 저장공간이 필요하게 됐음
  • 커널은 일종의 공유 코드로써 일관성 유지를 위해 각 프로세스마다 커널 내의 별도의 스택을 두었음

정리

  • 프로그램이 자기 자신의 코드 내에서 함수호출 및 복귀 주소를 유지하기 위해서는 자기 주소 공간 내의 스택을 활용
  • 시스템 콜, 인터럽트 등으로 운영체제의 코드가 실행되는 중에 함수호출이 발생할 경우 커널 스택을 사용하게 됨

4. 사용자 프로그램이 사용하는 함수

  • 사용자 정의함수
  • 라이브러리 함수
  • 커널함수

사용자 정의함수

  • 프로그래머 본인이 직접 작성한 함수
  • 누군가 작성해놓은 함수를 호출만 하여 사용하는 경우
  • 이 두 함수는 프로그램이 실행 될 때에 해당 프로세스의 주소 공간에 포함되며, 또한 함수호출 시에도 자신의 주소 공간에 있는 스택을 사용함

커널 함수

  • 커널의 코드에 정의된 함수를 뜻함
  • 운영체제의 서비스를 요청하기 위해 호출하는 시스템 콜
  • 각종 하드웨어 및 소프트웨어가 CPU의 서비스를 요청하기 위해 발생시키는 인터럽트 처리 함수
  • 사용자 프로그램의 주소 공간에 그 코드가 존재하는 것이 아니라 운영체제 커널의 주소 공간에 코드가 정의됨
  • 운영체제 내에 있는 함수를 사용자 프로그램이 호출해서 사용하는 것이다.

5.인터럽트

CPU는 매번 프로그램 카운터가 가리키고 있는 지점의 명령을 하나씩 수행하고 나서, 다음 명령을 수행하기 직전에 인터럽트 라인이 세팅되어있는지 체크함

인터럽트 처리 중에 다른 인터럽트가 발생하는 경우엔?

  • 원칙적으로는 인터럽트 처리 중에 또 다른 인터럽트가 발생하는 것을 허용하지 않음
  • 왜냐하면 인터럽트 처리 중에 다른 인터럽트를 처리하면 데이터의 일관성이 유지되지 않는 문제가 발생할 수 있음

예외 필요성!

  • 인터럽트가 발생해 현재 인터럽트 처리루틴을 수행하고 있지만, 그보다 더 시급하거나 CPU를 당장 사용해야 하는 일이 발생할 수 있기 때문
  • 인터럽트마다 중요도가 다르기 때문에 상대적으로 낮은 중요도를 가진 인터럽트를 처리하는 도중에 중요도가 더 높은 인터럽트가 발생하는 것을 허락할 필요가 있음
  • 더 높은 우선순위의 인터럽트 발생
  • 현재 처리 중이던 인터럽트의 코드 수행 지접을 저장
  • 우선순위가 높은 인터럽트를 처리
  • 저장된 주소로 복귀해 이전에 수행하던 인터럽트 처리 코드를 마저 수행

6.시스템 콜

  • 모든 프로그램은 자기 자신의 독자적인 주소 공간을 가지고 있음
  • 프로그램이 함수호출을 하는 경우 자신의 주소 공간 내에서 호출이 이루어지게 됨
  • 시스템 콜 → 함수호출 하지만 자신의 주소 공간을 거스르는 영역에 존재하는 함수를 호출함

    커널이라는 다른 프로그램의 주소 공간에 존재하는 함수를 호출하는 것

  • 다른 공간으로 이동 해야하기에 프로그램 자신이 인터럽트 라인에 인터럽트를 세팅
  • 디스크 컨트롤러에게 파일을 읽어오라는 명령을 하게 됨
  • 디스크에서 데이터를 읽어오는 일은 cpu가 명령을 수행하는 일과 비교할 때 상대적으로 많은 시간이 소요됨
  • cpu를 넘기지 않고 갖고 있는것은 매우 비효율 적
  • cpu의 제어권을 다른 프로세스에게 이양함
  • 작업 완료
  • 인터럽트 입출력 작업 완료!
  • 해당 프로세스 cpu기다리는 큐에 삽입됨

💡 중간에 cpu뺏기는 경우 2가지
1. 타이머
2. 시스템 콜

7.프로세스의 두 가지 실행상태

사용자모드에서의 실행 상태

커널모드에서의 실행 상태

  • 비록 시스템 콜을 통해 실행되는 것이 프로세스 A의 코드가 아닌 운영체제 커널의 코드이지만, 시스템 콜이 수행되는 동안 커널이 실행 상태에 있다고 하지 않고 프로세스 A가 실행 상태에 있다고 말하는 점임
  • 시스템 콜이 실행 중일 때에도 여전히 프로세스 A는 실행상태에 있는 것으로 간주 함
  • ‘프로세스 A가 커널모드에서 실행 중’

Refernce

반효경, 운영체제와정보기술의원리, 이화여자대학교출판문화원, 2020.05.04, p95~112

profile
Fail Fast learn Faster

0개의 댓글