프로세스와 컨텍스트 스위칭
프로세스 구조
- 프로세스는 일반적으로 어떻게 구성되어 있을까?
- text(CODE): 코드
- data: 변수/초기화된 데이터
- stack: 임시 데이터(함수 호출, 로컬 변수 등)
- heap: 코드에서 동적으로 만들어지는 데이터
DATA를 BSS와 DATA로 분리
- BSS : 초기화되지 않은 전역변수
- DATA : 초기화된 전역변수
PCB
: 프로세스 상태 정보 - PC, SP, 메모리, 스케쥴링 정보 등
- PC (Program Counter) + SP (Stack Pointer)
- PCB (Process Control Block)에 저장
- 1. Process ID
- 2. Register값 (PC, SP 등)
- 3. Scheduling info (Process State)
- 4. Memory Info (메모리 사이즈 limit)
- PCB: 프로세스가 실행 중인 상태를 캡쳐/ 구조화해서 저장
컨텍스트 스위칭
- Context Switching (문맥 교환)
- CPU에 실행할 프로세스를 교체하는 기술
- 실행 중지할 프로세스 정보를 해당 프로세스의 PCB에 업데이트해서 메인 메모리에 저장
- 다음 실행할 프로세스 정보를 메인 메모리에 있는 해당 PCB 정보를 CPU에 넣고, 실행
- 디스패치 (dispatch) : ready 상태의 프로세스를 running 상태로 바꾸는 것 (PCB정보를 CPU에 넣고 실행하는 과정을 디스패치라고 함)
프로세스 간 커뮤니케이션
- InterProcess Communication (IPC)
- 프로세스 간의 커뮤니케이션은 기본적으로 제한되어 있음
- 프로세스 간 통신은 성능을 높이기 위해 여러 프로세스를 만들어서 동시에 실행할 필요가 있고 이 때 프로세스 간 상태 확인 및 데이터 송수신이 필요
- IPC 기법의 핵심은 결국 커널 공간을 활용하는 것 (커널 공간은 공유되기 때문에)
예시
-
fork() 시스템콜
- 프로세스 자신을 복사해서 새로운 프로세스를 만들 수 있음 : 부모, 자식 프로세스
-
웹서버: 요청이 오면 html 파일을 클라이언트에 제공하는 프로그램
- 새로운 사용자 요청이 올 때마다 fork() 함수로 새로운 프로세스를 만들고, 각 사용자 요청에 즉시 대응
- 이 때 각 프로세스 제어 및 상태 정보 교환을 위해 프로세스 간 통신 필요
-
파일을 사용한 커뮤니케이션
- 다른 프로세스에 전달할 내용을 파일에 쓰고, 다른 프로세스가 해당 파일을 읽을 수 있도록
- 한계: 실시간으로 데이터 전달이 어려움 (파일을 읽는 활동이 지속적으로 실시간으로 일어날 수 없으므로)
다양한 IPC 기법
- file 사용: 실시간성이 떨어짐
- message queue
- shared memroy
- pipe
- signal
- semaphore
- socket
: 2-7번까지는 모두 커널 공간을 사용한다는 것이 핵심임
IPC 기법 참고자료
- pipe(파이프)
- 기본 파이프는 단반향 통신
- fork()로 자식 프로세스를 만들었을 때, 부모와 자식 간의 통신
- 메세지 큐(message queue)
- 양방향
- 메세지큐는 부모/자식이 아니라 어느 프로세스 간이라도 데이터 송수신이 가능
- 공유 메모리
- kernel space에 메모리 공간을 만들고 이를 변수처럼 쓰는 방식
- 공유 메모리 key를 가지고 여러 프로세스가 접근 가능
IPC 기법과 커널 모드
- pipe, 메세지 큐는 모두 커널 공간의 메모리를 사용
주요 시그널
- SIGKILL: 프로세스를 종료 (슈퍼 관리자가 사용하는 시그널로 프로세스는 어떤 경우든 죽게 되어 있음)
- SIGALARM: 알람을 발생
- SIGSTP: 프로세스를 멈춤 (Ctrl + z)
- SIGCONT: 멈춰진 프로세스를 실행
- SIGINT: 프로세스에 인터럽트를 보내서 프로세스를 죽여라 (Ctrl + c)
- SIGSEGV: 프로세스가 다른 메모리영역을 침범했다.
소켓(socket)
- 소켓은 네트워크 통신을 위한 기술
- 기본적으로는 클라이언트와 서버 등 두 개의 다른 컴퓨터 간의 네트워크 기반 통신을 위한 기술