티스토리 뷰

반응형

프로세스 간 통신

프로세스 간 통신의 개념

프로세스 내부 데이터통신

 - 하나의 프로세스 내에 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()를 이용하여 소켓을 등록

 - 통신이 끝나면 소켓 기술자를 닫고 무한 루프를 돔

 

 

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함