프로세스?
실행중인 프로그램을 프로세스라고 한다. 작업의 단위 = 프로세스.
CPU가 실행할 프로그램이 메모리에 로드되어 있는 상태를 프로세스라고 한다.
프로그램을 실행시켜 주는 것이 OS(Operating System 운영체제)
프로세스가 실행 되기 위해선 자원이 필요하다 (메모리, cpu, 파일, 리소스 )
실행중인 프로그램. 메모리에 적재하는, 실행하는 순간 프로세스를 생성한다.
프로그램은 프로세스가 된다.
프로세스는 크게 두가지로 나뉜다.
우리가 볼 수 있는 포그라운드 프로세스
우리가 볼 수 없는 백그라운드 프로세스
백그라운드는 두가지로 나뉜다. 1. 사용자와 상호작용이 가능한 것. 2. 사용자와 상호작용 하지 않는 것(=데몬, 서비스)
실행의 주체는 CPU이다. 모든 프로세스는 cpu를 원하지만 cpu는 한정되어있다.
운영체제는 이러한 프로세서를 어떻게 관리하나?
프로세스는 자신에게 주어진 시간동안 cpu를 사용하고, 차례가 끝나면 다른 프로세스에게 CPU를 양보한다.
타이머인터럽트: 할당된 시간이 끝나면 알려준다.
클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트의 한 종류로, 타임아웃인터럽트라고 하기도 한다.
모든 프로세스는 한정된 만큼 cpu를 사용하고 타이머 인터럽트 발생시 다음 프로세스에게 cpu를 넘긴다.
프로세스 제어 블록 Process Control Block
pcb: 상품 태그와 같이 관련 정보가 적혀있다. 프로세스가 새롭개 생성되면 커널 영역에 pcb가 생성되고, 프로세스 종료시 폐기된다.
- PID: 특정 프로세스를 식별하기 위해 부여되는 고유 번호
- 레지스터 값: 프로세스는 자신의 실행 차례까 오면 이전까지 사용한 레지스터값을 모두 복원한다.
pcb에 레지스터값을 명시하는 이유는 이전까지 실행했던 내용을 다시 자기 차례가 오면 실행을 재개하기 위해서이다.
- 프로세스 상태 : 입출력 장치를 사용하기 위해 대기하는 상태. cpu를 사용하기 위해 대기 상태. cpu 이용중인 상태
- cpu 스케줄링 정보: 프로세스가 언제 어떤 순서로 cpu를 할당 받을지에 대한 정보
- 메모리 정보: 프로세스가 어느 주소에 저장되어 있는지에 대한 정보. 페이지 테이블(메모리 현 주소를 알 수 있는 정보가 담김. 중요하다) 정보
- 사용한 파일과 입출력 장치 정보: 할당된 입출력 장치, 사용중인 파일 정보
- 프로그램 카운터, 스택 포인터.
레지스터 정보, 프로세스 상태 정보, 리소스 상태 정보를 담아 놓은 자료구조가 PCB이다.
프로세서에서 a 가 실행 중 - 타이머 인터럽트 실행 - b가 순서를 받음
-> 중간 정보 a를 백업 (레지스터 값, 입출력 정보 등) 이러한 중간 정보를 문맥 context라고 한다.
다음 차례가 왔을 때 실행을 재개하기 위한 정보가 문맥 context 이다.
a가 문맥에 백업을 했다면 b의 문먀그 중간 정보를 복구.
얘기치 않은 상황이 와도 해당 프로세스의 실행을 복구할 수 있다.
a 실행, b실행, c실행... 수많은 프로세스들이 실행되는 원리이다.
A의 시간이 끝나면 (= 타이머 인터럽트가 발생하면) B를 바로 실행 하는 것이 아니라 PCB에 A의 문맥을 저장하고, B의 문맥을 PCB에서 가져와 복구한다 -> 이것을 문맥교환 CONTEXT SWITCH 라고 한다.
티임 쉐어링, 멀티 프로세싱이 결국 os 스케줄로 의해 문맥교환으로 이루어진다.
PCB는 사용자 영역이 아니라 커널 영역에 적재되어 있는 상품태그와 같은 자료구조이다. 특정 프로세스에 달려있다.
프로세스가 사용자 영역엔 어떻게 저장되어 있을까?
특정 영욕을 나누어 저장한다.
코드영역: 실행할 수 있는 코드, 기계어로 이루어진 명령어 저장
데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역이다 (READ ONLY)
명령어가 바뀔 일이 없어서 read only area
데이터 영역: 잠깐 썼다 없앨 데이터터가 아닌, 프로그램이 실행되는 동안 유지할 데이터 저장
프로그램 내내 저장되어 있어야할 데이터를 저장한다.
전역 변수 저장
코드영역, 데이터 영역은 크기가 변하지 않는다. 크기가 고정되어 있는 정적 할당 영역이다
힙 영역: 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당을 할 수 있는 저장공간이다.
메모리 할당 후 반환 해야한다. 자바에선 이를 JVM의 GC가 해준다.
사용자가 언제 메모리 공간을 할당 할 지 모르기 때문에 언제든 가변적으로 변할 수 있다.
스택 영역: 데이터가 일시적으로 저장되는 공간이다. 데이터 영역과 반대로 잠깐 쓰다 말 값들이 저장되는 공간이다.
일시적으로 저장되는 데이터들이 언제든지 스택 영역에 쌓일 수 있다. 가변적이다.
함수 호출을 했을 때 쌓이는 영역이다. 매개변수, 지역변수
힙과 스택은 동적 할당 영역이다. 프로그램이 실행되는 중 공간이 변할 수 있다.
충돌이 일어날 수 있으므로 반대되는 방향으로 저장된다. 주소 겹침 방지
힙 오름차순으로 저장, 스택 내림차순 저장
프로세스 상태와 계층 구조
많은 운영체재들은 동시에 실행되는 가기 다른 상태로서 수많은 프로세스들을 계층적으로 관리한다.
프로세스는 프로그램이라고 데이터, 보조기억장치에 저장되어 있는 데이터 덩어리지만 이것을 실행하게 되면 프로세스가 생성되고 운영체제는 이 프로세스한테 PCB를 할당한다. 프로세스가 끝나게 되면 PCB를 폐기한다.
생성 상태 new state: 이제 막 메모리에 적재되어 pcb를 할당받은 상태이다. 준비 완료 시 준비 상태로 간다.
준비 상태 Ready state : 당장이라도 cpu 할당 받아 실행이 가능하지만 아직 차례가 안온 상태이다. 기다린다
실행 상태 running state: cpu를 할당받아 실행 중인 상태이다. cpu 점유 상태. 할당된 시간 모두 사용 시 타이머 인터럽트 발생 시, 준비 상태로 간다.
대기 상태 block state : 프로세스 실행 도중 입출력 작업을 사용하는 경우. 입출력 작업은 cpu에 비해 느리기 때문에 이 경우 대기 상태로 접어든다. 입출력 작업이 끝나면 준비 상태로 이동한다.
종료 상태 : 프로세스 종료, pcb, 프로세스의 메모리 영역 정리
waiting : 현재 실행되고 있는 프로세스의 종료를 기다리고 있는 상태
대부분의 운영체제는 프로세스를 계층적으로 관리한다. 윈도우는 계층적으로 관리하지 않는다
계층구조란,
부모 프로세스와 자식은 별개 프로세스, 각기 다른 PID값을 가진다.
자식 프로세스도 자식 프로세스를 생성 할 수 있다. 이런 식으로 계층적 구조가 나온다
데몬(백그라운드, 사용자와 소통하지 않음) 프로세스는 최초 프로세스의 자식이다.
프로세스 생성기법
부모 프로세스는 어떻게 자식 프로세스를 생성하고, 자식 프로세스는 어떻게 자신만의 코드를 실행할까
부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본인 자식 프로세스를 생성한다
자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다
부모는 자식을 생성하고, 자식은 자신만의 프로그램을 만들 수 있다.
fork: 자신의 복사본을 자식 프로세스로서 생성하는 시스템 호출.
부모 프로세스가 갖고 있던 자원들이 자식 프로세스에게 상속된다. 자식은 부모와 동일 내용을 가지고 있지만 메모리, pid, 메모리 저장 위치는 다르다.
exec 시스템 호출 (execution) : 메모리 공간을 새로운 프로그램으로 덮어쓰기
코드, 데이터 영역은 실행할 프로그램 내용으로 바뀌고 나머지 영역은 초기화 된다.
자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출.
새로운 프로그램 내용으로 전환해 실행한다.
부모가 fork를 실행해 자식을 만든다. 자식은 exec를 실행해 기존 본인의 힙, 데이터, 코드, 스택 영역들을 본인이 실행할 프로그램으로 바꾼다.
여기서부터는 자식과 부모의 프로그램 내용이 달라진다. 서로 다른 프로그램을 병행해 실행하는 꼴이다.
프로세서 계층 구조를 만드는 과정은 fork와 exec의 반복이라고 볼 수 있다.
---------------
레지스터 정보, 프로세스 상태 정보, 리소스 상태 정보를 담아 놓은 자료구조가 PCB이다.
PCB를 외부에 저장하고 다른 PCB를 CPU에 레지스터레 로드하면 문맥교환을 통해 타임 쉐어링, 동시성 제어를 할 수 있다.
OS, CPU 스케줄러가 멀티 프로그램으로 N개의 프로세스들을 동시에 실행시키기 위해 타임 쉐어링을 한다. 이를 수행하기 위해선 레지스터 정보들을 저장하고 복원해야 하는데 이를 문맥교환이라고 한다.
문맥교환을 하기 위해선, 동기화를 해야한다. 동시성제어가 많은 문제를 일으킨다.
'CS' 카테고리의 다른 글
교착상태 Deadlock (0) | 2024.03.04 |
---|---|
Thread 스레드, 멀티 프로세스, 멀티 스레드, IPC (0) | 2024.03.03 |
캐시메모리 - L1, L2, L3, 참조 지역 (0) | 2024.02.24 |
메모리의 주소공간 - 논리주소, 물리주소, 베이스 레지스터, 한계 레지스터 (1) | 2024.02.24 |
램의 특징과 종류 - SRAM, DRAM, SDRAM, DDR SDRAM, DDR2, DDR3, DDR4 (1) | 2024.02.24 |