posted by bluelimn 2015.01.27 10:45

IPC : pipe, named pipe, semaphore, message queue, shared memory, futex, socket


Futex : fast userspace mutex(Spinlock 방식)

- 장점 : 빠름 (sleep 대신 while), 

            lock이 user space에 있기 때문에 접근성이 좋음(공유 메모리나 Thread 및           Process간 공유 가능)

- 단점 : 기본적으로 loop를 계속 돌고 있기 때문에 core수가 뒷받침되어야 한다. 

           (single core에서는 소용 없음.)


pthread mutex vs pthread spinlock

Pasted from <http://www.alexonlinux.com/pthread-mutex-vs-pthread-spinlock> 



Pselect()

int pselect(int nfds, fd_set *readfds, fd_set *writefds,

           fd_set *exceptfds, const struct timespec *timeout,

           const sigset_t *sigmask);

• pselect는 struct timespec 구조체 사용한다. timespec 구조체를 사용함으로써        나노초까지 세밀하게 조정할 수 있게 되었다.


struct timespec {

    long    tv_sec;         /* seconds */

    long    tv_nsec;        /* nanoseconds */

};

• pselect 는 Linux(:12) 커널 2.6.16에 추가되었다. 이전에는 glibc에서 애뮬레이트한
          함수가 제공되었으나 버그를 가지고 있었다.

• sigmask를 사용해서 시그널을 블럭시킬 수 있다. select의 경우 수행되는 도중에         시그널에 의한 인터럽트가 발생하게 되면, race condition 혹은 무한 블록킹         상태에 놓일 수 있었다. pselect를 사용하면 이러한 문제를 제거할 수 있다. 


Pasted from <http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/2/select> 

Pselect가 select와 다른 점

- Nano sec단위로 사용하므로 이론적으로는 타이머 해상도가 정밀하나 실전에서는
        micro sec단위도 안정적으로 제공하지 못한다.

- Timeout parameter를 변경하지 않는다. 사용할 때마다 timeout을 다시 설정할
        필요가 없음

- Signal parameter가 추가됨(sigmask) : signal 을 차단함.




Select() : 동기식 다중 입출력 제공
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

Int select (int n,
                  fd_set *readfds,
                   fd_set *writefds,
                   fd_set *execptfds,
                   struct timeval *timeout);

FD_CLR(int fd, fd_set *set);       /* delete FD */
FD_ISSET(int fd, fd_set *set);    /* select의 결과에 해당 fd가 있는지 */
FD_SET(int fd, fd_set *set);      /* add FD*/
FD_ZERO(fd_set *set);


#include <sys/time.h>
Struct timeval {
             long tv_sec;    /* sec */
             long tv_usec;  /* micro sec */
};

Poll() : select를 보완 (fd set을 하나로 통일)
#include <sys/poll.h>
Int poll (struct pollfd *fds, unsigned int nfds, int timeout);

#include <sys/poll.h>
Struct pollfd {
            int fd;
            short events;   /* 감시 대상 요청 */
            short revents; /* returned event */
}

Events:
POLLIN : Data other than high-priority data may be read without blocking.
POLLRDNORM : Normal data may be read without blocking.
POLLRDBAND : Priority data may be read without blocking.
POLLPRI : High-priority data may be read without blocking.
POLLOUT : Normal data may be written without blocking.
POLLWRNORM : Equivalent to POLLOUT.
POLLWRBAND : Priority data may be written.
POLLERR : An error has occurred on the device or stream. This flag is only valid in the revents bitmask; it shall be ignored in the events member.
POLLHUP : The device has been disconnected. This event and POLLOUT are mutually-exclusive; a stream can never be writable if a hangup has occurred. However, this event and POLLIN, POLLRDNORM, POLLRDBAND, or POLLPRI are not mutually-exclusive. This flag is only valid in the revents bitmask; it shall be ignored in the events member.
POLLNVAL : The specified fd value is invalid. This flag is only valid in the revents member; it shall ignored in the events member.

Ppoll() : pselect 처럼 만든 것, 나노초 단위, sigmask 제공, linux 전용
#define _GNU_SOURCE
#include <sys/poll.h>
Int ppoll (struct pollfd *fds,
                  nfds_t nfds,
                  const struct timespec *timeout,
                  const sigset_t *sigmask);

Poll과 select 비교

oll 

select 

매개변수에 +1(fd+1)이 필요없다 

 

fd의 숫자가 큰 경우 select보다 효율적 

fd_set값이 크면 비효율적이다. bitmask를 모두 검사하며 특히 bit가 분산된 경우 더욱 비효율적이다 

 

 매번 set을 초기화해야 한다.(FD_ZERO)

 

 이식성을 높이기 위해 timeout parameter(timeval)를 매번 초기화 해야함

Pselect() 사용할 경우 초기화 안해도

 몇몇 UNIX에서는 poll을 지원하지 않는다

 이식성이 높다

 

 microsecond단위까지는 timeout resolution이 더 좋다

Pasted from <http://bluelimn.tistory.com/entry/2-epoll-select-poll>

 


Select example(server)


Select example(client)


Poll example


'Programming > linux왕초보' 카테고리의 다른 글

fork  (0) 2015.05.26
Linux SSD 최적화  (0) 2015.04.17
fflush, fileno  (0) 2015.04.07
[Linux] stream write  (0) 2015.03.26
linux filesystem 사용 용량 확인  (0) 2015.03.18
[Linux] Select and Poll  (0) 2015.01.27
Example syntax for Secure Copy (scp) : scp사용법  (0) 2014.04.02
tar 분할압축/풀기  (0) 2014.03.20
slang_rs_export_foreach.cpp Error: ParamName  (0) 2014.02.26
printk : kernel log 설정  (0) 2013.11.19
[Linux] Top 명령어 사용법  (0) 2013.11.08

티스토리 툴바