4/10 학습일지 - 멀티쓰레드
key: blocking/none-blocking
모든 프로세서는 1개 이상의 스레드를 가지고 있다.
쓰레드는 부모가 죽으면 자식도 따라죽음 (프로세스와 다름)
하지만 죽으면 안될때 죽어버리는 단점이 될수있음
쓰레드의 장점은 메모리 공유, 단점도 메모리 공유..
쓰레드는 통째로 복사하는게 아니라 이 함수의 흐름대로 움직여줘 라고 말하는거임
프로세스와 달리 자신이 속한 프로세스의 메모리를 공유함 ( join )
ㅇ프로세스: 운영체제 관점에서 별도의 실행흐름을 구성하는 단위
ㅇ쓰레드: 프로세스 관점에서 별도의 실행흐름을 구성하는 단위
void* 은 어떤 자료형이 들어올지 모르니 void로 두고 포인터를 넣는다.
<채팅프로그램 과제>
예제를 찾아서 쓰되, 읽을 줄 알아야 함 (컨펌 필수)
방식1.
서버가 있고, 클라이언트들이 서버에 붙음
서버의 전권(방장)을 클라이언트1에게 준다.
서버장 기능을 갖고있는 클라이언트
모든 대화는 서버에 향하게됨
서버는 각 클라이언트들에게 전달
방식2.
*요구사항에 맞는 방식은 이 방식
서버가 방장 (절대적인 권한을 넘겨주는거임)
방식3.
이미 서버가 있고, 클라이언트가 만들어져 있는 서버에 접속하는 형식
클라이언트가 보내는 채팅은 모두 서버에게 감
서버가 처리해야할게 많아짐
ex) https://www.youtube.com/watch?v=pC6-U_0BxaA&ab_channel=MBCNEWS
채팅 프로그램은 멀티 프로세스 방식으로도, 멀티 쓰레드 방식으로도 다 만들 수 있음.
다만 프로세스 끼리 연결은 까다롭기 때문에 동일 메모리에서 채팅을 주고 받는 멀티 쓰레드 형식이 비교적 간단함
멀티 프로세스의 경우, 메모리를 독립적으로 각각 할당해줘야하니 os 입장에서 부담스럽기 때문에
이 점을 보완하기 위해 쓰레드가 탄생했다.
쓰레드는 별도의 실행흐름을 갖기 때문에 main 함수를 별도로 정의해야 한다.
이 함수를 시작으로 별도의 실행흐름을 형성해달라고 OS에게 요청해야한다.
요청하는 함수는 pthread 이다.
pthread create - 쓰레드 생성
pthread join - 쓰레드 종료 대기
<임계영역>
둘 이상의 쓰레드가 동시에 접근하는 경우 문제가 발생하는 영역
<쓰레드 동기화>
동기화: 0한 쓰레드가 변수에 접근하여 연산이 완료될 때 까지, 다른 쓰레드가 같은 변수에 접근하지 못하도록 막는 것
1. 뮤텍스 - 쓰레드 동시접근 불허, 자물쇠 (p.411)
생성 int pthread_mutex_init
삭제 int pthread_mutex_destroy0
2. 세마포어