개발에 대한 기본 지식/운영체제
[OS] - 운영체제 (프로그램의 구조와 실행)
쿠쿠트레인
2023. 11. 27. 13:28
- 목차 -
1. 프로그램의 구조와 인터럽트
2. 컴퓨터 시스템의 작동 개요
3. 프로그램의 실행
4. 사용자 프로그램이 사용하는 함수
5. 인터럽트
6. 시스템 콜
7. 프로세스의 두 가지 실행 상태
1. 프로그램의 구조와 인터럽트
- 프로그램의 구조 (CPU 명령 수행 시, 명령 담은 프로그램 주소 영역이 메모리에 올라가 있어야 함)
- 주소 영역
- 코드 : 프로그램 함수들의 코드 => 기계어 명령 형태로 변환되어 저장
- 데이터 : 전역 변수 등 프로그램이 사용하는 데이터 저장
- 스택 : 함수 호출 시, 함수 수행후 복귀할 주소 및 데이터 임시 저장
- 인터럽트 (함수 호출과 비슷)
- 인터럽트 때문에 CPU를 빼앗긴 위치는 운영체제가 관리하는 PCB(프로세스 제어 블록)에 저장
- 인터럽트가 발생하면 PCB에 해당 프로그램의 수행 위치를 저장
- 인터럽트 처리 후 PCB에 저장된 주소를 복원시켜 원래 하던 일을 재개
2. 컴퓨터 시스템의 작동 개요
- 프로그램 카운터 PC(Program Counter) : CPU가 수행해야 할 메모리 주소 담고 있는 레지스터
- 컴퓨터 시스템 장치
- 하드웨어(CPU, Memory) , 입출력 장치, 입출력 컨트롤러, 로컬버퍼
- 커널모드(kernel mode) : CPU가 OS의 코드 수행중일 경우
- 사용자모드(user mode) : 사용자 프로그램이 존재하는 메모리 위치를 수행 중일 경우
- CPU 명령
- 일반명령 : 모든 프로그램이 수행할 수 있는 명령
- 특별명령 : 보안이 필요한 명령으로 각종 장치에 접근하는 명령 (시스템 콜)
3. 프로그램의 실행
1. 디스크에 존재하던 실행파일이 메모리에 적재
2. 프로그램이 CPU를 할당받고 명령(instruction)을 수행하고 있는 상태
보통 프로그램은 파일 시스템(비휘발성 디스크)내에 실행파일 형태로 저장
실행파일을 실행 시, 메모리에 올라가 프로세스가 됨
(가상 메모리를 거쳐 물리적 메모리로 올려 실행시킴, 논리적 메모리 주소가 물리적 메모리 주소로 변환됨)
1) 프로그램 실행 시 독자적인 메모리 주소공간(code, data, stack영역) 생김
- code - 기계어 코드를 담고 있음
- data - 변수 / 자료구조를 담고 있음
- stack - 데이터를 쌓거나 빼가는 용도
2) 당장 필요한 것만 물리적 메모리에 올림, 아닐 경우 Swap area(메인 메모리의 연장공간, 전원 나가면 종료)
+ 부팅 시, 커널영역
- code (커널 코드)
- 시스템콜, 인터럽트 처리 코드
- 자원 관리를 위한 코드
- 편리한 서비스 제공을 위한 코드
- data (운영체제가 사용하는 자료구조들)
- CPU, memory, disk와 같은 HW를 관리하기 위해 각각의 자료구조를 갖고 있음.
- 프로세스들을 관리하기 위해 각 프로세스마다 자료구조(PCB)를 갖고 있음.
- stack (함수 호출 시 사용)
- 사용자 프로그램마다 커널스택을 따로 갖고 있음.
4. 사용자 프로그램이 사용하는 함수
- 사용자 정의 함수
- 자신의 프로그램에서 정의한 함수 (내가 직접 작성한 함수를 불러와 씀)
- 라이브러리 함수
- 자신의 프로그램에서 정의하지 않고 가져다 쓴 함수
=> 사용자 정의 함수와 라이브러리 함수 둘 다 자신의 프로그램 실행파일에 포함되어 있음
(사용자 프로세스의 code영역 내에서 점프하며 실행)
- 커널 함수
- 운영체제 프로그램의 함수. 내가 갖고있지 않고, 커널 함수를 호출해(virtual memory 내에서 점프할 수 없으므로, interrupt line을 세팅하고 시스템 콜) 씀
5. 인터럽트
- 인터럽트 처리 중에 또 다른 인터럽트가 발생하는 것은 허용하지 않음
=> 데이터의 일관성이 유지되지 않는 문제가 발생할 수 있기 때문
- 예외가 존재
=> 인터럽트를 수행하고 있지만 더 시급하거나 CPU를 당장 사용해야 하는 일이 발생 할 수 있음
6. 시스템 콜
- 시스템 콜이란? => '운영체제가 제공하는 서비스에 대한 인터페이스’를 사용자에게 제공
- c,c++ 로 작성된 루틴 형태 제공
- '직접적인 시스템 콜 사용' 대신 'API(Application Program Interface)' 통해 접근
(이 때 API는 시스템 콜 사용할 수 있도록 하는 API 뜻함)
- 시스템 콜 구현
- 각 시스템 콜에 대해, 숫자(index)가 부여
- 시스템 콜 인터페이스가 ‘시스템 콜 테이블’을 관리
- 시스템 콜 인터페이스
- 운영체제 커널 내에 있는 요청된 시스템 콜을 요청
- 시스템 콜의 반환 상태와 해당 반환 값을 반환
7. 프로세스의 두 가지 실행 상태
- 사용자모드에서의 실행 상태(user mode running)
=> 자신의 주소 공간에 있는 코들르 실행하는 상태 - 커널모드에서의 실행 상태(kernel mode running)
=> 커널의 시스템 콜 함수를 실행하는 것
- 프로그램이 시작되어 종료될 때까지 다양한 함수를 호출하는 것 (사용자모드와 커널모드의 실행 상태로 구분)
- 프로그램의 실행이 끝날 때에는 커널 모드로 진입해 프로그램을 종료
출처