CS(Computer Science) 14

CGI와 Servlet, 그리고 WS와 WAS

CGI와 Servlet에 대해 이야기하기 전에 먼저 WS와 WAS의 차이에 대해서 이야기하도록 하겠습니다. 일반적으로 웹서버라고 하면 WS와 WAS를 모두 통칭하는 경우가 많지만 이 글에서는 정적인 웹 페이지만을 반환하는 WS와 동적인 요청또한 처리할 수 있는 WAS를 분리해서 설명하도록 하겠습니다. Web Server (WS) WS의 정의는 다음과 같습니다. 웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램 또는 위에 언급한 기능을 제공하는 컴퓨터 프로그램을 실행하는 컴퓨터 즉 웹서버란 HTTP 프로토콜에 따른 요청을 받아서 HTML과 같은 정적인 웹 페이지를 반환하는 프로그램이나 컴퓨터를 의미한다고 이해할 수 있습니다. 결론적으..

[UNIX] read() write() 시스템 콜의 사용법과 주의사항

UNIX file 접근의 기초 read/write 시스템 콜에 대해 설명하기 전에 먼저 UNIX file 접근의 기초에 대해서 이해해 보자. UNIX상의 모든 file은 byte들의 linear sequence이다. 이 말은 즉, Text file과 Binary file이 따로 나누어져 있지 않다는 의미이다. 모든 파일은 Binary file이다. UNIX에서는 이런 파일들을 프로세스상에서 구분하기 위해서 open 해놓은 파일에 대해서 file descriptor라는 파일 구분자를 운영한다. 이는 file을 open 할 때마다 구조체 배열에 파일의 메타데이터가 저장되는 식으로 작동된다. 참고로 open 시스템 콜을 사용해서 file을 open 하게 되면 가공되지 않은 binary code를 그대로 받게 ..

삼성SDS 2023 동계(상반기) 대학생 알고리즘 특강 후기

삼성SDS에서는 매 방학 시즌에 대학생들을 대상으로 알고리즘 특강을 무료로 진행한다. 요즘에는 컴퓨터공학 전공뿐 아니라 전자, 기계분야도 코딩테스트가 거의 필수가 된 시대이다. 코딩테스트 하나만으로 그 사람의 사고에 대해 많은 것이 설명 가능하고, 또한 채용에 많은 돈을 들이는 기업의 입장에서 본다면 일종의 미달 기준선이 되기에 매우 좋은 시험이기 때문에 필수가 됐다고 생각한다. 이 알고리즘 특강은 알고리즘을 제대로 배워본 적이 없는 대학생이나 기존에 알고리즘을 공부했지만 플레티넘 수준의 문제는 접근하지 못해 봐서 더 깊게 알고리즘을 배우고 싶은 취준생 입장에서 매우 좋은 기회라고 생각한다. 나는 삼성SDS처럼 업계에서 좋은 입지를 가지고 있는 회사에서 이런 좋은 기회를 주는데 마다할 이유가 없다고 생각..

밀러 - 라빈 소수 판별법 (Miller - Rabin primality test)

컴퓨터 공학에 입문한 뒤 대부분 처음으로 배우는 소수 판별 알고리즘은 에라토스테네스의 체 알고리즘이다. 에라토스테네스의 체는 소수를 판별하고 싶은 범위 안의 소수인 수의 모든 배수를 차례로 제거해서 원하는 수의 범위에서 어떤 수가 소수인지 판별 할 수 있는 알고리즘이다. 이는 꽤나 직관적인 알고리즘으로, 알고리즘이 작동하는 방식을 보면 소수라는 체로 소수가 아닌 수를 거르는 것처럼 보인다. 따라서 알고리즘의 고안자인 에라토스테네스의 이름과 체를 붙여서 에라토스테네스의 체 라는 이름을 가지고 있다. 에라토스테네스의 체는 O(N^2) 시간복잡도를 가진 알고리즘이다. 그런데 놀랍게도 에라토스테네스의 체를 가르쳐 준 후, 컴퓨터 공학 학부를 졸업할 때까지 일반적인 학부 과정상에서 소수 판별에 대한 더 효율적인 ..

UNIX - [Record Locking]

사용법 #include int fcntl(int filedes, int cmd, struct flock *ldata); /* > filedes : lock을 설정 하려는 file의 descriptor > read-lock은 O_RDONLY/O_RDWR로 open된 file에 한해서 적용 가능 > write-lock은 O_WRONLY/O_RDWR로 open된 file에 한해서 적용 가능 > cmd : > F_GETLK : lock 정보 얻기 > 해당 정보는 세 번째 인수에 저장 > F_SETLK : non-blocking locking or unlocking > lock 설정에 관한 자세한 정보는 세 번째 인수에 지정 > F_SETLKW : blocking locking > lock 설정에 관한 자세한 정..

UNIX - [Shared memory]

shared memory (공유 메모리) 둘 이상의 프로세스가 물리적 메모리의 일부를 공유 가장 효율적인 IPC기법이다. shmget 시스템 호출 #include #include #include int shmget(key_t key, size_t size, int permflag); /* > key : 공유 메모리 영역의 identifier > size : 공유 메모리 영역의 최소 크기 > permflag : access permission|IPC_CREAT|IPC_EXCL > return 값 : 공유 메모리 영역의 identifier */ 공유 메모리 생성 예 512byte의 문자를 저장 할 공유 메모리 생성 shmid1 = shmget(0111, 512, 0600|IPC_CREAT); 10개의 정수를..

UNIX - [Semaphore]

semaphore 세마포는 양의 정수로 선언할 수 있다. 세마포의 2가지 기능 semWait(); → 세마포-1을 하고 세마포 ≥ 0 이라면 지나가고 아니라면 세마포 ≥ 0 이 될 때까지 Block한다. semSig(); → 세마포+1을 한다. p(sem); // semWait something interesting; // 크리티컬섹션 v(sem); // semSig semget 시스템 호출 사용법 #include #include #include int semget(key_t key, int nsems, int permflags); /* > key : semaphore 집합 이름 > nsems : semaphore 집합 내의 semaphore 수 > permflags : 0600, IPC_CREAT, I..

UNIX - [시스템 V의 프로세스간 통신 - Message queue]

시스템 V의 프로세스간 통신 유닉스는 처음 개발된 이래 다양한 형태로 발전했다. 크게 BSD 계열과 시스템 V 계열로 구분할 수 있다. 시스템V계열 유닉스에서 개발해 제공하는 프로세스간 통신 방법이 메세지 큐, 공유 메모리, 세마포어 이다. 이 세가지를 묶어서 시스템V IPC 라고 한다. 이것은 SVR2에서 처음 개발되었고, SVR4에서도 제공하고 있으며 현재는 대부분의 유닉스 시스템에서 제공하고 있다. IPC 설비 IPC(Inter-Process Communication)란 프로세스 간 통신을 의미한다. UNIX의 대표적인 IPC는 message_queue, semaphore, shared memory segment가 있다. key • key는 message_queue, semaphore, shared..

UNIX - [PIPE - 2]

FIFO pipe는 동일 ancestor를 갖는 프로세스들만 연결 가능. fifo는 모든 프로세스들을 연결 가능. UNIX의 file 이름을 부여 받는다. 소유자, 크기, 연관된 접근 허가를 가진다. 일반 file처럼, open, close, read, write, remove가 가능하다. fifo는 pipe와 다르게 UNIX의 파일 이름을 부여 받는다. 따라서 파일처럼 여러 권한 설정과 파일 크기를 가지고, open, close, read, write, remove 등의 시스템 콜을 사용 가능하다. 사용법 fifo 만들기 #include #include int mkfifo(const char *pathname, mode_t mode); // mode는 보통 0666으로 그냥 줌 → fifo open (..

UNIX - [PIPE]

유닉스의 프로세스 간 통신 방법 즉 IPC 통신에는 PIPE가 있다. PIPE란 이름처럼 두 프로세스 간에 데이터가 오고 가는 관. 즉 영어로 파이프를 생성해서 두 프로세스가 데이터를 주고받는 방법이다. 이 파이프는 fifo의 성질을 띄고있으며 단방향 통신이라는 특징이 있다. 파이프는 read와 write 시스템 콜을 이용해서 데이터를 주고받으며, 기본적으로 blocking read/ blocking write를 사용한다. 파이프를 이용해서 프로세스간 동기화 작업을 수행할 수 있으며, 프로세스 간 서버와 클라이언트의 동작을 구현할 수 있다. pipe 만들기 #include int pipe(int filedes[2]); → filedes[0] : 읽기용 → filedes[1] : 쓰기용 → 성공시 0, 실..