[운영체제] 4. 프로그램의 구조, 실행 과정? Easy with TMI
<운영체제 TIL 목록>
1. 운영체제란? 목적? 분류?
2. 인터럽트란? 컴퓨터 시스템 동작원리로 알아보자.
3. 하드웨어, 메모리 및 메모리 보안 방법?
4. 프로그램의 구조, 실행 과정?
5. 인터럽트, 문맥 교환(컨택스트 스위칭) 정의와 차이?
6. 프로세스란? 6가지 상태? PCB?
7. 스레드, 멀티스레드란? 프로세스와의 차이?
8. CPU 스케줄링란? 종류 평가 기준?
9. ''업데이트 예정'
1. 프로그램 구조
- 프로그램의 구조에 대해 알려면 우선 프로세스에 대해 알야한다. 프로세스란 프로그램이 실행되기 위해 메모리에 공간을 할당 받은 프로그램을 프로세스라고 한다. 이때 해당 프로세스가 cpu를 할당 받아 Instruction을 실행하면, 이를 '프로세스가 실행중이다.'라고 말한다. 그렇다면 메모리에 올라간 프로그램의 구조는 어떻게 될까?
기본적으로 모든 프로세스는 코드/데이터/스택 공간을 가진다.
- 사용자 프로그램
- 코드 영역: 사용자가 정의한 함수, 라이브러리 함수가 코드 영역에 컴파일 된 기계어 형태로 존재한다. CPU는 코드 영역에 있는 Instruction을 PC(Program counter)를 참조하여 실행한다.
- 데이터 영역: 전역 변수와 static 변수가 저장된다. 프로그램 혹은 클래스 실행 동시에 할당되고, 프로그램 종료시에 해제된다.
- 스택 영역: 프로그램이 사용하는 임시 메모리 영역이다. 함수 호출이 되면 탑이 쌓이듯이 아래 주소부터 데이터가 쌓이고 함수 호출이 종료되면 해제된다.
- 커널 영역
- 코드 영역: 운영체제의 코드가 저장돼있다. 운영체제의 목적은 자원 관리를 효율적으로 하는 것과 사용자에게 편리한 환경을 제공하는 것이다. 운영체제는 코드 영역에는 두가지를 이행할 수 있는 코드들이 있다(인터럽트 벡터 & 루틴, 타이머 설정 등).
- 데이터 영역: 하드웨어(cpu, memory, disk) & 소프트웨어 관리를 위한 자료구조가 저장된다. 소프트웨어 관리를 위한 자료구조는 PCB(Process control block)를 사용한다. 각 프로세스마다 PC및 스택 등의 상태가 다르기 때문에 다른 PCB를 가지고 있다.
- 스택 영역: 각 프로세스가 커널에서 실행된 데이터를 저장한다. 프로세스들이 하나의 커널 스택을 공유하면 공유자원 접근 문제가 발생한다. 프로세스A가 커널 영역 코드를 실행중일 때 우선순위가 높은 프로세스B의 인터럽트가 발생하게 되어 스택의 내용을 바꿀 수 있기 때문이다. 물론 data 영역에 대한 공유자원 문제는 다른 문제다.(추후 업데이트 예정)
2. 사용자 프로그램이 디스크 파일에 접근하려 할때?
- 답: 사용자 프로그램이 직접 cpu의 인터럽트 라인에 시스템 콜 인터럽트를 설정한다.
- 왜?: 이때 사용자 프로그램은 직접 데이터를 읽어오지 못한다. 자신의 메모리 이외의 메모리에 접근하는 것은 보안이 보장되어야하는 작업이기 때문이다.
- 과정?:
- 사용자 프로그램 혹은 프로세스가 I/O 장치의 데이터가 필요하거나 디스크 파일로부터 데이터를 읽어들여야할 수도 있다.
- 사용자 프로그램이 직접 cpu의 인터럽트 라인에 시스템 콜 인트럽트를 설정한다.
- cpu가 현재 읽던 Instruction 실행 후 인터럽트 라인을 살펴본다. 인터럽트 인식 후 사용자 모드는 커널모드로 변경되고 운영체제로 cpu의 권한이 이양된다.
- 운영체제는 시스템 콜한 프로그램의 PCB 프로세스의 상태를 저장한다.
- 운영체제는 인터럽트 벡터->인터럽트 루틴(핸들러)로 가서 I/O 관련 코드를 실행한다.
- 운영체제가 cpu를 가지고 해당되는 I/O 장치로 가서 장치의 Controller에게 명령을 전달한다.
- I/O 데이터 얻는 과정이 동기형으로 실행되는 경우 cpu 사용 효율을 위해 운영체제는 다른 프로세스에게 cpu를 넘긴다. I/O 데이터 획득 과정이 비동기로 실행되는 경우, 운영체제는 시스템 콜을 한 프로그램에게 cpu를 재할당한다.
- 프로세스 상태?:
동기식 I/O와 비동기식 I/O에 따라 프로세스 상태 진행도가 달라진다. CPU의 사용 문맥이 달라지기 때문이다. 기본적으로 프로세스가 cpu를 잡고 Instruction을 실행중인 상태를 사용자 모드의 Running state라고 부른다. 이후 system call을 프로세스가 발생시키면 cpu는 커널 모드로 바뀐다. 이때는 커널 모드의 Running state라고 한다. cpu 이행 권한이 커널로 바뀌었지만 진행되는 코드 실행이 사용자 프로세스를 위한 것이기 때문에 '사용자 프로세스가 커널 모드의 Running state'에 있다고 한다. 이후 상태는는 I/O의 작동 방식에 따라 달라진다.
- 동기식 I/O에서의 프로세스 상태 진행도: 동기식 I/O에서는 I/O 작업 요청 이후 결과 데이터와 프로세스의 데이터를 동기화 해야 프로세스의 다음 Instruction이 실행될 수 있기 때문에 cpu의 효율을 고려하여 Ready queue에 있는 다음 프로세스로 cpu가 할당된다.
- 비동기식 I/O에서의 프로세스 상태 진행도: 비동기식 I/O에서는 프로세스 Instruction이 결과 데이터와 무관하게 실행될 수 있기 때문에 system call을 요청한 프로세스로 cpu가 재할당된다.