: 클라이언트와 서버간의 중계 서버로, 통신을 대리 수행하는 서버
- proxy I: sequential / 서버 하나에 클라 하나
- proxy II: concurrent / 서버 하나에 클라 여러개(컴퓨터시스템 12장)
- proxy III: cache / 프록시에 캐시를 저장
ㅇ 프록시는 방화벽 에서 사용된다.
ㅇ 익명화 역할을 하는 프록시는 브라우저를 웹 서버에 익명으로 만들 수 있다.
ㅇ 원격 서버와 다시 통신하지 않고 캐시에서 읽어 미래 요청에 응답한다.
: 클라이언트와 인터넷 사이에 위치 (클라 - 포워드프록시 - 인터넷 - 서버)
1) 캐싱 : 클라이언트가 요청한 내용을 캐싱
: 인터넷과 서버 사이에 위치 (클라 - 인터넷 - 리버스프록시 - 서버)
1) 캐싱 : 클라이언트가 요청한 내용을 캐싱 (Forward Proxy와 동일)
2) 보안 : 서버 정보를 클라이언트로부터 숨김
- Client는 Reverse Proxy를 실제 서버라고 생각하여 요청
- 실제 서버의 IP가 노출되지 않음
3) Load Balancing (선택적)
: 여러 대의 서버가 분산(나누어) 처리할 수 있도록 요청을 나누어주는 서비스
sudo apt-get install net-tools
터미널에 설치 후
프록시 폴더 들어가서 make clean
- make
- ./driver.sh
하면 점수가 나온다
즉, 여러 클라이언트의 요청을 한 서버로 처리하는데, 이 처리방식이 프로세스를 여러개로 하는 방식이 아니라 쓰레드를 이용,
한 프로세스가 feed쓰레드를 여러개 함으로써,그런 요청들을 처리하는 방식으로 했다. -> 책 : 쓰레드에 기초한 동시성 서버. 라고 함
운영 체계 또는 프로그램 작성 내에서 공유 자원에 대한 접속을 제어하기 위해 사용되는 신호이다.
그런데 병행 내지 병렬로 동작되는 둘 이상의 프로세서 사이에서 공유 자원을 동시에 사용할 수 없기 때문에, 한 프로세서가 사용하고 있는 동안에 세마포어를 세워서 다른 프로세서를 대기시키고 사용이 끝나면 해제시키는 방법으로 사용
비슷한 맥락에서 뮤텍스는 공유된 자원의 데이터를 여러 쓰레드가 접근하는 것을 막는 것!!!
뮤텍스는 0과 1로 구분하여 접근을 상호 배제하는 기술이다.
뮤텍스는 Locking 메커니즘으로 오직 하나의 쓰레드만이 동일한 시점에 뮤텍스를 얻어 임계 영역(Critical Section)에 들어올 수 있다. 그리고 오직 이 쓰레드만이 임계 영역에서 나갈 때 뮤텍스를 해제할 수 있다.
SIGPIPE 시그널은 소켓에서 다른 한쪽이 접속을 끊은 소켓에 대하여 쓰기 / 읽기 작업을 수행하려 할 때 발생한다. 이 시그널의 기본 액션은 프로세스 종료이므로 서버 프로세스는 이 시그널이 발생하면 종료된다. 서버 프로세스가 종료되지 않도록 하려면 Signal(SIGPIPE, SIG_IGN) 을 사용하여 무시한다.
void cache_LRU(int index) {
int i;
for (i = 0; i < CACHE_OBJS_COUNT; i++) {
if (i == index) { continue; }
writePre(i);
if (cache.cacheobjs[i].isEmpty == 0) {
cache.cacheobjs[i].LRU--;
}
writeAfter(i);
}
}
readerPre 하지 않고 break 할 시 readerPre가 계속 잠겨있어 프로그램이 계속 멈춰있을 수 있는 위험이 있어보입니다.
그래서 저는 break전에 readerAfter(i)를 해주었습니다.
int cache_find(char *url) {
int i;
for (i = 0; i < CACHE_OBJS_COUNT; i++) {
readerPre(i);
if (cache.cacheobjs[i].isEmpty == 0 && strcmp(url, cache.cacheobjs[i].cache_url) == 0) {
readerAfter(i);
return i;
}
readerAfter(i);
}
return -1;
}