프로그램의 실행
- 주소 변환(Address translation) : 가상 주소를 실제 주소로 변환하는 행위
프로세스가 생성될 때는물리 주소(Physical memory)
에 생성되는데, 실제로 CPU는가상 메모리(Virtual memory)
를 통해 접근하기 때문에주소 변환(Address translation)
이 필요함 - 프로세스의 주소 공간(Process Address space)
- stack : 함수 내에서 사용되는 변수들
- data : 전역 변수, 배열 등
- code : 기계어 코드(main 함수, 사용자 정의 함수 등등)
커널 주소 공간의 내용
- code 영역
코드 영역에는 시스템콜로 인터럽트가 발생했을 때 어떤 함수들이 실행되어야 하는지와 커널 함수들이 저장됨
ex) - data 영역
- PCB : 프로세스들을 관리하기 위한 자료구조
- 하드웨어 관리 영역 : CPU, Memory, Disk 등을 관리하기 위한 데이터를 저장하는 영역
- stack
사용자 프로그램이 시스템콜을 호출하면, 각 프로세스마다 할당된 커널 스택에서 시스템콜 함수들의 스텍프레임이 쌓임
사용자 프로그램이 사용하는 함수
- 사용자 정의 함수
- 자신의 프로그램에 정의해놓은 함수
- 라이브러리 함수
- 자신의 프로그램에 넣은 라이브러리의 함수
- 컴파일 되면, 이 함수들도 프로세스의 코드 영역에 저장됨
- 개발 단계에서는 남의 코드지만, 컴파일된 후 실행 단계에서는 내 코드와 함께 저장되어 사용됨
- 커널 함수
- 운영체제 프로그램의 함수
- 커널 함수 호출 = 시스템 콜
- 주로 하드웨어와 관련있는 작업 수행을 위해, 커널 함수를 사용자 프로그램이 부름
프로그램의 실행
사용자 프로그램을 실행 하다가 시스템콜을 호출하면, mode bit이 커널 모드로 변경된다.
커널 모드 에서는 커널 함수를 실행하고, 완료되면 다시 사용자 모드로 변경한 뒤 사용자 프로그램에 결과를 전달한다.
프로세스
프로세스의 문맥
문맥(Context) : 현재 어떤 상태인가
하드웨어 문맥(CPU 실행 상태)
- Program Counter : 다음에 어떤 명령(함수)를 실행해야 하는가
- 각종 Register : 어떤 데이터들이 저장되어있고 계산되었는가
프로세스의 주소 공간(
code
,data
,stack
)
이 영역을 통해 다음과 같은 것들을 알 수 있습니다.- 어떤 함수를 실행했는가
- 함수에 어떤 부분을 실행중인가 등등
프로세스 관련 커널 자료구조
PCB(Process Control Block) : 각 프로세스의
PCB
가 저장되는 영역
프로세스의 현재 상태를 저장하는 영역으로 아래와 같은 정보들이 저장됩니다.- OS가 관리상 사용하는 정보
- 상태 :
생성
,준비
,실행
,대기
,종료
상태를 저장 - 프로세스 번호 : 프로세스 식별자(PID)를 저장
- 메모리 제한 : 할당된 메모리에 대한 정보(페이지 테이블 등의 정보들이 포함됨)
- 스케줄링 정보 : 운영체제의 프로세스 스케줄링 관련 정보
- 우선순위 : 프로세스 작업 우선순위 정보
- 상태 :
- CPU 수행 관련 하드웨어 값
- 프로그램 카운터 : 다음에 실행될 명령어 주소를 저장
- 레지스터 : 레지스터에 저장되었던 정보들
- 메모리 관련
- 포인터 : 프로세스 현재 위치를 저장하는 포인터(code, data, stack의 위치정보)
- 파일 관련
- 열린 파일 목록 : 프로세스를 위해 열린 파일들의 목록이 저장됨
- OS가 관리상 사용하는 정보
Kernal Stack : 프로세스가 커널을 사용할때 사용되는
커널 스택
이 저장되는 영역
문맥 교환(Context Switch)
문맥 교환
은 시스템콜 혹은 인터럽트가 발생하여, 현재 실행중인 프로세스가 다른 프로세스에게
CPU 제어권을 넘겨줘야할 경우 발생합니다.
제어권을 넘겨줄 때는 다음 과정을 수행합니다.
- 제어권을
내어주는 프로세스
의 상태를 그 프로세스의 PCB에 저장 - 제어권을
얻는 프로세스
의 상태를 해당 프로세스의 PCB에서 읽어서 CPU에 갱신- 프로그램 카운터 : 다음 실행할 명령
- 레지스터 : CPU 레지스터에 저장되어있던 값들
하지만, 인터럽트나 시스템콜이 일어나면 무조건 문맥 교환
이 일어나는것은 아닙니다.
물론 (1)의 경우도 운영체제에게 CPU 제어권
을 넘겨주며 현재 상태의 일부를 PCB에 저장합니다.시스템콜 함수들도 결국 CPU의 PC나 레지스터를 사용해야 하기 때문입니다.
하지만 모든 정보를 저장하는 것이 아니기 때문에, 아예 다른 프로세스로 변경하는 것 보다는
부담이 적은 작업입니다.
그러나 다른 프로세스로 변경한다면, 현재 프로세스가 사용하던 캐시 메모리를 비워야 하는데
캐시 메모리에는 현재 프로세스의 페이지 테이블이 저장되어있습니다.
이를 비우고 다른 프로세스의 페이지 테이블을 불러오는 작업이 필요하기 때문에 오버헤드가 크다고 합니다.
프로세스 스케줄링
작업 큐
모든 프로세스들은 아래처럼 각 큐를 오가며 작업을 수행하게 됩니다.
각 큐는 연결리스트 구조로 되어있으며 PCB가 노드로 활용되는데요.
PCB의 포인터는 다음 프로세스의 PCB를 가리키는 형태로 큐를 구성하게됩니다.
Job queue
현재 시스템 내에 있는 모든 프로세스의 집합Ready queue
현재 메모리 내에 있으면서, CPU의 제어권만 주어지면 바로 실행 가능한 프로세스의 집합Device queue
I/O device의 처리를 기다리는 프로세스의 집합
스케줄러
프로세스 스케줄링을 하는 주체는 운영체제
입니다.
장기 스케줄러(Job Scheduler)
- 시작 프로세스 중 어떤 것들을
Reqdy queue
로 보낼것인지 결정합니다. - 프로세스에 자원(memory 등)을 얼마나 할당할지 결정합니다.
- 시작 프로세스 중 어떤 것들을
단기 스케줄러(CPU Scheduler)
- CPU를 어떤 프로세스에게 얼마나 할당할지를 결정합니다.
- millisecond 단위로 동작하며 스케줄링을 함
중기 스케줄러(Swapper)
time sharing system과 같은 시스템에는 보통 장기 스케줄러가 없습니다.
이러한 시스템이 메모리에 여유공간 마련을 위해 디스크의 스왑 영역으로 현재 프로세스를
이동시키는 작업을 수행합니다.
프로세스의 상태
New(생성)
: 프로세스가 생성되는중인 단계Ready(준비)
: CPU 제어권만 넘겨주면 바로 실행할 수 있는 상태(메모리에 할당된 상태)Running(실행)
: CPU 제어권을 넘겨받아 기계어를 실행하는 단계Blocked(Waiting, Sleep)
I/O로 인해 blocked 상태, 작업이 끝나면Ready
상태로 변경됨
자신이 요청한 작업이 끝나면Ready
가 됨Suspended(Stopped)
외부적인 이유로 프로세스 수행이 정지된 상태
프로세스는 통째로 디스크에 Swap out됨
외부에서 재개시켜줘야함
Terminated(종료)
: 종료되는중인 단계
Thread
스레드는 프로그램의 기본 단위 입니다.
모든 프로세스는 최소 하나 이상의 스레드
를 가지게 됩니다.
스레드의 구성
- Register
- FP(Frame Pointer) : 스택 프레임을 가리키는 포인터
- SP(Stack Pointer) : 현재 스택의 상단을 가리키는 포인터
- PC(Program Counter) : 실행할 명령어의 주소를 저장하는 레지스터
- Stack space
- Register
스레드간 공유하는 부분
- code 영역
- data 영역
- OS resources
멀티 스레드
프로그램에서 동시에 여러가지 작업을 실행해야할 때, 멀티 프로세스로 실행하게 되면code
, data
영역을 각각 사용하게되어, 메모리를 비효율적으로 사용합니다.
그리고 이 때문에 프로세스간 문맥 교환
에도 상대적으로 오버헤드가 큰 단점이 있습니다.
하지만 멀티 스레드로 작업하게 되면, 모든 스레드가 공유하는 부분 이외에 대해서만문맥 교환
이 일어나게 되어 상대적으로 오버헤드가 크지 않습니다.