。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

CS

프로세스

quarrrter 2023. 11. 23. 15:30

프로세스,

컴퓨터에서 실행 중인 하나인 프로그램

 

OS는 프로그램을 실행하면서 디스크에 저장돈 데이터를 메모리로 로드한다.

프로세스는 OS로부터 독립된 메모리 영역을 할당받으며, 다른 프로세스의 메모리 영역에 접근할 수 없다.

 

프로세스의 메모리 영역 구조

높은 주소 값 스택 지역변수, 함수의 매개변수
  빈 메모리 공간  
  사용자 동적 할당
  데이터 전역변수, 정적변수 
낮은 주소 값 코드 실행할 코드(기계어)

 

*스택: LIFO 후입선출 방식으로 높은 주소 값에서 낮은 주소 값으로 메모리가 할당됨

*힙: FIFO 선입선출 방식으로 낮은 주소 값에서 높은 주소 값 순서로 메모리 할당됨

* 스택과 힙은 동적으로 메모리 할당이 가능해 두 영역 사이에 빈 메모리 공간이 존재한다. 

 

메모리 영역을 공유하기 때문에 서로의 영역을 침범하는 문제가 생길 수 있음

*스택 오버 플로, 스택이 힙 영역 침범

*힙 오버플로, 힙이 스택 영역 침범 

 

 

스레드

프로세스는 한 개 이상의 스레드를 갖는데, 스레드는 프로세스에서 실제로 실행되는 흐름의 단위를 의미한다.

스레드는 프로세스 안에 존재하므로 프로세스의 메모리 공간을 이용하고, 지역 변수를 저장하는 스택 영역을 할당받는다. 그리고 전역 변수를 저장하는 힙 영역은 다른 스레드와 공유한다. 

 

 

PCB(Process Control Block, 프로세스 제어 블럭)

OS가 프로세스를 제어하기 위해 프로세스 정보를 저장한 것

프로세스의 현재 상태, 프로세스를 나타내는 고유의 PID, 부모 프로세스의 PID, 자식프로세스의 PID, 다음 실행할 명령의 주소인 PC(program Counter), 프로세스의 우선순위, 메모리 제한 등을 저장.

포인터
프로세스 상태
PID
PC
레지스터
메모리 제한
열린 파일 목록
...

(PCB 저장 정보)

 

 

프로세스의 생성

새로운 프로세스는 기존 프로세스에서 fork() 함수를 호출해 생성한다. 

fork() 함수에는 함수를 호출한 프로세스를 복사하는 기능이 있다.

부모 프로세스에서 fork() 함수를 호출하면 부모 프로세스는 자식 프로세스의 PID 값을, 자식 프로세스는 0을 반환한다. 

 

 

프로세스 상태도

모든 프로세스는 CPU에 의해 생성되고 소멸하는 과정을 거친다. 

생성: 프로세스가 PCB를 가지고 있지만 OS로부터 승인 받기 전

준비: OS로부터 승인받은 후 준비 큐에서 CPU 할당을 기다림

실행: 프로세스가 CPU를 할당받아 실행함

대기: 프로세스가 입출력이나 이벤트 발생을 기다려야해서 CPU 사용을 멈추고 기다림

종료: 프로세스 실행을 종료함

 

생성 -> 준비

OS로부터 승인을 받아, 준비 상태의 포레스가 모여있는 자료 구조인 준비 큐에 추가됨

준비 -> 실행

준비 큐에 있는 프로세스 중 우선순위가 높은 프로세스가 디스패치되어 실행됨

실행 -> 준비

CPU 독점을 방지하기 위해 타임아웃 되어 준비 상태로 변경됨

실행 -> 대기

입출력 또는 이벤트 때문에 대기 상태로 변경됨 

대기 -> 준비

입출력 또는 이벤트가 완료되어 준비 상태로 변경됨 

실행 -> 종료

실행중인 프로세스가 정상적으로 끝나서 종료 상태로 변경됨 

 

 

멀티 프로세스와 멀티 스레드

*동시성: 하나의 코어에서 여러 작업을 번갈아 가면서 처리하는 방식

*병렬성: CPU가 여러 개 (멀티 코어) 있어서 각 CPU에서 각 작업을 동시에 처리하는 방식

 

멀티프로세스

응용 프로그램 하나를 여러 프로세스로 구성하는 것. 한 프로세스가 죽어도 다른 프로세스에 영향을 주지 않아 안정적이다. 시간과 메모리 공간을 많이 사용한다는 단점이 있다. CPU는 하나의 작업만 처리할 수 있는데 여러 프로세스를 처리하려면 CPU에서 처리 중인 프로세스를 교체하는 콘텍스트 스위칭 작업이 이루어져야 한다. CPU에서 기존에 처리하던 프로세스가 할당받은 메모리 영역을 다른 프로세스에서 사용할 수 있게 교체하면서 시간과 메모리가 필요한데, 오버헤드라고 한다. 

프로세스는 독립적인 메모리를 할당 받는데 따라서 프로세스 간 공유할 자원이 있다면 IPC를 통해 프로세스 간 자원을 공유해야한다. 메모리 직접 참조보다 비효율적임. 

 

멀티스레드

스레드를 여러 개 생성해 스레드들이 각자 다른 작업을 처리하는 것을 의미. 

스레드 간 힙, 데이터, 코드 영역을 공유하고, 콘텍스트 스위칭을 할때 오버헤드가 적게 발생하고, IPC를 사용하지 않아도 되어 멀티 프로세스의 단점을 보완할 수 있다. 스택영역을 다른 스레드와 함께 사용하므로 공유 자원에 대한 동기화가 필수다.

 

콘텍스트 스위칭: 멀티 프로세스 환경에서 CPU가 처리 중인 프로세스의 정보를 바꾸는 것. 

콘텍스트: CPU가 처리하는 프로세스의 정보 

=> 멀티 스레드를 처리할 때도 콘텍스트 스위칭이 이뤄진다. 

 

프로그램 카운터: 프로세스가 이어서 처리해야 하는 명령어의 주소 값

스택 포인터: 스택 영역에서 데이터가 채워진 가장 높은 주소 값

=>PCB에 프로그램 카운터와 스택 포인터값이 저장되어 있기 때문에 CPU에서 처리중인 프로세스가 중간에 변경되어도 이전에 실행하던 코드를 이어서 실행 할 수 있다. 

 

 

 

프로세스 동기화 

경쟁상태: 공유 자원에 동시에 접근해 경쟁하는 상태

임계영역: 공유 자원에 접근할 수 있고 접근 순서에 따라 결과가 달라지는 코드 영역/ 여러 프로세스가 접근해도 일관성이 유지되도록 프로세스 동기화를 해야함. 

=> 임계영역에 여러 접근이 동시에 발생하는 것을 방지하려면,, 

1. 상호배제 기법: 어떤 프로세스가 임계 영역 실행 중일 때 다른 프로세스가 임계영역에 접근할 수 없다. (뮤텍스, 세마포어 기법)

2. 진행: 임계 영역을 실행 중인 프로세스가 없을 때 다른 프로세스가 임계 영역을 실행한다. 

3. 한정된 대기: 임계 영역에 접근을 요청했을 때 무한한 시간을 기다리지 않는다. 

 

*뮤텍스: 락을 가진 프로세스만이 공유 자원에 접근할 수 있게 하는 방법. (= 락킹 매커니즘)

      -스핀락: 임계 영역에 접근하지 못한 프로세스가 락을 얻기 위해 반복문을 돌면서 확인 (바쁜 대기의 한 종류)

 

*세마포어 : 공유 자원에 접근할 수 있는 프로세스의 수를 정해 접근을 제어하는 방법 (= 시그널링 매커니즘: 접근 프로세스가 해제하면 신호를 보낸다고 해서)

 

동기: 여러 작업을 처리할 때 작업 순서를 보장
비동기: 여러 작업을 처리할 때 작업 순서를 보장하지 않음
블로킹: 작업을 수행할 때 대기할 수 있다는 것을 의미하며 작업순서를 보장하지 않음
넌블로킹: 작업을 시작하면 대기없이 수행한다는 것을 의미 

 

 

교착상태

2개의 상의 프로세스가 각각 자원을 가지고 있으면서 서로의 자원을 요구하며 기다리는 상태

막으려면 ,,,,

*상호배제 부정: 여러 프로세스가 동시에 하나의 공유 자원을 사용할 수 있게 한다

*점유와 대기 부정 : 프로세스가 실행되기 전 필요한 모든 자원을 할당하여 프로세스 대기를 없앤다. 

*비선점 부정: 자원을 점유한 프로세스가 다른 자원을 요구할 때 점유한 자원을 반납하게 한다. 

* 환형 대기 부정 : 자원을 선형 순서대로 정렬하여 고유 번호를 할당한다. 한쪽 방향으로만 자원을 요구하게 함

 

 

스레드 안전

멀티 스레드 환경에서 하나의 변수, 함수, 객체에 스레드 여러개가 동시에 접근해도 문제 없음 

조건: 상호 배제, 원자연산(공유 자원에 접근할 때 원자 연산을 이용하여 연산 도중 다른 스레드가 접근할 수 없게 함), 재진입성(특정 함수를 하나의 스레드에서 실행 중일 때 다른 스레드가 해당 함수를 실행해도 각 스레드에 올바른 결과가 나올 수 있게 해야한다.) 스레드 지역 저장소(각 스레드에서만 접근할 수 있는 저장소를 사용해서 공유되는 자원을 줄인다)

 

IPC(Inter Process Communication): 프로세스 간에 자원을 공유하는 방식 

1. 공유 메모리

2. 소켓 : 네트워크 소켓을 이용하는 프로세스 간 통신으로, 외부 시스템과도 이용할 수 있고, 클라이언트와 서버 구조로 자원을 주고 받음.

3. 세마포어: 접근하는 프로세스를 제어해 공유 자원 관리

4. 파이프 : FIFO 형태의 메모리인 파이프를 이용하여 자원 공유. 파이프는 단방향 통신만 지원하므로 읽기 또는 쓰기 중 하나만 할 수 있다. 양뱡향 통신을 하려면 읽기 파이프와 쓰기 파이프를 각각 생성해야한다. 

5. 메세지큐: FIFO 형태의 큐 자료 구조를 사용해 프로세스 간 메세지를 주고 받는 형식 

 

좀비프로세스: 부모 프로세스가 자식 프로세스의 종료 상태를 회수하지 않았을 경우 남겨진 자식 프로세스

고아프로세스: 부모 프로세스가 자식 프로세스보다 먼저 종료되는 경우

 

 

'CS' 카테고리의 다른 글

가상 메모리  (1) 2023.11.25
메모리 관리 전략  (1) 2023.11.23
스케줄링  (0) 2023.11.23
커널  (2) 2023.11.23
운영체제, CPU, 메모리  (1) 2023.11.22