일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Java Call By Refernce
- nodejs rabbitmq
- 익명 객체 @transactional
- 자바 1676
- 전략 패턴이란
- 백준 2252 줄세우기
- 백준 연결요소 자바
- java 팩토리얼 개수
- java 파티
- kotiln const
- spring mongoTemplate switch
- java 1509
- javav 1676
- ipfs singletone
- 백준 1504 java
- kotiln const val
- rabbitmq 싱글톤
- ipfs bean
- mongodb lookup
- 안정해시
- java 백준 1509
- 자바 백준 팩토리얼 개수
- java 1238
- kotiln functional interface
- spring mongodb switch
- Spring ipfs
- spring mongoTemplate
- go
- spring mongodb
- 백준 특정한 최단 경로
- Today
- Total
공부 흔적남기기
프로세스 동기화 본문
프로세스 간 통신
프로세스 간 통신의 개념
프로세스 또는 스레드는 독립적으로 실행된다.
프로세스나 스레드가 협업을 하거나 병렬로 처리하기 위해서는 데이터를 주고받아야한다.
스레드는 하나의 프로세스 내부에서 실행되기 때문에 데이터를 주고 받는 것은 크게 어렵지 않다.
하지만 프로세스는 서로 공유하고 있는 부분이 없기 때문에 이를 새로 만들어서 통신해야한다.
운영체제는 프로세스 간 통신을 쉽게 할 수 있는 통신 방법을 제공하는데 이를 프로세스 간 통신(IPC) 라고한다.
대표적인 IPC로 공유 저장공간을 사용한 통신, 파이프 통신, 소켓 통신이 있다.
공유 저장공간을 이용한 통신은 데이터를 주고 받는 방법을 프로세스끼리 알아서 정의해서 사용해야하기 때문에 가장 원시적인 방식이다. (영구적인 데이터 저장이 필요할때 사용한다.)
파이프 통신은 가장 많이 사용되는 방법으로 운영체제가 제공한다. 보통의 경우 부모 자식 간 통신에 사용한다.
소켓 통신은 컴퓨터와 컴퓨터가 네트워크로 연결된 경우 즉 원격 컴퓨터의 프로세스끼리 통신해야할 때 사용한다.
프로세스 간 통신의 분류
양방향 통신: 데이터를 양쪽으로 동시에 전송할 수 있는 구조이다.
반양방향 통신: 데이터를 양쪽으로 전송할 수 있지만 동시에는 불가능하다.
단방향 통신: 데이터를 한쪽 방향으로만 전송할 수 있다.
대기가 있는 통신(blocking communication) -> 동기화 통신(synchronous communication)
대기가 없는 통신(nonBlocking communication) -> 비동기화 통신(asynchronous communictaion)
블로킹과 논블로킹 그리고 동기와 비동기는 비교 대상이 아니며 다른 개념이다.
블로킹은 작업이 끝날때 까지 차단/대기 하는 경우
논블로킹은 작업을 대기/차단하지 않고 다음 작업으로 넘김
동기는 작업이 끝난 데이터를 바로 사용하는 것
비동기는 작업이 끝난 데이터를 바로 사용하지 않고 완료되는 시점에 사용하는 것
대기가 있는 통신은 블로킹 이면서 동기화입니다.
파일을 읽는 코드를 실행시키면 파일을 읽을때까지 대기하며 해당 파일을 사용합니다.
대기가 없는 통신은 논블로킹이면서 비동기화입니다.
파일을 바쁜 대기를 통해서 기다리지만 동시에 다른 작업도 처리할 수 있습니다.
공유 메모리, 파일을 통한 통신: 프로세스 내부에서 동기화를 시켜서 진행함 단방향
파이프: 운영체제에서 동기화를 제공함 단방향
소켓: 기본적으로 동기화 제공함 양방향
공유 자원과 임계구역
공유 자원에 대한 접근
공유자원은 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말한다.
프로세스가 공유자원의 접근 순서에 따라 결과가 바뀌는 부분을 임계구역이라 한다.
임계 구역 문제 해결 조건
상호 배제: 한 프로세스가 임계 구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없다.
한정 대기: 한 프로세스가 임계 구역을 독차지해서 다른 프로세스가 임계구역에 들어가지 못해 무한대기를 해서는 안된다.
진행의 융통성: 프로세스간 임계구역을 돌아가며 사용가능해야 한다. 즉 한 프로세스가 다른 프로세스의 진행을 방해해서는 안된다. ( 너무 당연한 이야기라 이해가 안됨) 멀 강조하는지 모르겠음
임계 구역 문제 해결 방법
단순한 방법은 락을 사용하는 것이다.
소프트웨어로 구현하는 단순한 LOCK은 프로세스의 타임슬라이스의 경우 때문에 완벽하게 구현하지 못한다.
하드웨어의 도움을 받아 락을 거는 시점과 락을 확인하는 시점을 동시에 두면 문제를 해결할 수 있다.
피터슨 알고리즘 & 데커 알고리즘
알필요도 없고 사용할 일도 없을 거 같으니 나중에 정리 과연할까?..
그냥 lock 과 turn을 이용하여 안전한 락을 구현함
프로세스가 많아지거나 공유 변수가 많아지면 아주 어지러워짐
세마포어
세마포어 방식은 먼저 공유 가능한 자원 수를 설정하고
해당 공유 자원을 사용할 수 있으면 사용하고 사용할 수 없다면 큐에 들어가 대기하다가
다른 프로세스가 완료되면 큐에서 호출되어 공유자원을 사용한다.
예를들어
printer_resource = Semaphore(1) # 세마포어 초기값: 1
def print_job(job_id):
printer_resource.acquire()
print(f"Printing job {job_id}")
time.sleep(1) # 프린팅 시뮬레이션을 위한 sleep
printer_resource.release()
# 여러 프린팅 작업을 생성
threads = []
for i in range(5):
thread = Thread(target=print_job, args=(i,))
threads.append(thread)
# 모든 스레드 시작
for thread in threads:
thread.start()
# 모든 스레드 종료 대기
for thread in threads:
thread.join()
'책 읽기 > 쉽게 배우는 운영체제' 카테고리의 다른 글
교착 상태 (0) | 2024.02.02 |
---|---|
CPU 스케줄링 (0) | 2024.01.19 |
프로세스와 스레드에 대한 이해 (0) | 2024.01.16 |
프로세스와 스레드 (0) | 2024.01.14 |
컴퓨터 구조와 성능 향상 (0) | 2024.01.14 |