* 본 내용은 운영체제를 공부하며 추후 복습하기 위해 포스팅하는 게시물입니다.
프로세스란??
- 메모리를 할당받아 실행되고 있는 프로그램을 의미
- 프로그램의 모든 영역이 메모리에 올라가지 않음(Page 단위로 분할하여 필요한 부분만 메모리에 할당)
프로세스는 메모리를 할당받을 때 프로그램 내 주소를 논리적 주소로 변환한다. 즉 프로그램의 논리저 시작주소는 0이며CPU가 프로세스를 수행하기 위한 메모리 접근 시 이러한 논리적 주소를 레지스터와 하드웨어를 이용하여 메모리의 물리적 주소로 변환하여 접근한다.(가상 메모리 챕터에서 자세히 다룰 예정)
프로그램을 실행하면 다음과 같은 상태들을 나타낸다.
New : 프로세스를 생성중인 상태
Ready : Ready Queue에 존재하여 CPU를 할당받기를 기다리고 있는 상태(CPU만 할당받으면 프로세스 수행)
Run : 프로세스에게 CPU의 제어권이 할당받은 상태
Wait : 프로세스를 수행하는 중 I/O 관련 기능을 수행하기 위해 CPU의 제어권을 반환하고 I/O 관련 기능을 수행하고 있는 상태
Exit : 프로세스 수행이 완료된 상태
* 프로세스는 무한정 CPU를 사용할 수 없으며 할당된 시간을 소모했을 시 Timer(하드웨어)에 의해 인터럽트가 발생하여 CPU의 제어권을 반납해야한다.
여러 개의 프로그램을 동시에 메모리에 올릴 수 있기 때문에 메모리가 부족한 상황이 발생하기도 하며 가상메모리 기법으로 디스크의 영역 일부를 메모리처럼 사용한다.(Swap In/Out)
다음 그림은 Swap In/Out이 포함된 프로세스 상태도이다.
위에서 설명했다시피 프로세스는 무한정 CPU의 제어권을 가질 수 없기 때문에 CPU의 제어권을 반납한다.
반납된 프로세스의 상태는 Ready로 변경되며 CPU의 제어권을 얻기 위해 Ready Queue에서 대기한다.
Ready Queue에서 대기중인 프로세스가 디스패처에 의해 CPU의 제어권을 할당받는다면 이전 CPU의 제어권을 할당받았을 때 마지막으로 실행했었던 부분부터 다시 실행해야한다. 그러기위해서는 프로세스의 상태정보를 저장해야하며 상태정보를 저장하는 자료구조를 PCB(Process Control Block)라고 한다.
PCB(Process Control Block)란?
- 프로세스 당 하나의 PCB를 가지고 있음- PCB는 프로세스 우선순위, 프로세스 아이디, 프로세스 상태, PC, RegisterSet, file 등으로 구성- 운영체제 Data 영역에 존재하는 자료구조
1) ProgramCounter : 다음 명령어를 실행하기 위한 메모리 주소를 의미2) 프로세스 우선순위 : CPU 스케줄링을 할 때 알고리즘에 따라 우선순위 값을 참고하여 스케줄링한다.3) 프로세스 아이디 : 프로세스를 식별하는 값을 의미4) 프로세스 상태 : 프로세스가 실행하고 있는지, 대기하고 있는지 프로세스의 현재 상태를 의미
PCB에 프로세스를 실행하기 위한 상태정보를 저장하고 PCB에 저장된 상태정보를 불러와 프로세스를 실행하는 과정을 Context Switch(문맥교환)라고 한다.
* Context Switch가 잦으면 성능이 저하되는 원인이 됨
Tip 기술면접에서 프로세스와 스레드의 차이를 물어보는 경우가 종종 있는데 이에 관한 설명을 지금해보자
스레드(Thread) 란?
- CPU를 수행하기 위한 실행단위를 의미
- 프로세스에는 하나 이상의 스레드가 존재
- 프로세스 내부에 존재하는 여러 스레드는 Code, Data, OS Resource 영역을 공유하며 Stack, PC, RegisterSet 각각 존재한다
- 프로세스의 Context Switch보다 스레드의 Context Switch가 오버헤드가 적다.(비용이 적게 듬)
프로세스 생성 등 프로세스와 관련된 시스템 콜
1) fork : 부모 프로세스가 자식 프로세스를 생성
- fork() 시스템 콜을 통해 자식 프로세스를 생성하며 자식 프로세스의 process id는 0을 의미한다.
- 자식프로세스는 fork()함수 이후부터 실행된다.
- 자식프로세스는 부모프로세스가 메모리를 공유하다 쓰기작업이 필요한 부분만 메모리를 할당받아 쓰기작업을 실행한다.
void main() {
printf("main 실행");
int pid = fork();
//자식
if(pid == 0) {
printf("자식 프로세스 실행");
}
//부모
else {
printf("부모 프로세스 실행");
}
}
2) exec : 생성된 프로세스에 새로운 프로그램을 덮어씌움
3) exit : 프로세스 종료
프로세스간 메시지 교환(IPC)
프로세스간 메세지를 교환하는 방법에는 2가지가 존재한다.
1) 메시지 패싱 : 전달받을 프로세스를 명시적으로 표시하는 방법과 메일박스를 사용하여 전달하는 방법이 있다.
-> 명시적 : 전달받을 프로세스를 직접적으료 명시하여 메시지를 전달한다.
-> 명시적 X : 메시지를 메일박스에 보내는 방법으로 여러 프로세스에게 메시지를 전달할 수 있다.
2) 공유메모리 : 프로세스 간 공유하는 메모리에 메시지를 쓰는 방법으로 공유 메모리에 존재하는 메세지를 가져옴으로써 메시지를 교환할 수 있다.
출저
- 공룡책 Operation System Cencept 9판
'운영체제' 카테고리의 다른 글
Virtual Memory에 대해서 알아보자 (0) | 2021.03.29 |
---|---|
Memory Management에 관해서 알아보자 (0) | 2021.03.25 |
DeadLock에 관해서 알아보자 (0) | 2021.03.21 |
Race Condition(경쟁 상태)이 발생하는 사례란? (0) | 2021.03.19 |
CPU 스케줄링이란? (0) | 2021.03.17 |