process scheduling� �게 �가지로 나뉜다.
1. real-time process - 1.hard real-time(산업용), 2.soft real-time(vedio decoder 등)
2. time-sharing process
1. real-time process - 1.hard real-time(산업용), 2.soft real-time(vedio decoder 등)
2. time-sharing process
여기서 time-sharing � 설명한다.
Linux�서는 �게 �가지� thread를 지�한다.
1. Kernel - 1. Kernel Thread, 2. LWT(Lightweight Thread)
2. User Thread
Linux�서는 �게 �가지� thread를 지�한다.
1. Kernel - 1. Kernel Thread, 2. LWT(Lightweight Thread)
2. User Thread
thread를 ì‚¬ìš©í• ë•Œ 중요한것ì�´ ë�™ê¸°í™”ì�¸ë�°, context switch를 í• ë•Œ ë�°ì�´í„°ê°€ ì €ìž¥ì�´ 안ë�œ ìƒ�태ì—�서 다른 thread로 ìš°ì„ ìˆœìœ„ê°€ 넘어가면 치명ì �ì�¸ 오류가 나게ë�œë‹¤.
Linuxì—�서 멀티 프로세스 ê°œë…�ì�¸ fork()는 ë‚´ë¶€ì �으로 do_fork()란 Kernel 함수를 호출하며, do_fork()는 ë‚´ë¶€ì �으로 user threadì�¸ POSIX기반ì�˜ Mutex를 사용한다.
Linuxì—�서 멀티 프로세스 ê°œë…�ì�¸ fork()는 ë‚´ë¶€ì �으로 do_fork()란 Kernel 함수를 호출하며, do_fork()는 ë‚´ë¶€ì �으로 user threadì�¸ POSIX기반ì�˜ Mutex를 사용한다.
... ê·¸ë¦¬ê³ ... 한가지... POSIX thread를 사용하여 ë§Žì�€ ì–‘ì�˜ thread를 ìƒ�성하면 ë�™ê¸°í™”를 주목해야한다.
설계가 관건�다. 설계를 잘해야한다. 사소한 실수�� 하면 ��다.
... mutex ë�™ê¸°í™”... ë¯¸ì¹˜ê² êµ°... ë�°ì�´í„°ë¥¼ ìˆ˜ì •í• ë•ŒëŠ” lockì�„ 걸 수 있는ë�° 변수 초기화때 context switchê°€ ì�¼ì–´ë‚˜ë©´ 어쩌ìž�는거ëƒ�.
설계가 관건�다. 설계를 잘해야한다. 사소한 실수�� 하면 ��다.
... mutex ë�™ê¸°í™”... ë¯¸ì¹˜ê² êµ°... ë�°ì�´í„°ë¥¼ ìˆ˜ì •í• ë•ŒëŠ” lockì�„ 걸 수 있는ë�° 변수 초기화때 context switchê°€ ì�¼ì–´ë‚˜ë©´ 어쩌ìž�는거ëƒ�.
여담으로... context switch시 PCB(Process Control Block)ì—� ì •ë³´ê°€ ì €ìž¥ë�œë‹¤.
ì�´ê²ƒì�€ Assembly어로 짜여지며 ê·¸ ì�´ìœ 는 ì†�ë�„ 때문ì�´ë‹¤.
PCBì—� ì €ìž¥ë�œ ì–‘ì�´ ì �어야 processê°„ ì „í™˜ì�´ ë¹ ë¥´ë‹¤.
-> 만약 Zombie Processê°€ ìƒ�성ë�˜ë©´ 시스템 ìž�ì›�ì�„ 먹지는 않지만 PCBê°€ 좀비프로세스ì�˜ 리턴 값으로 늘어나 시스템ì�´ ì „ë°˜ì �으로 ëŠ�ë ¤ì§„ë‹¤.
ì�´ê²ƒì�€ Assembly어로 짜여지며 ê·¸ ì�´ìœ 는 ì†�ë�„ 때문ì�´ë‹¤.
PCBì—� ì €ìž¥ë�œ ì–‘ì�´ ì �어야 processê°„ ì „í™˜ì�´ ë¹ ë¥´ë‹¤.
-> 만약 Zombie Processê°€ ìƒ�성ë�˜ë©´ 시스템 ìž�ì›�ì�„ 먹지는 않지만 PCBê°€ 좀비프로세스ì�˜ 리턴 값으로 늘어나 시스템ì�´ ì „ë°˜ì �으로 ëŠ�ë ¤ì§„ë‹¤.
~cpp
void *thread(void *arg)
{
int num = *(int *)arg;
int i;
for(i=1; i<=20; i++){
pthread_mutex_lock(&mutex);
printf("%d: sum+=%d\n", num, i);
sum += i;
sleep(1);
pthread_mutex_unlock(&mutex);
}
}
thread를 10ê°œ ìƒ�성 ì‹œí‚¤ê³ ì�´ 작업ì�„ 수행하면,
함수가 실행ë�˜ê³ context switchê°€ ì�¼ì–´ë‚˜ê³ argê°€ ì œëŒ€ë¡œ 안바뀌는 것 같다.
arg는 0~9까지가 아닌 몇몇� 중복�는 수로 나타나게 �다.
pthread_mutex_lock� 변수 앞� 걸어주면 arg는 0으로 채워지게�다.
ì•„ì§�까지 ìƒ�ê°� 중ì�´ì§€ë§Œ pthreadì�˜ ë‚´ë¶€ì � ë¬¸ì œì�¸ê²ƒ 같다.
명확한 ì§€ì‹�ì�´ ìžˆê¸°ì „ê¹Œì§„ argì�˜ ê°’ì�€ 믿ì�„ 수 없다. ì�´ìƒ�.
Critical Sectionì�´ 아닌ë�°ë�„ ë�°ì�´í„°ê°€ ì œëŒ€ë¡œ 바뀌지 않는다.
ì�´ìƒ�하다. 소스ì—�는 ë¬¸ì œì �ì�´ 없지만 약간 ë§Žì�€ ì“°ë ˆë“œê°€ ë�™ì‹œì—� ìƒ�성ë�˜ê³ ë�°ì�´í„° 처리 ì–‘ì�´ ë§Žì�„ 때ì—�는
argumentê°€ ì œëŒ€ë¡œ 넘겨지지 않는 것 같다.
functionì—� argument를 넘기는 것ì�€ stackì—� 관계ë�œ 것ì�´ê³ , 개개ì�˜ ì“°ë ˆë“œëŠ” ê°�ê°�ì�˜ stackì�„ ê°€ì§€ê³ ìžˆì�„í…�ë�°. ì•„ì§� ìƒ�ê°�중ì�´ë‹¤.
ì�´ìƒ�하다. 소스ì—�는 ë¬¸ì œì �ì�´ 없지만 약간 ë§Žì�€ ì“°ë ˆë“œê°€ ë�™ì‹œì—� ìƒ�성ë�˜ê³ ë�°ì�´í„° 처리 ì–‘ì�´ ë§Žì�„ 때ì—�는
argumentê°€ ì œëŒ€ë¡œ 넘겨지지 않는 것 같다.
functionì—� argument를 넘기는 것ì�€ stackì—� 관계ë�œ 것ì�´ê³ , 개개ì�˜ ì“°ë ˆë“œëŠ” ê°�ê°�ì�˜ stackì�„ ê°€ì§€ê³ ìžˆì�„í…�ë�°. ì•„ì§� ìƒ�ê°�중ì�´ë‹¤.









