3. 6. 1
Linux clone(), . fork(), .
, , . , , , , . , clone() (pid), .
( clone() ', ).
ϳ clone() 1:1. , ( Linux , , , ).
Linux , . Linux task_struct, .
Linux
Linux clone(). Linux , .
. , , clone(), . .
POSIX 1996 , POSIX.
Linux
, Linux ᒺ, . , (pid). ³ , :
;
;
, .
3. 6. 2
, POSIX pthread_create() :
#include<pthread.h>
int pthread_create(pthread_t *th, pthread_attr *attr,
void *(*thread_fun)(void *).void *arg);
|
|
:
th pthread_t, ; (thread handle).
Attr ( , );
thread_fun ,
void *mythread_fun(void *value)
{
//
}
arg , ( value).
POSIX:
#include<pthread.h>
//
void *thread_fun(void *num)
{
printf( %d\n,(int)num);
}
//
pthread_t th;
//
pthread_create(&th, NULL,thread_fun,(void *)++thread_num);
//
, . , main() , : , main(), .
POSIX
thread_fun() pthread_exit():
#include<pthread.h>
void pthread_exit(void *retval);
retval . :
void *turead_fun(void *num)
{
printf( %d\n,(int)num);
pthread_exit(0);
}
:
return main() , ;
pthread_exit() main() , , .
pthread_exit() , , .
pthread_join(). :
int pthread_join(pthread_t th,,void **status);
, , , , th, . status , , ( pthread_exit()). pthread_join(), .
, . . , . , . , . .
. , , -, , -볺. .
|
|
, , , . . 1:1, , .
(, , ). . - .
, . ϳ ( fork()) , . , .
4
. , ( ). N>1, N ( ).
, , (scheduling). , , .
, .
, .
4. 1
, .
4. 1. 1
( ) -. , , (CPU birst), , -, - - (I/O burst). 2 8 .
, -, (CPU bound). . , , . , -, - (I/O bound). , . , .
, ( )
, - ( )
|
|
- (I/O bound)
(CPU bound)
4.1
4. 1.2
. , , , . , (scheduler), , (scheduling algorithm).
, , .
.
̳ . . ( ) . 50-150.
. , (, ). ; . , :
(, , );
( , , - ).
, , . , , . ³, . .
4. 1. 3
1:1( ), . , , , . , ( 1:M M:N). : , .
(long-term scheduling), c (medium-term scheduling) (short-term schediling).
4. 2. 1
, . , . , , . (, ) , ; . , . 㳿 , , , , .
|
|
4. 2. 2
. ³ , , (ready queue).
:
-;
();
.
, , , . , (, -); (schediling queues) (wait queues). \ , . . 4.2 .
4. 2. 3
, ( CPU scheduling), . :
?
?
, , . , . (dispetcher), ( ).
.
TCB4 TCB2
1
2 TCB5 TCB1
3
4. 2
FIFO, , .
㳿 , , .
4. 3 㳿 .
, 㳿 , :
, (, - );
;
( , );
(, , , ).
, , , . 㳿 .
(preemptive multitasking) , , . . .
(non=preemptive multitasking) . , , , . , , , . Nowell Net Ware.
, (- ). , . , , , . , . (, Net Ware ).
|
|
, . , .
㳿 , , . , . , , .
FIFO
() , , . FIFO, FIFO.
, , , .
:
;
(, , , );
(convoy effect).
. , ( Tcpu), , Tio, -. Tcpu . Tio -, , - . Tcpu , Tio ( , , ) -. ϳ Tcpu .
(round-robin scheduling). round robin , , , ( , ).
, (time quantum, time slice) . , . , . .
. . , , . ( 4. 3). .
t
,
t+q
t+2*q
4.3.
, , . , , .
, , , . , , , , , . FIFO ( ). 10 100 .
, , . , , -, , . ( , ) , -, .
4. 4. 3
, . .
: , . .
(multilevel queues). ( , , ).
г :
, (, ), ;
, . .
, , .
, , . , 1973 , 1967 . ( starvation).
. , , ( ), , , . , , , .
4. 4. 4
, .
(Shortest Time to Completition First, STCF), , . , , .
STCF , , - . , , . ( , , , ). , .
, .
tn+1=aTn+(1-a)tn, 0 < a < 1, t0=T0,
tn+1 ;
tn ;
Tn .
a=0,5, .
STCF , (Shortest Remainig time to completition first, SRTCF). STCF , , , , , , , .
4. 4. 5
(multilevei feedback queues) ( - ), .
: , .
³ , :
;
ᒺ , , .
, , ( FIFO-).г , ( ). , ( ). (, -) , ( 4. 4). , , .
FIFO
4. 4
(lottery scheduling) , , .
, :
, T;
T ;
, , .
:
, ;
, ;
SRTCF , ( , );
, , (, , , A 50% , B C 25%, A , B C );
, .
, , . , ( ). , , .
4. 5 Linux
Linux ( 2.4 ) ,
2.6.
Linux , .
: FIFO, , .
4. 5. 1
, , :
;
FIFO , (, ) ;
, , .
4. 5. 2
. (epochs). , . . , . . - , . , . .
, , . nice() setpriority(). - .
: , , , , , , . - - .
:
policy , (, FIFO );
nice , ( nice , );
counter , . counter .
, ( scedule()).
, . , .
(lazy invocation). ³ , need_resched 1. : ; , , ; . , , , , need_resched . , .
, , , . . , . , , .
, . , .
, , , . , , , - (, , -.
, ( ). , :
for each_task(p)
p.counter=(p.counter/2)+p.nice;
, , , -. , .
. goodness(). , .
0 , . . , , .
³ 0 1000 , . , . :
c=p.counter+p.nice;
p .
, , . , , , (, , clone()).
, . ( counter ) , , . , , fork() counter : , .
.
. dz .
, . , , .
, -, , (, ) .
dz , , .
4. 5. 3
, . Linux .
. , 2.6 . , .
, , .
, , . г : , . , . .
. ϳ , , . , , . , .
4. 5. 4
Linux, ( nice) .
setpriority():
#include<sys/resource.h>
int setpriority(int which, int who,int priority);
, which PRIO_PROCESS PRIO_USER, , who . ( , who ), .
priority . 20 20, . 0. priority .
getpriority():
Int getpriority(int which, int who);
, which who , setpriority().
:
//
setpriority(PRIO_PROCESS,0,10);
//
printf( : %d\n,getpriority(PRIO_PROCESS,0));
nice():
#include<unistd.h>
int nice(int inc); // inc.
, , . ֳ : , . . , , .
, . , , . .
5
糺䳿 . .
5. 1 䳿
, , .
, , , . .
, . ֳ , ( ). , , ( ).
, , .
, , (shared data). . - . .
, , . , , , .
䳿 .
. , - , , .
䳿 . , , . 㳺 .
, -, , -, .
, , , , , .
, , .
5. 2 䳿
, , , , .
, ( ). , total_amount. :
total_amount=total_amount+new_amount;
: , , , total_amount ?
:
total_amount ;
new_amount .
, . 100 . 1000, 100. , . ( 1).
1. total_amount, 100.
2. total_amount, 100.
3. 1 total_amount 1000, 1100 .
4. 2 total_amount 100, 200 , , .
.
( 2).
1. total_amount, 1000 1100 .
2. total_amount, 1100, 100 1200 .
.
, . : , , . (race condition), , . ( , ).
. ³ , . , .
- , , : , , , .
, , .
.
( ) . , , , . , , , . , .
. . . , ( , ), . , (, , , ).
. .
.
5. 2. 2
.
, , , . , .
, , , , , . (critical section):
//
total_amount=total_amount+new_amount;
//
, , , , , ( , ). 2, .
, .
(mutual exlusion): .
: , ( ).
: , , .
: ?
. , , , , , .
(locks). , . : (, acquire_lock()) (, release_lock()). , , , , . ϳ .
acquire_lock(lock);
//
release_lock(lock);
, (mutex, mutual exclusion).
. , . :
int lock=0;
void aquire_lock(int lock)
{
// (lock==0), ( lock=1)
//
// ,
while(lock!=0); //(1)
lock=1; //(2)
}
void release_lock(int lock)
{
//
lock=0;
}
, (1) (2) . , 0, .
5. 3
.
, , . , .
:
, , ();
, , 峺 ( );
, ; , ;
, ( - );
, , .
, - (produser-consumer problem) (bounded buffer).
. , - -. ᒺ, . , ᒺ, ᒺ, .
n. ᒺ , . ᒺ, . :
1. , , .
2. ᒺ , ( n ᒺ), , .
3. ᒺ , , , ᒺ.
1965 . . , .
䒺 , :
(down): , , , , (, ). wait. :
void down(semaphore_t sem)
{
if (sem>0)
sem--;
else sleep();
}
(up): ; , ,