본문 바로가기

ComputerScience/Linux

Linux 9. Thread

728x90

1. Thread

thread는 cpu 자원을 utilize하는 가장 기본 단위이다. 각 thread는 각 core에 할당된다.

Process안에서 execution의 단위가 된다.그래서 lightweight process라고도 불린다. program counter, stack, tread ID를 포함한다. 

프로세스는 여러개의 쓰레드를 가질 수 있다. 따라서 쓰레드들을 여러 작업에 잘 분배함으로써 병렬 효과를 볼 수 있다. 

예를들어 크롬 브라우저에 여러 탭을 띄워 놓는 것이 있다.

쓰레드 들은 같은 프로그램 내에서 same data, same address space를 share하며 concurrent하게 실행된다.

Right diagram shows that in a single thread, three treads utilize three cores and share same address space of parent process.

기본적으로 하나의 Proces는 main thread라고 하는 하나의 thread를 갖는다.

pthread_create(pthread_t*thread, constpthread_attr_t*attr, void *(*start_routine)(void*), void *arg)

실행중인 프로세스에서 thread를 생성하는 함수이다. 인자로 전달 받은 start_routine과 그 routine의 인자를 arg로 전달해줌으로써 thread가 실행할 작업을 지정하고 생성한다.

pthread_join(pthread_thread, void **retval)

thread가 작업을 끝낼 때 까지 parent process가 기다린다. 작업이 종료되고 나면 process는 thread가 사용한 모든 resource(메모리 등)를 clean up한다.

 

리눅스 kernel은 pthread_create()안에서 clone() system call을 부른다.

process가 fork()로 생성되는 것과 달리 thread는 clone()을 사용하는데 이는 process와 데이터를 share하기 위함이다.

fork()는 fork 선언 이후에 작성된 code들 부터 새롭게 생성된 프로세스가 실행을 하는 반면에

thread는 특정 function을 매개변수로 전달하므로 새롭게 생성된 thread는 해당 function만 수행한다.

그래서 main코드 중간에 tid_print() 라인을 생성된 thread들은 실행을 하지 않는다.

pthread_join으로 인해 thread들이 다 종료될때까지 parent가 종료되지 않는다.

 

2. Creating thread in Kernel-level

kernel에서도 user level에서 처럼 thread를 생성해서 background operation들을 처리한다.

kernel에서는 kernel thread를 생성하기 위해 kthread_create()을 사용한다.

* 저널링 파일 시스템

파일과 디렉토리 변경 사항을 반영하기 위한 파일 시스템의 업데이트에는 보통 많은 쓰기 연산이 필요하다. 따라서 쓰기 동작 중에 (전원 공급이 끊기거나 시스템 크래시 등의 이유로) 인터럽트가 발생하여 특정 데이터가 유효하지 않은 상태가 될 수 있다.

이를 막기 위해, 저널 파일 시스템은, 변경사항을 기록하는 특별한 구역(저널, journal)을 할당한다. 충돌 이후에, 단순히 파일시스템에서 저널을 읽고, 파일시스템의 오류가 복구될 때까지 저널의 변경사항을 리플레이(replay)하는 것으로 복구가 이루어진다. 

 

 

anonymous page의 경우 : 만약 메모리보다 큰 page를 만들면 swap device 해서 메모리는 비우고 하드로 내린다.

file_backed page의 경우 : 얘는 이미 하드를 쓰고 있으니 디스크에 그대로 써진다.

 

3. How to make a kernel thread

Daemon thread를 만드는 예시이다. daemon은 죽지 않고 백그라운드에서 계속 실행되는 것을 말한다.

이를 구현하려면 while, infinite loop가 필수이다. thread_should_stop이 true가 되면 이 무한 루프를 빠져나간다.

하지만 위 상태는 계속해서 thread가 cpu자원을 소모중인 상태이다. 따라서 목적에 맞게 sleep을 활용해서 이를 막는 방법이 필요하다.

728x90
반응형

'ComputerScience > Linux' 카테고리의 다른 글

Linux 11. Synchronization (2)  (0) 2023.11.06
Linux 10. Synchronization  (1) 2023.10.22
Linux8. Process  (1) 2023.10.09
Linux6. Makefile  (0) 2023.09.28
Linux4. Design Principle of Linux Kernel  (0) 2023.09.28