
수신 스레드 : echo_recv()는 클라이언트로부터 메시지를 수신하여 메시지큐에 넣는 작업 송신 스레드 : echo_resp()는 메시지큐에서 메시지를 꺼내와서 클라이언트에 응답하는 작업 앞서 파이프를 사용한 에코서버를 처리한것과 비슷하지만 멀티 프로세스가 아닌 멀티 스레드 방식을 사용하는데 차이가 있음. 송신 및 수신을 위해 스레드를 각각 5개씩 생성, 임의의 스레드가 랜덤하게 에코 서비스를 수행하게 처리. 메시지큐 생성을 위한 키값과 포트번호를 입력받음 recvfrom()을 통해 받은 메시지를 메시지큐에 thread를 통해 송신( 메시지를 받아서 메시지큐에 넣으니 스레드는 recv해야함 => recv thread) sendto()를 통해 전송할 메시지를 메시지큐에서 thtread를 통해 수신(메시..

what? 조건변수란 스레드간 통신을 위해 공유데이터에 대한 상태를 서로 주고 받기 위해서 사용하는 변수이다. how?어떻게 사용? *반드시 뮤텍스와 함께 사용* 조건변수에 대한 정보를 알기 위해서 기다리는 함수를 호출. => cond에 조건 알림(signal)이 발생할 때까지 대기하는 함수. cond : 조건변수 인자 mutex : 조건변수를 mutex로 "제어"하며 공유데이터에 대한 접근을 제어하는데 사용 => 호출함수 사용시 : mutex를 해당 스레드가 얻어야(lock) pthread_cond_wait가 가능함. => 호출발생시(호출이 적용되는 순간) : wait를 호출하는 순간에는 mutex를 해제(umlock)해야 가능함. => 이후, wait는 블록상태로 정보를 얻을 thread가 cond를..

what? 스레드의 동기화 문제를 해결하기 위해 사용하는 커널이 제공하는 일종의 플래그. 멀티프로세스 프로그램에서의 세마포어를 사용해도 무방하지만 프로그램의 구현이 뮤택스가 더 쉬움 바이너리 세마포어와 유사하게 적용 how? 크리티컬 영역 기준으로 look -> unlook이 진행된다. - 크리티컬 영역에 들어가기 "직전" : 뮤텍스를 잠금 시켜 다른 스레드가 사용하지 못하게 하여 자신만 사용 - 크리티컬 영역에 나온 "직후" : 뮤텍스를 해제하여 다른 스레드가 사용할 수 있게 함. pthread_mutex_t mutex; // 1. 뮤텍스 생성 (선언) // 2.뮤텍스 초기화 작업 pthread_mutex_lock(mutex); // 3. 뮤텍스 잠금 // 4. 공유데이터(크리티컬 영역) 엑세스 pth..

이전 시간 살펴본 스레드 취소요청에 대해 직접 돌려보며 알아보자 1. pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL) 취소요청을 수락하지 않으며 진행한다. 50000번째마다 정해진숫자만큼 무한루프를 돌며 취소요청을 검사한다면, 취소요청이 있더라도 수락하지 않아서(취소요청이 없는 것처럼 행동) pthread_testcancel()에서 작동되지 않는다. 2. pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) 취소요청을 수학하며 진행한다. 50000번째마다 정해진숫자만큼 무한루프를 돌며 취소요청을 검사한다면, 취소요청이 있을 때 pthread_testcancel()에서 걸려서 종료된다. 그때 PTHREAD_CANCELED가..
what? 멀티태스킹 방법중 하나로 둘 이상의 스레드를 생성하는 프로그램이다. 하나의 컴퓨터에서 병렬로 여러 작업을 처리할 경우 멀티 스레드 방식이 사용될 수 있다. 멀티프로세스 프로그램과 달리 복잡한 프로세스간 통신 기능을 사용하지 않아도 스레드간 데이터 공유가 쉽게 이루어진다. how? 한 프로세스 내에서 생성된 스레드들은 서로 전역 변수를 공유하므로 스레드간 데이터를 편리하게 공유할 수 있다. - 스레드 생성과 종료 //pthread_create() int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine) (void *), void *arg) // thread : 스레드가 정상생성된 경우 ID가 저장됨 => ..

세마포어를 적용시켜 펜과 연필을 동시에 사용하는 코드를 작성해보자 펜과 연필에 대한 초기값을 3개로 설정하고 4개의 프로세스에서 각 프로세스마다 3번 실행하게 하여 12개를 출력해본 결과이다. 연필과 노트를 가지고 공부를 하는 도중에 다른 프로세스가 끼어들지 못하는 것은 세마포어를 사용했기 때문이다. !초기값을 신경써서 operation을 적용해야함! 그렇다면 만약에 세마포어를 사용하지 않는다면 어떻게 될까? 라는 생각으로 코드를 바꿔 돌려보았다. fork( )를 2번실행했을 때는 문제가 없었지만 프로세스를 10개를 만들었을 때 동기화문제가 발생하였다. 이후, 위에서 세마포어를 적용한 코드를 돌린 것도 프로세스를 10개 만들었을 때를 확인해본 결과 동기화 문제가 세마포어때문에 발생하지 않는다는 것도 다시..

what ? - 세마포어는 프로세스간 통신에서 발생하는 동기화문제를 해결하기 위해서 사용하는 프로세스간통신에 사용되는 방법중 하나이다. - 공유데이터를 액세스하는 프로세스를 한순간에 하나로 제한하는 방법을 사용한다. - 세마포어란, "어떤 공유데이터(프로세스에서 같이 사용하는 변수를 예로 들수있다)에 대해 "현재 사용 가능한 데이터의 수""이다. => 세마포어의 정의 해석 : 세마포어가 0일때 현재 사요아능한 공유데이터에 대해 사용가능한 데이터의 수가 0이기에 접근할 수 없다는 것을 의미하고 1일때는사용가능한 것을 의미한다. ##이때의 세마포어는 S=0혹은 S=1로 사용불가능, 사용가능으로 두개의 값만 가질 수 있는 이진 세마포어## ##만약 공유데이터가(아래 사진의 예제에서 X변수) 두개 이상일때는 S..
what? 무엇? 소켓 프로그램에서 소켓의 디폴트 설정 값을 그래도 사용하는 경우가 아니라 TCP/IP 프로토콜의 세부적인 기능을 활용하거나 소켓의 동작의 특성을 변경할 수 있다. 이때, 사용하는 것을 소켓 옵션이라고 한다. HOW? 어떻게 사용? 소켓 옵션을 변경하는 방법과 멀티캐스트 패킷을 송수신하는 방법 및 멀티캐스트를 이용한 채팅 프로그램을 작성하며 알아보자. *소켓옵션 변경 함수 int getsockopt(int s int level., int opt, const char *optval, int *optlen); - 소켓 s에 지정되어있는 옵션 값을 알아내기 위해 사용하는 getsockopt int setsockopt(int s, int level, int opt, const char *optv..

WHAT? 무엇인가? pipe에 이름을 지정하여 다른 프로세스에서도 pipe를 사용할 수 있도록 한 것 HOW? 어떻게 구현? - pipe와 다른점은 다른 프로세스간에 통신이 가능하다는 점 1. 프로세스 A -> 프로세스 B로 메세지를 넘길때 프로세스 A에서 FIFO는 WRITE 프로세스 B에서 FIFO는 READ 2. FIFO의 이름을 지정하며 (+mode의 지정) FIFO를 생성해 프로세스간 통신을 할 수 있음 WHY? 왜 필요한가? - 멀티프로세스 형태로 서버를 구현하는 경우, 프로세스 사이에 데이터를 주고받을 필요가 있고 이때 프로세스간 IPC가 사용되며 IPC의 한 종류로 FIFO가 있다. - PIPE의 한계를 극복 : 파이프는 fork()로 만들어진 프로세스간 통신에서만 사용할 수 있는데 FI..
- Total
- Today
- Yesterday
- 백트래킹(1)
- 효율적인방법찾기
- 백준 10866
- stack 컨테이너
- 시뮬레이션 c
- 기본 텍스트 분류
- 핀테크 트렌드
- 기사작성 대외활동
- 소프트웨어공학설계
- 온라인프로필 만들기
- CSMA/CD란?
- 딥러닝입문
- DRF 회원관리
- 스택 파이썬
- 백준 4963
- mm1queue
- 백준 숫자놀이
- 모듈 사용법
- 코딩월드뉴스
- 11053 백준
- 4963 섬의개수
- 영화 리뷰 긍정 부정 분류
- 13886
- LAMBDA
- c++덱
- CREATE ASSERTION
- 파이썬 알아두면 유용
- 백준 15650 파이썬
- 백준 11053 파이썬
- 10866 백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |