pthreads(7) - wariua/manpages-ko GitHub Wiki
pthreads - POSIX ์ค๋ ๋
POSIX.1์์๋ ์ค๋ ๋ ๋ฐฉ์ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ์ผ๊ตฐ์ ์ธํฐํ์ด์ค(ํจ์, ํค๋ ํ์ผ)๋ฅผ ๋ช ์ธํ๋๋ฐ, ๋ณดํต POSIX ์ค๋ ๋ ๋ด์ง Pthreads๋ผ๊ณ ํ๋ค. ํ ํ๋ก์ธ์ค ์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์์ ์ ์์ด์ ๋ชจ๋ ๋์ผ ํ๋ก๊ทธ๋จ์ ์คํํ๋ค. ๊ทธ ์ค๋ ๋๋ค์ ๋์ผํ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ(๋ฐ์ดํฐ ๋ฐ ํ ์ธ๊ทธ๋จผํธ)๋ฅผ ๊ณต์ ํ์ง๋ง ์ค๋ ๋๋ง๋ค ๊ฐ์์ ์คํ(์๋ ๋ณ์)์ด ์๋ค.
POSIX.1์์๋ ์ค๋ ๋๋ค์ด ๋ค์ํ ๋ค๋ฅธ ์์ฑ๋ค์ ๊ณต์ ํ๊ธฐ๋ฅผ ์๊ตฌํ๋ค. (์ฆ ์ด ์์ฑ๋ค์ ์ค๋ ๋ ํ์ ์ด ์๋๋ผ ํ๋ก์ธ์ค ์ ์ญ์ด๋ค.)
-
ํ๋ก์ธ์ค ID
-
๋ถ๋ชจ ํ๋ก์ธ์ค ID
-
ํ๋ก์ธ์ค ๊ทธ๋ฃน ID ๋ฐ ์ธ์ ID
-
์ ์ด ํฐ๋ฏธ๋
-
์ฌ์ฉ์ ID ๋ฐ ๊ทธ๋ฃน ID
-
์ด๋ฆฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ
-
๋ ์ฝ๋ ๋ฝ (fcntl(2))
-
์๊ทธ๋ ์ฒ๋ฆฌ ๋ฐฉ์
-
ํ์ผ ๋ชจ๋ ์์ฑ ๋ง์คํฌ (umask(2))
-
ํ์ฌ ๋๋ ํฐ๋ฆฌ (chdir(2)) ๋ฐ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ (chroot(2))
-
๊ฐ๊ฒฉ ํ์ด๋จธ (setitimer(2)) ๋ฐ POSIX ํ์ด๋จธ (timer_create(2))
-
๋์ด์ค ๊ฐ (setpriority(2))
-
์์ ์ ํ (setrlimit(2))
-
CPU ์๊ฐ (times(2)) ๋ฐ ์์ (getrusage(2)) ์๋ชจ ์ธก์ ์น
POSIX.1์์๋ ์คํ๋ฟ ์๋๋ผ ์ฌ๋ฌ ๋ค๋ฅธ ์์ฑ๋ค์ด ์ค๋ ๋๋ณ๋ก ๊ตฌ๋ถ๋์ด ์๋ค๊ณ ๋ช ์ธํ๋ค.
-
์ค๋ ๋ ID (
pthread_t
๋ฐ์ดํฐ ํ์ ) -
์๊ทธ๋ ๋ง์คํฌ (pthread_sigmask(3))
-
errno
๋ณ์ -
๋์ฒด ์๊ทธ๋ ์คํ (sigaltstack(2))
-
์ค์๊ฐ ์ค์ผ์ค๋ง ์ ์ฑ ๊ณผ ์ฐ์ ์์ (sched(7))
๋ค์ ๋ฆฌ๋ ์ค ํ์ ์์ฑ๋ค ์ญ์ ์ค๋ ๋๋ณ์ด๋ค.
-
์ญ๋ฅ (capabilities(7))
-
CPU ์นํ์ฑ (sched_setaffinity(2))
pthreads ํจ์ ๋๋ถ๋ถ์ ์ฑ๊ณต ์ 0์ ๋ฐํํ๊ณ ์คํจ ์ ์ค๋ฅ ๋ฒํธ๋ฅผ ๋ฐํํ๋ค. pthreads ํจ์๋ค์ด errno
๋ฅผ ์ค์ ํ์ง ์๋๋ค๋ ์ ์ ์ ์ํด์ผ ํ๋ค. ์ค๋ฅ๋ฅผ ๋ฐํํ ์ ์๋ pthreads ํจ์ ๊ฐ๊ฐ์ ๋ํด POSIX.1-2001์์๋ ๊ทธ ํจ์๊ฐ ์ ๋ EINTR
์ค๋ฅ๋ก ์คํจํ ์ ์๋ค๊ณ ๋ช
์ธํ๊ณ ์๋ค.
ํ๋ก์ธ์ค ๋ด์ ๊ฐ ์ค๋ ๋์๋ (pthread_t
ํ์
์ ์ ์ฅํ๋) ๊ณ ์ ์ ์ค๋ ๋ ์๋ณ์๊ฐ ์๋ค. pthread_create(3) ํธ์ถ์์๊ฒ ์ด ์๋ณ์๊ฐ ๋ฐํ๋๋ฉฐ pthread_self(3)๋ก ์๊ธฐ ์ค๋ ๋ ์๋ณ์๋ฅผ ์ป์ ์ ์๋ค.
์ค๋ ๋ ID๋ ํ๋ก์ธ์ค ๋ด์์๋ง ์ ์ผ์ฑ์ด ๋ณด์ฅ๋๋ค. (์ค๋ ๋ ID๋ฅผ ์ธ์๋ก ๋ฐ๋ pthreads ํจ์ ๋ชจ๋์์ ๊ทธ ID๋ ์ ์์ ํธ์ถ์์ ๊ฐ์ ํ๋ก์ธ์ค ๋ด์ ์ค๋ ๋๋ฅผ ๊ฐ๋ฆฌํจ๋ค.)
์ข ๋ฃ๋ ์ค๋ ๋๊ฐ ํฉ๋ฅ๋๊ฑฐ๋ ๋ถ๋ฆฌ๋ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋ ํ์ ์์คํ ์ด ์ค๋ ๋ ID๋ฅผ ์ฌ์ฌ์ฉํ ์๋ ์๋ค. POSIX์์๋ "์๋ช ์ด ๋๋ ์ค๋ ๋ ID๋ฅผ ์์ฉ์์ ์ฌ์ฉํ๋ ค ์๋ํ๋ ๊ฒฝ์ฐ์ ๋์ ๋ฐฉ์์ ๊ท์ ๋์ด ์์ง ์๋ค"๊ณ ํ๋ค.
์ค๋ ๋ ์์ (thread-safe) ํจ์๋ ๋์์ ์ฌ๋ฌ ์ค๋ ๋์์ ํธ์ถํด๋ ์์ ํ (์ฆ ์ด๋ ๊ฒฝ์ฐ๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋๋) ํจ์์ด๋ค.
POSIX.1-2001๊ณผ POSIX.1-2008์์๋ ๋ค์ ํจ์๋ค์ ์ ์ธํ๊ณ ๊ทธ ํ์ค์์ ๋ช ์ธํ๋ ํจ์ ๋ชจ๋๊ฐ ์ค๋ ๋ ์์ ์ด์ด์ผ ํ๋ค๊ณ ์๊ตฌํ๋ค.
asctime()
basename()
catgets()
crypt()
ctermid() NULL ์๋ ์ธ์ ์ค ๊ฒฝ์ฐ
ctime()
dbm_clearerr()
dbm_close()
dbm_delete()
dbm_error()
dbm_fetch()
dbm_firstkey()
dbm_nextkey()
dbm_open()
dbm_store()
dirname()
dlerror()
drand48()
ecvt() [POSIX.1-2001 ํ์ (POSIX.1-2008์์ ์ ๊ฑฐ)]
encrypt()
endgrent()
endpwent()
endutxent()
fcvt() [POSIX.1-2001 ํ์ (POSIX.1-2008์์ ์ ๊ฑฐ)]
ftw()
gcvt() [POSIX.1-2001 ํ์ (POSIX.1-2008์์ ์ ๊ฑฐ)]
getc_unlocked()
getchar_unlocked()
getdate()
getenv()
getgrent()
getgrgid()
getgrnam()
gethostbyaddr() [POSIX.1-2001 ํ์ (POSIX.1-2008์์ ์ ๊ฑฐ)]
gethostbyname()
[POSIX.1-2001 ํ์ (POSIX.1-2008์์ ์ ๊ฑฐ)]
gethostent()
getlogin()
getnetbyaddr()
getnetbyname()
getnetent()
getopt()
getprotobyname()
getprotobynumber()
getprotoent()
getpwent()
getpwnam()
getpwuid()
getservbyname()
getservbyport()
getservent()
getutxent()
getutxid()
getutxline()
gmtime()
hcreate()
hdestroy()
hsearch()
inet_ntoa()
l64a()
lgamma()
lgammaf()
lgammal()
localeconv()
localtime()
lrand48()
mrand48()
nftw()
nl_langinfo()
ptsname()
putc_unlocked()
putchar_unlocked()
putenv()
pututxline()
rand()
readdir()
setenv()
setgrent()
setkey()
setpwent()
setutxent()
strerror()
strsignal() [POSIX-1.2008์์ ์ถ๊ฐ]
strtok()
system() [POSIX-1.2008์์ ์ถ๊ฐ]
tmpnam() NULL ์๋ ์ธ์ ์ค ๊ฒฝ์ฐ
ttyname()
unsetenv()
wcrtomb() ๋ง์ง๋ง ์ธ์๊ฐ NULL์ธ ๊ฒฝ์ฐ
wcsrtombs() ๋ง์ง๋ง ์ธ์๊ฐ NULL์ธ ๊ฒฝ์ฐ
wcstombs()
wctomb()
๋น๋๊ธฐ ์ทจ์ ์์ (async-cancel-safe) ํจ์๋ ๋น๋๊ธฐ ์ทจ์ ๊ฐ๋ฅ์ฑ์ด ์ผ์ ธ ์๋ ์์ฉ์์ ํธ์ถํด๋ ์์ ํ ํจ์์ด๋ค. (pthread_setcancelstate(3) ์ฐธ๊ณ .)
POSIX.1-2001๊ณผ POSIX.1-2008์์๋ ๋ค์ ํจ์๋ค๋ง ๋น๋๊ธฐ ์ทจ์ ์์ ์ด๊ธฐ๋ฅผ ์๊ตฌํ๋ค.
pthread_cancel()
pthread_setcancelstate()
pthread_setcanceltype()
POSIX.1์์๋ ์ด๋ค ํจ์๋ค์ด ์ทจ์์ ์ด์ด์ผ ํ๋ค๊ณ , ๊ทธ๋ฆฌ๊ณ ์ด๋ค ๋ค๋ฅธ ํจ์๋ค์ ์ทจ์์ ์ผ ์๋ ์๋ค๊ณ ๋ช ์ธํ๋ค. ์ค๋ ๋๊ฐ ์ทจ์ ๊ฐ๋ฅํ๊ณ , ์ทจ์ ๊ฐ๋ฅ์ฑ ์ ํ์ด ์ฐ๊ธฐ์ด๋ฉฐ, ์ค๋ ๋์ ์ทจ์ ์์ฒญ์ด ๋๊ธฐ ์ค์ด๋ฉด ์ทจ์์ ์ธ ํจ์๋ฅผ ํธ์ถํ ๋ ์ค๋ ๋๊ฐ ์ทจ์๋๋ค.
POSIX.1-2001 ๋ฐ/๋๋ POSIX.1-2008์์ ๋ค์ ํจ์๋ค์ด ์ทจ์์ ์ด๊ธฐ๋ฅผ ์๊ตฌํ๋ค.
accept()
aio_suspend()
clock_nanosleep()
close()
connect()
creat()
fcntl() F_SETLKW
fdatasync()
fsync()
getmsg()
getpmsg()
lockf() F_LOCK
mq_receive()
mq_send()
mq_timedreceive()
mq_timedsend()
msgrcv()
msgsnd()
msync()
nanosleep()
open()
openat() [POSIX-1.2008์์ ์ถ๊ฐ]
pause()
poll()
pread()
pselect()
pthread_cond_timedwait()
pthread_cond_wait()
pthread_join()
pthread_testcancel()
putmsg()
putpmsg()
pwrite()
read()
readv()
recv()
recvfrom()
recvmsg()
select()
sem_timedwait()
sem_wait()
send()
sendmsg()
sendto()
sigpause() [POSIX.1-2001 ํ์ (POSIX.1-2008์์ "๊ฐ๋ฅ" ๋ชฉ๋ก์ผ๋ก ์ด๋)]
sigsuspend()
sigtimedwait()
sigwait()
sigwaitinfo()
sleep()
system()
tcdrain()
usleep() [POSIX.1-2001 ํ์ (POSIX.1-2008์์ ์ ๊ฑฐ)]
wait()
waitid()
waitpid()
write()
writev()
POSIX.1-2001 ๋ฐ/๋๋ POSIX.1-2008์ ๋ฐ๋ฅด๋ฉด ๋ค์ ํจ์๋ค์ด ์ทจ์์ ์ผ ์๋ ์๋ค.
access()
asctime()
asctime_r()
catclose()
catgets()
catopen()
chmod() [POSIX-1.2008์์ ์ถ๊ฐ]
chown() [POSIX-1.2008์์ ์ถ๊ฐ]
closedir()
closelog()
ctermid()
ctime()
ctime_r()
dbm_close()
dbm_delete()
dbm_fetch()
dbm_nextkey()
dbm_open()
dbm_store()
dlclose()
dlopen()
dprintf() [POSIX-1.2008์์ ์ถ๊ฐ]
endgrent()
endhostent()
endnetent()
endprotoent()
endpwent()
endservent()
endutxent()
faccessat() [POSIX-1.2008์์ ์ถ๊ฐ]
fchmod() [POSIX-1.2008์์ ์ถ๊ฐ]
fchmodat() [POSIX-1.2008์์ ์ถ๊ฐ]
fchown() [POSIX-1.2008์์ ์ถ๊ฐ]
fchownat() [POSIX-1.2008์์ ์ถ๊ฐ]
fclose()
fcntl() (๋ชจ๋ cmd ์ธ์ ๊ฐ์ ๋ํด)
fflush()
fgetc()
fgetpos()
fgets()
fgetwc()
fgetws()
fmtmsg()
fopen()
fpathconf()
fprintf()
fputc()
fputs()
fputwc()
fputws()
fread()
freopen()
fscanf()
fseek()
fseeko()
fsetpos()
fstat()
fstatat() [POSIX-1.2008์์ ์ถ๊ฐ]
ftell()
ftello()
ftw()
futimens() [POSIX-1.2008์์ ์ถ๊ฐ]
fwprintf()
fwrite()
fwscanf()
getaddrinfo()
getc()
getc_unlocked()
getchar()
getchar_unlocked()
getcwd()
getdate()
getdelim() [POSIX-1.2008์์ ์ถ๊ฐ]
getgrent()
getgrgid()
getgrgid_r()
getgrnam()
getgrnam_r()
gethostbyaddr() [SUSv3 ํ์ (POSIX.1-2008์์ ์ ๊ฑฐ)]
gethostbyname() [SUSv3 ํ์ (POSIX.1-2008์์ ์ ๊ฑฐ)]
gethostent()
gethostid()
gethostname()
getline() [POSIX-1.2008์์ ์ถ๊ฐ]
getlogin()
getlogin_r()
getnameinfo()
getnetbyaddr()
getnetbyname()
getnetent()
getopt() (opterr๊ฐ 0์ด ์๋ ๊ฒฝ์ฐ)
getprotobyname()
getprotobynumber()
getprotoent()
getpwent()
getpwnam()
getpwnam_r()
getpwuid()
getpwuid_r()
gets()
getservbyname()
getservbyport()
getservent()
getutxent()
getutxid()
getutxline()
getwc()
getwchar()
getwd() [SUSv3 ํ์ (POSIX.1-2008์์ ์ ๊ฑฐ)]
glob()
iconv_close()
iconv_open()
ioctl()
link()
linkat() [POSIX-1.2008์์ ์ถ๊ฐ]
lio_listio() [POSIX-1.2008์์ ์ถ๊ฐ]
localtime()
localtime_r()
lockf() [POSIX-1.2008์์ ์ถ๊ฐ]
lseek()
lstat()
mkdir() [POSIX-1.2008์์ ์ถ๊ฐ]
mkdirat() [POSIX-1.2008์์ ์ถ๊ฐ]
mkdtemp() [POSIX-1.2008์์ ์ถ๊ฐ]
mkfifo() [POSIX-1.2008์์ ์ถ๊ฐ]
mkfifoat() [POSIX-1.2008์์ ์ถ๊ฐ]
mknod() [POSIX-1.2008์์ ์ถ๊ฐ]
mknodat() [POSIX-1.2008์์ ์ถ๊ฐ]
mkstemp()
mktime()
nftw()
opendir()
openlog()
pathconf()
pclose()
perror()
popen()
posix_fadvise()
posix_fallocate()
posix_madvise()
posix_openpt()
posix_spawn()
posix_spawnp()
posix_trace_clear()
posix_trace_close()
posix_trace_create()
posix_trace_create_withlog()
posix_trace_eventtypelist_getnext_id()
posix_trace_eventtypelist_rewind()
posix_trace_flush()
posix_trace_get_attr()
posix_trace_get_filter()
posix_trace_get_status()
posix_trace_getnext_event()
posix_trace_open()
posix_trace_rewind()
posix_trace_set_filter()
posix_trace_shutdown()
posix_trace_timedgetnext_event()
posix_typed_mem_open()
printf()
psiginfo() [POSIX-1.2008์์ ์ถ๊ฐ]
psignal() [POSIX-1.2008์์ ์ถ๊ฐ]
pthread_rwlock_rdlock()
pthread_rwlock_timedrdlock()
pthread_rwlock_timedwrlock()
pthread_rwlock_wrlock()
putc()
putc_unlocked()
putchar()
putchar_unlocked()
puts()
pututxline()
putwc()
putwchar()
readdir()
readdir_r()
readlink() [POSIX-1.2008์์ ์ถ๊ฐ]
readlinkat() [POSIX-1.2008์์ ์ถ๊ฐ]
remove()
rename()
renameat() [POSIX-1.2008์์ ์ถ๊ฐ]
rewind()
rewinddir()
scandir() [POSIX-1.2008์์ ์ถ๊ฐ]
scanf()
seekdir()
semop()
setgrent()
sethostent()
setnetent()
setprotoent()
setpwent()
setservent()
setutxent()
sigpause() [POSIX-1.2008์์ ์ถ๊ฐ]
stat()
strerror()
strerror_r()
strftime()
symlink()
symlinkat() [POSIX-1.2008์์ ์ถ๊ฐ]
sync()
syslog()
tmpfile()
tmpnam()
ttyname()
ttyname_r()
tzset()
ungetc()
ungetwc()
unlink()
unlinkat() [POSIX-1.2008์์ ์ถ๊ฐ]
utime() [POSIX-1.2008์์ ์ถ๊ฐ]
utimensat() [POSIX-1.2008์์ ์ถ๊ฐ]
utimes() [POSIX-1.2008์์ ์ถ๊ฐ]
vdprintf() [POSIX-1.2008์์ ์ถ๊ฐ]
vfprintf()
vfwprintf()
vprintf()
vwprintf()
wcsftime()
wordexp()
wprintf()
wscanf()
ํ์ค์์ ๋ช ์ธํ์ง ์์ ๋ค๋ฅธ ํจ์๋ค์ ๊ตฌํ์์ ์ทจ์์ ์ผ๋ก ๋ ์๋ ์๋ค. ํนํ ๋ธ๋ก ํ ์ ์๋ ๋นํ์ค ํจ์๊ฐ ์๋ค๋ฉด ์๋ง ๊ตฌํ์์ ์ทจ์์ ์ผ๋ก ๋ ๊ฒ์ด๋ค. (ํ์ผ์ ๊ฑด๋๋ฆด ์ ์๋ ํจ์๋ค ๋๋ถ๋ถ์ด ์ฌ๊ธฐ ํฌํจ๋๋ค.)
๋ฆฌ๋
์ค์์ Pthreads API๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ cc -pthread
๋ผ๊ณ ์ปดํ์ผ ํด์ผ ํ๋ค.
๊ทธ๊ฐ ๋ฆฌ๋ ์ค์ GNU C ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ ๊ฐ์ง ์ค๋ ๋ฉ ๊ตฌํ์ ์ ๊ณตํ๋ค.
- LinuxThreads
- ์๋ Pthreads ๊ตฌํ์ด๋ค. glibc 2.4๋ถํฐ๋ ์ด ๊ตฌํ์ ๋ ์ด์ ์ง์ํ์ง ์๋๋ค.
- NPTL (Native POSIX Threads Library)
- ์ ์ Pthreads ๊ตฌํ์ด๋ค. LinuxThreads์ ๋น๊ตํ ๋ NPTL์ POSIX.1 ๋ช ์ธ ์๊ตฌ ์ฌํญ๋ค์ ๋ ๊ฐ๊น๊ฒ ์ค์ํ๋ฉฐ ์ค๋ ๋๋ฅผ ๋ค์ ์์ฑํ ๋ ์ฑ๋ฅ์ด ๋ ์ข๋ค. glibc 2.3.2๋ถํฐ NPTL์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ฆฌ๋ ์ค 2.6 ์ปค๋์ ์๋ ๊ธฐ๋ฅ๋ค์ ํ์๋ก ํ๋ค.
๋ ๋ค ์์ 1:1 ๋ฐฉ์ ๊ตฌํ์ด๋ค. ์ฆ ๊ฐ ์ค๋ ๋๊ฐ ์ปค๋ ์ค์ผ์ค๋ง ํญ๋ชฉ ํ๋๋ก ์ฌ์๋๋ค. ๋ ๊ฐ์ง ์ค๋ ๋ฉ ๊ตฌํ ๋ชจ๋ ๋ฆฌ๋ ์ค์ clone(2) ์์คํ ํธ์ถ์ ์ด์ฉํ๋ค. NPTL์์๋ ๋ฆฌ๋ ์ค์ futex(2) ์์คํ ํธ์ถ์ ์ด์ฉํด ์ค๋ ๋ ๋๊ธฐํ ์์๋ค(๋ฎคํ ์ค, ์ค๋ ๋ ํฉ๋ฅ ๋ฑ)์ ๊ตฌํํ๋ค.
์ด ๊ตฌํ์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
-
๋ฉ์ธ (์ต์ด) ์ค๋ ๋์ ํ๋ก๊ทธ๋จ์์ pthread_create(3)๋ก ๋ง๋๋ ์ค๋ ๋์ ๋ํด์ ๊ตฌํ์์ "๊ด๋ฆฌ์" ์ค๋ ๋๋ฅผ ์์ฑํ๋ค. ์ด ์ค๋ ๋๊ฐ ์ค๋ ๋ ์์ฑ๊ณผ ์ข ๋ฃ๋ฅผ ์ฒ๋ฆฌํ๋ค. (์๋ชปํด์ ๊ทธ ์ค๋ ๋๋ฅผ ์ฃฝ์ด๋ฉด ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.)
-
๊ตฌํ ๋ด๋ถ์์ ์๊ทธ๋์ ์ด์ฉํ๋ค. ๋ฆฌ๋ ์ค 2.2์ ์ดํ์์๋ ์ฒ์ ์ธ ๊ฐ ์ค์๊ฐ ์๊ทธ๋์ ์ด๋ค. (signal(7) ์ฐธ๊ณ .) ๊ทธ ์ ์ ๋ฆฌ๋ ์ค ์ปค๋์์๋
SIGUSR1
๊ณผSIGUSR2
๋ฅผ ์ด๋ค. ์์ฉ์์๋ ๊ตฌํ์์ ์ด์ฉํ๋ ์ด๋ค ์๊ทธ๋๋ ์ฌ์ฉ์ ํผํด์ผ ํ๋ค. -
์ค๋ ๋๋ค์ด ํ๋ก์ธ์ค ID๋ฅผ ๊ณต์ ํ์ง ์๋๋ค. (์ค์ง์ ์ผ๋ก LinuxThreads์ ์ค๋ ๋๋ ํ์์๋ณด๋ค ๋ ๋ง์ ์ ๋ณด๋ฅผ ๊ณต์ ํ์ง๋ง ๊ณตํต ํ๋ก์ธ์ค ID๋ฅผ ๊ณต์ ํ์ง๋ ์๋ ํ๋ก์ธ์ค๋ค๋ก ๊ตฌํ๋ผ ์๋ค.)
ps(1)
์์ LinuxThreads์ ์ค๋ ๋๋ค(๊ด๋ฆฌ์ ์ค๋ ๋ ํฌํจ)์ ๋ณ๊ฐ ํ๋ก์ธ์ค๋ค๋ก ๋ณด์ธ๋ค.
LinuxThreads ๊ตฌํ์ ๋ค์์ ํฌํจํ ์ฌ๋ฌ ๋ถ๋ถ์์ POSIX.1 ๋ช ์ธ์ ๋ค๋ฅด๋ค.
-
getpid(2)๋ฅผ ํธ์ถํ๋ฉด ์ค๋ ๋๋ง๋ค ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ๋ค.
-
๋ฉ์ธ ์ค๋ ๋ ์ธ์ ์ค๋ ๋์์ getppid(2)๋ฅผ ํธ์ถํ๋ฉด ๊ด๋ฆฌ์ ์ค๋ ๋์ ํ๋ก์ธ์ค ID๋ฅผ ๋ฐํํ๋ค. ์๋๋ ๊ทธ ์ค๋ ๋๋ค์์์ getppid(2)๊ฐ ๋ฉ์ธ ์ค๋ ๋์์์ getppid(2)์ ๊ฐ์ ๊ฐ์ ๋ฐํํด์ผ ํ๋ค.
-
ํ ์ค๋ ๋์์ fork(2)๋ก ์ ์์ ํ๋ก์ธ์ค๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์ ์ด๋ ์ค๋ ๋๋ ๊ทธ ์์์ wait(2) ํ ์ ์์ด์ผ ํ๋ค. ํ์ง๋ง ์ด ๊ตฌํ์์๋ ์์์ ๋ง๋ ์ค๋ ๋๋ง wait(2) ํ ์ ์๋ค.
-
์ค๋ ๋์์ execve(2)๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ์ (POSIX.1์ ์๊ตฌ๋๋ก) ๋ค๋ฅธ ์ค๋ ๋๋ค์ด ๋ชจ๋ ์ข ๋ฃ๋๋ค. ํ์ง๋ง ๊ทธ๋์ ๋จ๋ ํ๋ก์ธ์ค๊ฐ execve(2)๋ฅผ ํธ์ถํ ์ค๋ ๋๊ฐ ๊ฐ์ PID๋ฅผ ๊ฐ์ง๋ค. ์๋๋ ๋ฉ์ธ ์ค๋ ๋์ ๊ฐ์ PID๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
-
์ค๋ ๋๋ค์ด ์ฌ์ฉ์ ๋ฐ ๊ทธ๋ฃน ID๋ฅผ ๊ณต์ ํ์ง ์๋๋ค. set-user-ID ํ๋ก๊ทธ๋จ์์ ๋ณต์กํ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ผ๋ฉฐ ์์ฉ์์ seteuid(2) ๋ด์ง ์ ์ฌ ํจ์๋ก ํฌ๋ฆฌ๋ด์ ์ ๋ฐ๊พธ๋ฉด Pthreads ํจ์๋ค์ด ์คํจํ๊ฒ ๋ ์ ์๋ค.
-
์ค๋ ๋๋ค์ด ๊ณตํต ์ธ์ ID ๋ฐ ํ๋ก์ธ์ค ๊ทธ๋ฃน ID๋ฅผ ๊ณต์ ํ์ง ์๋๋ค.
-
์ค๋ ๋๋ค์ด fcntl(2)๋ก ์์ฑํ ๋ ์ฝ๋ ๋ฝ์ ๊ณต์ ํ์ง ์๋๋ค.
-
times(2)์ getrusage(2)๊ฐ ๋ฐํํ๋ ์ ๋ณด๊ฐ ํ๋ก์ธ์ค ์ ์ญ์ด ์๋๋ผ ์ค๋ ๋ ํ์ ์ด๋ค.
-
์ค๋ ๋๋ค์ด ์ธ๋งํฌ์ด ์์ ์ทจ์ ๊ฐ์ ๊ณต์ ํ์ง ์๋๋ค. (semop(2) ์ฐธ๊ณ .)
-
์ค๋ ๋๋ค์ด ๊ฐ๊ฒฉ ํ์ด๋จธ๋ฅผ ๊ณต์ ํ์ง ์๋๋ค.
-
์ค๋ ๋๋ค์ด ๊ณตํต ๋์ด์ค ๊ฐ์ ๊ณต์ ํ์ง ์๋๋ค.
-
POSIX.1์์๋ ํ๋ก์ธ์ค ์ ์ฒด๋ก ๊ฐ๋ ์๊ทธ๋๊ณผ ๊ฐ๋ณ ์ค๋ ๋๋ก ๊ฐ๋ ์๊ทธ๋์ ๊ตฌ๋ณํ๋ค. POSIX.1์ ๋ฐ๋ฅด๋ฉด ํ๋ก์ธ์ค ๋ด์์ ์์๋ก ๊ณ ๋ฅธ ํ ์ค๋ ๋๊ฐ (๊ฐ๋ น kill(2)๋ก ๋ณด๋ธ) ํ๋ก์ธ์ค๋ก ํฅํ ์๊ทธ๋์ ์ฒ๋ฆฌํด์ผ ํ๋ค. LinuxThreads์์๋ ํ๋ก์ธ์ค๋ก ํฅํ๋ ์๊ทธ๋์ด๋ผ๋ ๊ฐ๋ ์ ์ง์ํ์ง ์๋๋ค. ์ฆ ํน์ ์ค๋ ๋๋ก๋ง ์๊ทธ๋์ ๋ณด๋ผ ์ ์๋ค.
-
์ค๋ ๋๋ค์ ๋ณ๊ฐ์ ๋์ฒด ์๊ทธ๋ ์คํ ์ค์ ์ด ์๋ค. ํ์ง๋ง ์ ์ค๋ ๋์ ๋์ฒด ์๊ทธ๋ ์คํ ์ค์ ์ ์์ฑํ ์ค๋ ๋์๊ฒ์ ๋ณต์ฌํ๋ฉฐ, ๊ทธ๋์ ์ฒ์์๋ ์ค๋ ๋๋ค์ด ๋์ฒด ์๊ทธ๋ ์คํ์ ๊ณต์ ํ๋ค. (์ ์ค๋ ๋๊ฐ ๋์ฒด ์๊ทธ๋ ์คํ์ด ์ ์๋์ง ์์ ์ฑ๋ก ์์ํด์ผ ํ๋ค. ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ๋์ฒด ์๊ทธ๋ ์คํ์์ ๋์์ ์๊ทธ๋์ ์ฒ๋ฆฌํ๋ฉด ์์ธก ๋ถ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ ์ฅ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ๋ค.)
NPTL์์๋ ํ๋ก์ธ์ค ๋ด ๋ชจ๋ ์ค๋ ๋๋ค์ด ๊ฐ์ ์ค๋ ๋ ๊ทธ๋ฃน์ ๋ค์ด๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๋ ๋ ๊ทธ๋ฃน์ ๋ชจ๋ ๊ตฌ์ฑ์์ ๊ฐ์ PID๋ฅผ ๊ณต์ ํ๋ค. NPTL์์๋ ๊ด๋ฆฌ์ ์ค๋ ๋๋ฅผ ์ฐ์ง ์๋๋ค.
NPTL ๋ด๋ถ์ ์ผ๋ก ์ฒ์ ๋ ๊ฐ ์ค์๊ฐ ์๊ทธ๋์ ์ด์ฉํ๋ค. ์ฆ ๊ทธ ์๊ทธ๋๋ค์ ์์ฉ์์ ์ฌ์ฉํ ์ ์๋ค. ๋ ์์ธํ ๋ด์ฉ์ nptl(7)์ ๋ณด๋ผ.
NPTL์๋ POSIX.1 ๋ถ์ ํฉ ์ฌํญ์ด ์ต์ ํ ๊ฐ์ง ์๋ค.
- ์ค๋ ๋๋ค์ด ๊ณตํต ๋์ด์ค ๊ฐ์ ๊ณต์ ํ์ง ์๋๋ค.
๋ช ๊ฐ์ง NPTL ๋ถ์ ํฉ ์ฌํญ๋ค์ ๊ตฌ์ ์ปค๋์์๋ง ๋ฐ์ํ๋ค.
-
times(2)์ getrusage(2)๊ฐ ๋ฐํํ๋ ์ ๋ณด๊ฐ ํ๋ก์ธ์ค ์ ์ญ์ด ์๋๋ผ ์ค๋ ๋ ํ์ ์ด๋ค. (์ปค๋ 2.6.9์์ ์์ )
-
์ค๋ ๋๋ค์ด ์์ ์ ํ์ ๊ณต์ ํ์ง ์๋๋ค. (์ปค๋ 2.6.10์์ ์์ )
-
์ค๋ ๋๋ค์ด ๊ฐ๊ฒฉ ํ์ด๋จธ๋ฅผ ๊ณต์ ํ์ง ์๋๋ค. (์ปค๋ 2.6.12์์ ์์ )
-
setsid(2)๋ก ์ ์ธ์ ์ ์์ํ๋ ๊ฒ ๋ฉ์ธ ์ค๋ ๋์๊ฒ๋ง ํ์ฉ๋๋ค. (์ปค๋ 2.6.16์์ ์์ )
-
setpgid(2)๋ก ํ๋ก์ธ์ค๋ฅผ ํ๋ก์ธ์ค ๊ทธ๋ฃน ๋ฆฌ๋๋ก ๋ง๋๋ ๊ฒ ๋ฉ์ธ ์ค๋ ๋์๊ฒ๋ง ํ์ฉ๋๋ค. (์ปค๋ 2.6.16์์ ์์ )
-
์ค๋ ๋๋ค์ ๋ณ๊ฐ์ ๋์ฒด ์๊ทธ๋ ์คํ ์ค์ ์ด ์๋ค. ํ์ง๋ง ์ ์ค๋ ๋์ ๋์ฒด ์๊ทธ๋ ์คํ ์ค์ ์ ์์ฑํ ์ค๋ ๋์๊ฒ์ ๋ณต์ฌํ๋ฉฐ, ๊ทธ๋์ ์ฒ์์๋ ์ค๋ ๋๋ค์ด ๋์ฒด ์๊ทธ๋ ์คํ์ ๊ณต์ ํ๋ค. (์ปค๋ 2.6.16์์ ์์ )
NPTL ๊ตฌํ์ ๋ค์ ์ถ๊ฐ ์ฌํญ์ ์ ์ํ๋ผ.
- ์คํ ํฌ๊ธฐ ์ฐ์ฑ ์์ ์ ํ(setrlimit(2)์
RLIMIT_STACK
์ค๋ช ์ฐธ๊ณ )์ ๋ฌด์ ํ ์ธ์ ๊ฐ์ผ๋ก ์ค์ ํ๋ฉด ๊ทธ ๊ฐ์ด ์ ์ค๋ ๋์ ๊ธฐ๋ณธ ์คํ ํฌ๊ธฐ๋ฅผ ๊ท์ ํ๋ค. ํจ๊ณผ๊ฐ ์์ผ๋ ค๋ฉด ํ๋ก๊ทธ๋จ ์คํ ์ ์ ์ ํ์ ์ค์ ํด์ผ ํ๋๋ฐ, ์ ธ ๋ด์ฅ ๋ช ๋ นulimit -s
๋ฅผ (C ์ ธ์์๋limit stacksize
๋ฅผ) ์ธ ์ ์๋ค.
glibc 2.3.2๋ถํฐ๋ getconf(1)
๋ช
๋ น์ ์ฌ์ฉํด ์์คํ
์ ์ค๋ ๋ฉ ๊ตฌํ์ ์์๋ผ ์ ์๋ค.
bash$ getconf GNU_LIBPTHREAD_VERSION
NPTL 2.3.4
๊ทธ ์ ์ glibc ๋ฒ์ ์์๋ ๋ค์ ์ ๋ ๋ช ๋ น์ด๋ฉด ๊ธฐ๋ณธ ์ค๋ ๋ฉ ๊ตฌํ์ ์์๋ด๊ธฐ์ ์ถฉ๋ถํ ๊ฒ์ด๋ค.
bash$ $( ldd /bin/ls | grep libc.so | awk '{print $3}' ) | \
egrep -i 'threads|nptl'
Native POSIX Threads Library by Ulrich Drepper et al
LinuxThreads์ NPTL์ ๋ชจ๋ ์ง์ํ๋ glibc(์ฆ glibc 2.3.x)๊ฐ ์๋ ์์คํ
์์๋ ํ๊ฒฝ ๋ณ์ LD_ASSUME_KERNEL
์ ์ด์ฉํด ๋์ ๋ง์ปค๊ฐ ์ ํํ ๊ธฐ๋ณธ ์ค๋ ๋ฉ ๊ตฌํ์ ๋ฐ๊ฟ ์ ์๋ค. ์ด ๋ณ์๊ฐ ์์ผ๋ฉด ํน์ ์ปค๋ ๋ฒ์ ์์์ ๋๊ณ ์๋ค๊ณ ๋์ ๋ง์ปค์์ ๊ฐ์ ํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ NPTL์ ํ์ํ ์ง์ ์ฌํญ์ ์ ๊ณตํ์ง ์๋ ์ปค๋ ๋ฒ์ ์ ์ง์ ํ๋ฉด LinuxThreads ์ฌ์ฉ์ ๊ฐ์ ํ ์ ์๋ค. (์ด๋ ๊ฒ ํ ๊ฐ์ฅ ๊ฐ๋ฅ์ฑ ๋์ ์ด์ ๋ LinuxThreads์ ์ด๋ค ๋น์ค์ ๋์ ๋ฐฉ์์ ์์กดํ๋ (์๋ชป๋) ์์ฉ์ ๋๋ฆฌ๊ธฐ ์ํด์์ผ ๊ฒ์ด๋ค.)
bash$ $( LD_ASSUME_KERNEL=2.2.5 ldd /bin/ls | grep libc.so | \
awk '{print $3}' ) | egrep -i 'threads|nptl'
linuxthreads-0.10 by Xavier Leroy
clone(2), fork(2), futex(2), gettid(2), proc(5), attributes(7), futex(7), nptl(7), sigevent(7), signal(7)
๋ค์ํ Pthreads ๋งค๋ด์ผ ํ์ด์ง: pthread_atfork(3), pthread_attr_init(3), pthread_cancel(3), pthread_cleanup_push(3), pthread_cond_signal(3), pthread_cond_wait(3), pthread_create(3), pthread_detach(3), pthread_equal(3), pthread_exit(3), pthread_key_create(3), pthread_kill(3), pthread_mutex_lock(3), pthread_mutex_unlock(3), pthread_mutexattr_destroy(3), pthread_mutexattr_init(3), pthread_once(3), pthread_spin_init(3), pthread_spin_lock(3), pthread_rwlockattr_setkind_np(3), pthread_setcancelstate(3), pthread_setcanceltype(3), pthread_setspecific(3), pthread_sigmask(3), pthread_sigqueue(3), pthread_testcancel(3)
2019-03-06