티스토리 뷰
프로세스 간 통신
프로세스 간 통신의 개념
프로세스 내부 데이터통신
- 하나의 프로세스 내에 2개 이상의 스레드가 존재하는 경우의 통신
- 프로세스 내부의 스레드는 전역 변수나 파일을 이용하여 데이터를 주고받음
프로세스 간 데이터 통신
- 같은 컴퓨터에 있는 여러 프로세스끼리 통신하는 경우
- 공용 파일 또는 운영체제가 제공하는 파이트를 사용하여 통신
네트워크를 이용한 데이터 통신
- 여러 컴퓨터가 네트워크로 연결되어 있을 때 통신
- 소켓을 이용하여 데이터를 주고받음
프로세스 간 통신의 분류
통신 방향에 따른 분류
양방향 통신
- 데이터를 동시에 양쪽 방향으로 전송할 수 있는 구조로, 일반적인 통신은 모두 양방향 통신
- 프로세스 간 통신에서는 소켓 통신이 양방향 통신에 해당
반양방향 통신
- 데이터를 양쪽방향으로 전송할 수 있지만 동시 전송은 불가능하고 특정 시점에 한쪽 방향으로만 전송할 수 있는 구조
- 반양방향 통신의 대표적인 예는 무전기
단방향 통신
- 모스 신호처럼 한쪽 방향으로만 데이터를 전송할 수 있는 구조
- 프로세스 간 통신에서는 전역 변수와 파이프가 단뱡향 통신에 해당
통신 구현 방식에 따른 분류
대기가 있는 통신
- 동기화를 지원하는 통신방식
- 데이터를 받는 쪽은 데이터가 도착할 때까지 자동으로 대기 상태에 머물러 있음
대기가 없는 통신
- 동기화를 지원하지 않는 통신 방식
- 데이터를 받는 쪽은 바쁜 대기를 사용하여 데이터가 도착했는지 여부를 직접 확인
프로세스 간 통신의 종류
프로세스간 통신방식
- 데이터를 주거나 받는 쓰기 연산과 읽기 연산으로 이루어짐
전역변수를 이용한 통신
- 공동으로 관리하는 메모리를 사용하여 데이터를 주고받는것
- 데이터를 보내는 쪽에서는 전역변수나 파일에 값을 쓰고, 데이터를 받는 쪽에서는 전역 변수의 값을 읽음
파일을 이용한 통신
- 파일열기
- open("com.txt", O_RDWR) : com.txt 파일을 읽기와 쓰기를 할 수 있는 형태로 준비
- 파일이 열리면 open 함수는 그 파일에 접근할 수 있는 권한인 파일 기술자 fd를 사용자에게 반환
- 읽기 또는 쓰기 연산
- write(fd, "Test", 5) : fd, 즉 com.txt파일에 Test라는 문자열을 쓰라는 뜻
- read(fd, buf, 5) : fd, 즉 com.txt 파일에서 5B를 읽어 변수 buf에 저장
- 파일 닫기
- close(fd) : fd가 가리키는 파일, 즉 com.txt 파일을 닫음
파이프를 이용한 통신
- 운영체제가 제공하는 동기화 통신방식으로, 파일 입출력과 같이 open() 함수로 기술자를 얻고 작업을 한 후 close() 함수로 마무리
- 파이프로 양방향 통신을 하려면 파이프 2개 사용
- 파이프에 쓰기 연산을 하면 데이터가 전송되고 읽기 연산을 하면 데이터를 받음
이름 없는 파이프
- 일반적으로 파이프라고 하면 이름없는 파이프를 가리킴
이름 있는 파이프
- FIFO라 불리는 특수파일을 이용하며 서로 관련없는 프로세스간 통신에 사용
소켓을 이용한 통신
- 여러 컴퓨터에 있는 프로세스끼리 통신하는 방법
- 통신하고자 하는 프로세스는 자신의 소켓과 상대의 소켓을 연결
- 시스템에 있는 프로세스가 소켓을 바인딩 한 후 소켓에 쓰기 연산을 하면 데이터가 전송되고, 읽기 연산을 하면 데이터를 받게됨
공유 자원과 임계구역
공유자원의 접근
공유자원
- 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말함
- 공동으로 이용되기 때문에 누가 언제 데이터를 읽거나 쓰느냐에 따라 그 결과가 달라질 수 있음
경쟁조건
- 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황
- 경쟁조건이 발생하면 공유자원 접근 순서에 따라 실행 결과가 달라질 수 있음
임계구역
임계구역
- 공유자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역
- 임계구역에서는 프로세스들이 동시에 작업을 하면 안됨
- 어떤 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역 밖에서 기다려야 하며 임계구역의 프로세스가 나와야 들어갈 수 있음
생산자 - 소비자 문제
코드 및 실행 순서에 따른 결과
- 생산자는 수를 증가시켜가며 물건을 채우고 소비자는 생산자를 쫒아가며 물건을 소비
- 생산자 코드와 소비자 코드가 동시에 실행되면 문제가 발생
임계구역 해결 조건
상호배제
- 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없는 것
한정대기
- 어떤 프로세스도 무한 대기하지 않아야함
진행의 융통성
- 한 프로세스가 다른 프로세스의 진행을 방해해서는 안 된다는것
임계구역 해결 방법
임계구역 해결 조건을 고려한 코드 설계
임계구역 문제의 하드웨어적인 해결방법
- 검사와 지정 코드로 하드웨어의 지원을 받아 while(lock==true)문과 lock = true;문을 한꺼번에 실행
- 검사와 지정코드를 이용하면 명령어 실행 중간에 타임아웃이 걸려 임계구역을 보호하지 못하는 문제가 발생하지 않음
피터슨 알고리즘
- 임계구역 해결의 세가지 조건을 모두 만족
- 2개의 프로세스만 사용 가능하다는 한계가 있음
데커알고리즘
세마포어
- 임계구역에 진입하기 전에 스위치를 사용 중으로 놓고 임계구역으로 들어감
- 이후에 도착하는 프로세스는 앞의 프로세스가 작업을 마칠 때까지 기다림
- 프로세스가 작업을 마치면 다음 프로세스에 임계구역을 사용하라는 동기화 신호를 보냄
세마포어 내부코드
- Semaphore(n) : 전역변수 RS를 n으로 초기화, RS에는 현재 사용 가능한 자원의 수가 저장
- P() : 잠금을 수행하는 코드로 RS가 0보다 크면(사용 가능한 자원이 있으면) 1만큼 감소시키고 임계구역에 진입, 만약 RS가 0보다 작으면(사용 가능한 자원이 없으면) 0보다 커질 때까지 기다림
- V() : 잠금 해제와 동기화를 같이 수행하는 코드로, RS값을 1 증가시키고 세마포어에서 기다리는 프로세스에게 임계구역에 진입해도 좋다는 wake_up신호를 보냄
모니터
세마포어의 잘못된 사용 예
- 1) 프로세스가 세마포어를 사용하지 않고 바로 임계구역에 들어간 경우로 임계구역을 보호할 수 없음
- 2) P()를 두번 사용하여 wake_up 신호가 발생하지 않은 경우로 프로세스 간의 동기화가 이루어지지 않아 세마포어 큐에서 대기하고 있는 프로세스들이 무한 대기에 빠짐
- 3) P()와 V()를 반대로 사용하여 상호 배제가 보장되지 않은 경우로 임계구역을 보호할 수 없음
모니터
- 공유자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공함으로써 자원을 보호하고 프로세스 간에 동기화를 시킴
모니터의 작동원리
- 1) 임계구역으로 지정된 변수나 자원에 접근하고자 하는 프로세스는 직접 P()나 V()를 사용하지 않고 모니터에 작업 요청
- 2) 모니터는 요청받은 작업을 모니터 큐에 저장한 순서대로 처리하고 그 결과만 해당 프로세스에 알려줌
파일, 파이프, 소켓 프로그래밍
파일
순차파일
- 아무리 큰 파일이라도 파일 내의 데이터는 개념적으로 한 줄로 저장됨
파일 기술자
- open() 함수로 파일을 열면 파일 기술자 fd를 얻음
- 파일 기술자는 파일 접근 권한 외에 현재 파일의 어느 위치를 읽고 있는지에 대한 정보도 보관
- 처음 파일이 열리면 파일 기술자는 맨 앞에 위치
- 파일에서 파일 기술자는 단 하나이고, 읽기를 하든 쓰기를 하든 파일 기술자는 계속 전진
파일을 이용한 통신
- read()와 write() 함수가 파일 기술자를 공유하며 통신
파이프
파이프를 이용한 통신
- 파이프는 파일 기술자를 fd[2]와 같이 2개의 원소를 가진 배열로 정의
- 배열에서 원소 하나는 읽기용이고 하나는 쓰기용으로 사용
네트워킹
소켓을 이용한 네트워킹
클라이언트 쪽의 통신 절차
- 처음에 socket() 구문으로 소켓을 생성하고 변수 sp로 이 소켓에 접긎ㄴ
- 통신이 초기화되면 sp와 ad를 이용하여 서버와 connect()를 시도
- 연결이 이루어지면 소켓으로부터 5B를 읽어 화면에 출력하고 닫은 후 클라이언트 프로그램을 끝냄
서버 쪽의 통신 절차
- 통신을 초기화한 후 소켓을 생성하고 bind()를 이용하여 소켓을 등록
- 통신이 끝나면 소켓 기술자를 닫고 무한 루프를 돔
'CS(Computer Science) > 운영체제' 카테고리의 다른 글
운영체제) #7 물리 메모리 관리 (0) | 2020.12.03 |
---|---|
운영체제) #6 교착상태 (0) | 2020.10.29 |
운영체제) #4 CPU 스케줄링 (1) | 2020.09.24 |
운영체제) #3 프로세스와 스레드 (0) | 2020.09.17 |
운영체제) #2 컴퓨터의 구조와 성능향상 (0) | 2020.09.10 |
- Total
- Today
- Yesterday
- 안드로이드
- 에러
- 에러해결
- 해결
- RecyclerView
- Android
- DART
- WAS
- springboot
- redis
- 안드로이드스튜디오
- 알고리즘
- socket.io
- mysql
- Android Studio
- Tutorial
- github
- node.js
- Git
- password
- django server
- chatting
- 코틀린
- 플러터
- flutter
- Hummingbird
- Kotlin
- CHANNELS
- Django
- flame
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |