Thread는 CPU utilization의 기본 단위로, program counter, stack, thread ID로 구성된다.
Thread는 process 내부에서 실행되는 단위이다.
Thread는 process 안에서 실제로 CPU 위에서 실행되는 최소 실행 단위이다.
Thread는 lightweight process라고도 불린다.
하나의 process를 여러 thread로 나누어 parallelism을 달성하기 위함이다.
pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg)
start_routine() 함수를 실행하며 시작한다.arg는 start_routine()의 인자로 전달된다.pthread_join(pthread_t thread, void **retval)
해당 thread가 종료될 때까지 대기한다.
pthread_join()이 성공하면, thread에 할당된 자원이 정리된다.
join에 실패하면 zombie thread가 발생할 수 있다.
Linux kernel은 user-level thread를 생성하기 위해 내부적으로 clone() system call을 사용한다.
pthread_create()로 thread 생성
pthread_t
pthread_self()

pthread_create()로 2개의 child thread를 생성한다.tid_print 함수를 실행한다.tid_print 함수를 호출한다.pthread_join()을 통해 모든 child thread가 종료될 때까지 대기한다.tid_print 함수getpid()로 process ID(pid) 를 얻는다.pthread_self()로 thread ID(tid) 를 얻는다.[child_thread] pid: 94247 tid: fbf45700
[parent_thread] pid: 94247 tid: fbf46740
[child_thread] pid: 94247 tid: fb744700
Kernel thread는 kernel 내부에서 background 작업을 수행하는 thread이다.
주로 daemon 형태로 동작한다.
예:
kswapdjournaldpages_low) 아래로 내려가면 깨어난다.kthread_create()를 사용한다.kthread_create(threadfn, data, namefmt, arg...)
kthread_run(threadfn, data, namefmt, ...)
kthread_stop(struct task_struct *k)
kthread_should_stop()

kthread_run()으로 journaling kernel thread를 생성한다.lazyinit 기능은 file system 생성 속도를 크게 향상시킨다.
이유:

kthread_run(ext4_lazyinit_thread, ...)
kthread_should_stop()
kthread_stop(ext4_lazyinit_task)
module 종료 시 ext4_destroy_lazyinit_thread()로 정리한다.
$ make로 빌드한다.$ make clean으로 정리한다.

kernel module에서 kernel thread를 생성하는 예제이다.
test_thread()
thread_create()
kthread_module_init()
kthread_module_cleanup()
$ make
$ insmod kthread_module.ko
$ dmesg
$ rmmod kthread_module
"Hello Module" 메시지가 출력된다.
MyThread
MyPrintk()
kthread_should_stop()이 호출되기 전까지init_kthread()
kthread_run()으로 kernel thread를 생성한다.exit_kthread()
kthread_stop()으로 kernel thread를 종료한다.
kthread_stop()이 호출되기 전까지 kernel thread는 계속 실행된다