[xv6] 실습3: thread
실습목표:
xv6에는 스레드 관련 시스템콜과 함수들이 없다.
직접 구현하여 thread를 support하도록 한다.
thread란?
스레드는 프로세스의 일부로, 하나의 프로세스를 여러개로 나누어 여러 작업을 한다고 생각하면된다.
하나의 프로세스 내에서 사용되기때문에 힙, 데이터, 코드 영역은 공유하고, 스택영역 메모리만 따로 사용한다.
멀티 프로세스를 사용하는것보다 스레드간 자원공유에 유리하고, context switching에 유리하다.
실습과정:
1. thread_create함수

스레드를 생성하는 함수로, stack 주소를 할당받아서, clone함수를 통해 생성한다.
다른 영역은 공유하므로 stack영역만 할당받으면 된다.
2. lock 관련 함수

lock을 선언하고, 얻고 해제 하는 함수를 선언한다.
실습결과:
테스트 과정은 다음과 같다.
3개의 thread 생성후, arg = 1인경우는 lock이 있는 상태에서 작업처리, arg1 = 0인경우는 lock이 없는경우에서 공유자원 사용시 작업하는 경우이다.
여기서 작업이란 prinf를 통해 문자열을 출력하는 행동으로 만들었다.


결과는 아래와같다.

위의 작업의 경우 a,c,b 문자열이 섞이지 않고 출력되는 반면, 아래는 섞여서 출력되는 thread의 병렬적 실행을 확인할 수 있었다.
고찰:
스레드 관련 함수들을 직접 구현해보며, lock의 중요성과 병렬적 multi tasking을 확인할 수 있었다.
스케줄링도 해보고, 멀티 태스킹도 해보면서 조금 사용 언어들이 헷갈려서 정리를 해봐야겠다.
1. 멀티 테스킹: 스케줄러가 여러 프로세스를 스케줄링을 통해 번갈아가며, 동시에 처리하는 것처럼 보이게끔하는방식
2. 멀티 프로세싱: 다수의 프로세서(CPU)가 일을 처리하는 방식
3. 멀티 스레딩: 위에서 말했던 대로 하나의 프로세스가 병렬적인 작업을 할 수 있도록 분할하여 작업하는 것