728x90
반응형
프로세스란?
- 프로세스 : (메모리에 올려져서,) 실행중인 프로그램
- 코드 이미지(바이너리) : 실행 파일
- 응용 프로그램 ≠ 프로세스
- 응용 프로그램은 여러 프로세스로 구성 가능
- 프로세스라는 용어는 작업, task, job 이라는 용어와 혼용
- ex) 엑셀 프로그램과 엑셀 프로세스
- excel.exe(코드 이미지, 바이너리)와 엑셀 프로세스
- 해당 파일은 코드로 구현이 되어있을 텐데, CPU가 이해할 수 있는 0과 1로 이루어진 파일로 만들어서 저장(바이너리)
- 이를 실행하면 메모리에 올라감(프로세스)
- excel.exe(코드 이미지, 바이너리)와 엑셀 프로세스
프로세스 스케쥴링
- 프로세스를 언제 실행 시킬 건지
1. 배치 처리 시스템(Batch Processing)
- 초기 프로세스 스케쥴링 알고리즘으로 배치 처리 시스템을 채택
- 여러 프로그램을 순차적으로 실행시킬 수 있도록
- 어떤 프로그램은 실행하는데 시간이 너무 많이 걸려서, 다른 프로그램이 실행하는데 시간을 많이 기다려야 함
- 미리 여러 프로세스를 등록시켜놓고, 순차적으로 실행하 되, 하나의 프로세스가 끝나면 다음 프로세스를 자동으로 실행할 수 있도록 하는 시스템
- ex) 큐 자료구조랑 유사
- 단점
- 여러 프로세스를 동시에 실행할 수 없음 → 응답시간이 길음
2. 시분할 시스템
- 개념
- 다중 사용자 지원을 위해 컴퓨터 응답 시간을 최소화하는 시스템
- 응용 프로그램이 CPU를 점유하는 시간을 잘게 쪼개어 실행될 수 있도록 하는 시스템
- 1초(1000ms)를 쪼개어 실행
- 장점
- 여러 프로세스를 동시에 실행할 수 있음
- 다중 사용자 지원
- 단점
- 앞단에 실행시간이 많이 필요한 응용 프로그램이 실행될 경우 컴퓨터 응답시간이 오래 걸릴 수 있음
- CPU가 필요없는 시간대에도 응용 프로그램이 CPU를 점유하고 있을 수 있기 때문에 총 실행 시간도 오래 걸릴 수 있음
- 예시
- 시분할 시스템을 최초로 지원하는 운영체제 : UNIX
- UNIX과 시스템이 유사한 UI를 지원하면서 무료인 운영체제 : LINUX
- 이는 지금도 서버컴퓨터로 많이 사용하고 있음
3. 멀티 태스킹
- 개념
- 단일 CPU에서, 여러 응용 프로그램이 동시에 실행되는 것처럼 보이도록 하는 시스템
- ex) 나는 MP3 음악을 들으면서, 문서작성을 한다
- 여러 개의 Task들이 CPU와 같은 자원을 공유하도록 하는 방법
- 시분할 시스템과 방식은 비슷하지만 목적이 다름
- 10~20ms 단위로도 실행 응용 프로그램이 바뀜
- 사람이 인식하기 힘든 짧은 시간(10~20ms)동안 바뀌면서 실행하는 점
→ 동시에 일을 처리한다고 느낌
- 사람이 인식하기 힘든 짧은 시간(10~20ms)동안 바뀌면서 실행하는 점
- 단일 CPU에서, 여러 응용 프로그램이 동시에 실행되는 것처럼 보이도록 하는 시스템
- 장점
- 시분할 시스템보다 더욱 짧은 시간동안 프로세스를 바꾸면서 실행하다보니 동시에 실행되는 것처럼 보임
- 단점
- 모든 작업을 수행할 수는 없기 때문에 성능저하 우려
- 예시
- 플립북(많은 그림이 지나갈 때, 마치 움직이듯이 실행되는 것 처럼 보이도록 함)
4. 멀티 프로그래밍
- 개념
- 최대한 CPU를 (일정 시간당) 많이 활용하도록 하는 시스템
- 응용 프로그램은 CPU와 다양한 하드웨어 사용
- 메모리 내에 여러 작업이 들어갈 수 있는 방식
- 현대 컴퓨터에 기본적으로 들어가 있는 알고리즘
- 최대한 CPU를 (일정 시간당) 많이 활용하도록 하는 시스템
- 장점
- 일정 시간 당 최대한 CPU를 많이 활용하도록 함
- 단점
- 실행중인 작업에 대해 관여할 수 없음
멀티 프로세스 VS 멀티 스레딩
멀티 프로세스
개념
- (여러 CPU에서) 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행
장점
- 서로의 메모리에 침범할 수 없음
- 여러 자식 프로세스 중 하나에 문제가 발생해도 다른 프로세서에는 영향이 없음(안정성)
단점
독립된 메모리를 갖고 있기 때문에 작업량이 많아지면(Context Switching이 자주 발생하면) 오버헤드가 발생함
IPC가 필요
멀티 스레드
- 개념
- 하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행
- 장점
- 스레드 간 데이터를 주고받는 것이 간단해져 스레드 간 통신이 간단
- 교환해야 할게 적어서 Context Switching이 빠름
- 각 스레드가 자신이 속한 프로세스의 메모리를 공유함 → 시스템 자원 낭비가 적음
- 단점
- 서로 다른 스레드가 stack을 제외한 메모리 공간을 공유하기 때문에 동기화 문제 발생
- 하나의 스레드에서 문제가 발생하면 전체 프로세스에 영향을 줌
- 주의 깊은 설계가 필요하고 디버깅이 어려움
프로세스 구조
- text(CODE) : 코드
- data: 변수/초기화된 데이터
- 메모리 : 프로세스가 실행되는 동안 필요한 데이터 및 코드 저장
- 레지스터 : 프로세스가 실행되는 동안 사용되는 데이터를 저장하는 데 사용되는 CPU 내부 메모리
- 스택 : 지역 변수, 함수 호출 및 반환 값 등의 정보 저장 → 임시 데이터
- 힙 : 객체, 동적 할당 메모리를 저장하는 데 사용 → 코드에서 동적으로 만들어지는 데이터
프로세스와 컴퓨터 구조
- PC(Program Count) + SP(Stack Pointer)
- PC: 여러 코드들이 있을때 어느 라인을 실행할지 결정짓기 위해 해당 주소를 갖고있는 레지스터 → 다음 실행할 코w드 주소
- SP: 스택 최상단 주소
- 보통 디버깅시 PC와 SP를 캡처해서 확인
작성한 코드가 0,1로 변환되고, 실행해서 프로세스로 들어갔을때,
어떻게 구성이 되는지를 그림을 통해 알아보게 되면
- code에는 해당 프로그램에서 실행하는 코드가 들어감
- data는 코드에서 사용되는 전역변수가 들어감
- stack/heap은 프로그램이 실행이 되지 않았기 때문에 XX아무것도 없음
이렇게 생성된 프로세스가 맨 처음 실행을 하면, CPU는 스케쥴러에 의해 PC값과 SP값을 초기화 하게 되어있음(맨처음 0000h, EFFAh) - CPU를 실행하게 되면, PC의 주소로 가서 코드를 실행하게 됨
- 첫번째 코드: 함수 선언이기 때문에 할게 없음 -> 이후 PC++
- 두 번째 코드: 함수선언 -> PC++
- 세 번째 코드: c만들어있던곳에 0할당 -> PC++
- 네 번쨰 코드: 코드상으로는 한줄이지만, func(1,2)의 리턴값을 c에 넣어줌
- 먼저 함수를 호출한 위치를 stack(초기화된 SP가 가리키고있는 위치에)에 올림 -> SP++
- a=1이 stack(EFFBh)에 올라감 -> EFFBh++
- b=2가 stack(EFFCh)에 올라감 -> EFFCh++
- return을 만나게 되면 stack을 하나씩 지움(RET를 만날때까지 지움) -> SP--
- RET를 만났을때, RET의 주소인 0003h를 PC에 넣고 해당 stack 삭제
컨텍스트 스위칭
- CPU에서 실행할 프로세스를 교체하는 기술
- 다른 프로세스를 갔다가 다시 왔을 때 어떻게 실행위치부터 다시 재개하는지?
- PC, SP만 바꿔주면, 프로세스 저장상태를 기반으로 실행 가능
IPC 배경
- 독립적인 프로세스는 데이터를 공유하거나 메시지를 주고받을 일도 없기 때문에 문제 X
→ 독립적인 메모리 영역을 가지며 각자 일을 하면 됨
→ 이 경우 CPU 스케쥴링을 잘해주면 영향을 미치지 않고 공존을 함 - 하지만 정보를 공유하거나, 모듈화하는 등 협력적인 프로세스일때 문제가 발생함
- 이것을 어떻게 해결할 것인가?에 대한 해답 —> IPC
IPC란
- 프로세스 간 통신
- 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로
- 각 프로세스는 자신의 독립적인 메모리 공간을 가지고 보호하기 때문에 별도의 매커니즘이 필요
IPC Model
- shared memory
- message passing
- Semaphore
1. Shared memory(공유 메모리)
- 개념
- 공유 메모리를 이용해서 데이터를 주고 받는 방법
- IPC를 위해 공유 메모리 영역을 구축하고, 자원이나 데이터를 주고 받음
- 장점
- 커널 의존성이 낮기 때문에 속도가 빠름
- 유저 레베렝서 IPC가 가능하기 때문에, 통신이 자유로움
- 단점
- 자원과 데이터를 공유하기 때문에 동기화 이슈 발생
- (데이터를 원활히 전달하기 위해서는) 동기화 기술 필요
- 자원과 데이터를 공유하기 때문에 동기화 이슈 발생
- 공유 메모리 세그먼트
- 공유 메모리는 프로세스의 힙과 스택 사이에 존재
- 공유 메모리를 생성하는 프로세스의 메모리 공간에 위치
- 다른 프로세스는 자신의 주소에 연결
- 프로세스들 사이의 공유 메모리 사용 조건
- 메모리 보호 제약을 해제
- 동일한 위치를 동시에 쓰지 않도록 보장(동기화)
- 공유 메모리를 버퍼로 활용하여 정보를 생성하고 소비, 동기화 필수
- 공유 메모리 생성
- 동일한 키를 알고 있는 프로세스들 끼리 공유 메모리를 생성
2. Message passing(메시지 전달)
- 특징
- IPC를 위해 커널을 통해 메시지를 전달하며 자원이나 데이터를 주고받음
- 프로세스가 자원/데이터를 직접 공유 X
- 구현이 간단하고 적은 양의 데이터 전달에 적합
- 커널이 데이터를 주고받는 것을 관리할 수 있음
→ 데이터를 주고 받는 상황을 컨트롤 할 수 있음
→ 별도의 동기화 메커니즘 없이도 두 프로세스가 정확한 위치에서 데이터를 받아갈 수 있음
- IPC를 위해 커널을 통해 메시지를 전달하며 자원이나 데이터를 주고받음
- 장점
- 커널만을 이용하기 때문에 구현이 비교적 쉬움
- 단점
- 커널을 이용하기 때문에, 시스템 콜(System call)이 필요하며 이로인해 오버헤드가 발생
- 매번 커널을 통해 정보/메시지를 전달하기 위해 두 번 복사(매번 시스템 호출 사용)
- 종류
- 파이프, 시그널, 메시지 큐, 소켓 등
- 기본적인 연산
- send(message)
- receive(message)
- message 크기는 고정일수도 가변일수도 있음
- channel(채널)
- 여기서 커널이 send와 receive를 제공
- 커널을 거치기 때문에 데이터 복사가 일어나서 느려진다는 단점
- send라는 것을 사용해서 메모리를 무한정 줄 수 없고 채널의 크기만큼 줄 수 있음
- send와 receive 연산을 수행하는 방법
- 직접/간접 통신
- 동기식/비동기식 통신
- 자동/명시적 버퍼링
- 메시지 전달 모델
- 파이프(Pipe)
- 특징
- 하나의 프로세스가 파이프를 통해 다른 프로세스로 메시지를 직접 전달
- 파이프는 두 개의 프로세스를 연결하게 되고, 하나의 프로세스는 데이터를 쓰기만하고 다른 한쪽은 읽기만 할 수 있음(반이중 통신)
- 양방향 통신을 하기 위해서는 두 개의 파이프가 필요
- 파이프에 용량 제한이 있기 때문에 이용에 제약이 있음
- 특징
- 시그널(Signal)
- 특징
- 프로세스 ID를 통해 특정 프로세스에게 메시지를 전달하는 방식
- 시그널 ID에 따라 어떤 이벤트인지 알 수 있음
- 특징
- 메시지 큐(Message Queue)
- 특징
- 고정 크기의 메시지를 연결 리스트를 통해 통신하는 방식
- 메시지 단위의 통신이며, 메시지 큐 ID를 통해 통신을 함
- 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있음
- 특징
- 소켓(Socket)
- 특징
- 네트워크 상에서 프로세스 간 통신을 하는 방식
- local 뿐만 아니라, Remote 통신이 가능
- 특징
- 파이프(Pipe)
3. Semaphore(세마포어)
- 공유된 자원에 여러개의 프로세스가 동시에 접근하면 안되며, 한 번에 하나의 프로세스만 접근 가능하도록 만들어줘야 함
- 동시에 여러 개의 프로세스가 접근하게 되면 문제가 발생하는데 이를 제한하기 위해 사용되는 것이 Semaphore
- 상호배제 원리를 보장하는 알고리즘
- 공유 리소스에 접근할 수 있는 최대 허용치만큼 동시 사용자 접근을 할 수 있게 하는 기술
- 동기화 대상이 여러 개일 경우 → 리소스 공유 메커니즘이용
728x90
반응형