일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 알고리즘
- 코테
- 코딩테스트
- C언어
- Nodejs
- git
- nestjs typeorm
- python
- 카카오 코테
- OpenCV
- 시스템호출
- 스프링
- AWS
- nestJS
- 카카오 알고리즘
- 컴포넌트스캔
- Spring
- @Component
- C++
- thymeleaf
- 구조체배열
- nestjs auth
- @Autowired
- 파이썬
- 카카오
- spring boot
- 프로그래머스
- 해시
- TypeORM
- 가상면접사례로배우는대규모시스템설계기초
Archives
- Today
- Total
공부 기록장 💻
[운영체제/OS] 05장 프로세스 동기화 본문
5장의 목표
- 독립적인 프로세스끼리 작업을 하다 서로 데이터를 주고받아야 할 때 통신을 하는 경우, 누가 먼저 작업을 할지, 작업이 언제 끝날지 등을 서로 알려주어야 하는 동기화
- 같은 데이터를 여러 프로세스가 사용할 때 서로 침범하면 안되는 임계구역 문제 해결
1. 프로세스 간 통신
병행 프로세스의 개념
- 병행 프로세스(Concurrent Process) 종류
- 독립 프로세스 - 단일 처리 시스템에서 수행하는 병행 프로세스, 다른 프로세스에 영향을 주고받지 않으면서 독립 실행
- 협력 프로세스
- 다른 프로세스와 상호작용(통신)하며 특정 기능을 수행하는 비동기적 프로세스
- 제한된 컴퓨터 자원의 효율성 증대, 계산 속도 향상, 모듈적 구성 강화, 개별 사용자의 여러 작업을 동시에 수행하여 편의성 제공에 사용됨
- 병행 프로세스들이 입출력장치, 메모리, 프로세서, 클록 등 자원을 서로 사용 시 충돌 발생(경쟁 조건 race condition 발생)
병행 프로세스의 과제
- 병행성(Concurrency)
- 여러 프로세스를 이용해 작업을 수행
- 스템 신뢰도 높이고, 처리 속도 개선, 처리 능력을 높이는 데 중요
- 병행 프로세스의 문제
- 공유 자원 사호 배타적 사용(프린터, 통신망 등은 한 순간에 프로세스 하나만 사용
- 병행 프로세스 수행 과정에서 발생하는 상호배제 보장
- 병행 프로세스 간의 협력이나 동기화
- 프로세스 간 데이터 교환을 위한 통신 (IPC, Intercession of Process Communication)
- 동시에 수행하는 다른 프로세스의 실행속도와 관계없이 항상 일정한 실행 결과 보장(결정성-determinancy)확보
- 교착 상태 해결, 병행 프로세스들의 병령 처리 능력 극대화
- 교착상태(deadlock) : 다른 프로세스가 공유 자원을 사용하고 있다고 착각하여, 무한정 대기하는 상태
- 공유 자원 사호 배타적 사용(프린터, 통신망 등은 한 순간에 프로세스 하나만 사용
프로세스 간 통신의 개념
- 같은 컴퓨터 내에 있는 프로세스 간 통신(IPC), 또는 스레드 간 통신, 네트워크로 연결된 다른 컴퓨터에 있는 프로세스와의 통신
프로세스 간 통신의 종류
- OS 도움 X
- 프로세스 내부 데이터 통신: 하나의 프로세스 내에 2개 이상의 스레드가 존재하는 경우 통신
- 전역 변수, 파일을 사용해 통신
- 프로세스 간 데이터 통신 : 동일 컴퓨터에 있는 여러 프로세스끼리 통신
- 공용 파일 또는 OS가 제공하는 파이프, 또는 소켓를 사용하여 통신
- 파일 입출력은 일반 메모리 입출력보다 10배 이상의 지연이 발생
- 공용 파일 또는 OS가 제공하는 파이프, 또는 소켓를 사용하여 통신
- 프로세스 내부 데이터 통신: 하나의 프로세스 내에 2개 이상의 스레드가 존재하는 경우 통신
- OS 제공하는 통신
- 네트워를 이용한 데이터 통신 : 여러 컴퓨터가 네트워크로 연결되어 있는 경우 소켓으로 데이터 전달 (네트워킹)
- 다른 컴퓨터에 있는 함수 호출하여 통신하는 경우, 원격 프로시저(Remote Process Communication) 호출
- 네트워를 이용한 데이터 통신 : 여러 컴퓨터가 네트워크로 연결되어 있는 경우 소켓으로 데이터 전달 (네트워킹)
프로세스 간 통신의 분류
- 함수 호출로 데이터를 주고받는 것은 통신이 아니다. 프로세스 간 통신은, 동시에 실행되는 프로세스끼리 데이터를 주고받는 작업이다.
- 통신 방향에 따른 분류
- 양방향 통신(duplex communication) - IPC에서 소켓 통신
- 반양방향 통신(half-duplex communication) - 동시 전송은 불가능, 특정 시점에 한쪽 방향으로만 전송 가능 (무전기)
- 단방향 통신(simplex communication) - 모스 신호처럼 한쪽(IPC에서 전역 변수 1개 사용, 파이프)
- 통신 구현 방식에 따른 분류
- 대기가 있는 통신(blocking communication)- 동기화 통신(synchronous)
- 데이터를 받는 쪽은 데이터가 도착할 때까지 자동으로 대기 상태에 머물러 있음
- 대기가 없는 통신(non-blocking communication) - 비동기화 통신(asynchronous)
- 바쁜 대기를 사용하여 데이터가 도착해는지 여부를 직접 확인
- 바쁜 대기(busy waiting) : 데이터 수신 측에서 반복적으로 전역 변수의 값을 점검하여 반복문을 무한 실행하며 기다리는 것
- 대기가 있는 통신(blocking communication)- 동기화 통신(synchronous)
프로세스 간 통신의 종류
send -> write(GV, message)
write -> read(GV, message)
- 전역 변수를 이용한 통신
- 직접적으로 관련 있는 프로세스 간, 공동으로 관리하는 메모리를 사용해 데이터를 주고받는 것
- ex) 부모 프로세스가 전역 변수를 선언한 후 자식 프로세스를 만들면, 부모 프레스솨 자식 프로세스가 통신 할 수 있음
- 데이터를 보내는 쪽 → 전역 변수나 파일에 값을 씀
- 데이터를 받는쪽 → 전역 변수의 값을 읽음
- 직접적으로 관련 있는 프로세스 간, 공동으로 관리하는 메모리를 사용해 데이터를 주고받는 것
- 파일을 이용한 통신
- 저장 장치의 데이터를 읽고 쓰는 것 또한 일반 프로세스와 입출력 프로세스 간의 통신이다.
- 부모-자식 관계 프로세스 간 통신에서 많이 사용 (프로세스 동기화를 제공 X)
- 파일 열기
- 파일의 존재 유무, 쓰기 권한 확인
- 파일 기술자(file descriptor) fp를 통해 접근 → 화장실의 열쇠와 같은 역할
- 파일 읽기, 쓰기
- 파일 닫기
- 파이프를 이용한 통신
- 프로세스 동기화 문제를 해결하는 방법
- 운영체제가 제공하는 동기화 통신 방식 (단뱡향)
- 대기 상태: 파이프에서 읽기 연산을 수행했는데, 타 프로세스에서 쓰기 연산을 하지 않은 경우 대기 상태가 되며, 데이터가 쓰여지는 순간 자동으로 풀려 동기화가 이루어짐
- 이름없는 파이프(anonymous pipe) : 부모와 자식 프로세스, 혹은 같은 부모를 가진 프로세스와 같이 서로 관련 있는 IPC에서 사용
- 이름있는 파이프(named pipe) : FIFO라 불리는 특수 파일 이용하여 서로 관련 없는 프로세스 간 통신에 사용
- 소켓을 이용한 통신
- 네트워킹(여러 컴퓨터에 있는 프로세스 끼리 통신) - 네트워크, 소켓 프로그래밍
- 원격 프로시저 호출: 다른 컴퓨터에 있는 함수 호출
- 자바에서 다른 컴퓨터에 있는 객체의 메소드를 불러와 사용하는 것
- 소켓을 이용하여 구현
- 다른 컴퓨터의 위치를 파악
- 원격지의 시스템 내 여러 프로세스 중 어떤 프로세스와 통신을 할지 결정
- 자신의 소켓과 상대의 소켓을 연결하는 바인딩(binding) 작업
- 소켓에 쓰기 연산을 하여 데이터를 전송, 읽기 연산을 통해 데이터를 수신
- 소켓: 프로세스 동기화 지원(하나만 사용해도 양방향 통신 가능)
2. 공유 자원과 임계구역
- 한정된 자원을 가지고 공동으로 작업 하는 경우 문제 발생
공유 자원의 접근
- 공유 자원(shared resource): 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일
- 공유 자원 접근 순서를 결정해야 함
- 경쟁 조건(race condition) : 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황
- 상호 배제(Mutual Exclusion)
- 특정 공유 자원을 한 순간에 하나의 프로세스만 사용할 수 있을 때, 프로세스 하나가 공유 데이터를 접근하는 동안 다른 프로세스들은 해당 데이터를 접근할 수 없게 하는 것
- 동기화(Synchronization)의 필요
- 공유 자원을 동시에 사용하지 못하게 실행을 제어하는 기법
- 동기화로 상호 배제 보장할 수 있지만,이 과정에서 교착 상태, 기아 상태 발생 가능
- 기아상태: 동기화로 인해 누군가는 계속 기다려야 하는 상태
- 교착상태: 누구도 공유 자원을 사용하지 못하는 상태
임계 구역
- 임계 구역(critical section): 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역
- 임계 자원(Critical Resource): 둘 이상의 프로세스가 공유할 수 없는 자원
- 계 영역(Critical Section): 프로그램에서 임계 자원을 이용하는 부분
- 임계 구역은 여러 프로세스들이 동시에 작업하면 안되는 구역
- 다수의 프로세스가 접근 가능하지만, 어느 한 순간에는 프로세스 하나만 사용 가능
- 어떤 프로세스가 임계구역에 들어가면, 다른 프로세스는 임계구역 밖에서 대기해야 함
생산자-소비자 문제 (producer-consumer problem)
코드 및 실행 순서에 따른 결과
- 생산자는 수를 증가시켜가며 물건을 채우고 소비자는 생산자를 쫓아가며 물건을 소비
- 생산자 코드, 소비자 코드가 동시에 실행되면 문제 발생
- 생산자: 계속 물건을 생산해서 버퍼에 넣고[input(buf)] 소비자는 계속 버퍼에서 물건을 가져옴[output(buf)]
- 원형 버퍼(circular buffer): 작업을 계속하기 위해 사용
- sum 전역변수: 버퍼가 비었는지 가득 찼는지 확인 (현재 버퍼에 있는 상품의 총수 저장)
임계구역 해결 조건
- 어떤 방법이든 만족해야 하는 조건 3가지
1) 상호 배제(mutual exclusion)
- 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없다.
2) 한정 대기(bounded waiting)
- 어떤 프로세스든 무한 대기(infinite postpone)해선 안 된다. 특정 프로세스가 임계구역에 진입하지 못하면 안 된다.
3) 진행의 융퉁성(progress flexibility)
- 한 프로세스가 다른 프로세스의 진행을 방해해서는 안 된다.
- 임계 영역에 프로세스가 없는 상태에서는 어떤 프로세스든 진행 가능해야 함
3. 임계구역 해결 방법
임계 구역 해결 방법을 위한 기본 코드
- 잠금(lock)을 이용하는 것 → 잠금 해재와 동기화 신호 전송
#include <stdio.h>
typedef enum {false, true} boolean;
extern boolean lock=false;
extern int balance;
main(){
while(lock==true);
lock=true;
balance=balance+10;
lock=false;
}
- p1이 임계 구역에 들어가 있는 경우 lock을 false로 설정하여 다른 프로세스가 들어올 수 없도록 처리. 임계구역을 다 사용한 후에는 lock을 true로 변경
문제점
공유 변수를 두 개 사용하여 해결
- 상대 프로세스의 키를 한 번 더 확인하여 임계구역 진입 여부를 더 명확히 결정
- 상호 배제에 대한 환경은 확실히 만들어지지만, 무한정 대기라는 문제가 발생 (deadlock) → while loop 안에 묶여 동기화 문제를 해결하기 어렵게 됨
공유 변수 값을 부여
- boolean이 아닌 실제 정수 값을 사용
- 문제점 - 다른 프로세스의 진입을 방해하는 문제 발생
하드웨어적 해결 방법
- 값에 대한 변화를 하드웨어적인 형태로 처리
피터슨 알고리즘
- 상호 배제, 한정대기, 진행의 융튱성 제공을 모두 해결하는 알고리즘
- 2개의 프로세스만 실행할 수 있게 함
데커 알고리즘
- p1이 우선 잠금을 걸고, p2에 대해 작믐을 한 번 더 확인
데커 알고리즘의 동작
- 프로세스 P!은 우선 잠금을 검(lock1=true;)
- 프로세스 P2의 잠금이 걸렸는지 확인[while(lock2==true)]
- 만약 프로세스 P2도 잠금을 걸었다면 누가 먼저인지 확인[if(turn==2)]
만약 프로세스 P1의 차례라면(turn=1) 임계구역으로 진입, P2의 차례라면(turn=2) 4로 이동
- 프로세스 P1은 잠금을 풀고(lock=1false) 프로세스 P2가 작업을 마칠 때까지 기다림[while(turn==2);]
프로세스 P2가 작업을 마치면 잠금을 걸고(lock1=true;) 임계구역으로 진입
세마포어
- 임계구역에 진입하기 전에 스위치를 사용 중으로 놓고 임계구역으도들어감
- 이후 도착한 프로세스는 앞의 프로세스가 작업을 마칠 때까지 기다림
- 프로세스가 작업을 마치면 다음 프로세스에 임계구역을 사용하라는 동기화 신호를 전송
내부 코드
- RS값이 0인 경우 계속 대기 상태(wait)였다음
- V: 키를 반납
모니터
- 공유 자원을 내부적으로 숨기고, 공유 자원에 접근하기 위한 인터페이스만 제공
- 작업들이 요구하는 critical section을 처리하고, 그 결과만 해당 프로세스에게 알려줌
- 독립적인 프로세스끼리 작업을 하다 서로 데이터를 주고받아야 할 때 통신을 하는 경우, 누가 먼저 작업을 할지, 작업이 언제 끝날지 등을 서로 알려주어야 하는 동기화
- 같은 데이터를 여러 프로세스가 사용할 때 서로 침범하면 안되는 임계구역 문제 해결
728x90
반응형
'# CS Study > Opearing System' 카테고리의 다른 글
[운영체제/OS] 08장 가상 메모리 기초 (0) | 2022.08.21 |
---|---|
[운영체제/OS] 쉽게 배우는 운영체제 05장 문제풀이 (프로세스 동기화) (0) | 2022.08.21 |
[운영체제/OS] 쉽게 배우는 운영체제 04장 문제풀이 (CPU 스케줄링) (0) | 2022.08.21 |
[운영체제/OS] 04장 CPU 스케줄링 (0) | 2022.08.21 |
[운영체제/OS] 쉽게 배우는 운영체제 03장 문제 풀이 (프로세스) (0) | 2022.08.21 |
Comments