[OS] 프로세스(Process) 와 컨텍스트 스위칭(Context switching)
1. Process 구성요소
- Code: text 코드
- Data: 변수/초기화된 데이터
- Stack: 임시 데이터(함수호출, 로컬변수 등)
- Heap: 동적으로 만들어지는 데이터 (malloc, new 등)
- PC (Program Counter) + SP(Stack Pointer)
- PCB: Process Context Block
- 프로세스가 실행중인 상태를 캡쳐/구조화 시켜서 저장
2. Context Switching
- CPU에 실행할 프로세스를 교체하는 기술
- 실행 중지할 프로세스 정보를 해당 프로세스의 PCB에 업데이트해서 Main Memory에 저장
- 다음 실행할 프로세스 정보를 Main Memory에 있는 해당 PCB 정보(PC, SP)를 CPU의 Register에 넣고 실행
- Dispatch : ready 상태의 프로세스를 running 상태로 바꾸는 것
3. Interrupt & Context Switching
- 프로세스 실행 중 인터럽트 발생
- 현 프로세스 실행 중단 (PCB 업데이트)
- 인터럽트 처리 함수 실행 (OS)
- 현 프로세스 재실행 (PCB 정보를 CPU에 Load)
- 프로세스 스위칭은 실제 nano sec 단위로 일어남
- 컨텍스트 스위칭 동작
- 프로세스1 PCB 정보를 메인메모리에 저장
- 프로세스2 PCB 정보를 메인메모리에서 로드함
- 컨텍스트 스위칭 동작
3.1 Compiler
- 초기 컴퓨터 프로그램들은 어셈블리어로 작성
- 서로 다른 CPU Architecture가 등장할 때마다 매번 똑같은 프로그램 작성
- 어셈블리어로는 프로그램 작성 속도가 매우 떨어짐
- 컴파일러 등장
- CPU 아키텍처에 따라 컴파일러 프로그램만 만들면 기존 코드 재작성할 필요가 없음 그러나 어셈블리어로 작성한 코드보다는 속도가 떨어질 수 있음
4. IPC
4.1 Inter Process Communication
- 필요한 이유?
- 성능을 높이기 위해 여러 Process 를 만들어서 동시 실행, Process 간 상태 확인 및 데이터 송수신 필요
- fork() 시스템 콜
- Process 자신을 복사해서 새로운 프로세스로 만들 수 있음 (부모, 자식 프로세스)
- Process를 fork()해서 여러 프로세스를 동시에 실행시킬 수 있음
- CPU가 한 개일 때만 생각하지만, CPU안에 Core가 8개 가 되는 경우가 많고, 각 Process를 각 Core에 동시 실행 가능, 병렬 처리
- Example
- 1 ~ 10000 까지 더하기
- fork() 함수로 10개 process를 만들어서 1 ~ 1000, 1001 ~ 2000 .. 계산
- 각각 더한 값을 모두 합하면, 더 빠르게 동작
- 이때, 각 Process가 더한 값을 수집하기 위해 IPC가 필요
- 1 ~ 10000 까지 더하기
4.2 IPC 방법
1. file
- 간단히 다른 프로세스에 전달할 내용을 파일에 쓰고, 다른 프로세스가 파일을 읽음
- 파일을 사용하면 실시간으로 직접 원하는 프로세스에 데이터 전달이 어려움, 왜냐면 계속 실시간으로 파일을 읽을 수 없기 때문에
2. Message Queue
3. Shared Memory
4. Pipe
5. Signal
6. Semaphore
7. Socket
4.3 리눅스 프로세스
- 프로세스간 공간은 완전 분리
- 커널 공간은 공유
5. 스케줄링 알고리즘
- FIFO 스케줄링 알고리즘 (배치 처리 시스템)
- 최단 작업 우선 스케줄링 알고리즘 (Process 시간이 짧은 순)
- 우선순위 기반 스케줄링 알고리즘
- 정적 우선순위: 프로세스마다 우선순위를 미리 지정
- 동적 우선순위: 스케줄러에 의해 동적으로 변경
- Round Robin 스케줄링 (시분할 시스템 기반)
참고
This is personal diary for study documents.
Please comment if I'm wrong or missing something else 😄.
댓글남기기