Linux 커 널 주석 - 제9 장 System V IPC
Unix ,
。 ,BSD(Berkeley Software Development) Unix
socket, (
)。
Unix System V , System V
IPC。 , ,
,System V IPC
, 。 , —— ——
。 ——
, ,
。System V IPC (IPC)
, 。
System V IPC : 、 。
System V (message queues) (
asynchronously) , , —
— , ——
。 ;
。 ,
。
SMP 。 CPU
。 :
、 、
, 。 , CPU
, ,
。
, ,
CPU 。( ,
, CPU 。)
, (RPC) 。
, ;
, 。 , :
, ( ) 。
,
System V IPC 。
:
? msgget—— : 。
。 (key), ,msgget
, ,
。 ,msgget ,
。
? msgsnd—— 。
? msgrcv—— 。
? msgctl—— —— (
)、 , 。
Struct msg
15919:struct msg 。 :
? msg_next—— ——
NULL。
? msg_type—— ;
。
? msg_spot—— 。 ,
struct msg , msg_spot struct msg 。
? msg_stime—— 。 (FIFO)
, msg_stime 。
? msg_ts—— (“ts” “text size” ,
)。 MSGMAX, 15902
4056 。 , 4K(4096 ) struct msg
。 b 20 , 20 。
Struct msqid_ds
15865:msqid_ds 。 :
? msg_perm—— 。
? msg_first msg_last—— 。
? msg_stime msg_rtime——
。( : msg_ stime
msg_stime ? ,
—— 。)
? msg_ctime—— —— ,
msgctl 。
? wwait—— 。 ,
。 , (denial-of-service
) , —— ,
, 。 ,
, ,
, ( ,
)。wwait 。
? rwait—— , 。
? : (
) 。
? msg_cbytes—— 。
? msg_qnum—— 。
—— , 。
? msg_qbytes—— ; msg_cbytes
msg_qbytes 。msg_qbytes MAGMNB,
。
MAGMNB 15904 16384。 。
, , ,
。 , ,
——
。 , 16K 128 , 2MB。
。 ,
( ) 。msg_qbytes
, , 。
、
; msg_qbytes —— 。
, 。
? msg_lspid msg_lrpid—— PID。
Msgque
20129: msgque, struct msqid_ds
。 MSGMNI(15900 128), 128
。 ?
: 128 56 (7168 ,7K),msgque
128 4 (512 )。 ,
, 。 , ,
512 。 ,
。
9.1 。
9.1
Msg_init
20137:msg_init 。 ,
。
20141: msgque IPC_UNUSED 。IPC_UNUSED
, -1( void*);
。msgque IPC_NOID(
)—— , 。
Real_msgsnd
20149:real_msgsnd sys_msgsnd , msgsnd 。
, “ ” “do_”
。
20338 real_msgsnd , lock_kernel/unlock_kernel
。( 10 —— , CPU
, SMP 。) unlock_kernel ——
,real_msgsnd unlock_kernel
。
, goto
。 , sys_msgsnd 。 ,
,
, 。
—— :
P523 —1
, , 。
20158: 。 ,
—— 。
, MSGMAX 。( ,
, MSGMAX 。)
20164: : msgque
7 , ( ) 7 16 。
。
20166: , ,
。
20171: msgque 。
:
。 ,
。16 ,
。(
65535 , —— 131071 ,
。 , 。)
, ,real_msgsnd EIDRM
。
20174: 。 11 ;
, Unix 。
20177: , 。
, 2.0
。 ,
。
20180: 。 msgflg IPC_NOWAIT ,
, EAGAIN 。
20182: 。real_msgsnd
。 , (
, )。
20184: , ,
。 , 。
20190: (struct msg) ——
, 。 msg_spot
。
20196: 。
20202: 。Msgque 20184
, msg 。
, 。
,
? UP , ,freeque(
20440 ), , real_msgsnd
freeque ( freeque )。 , SMP
, 。
,msgque[id] IPC_UNUSED IPC_NOID, msq
freeque , 20203 。
20209: , , (
)。 ,
, 。
20226: , 0 。
Real_msgrcv
20230: real_msgsnd ,real_msgrcv msgrcv 。Msgtyp
, 20248 。Struct msg
msg_type : msgtyp 。
real_msgsnd real_msgrcv 20349
lock_kernel /unlock_kernel 。
20239: msgid msgque 。
20262: if/else 。 :
, nmsg NULL 。
20266:msgtyp , msgflg MSG_EXCEPT (15862 ) 。real_
msgrcv msgtyp 。
20272:msgtyp , MSG_EXCEPT 。real_msgrcv
msgtyp 。
20279:msgtyp 。real_msgrcv msgtyp ,
msgtyp 。 20281 < <=,
。 ——
FIFO —— ,
。 <=, (tie) 。
20287: , ,nmsg 。 ,nmsg NULL
。
20288: , 。
, E2BIG 。 ,
msgflg MSG_NOERROR (15860 ) , 。(
MSG_NOERROR ,
。)
20292: msgsz ,real_msgrcv msgsz
。 ,msgsz
。
, :
if ( msgsz > nmsg -> msg_ts )
msgsz = nmsg -> msg_ts;
20294: 。 , ,
,real_msgrcv
。
, 。
( ), ( ),
( )。 , ,
, 。
, 。 ,
msg _prev ( )
。 , 。
——
。 ,
, ,
。
,
, 。 ,
。 , ,
—— , Linux,
。
20305: 。
20308: 。
20313: —— real_msgsnd
。
20314: ( )。
20318: —— ,
。
20320: 。 :
msgflg IPC_NOWAIT , real_msgrcv
。
20323: , 。
EINTR ; ,
。
20329: , 。 ,
return , gcc 。
Sys_msgget
20412: sys_msgget sys_msgsnd sys_msgrcv ,
sys_msgget 。
, 。
20414: ret -EPERM。Ret
, 。 ,gcc
, 。
20418: IPC_PRIVATE( —— 0)
, 。 ,
newque(20370 ) , newque 。
20420: ,key 。 ,
( )
。
, ——
。 , ——key_t int
typedef, 32 40 , 64 9×1018
! 。
, , ,
。
, ? C tmpnam
,
。
, 。
,
。 。
,
。( , msgid 。) ,
,
? , 。
(nonprivate) , ,
1 ( 0 IPC_PRIVATE)
—— , 。
, findkey(20354 , )
。
20421: , sys_msgget 。 IPC_CREAT
, ENOENT ; ,newque (20370 ) 。
20425: 。 IPC_CREAT IPC_EXCL ,
, 。(
open O_CREAT O_EXCL 。)
, if :
P526—1
, , ,
。 , gcc ,
。( ,
——
。) , 。
20428: , , 。(
。) ( findkey ,
) ,
。
20434: msgque 。
sys_msgsnd、sys_msgrcv, sys_msgctl msgid 。
。
: id msgque , (
)msgque , MSGMNI 。
, id —— MSGMNI 。
—— , C
。 128,
7 。 16 , ret 23
1, 0。 , 0, ret 0 。
20437: ret , 。
Sys_msgctl
20468:sys_msgctl 。
—— ioctl ,
。( , Linux ;
System V 。)
msqid ,cmd sys_msgctl 。
, buf cmd,
。
20477: 。 ,
, lock_kernel 。( ,
—— lock_kernel )
20481: IPC_INFO MSG_INFO ,
。 , , ,
。
struct msginfo
(15888 ) 。 cmd MSG_INFO IPC_INFO ,
, 20495 ,
。
buf, struct msqid_ds
。 。 copy_to_user (13735 ) ,
,
。 ,sys_msgctl
; ( ) 。
20505: ,sys_msgctl , max_msqid。
msqid 。 ,
, 。 ,
msqid 。 ,
msqid msqid 。
20508:MSG_STAT ——
、 PID, 。
20512: msqid , ,
, 。 ,
, “ (metadata)” 。
, MSG_STAT msqid msgque ,
。
20521: 。sys_msgctl
, 。
20533: “ ” —— ( 20520
)。
20535: :IPC_SET、IPC_STAT, IPC_RMID。
, switch ,
。 ,IPC_SET
, tbuf 。(
20540 err —— 20550 ,err
。)
20542: ,IPC_STAT ——
。 ,IPC_RMID ;
。
20548: ,
: msqid ,
, 。
20559: IPC_STAT 。 ,
sys_msgctl 。
MSG_STAT , 。 :
,MSG_STAT “ ” msqid, IPC_STAT “
” msqid( )。
20572: 。 ,
:
P527—1
, 。 ,
MSG_STAT ( 20530 )
:
P527—2
, , :
P528—1
, ,
。 gcc : ,
。( C
—— gcc 。)
, , CPU
。CPU ,
, 。
, gcc 。
, gcc
, 。 。
,gcc —— 。(
gcc 。)
20576: IPC_SET , : 、
, (mode)。
20578: , CAP_SYS_ADMIN
(14092 )。 7 。
20584: ,
, , CAP_SYS_RESOURCE(
14117 )。 7 。
20587: , tbuf
。
20595:IPC_RMID —— , 。
CAP_SYS_ADMIN , freeque
(20440 ) 。
20605:cmd , EINVAL 。
, 20548 。
cmd, switch default
20546 switch :
P528—2
。 cmd msqid
, —— , cmd
msqid 。 msgctl ,
。 cmd
。
, switch
IPC_RMID case。 , IPC_RMID cmd
。 case cmd —— ,
。 , ,
。 。
Findkey
20354:findkey sys_msgget ( 20420 )
。
20359: msgque 。max_msqid
msgque ; ,
newque freeque 。 max_msqid,
msgque MSGMNI , 5 。
20360: IPC_NOID, 。
, findkey
。( 20385 kmalloc 。)
20362: msgque , 。
20364: , 。
20367: , -1 。
Newque
20370:newque msgque ,
。
20376: msgque 。 , IPC_NOID
, 20383 found 。
20381: ,msgque 。Newque
ENOSPC 。
20384: struct msqid_ds 。
20387: , msgque IPC_UNUSED 。
20388: IPC_NOID findkey。
20391: 。
20404: msgque ,newque
max_msqid。
20406: msgque 。
20408: findkey。
20409: msgque 。(
。) , ——
freeque 。 , 。
—— msgque
, (combination)
。 ,
。
, msgque
。
Freeque
20440: freeque ,
msgque 。
20449: ,freeque
max_msqid。 ,max_msqid msgque ,
0。 max_msqid 0, msgque
, 。
20452:msgque , struct msqid_ds
( msq ,freeque struct msqid_ds )。
20454: ,
。 。
20171 ;
20254 。
20458: schedule (26686 , 7 )
。 , CPU ——
。 ,
; freeque 。 ,
freeque (CPU) 。
, SCHED_YIELD (16202 )
, CPU 。
20460: , 。
(Semaphores) 。
( ),
(key)。 (key) ——
, 。
, 。
, ;
。 , ——
, 。 ,
, 。
(entity) ;
, (binary semaphore)。
, (counted
semaphores)。 , 。
( , )
, 。 。
。 ,
。
—— ,
。 X 。
X , X ,
。
。 、 X ,
, ,
。 , ——
( ), (X
), 。 ,
(mutual exclusion);
, (mutex) 。
,
。 , ;
。 , 。 ,
。
sem_init(20695
)、findkey(20706 )、sys_semget(20770 )、newary(20722 ),
freeary(20978 ) , 。
Struct sem
16983:struct sem 。 :
? semval—— 0 ,semval +1
。 , 。
, sys_semctl ;
SEMVMX( 16971 32767)。
? Sempid—— PID。
Struct semid_ds
16927:struct semid_ds struct msqid_ds :
。 、 struct
msqid_ds :
? sem_base—— struct sem —— , 。
struct msqid_ds , struct semid_ds
—— (
semaphore set)。 , struct semid_ds
。 。
SEMMSL, 16968 32。
struct semid_ds sem_nsems 。
? sem_pending—— 。
, , ,
。 struct msqid_ds rwit wwait 。
? sem_pending_last—— 。
—— , (
)。( ,
。)
? sem_undo—— 。
。
Struct sem_queue
16989:struct sem_queue struct semid_ds
。 :
? next prev—— 。 sem_pending_last ,
prev 。
。prev NULL; ,
,prev next。
? sleeper—— 。
2 。
? undo—— sops ——
sops 。
? pid—— PID。
? status—— 。
? sma—— struct sem_pending struct
semid_ds。
? sops—— ;
NULL。 sops 。
? nsops——sops 。
? alter—— 。
, 0( )
。
Struct sembuf
16939:struct sembuf 。 :
? sem_num—— struct semid_ds sem_base ,
。 struct sembuf struct sem_queue ,
struct sem_queue struct semid_ds ,
struct semid_ds 。 ,
struct sembuf semary ,
。
? sem_op—— 。 , -1、0, 1:-1 (
procure) ( ),1 (vacate) (
), 0 0。
, —— ,
。( “ ” “ ” —
— ; 。)
? sem_flg—— ( short
)。
9.2 。
9.2
Struct sem_undo
17014:struct sem_undo 。
SEM_UNDO struct
sem _undo。 struct sem_undo
。 (design patterns) (
Command pattern) 。
, ——
, 。(
, ——
, , 。)
struct sem_undo :
? proc_next—— struct sem_undo struct sem_undo
。
? id_next—— struct sem_undo struct
sem_undo。 , struct sem_undo
。 。
? semid—— struct sem_undo semary 。
? semadj—— , struct sem_undo
。 0
—— 。
Sys_semop
21244:sys_semop semop 。
sys_semop —— sys_msgsnd、sys_msgrcv,
, 。 ,
。 ( )。
, 。
21254: ,
。 21265 。
21255: 。 nsops SEMOPM ,
。 16970 32。
21261: , sops 。
21265: 。 ,
msgque semary(20688 )。
semid 。 ——
SEMMNI 16967 128( ,MSGMNI )。
21272: 。
, 。 ,
EFBIG ( “ ”) EINVAL (“ ”)。
。
21275: SEM_UNDO 。undos ——
0—— , 1( )
。 , 。 SEMOPM ,
undos 0。
21277: :decrease alter。
。
,alter 21282 —— ,
; decrease
。
——
1, 1。 ,
,decrease alter 。
( ),
, :
, 。
21285: 。 alter ,
; , 0,
。
21291: 。
,
。 , , un , , un
NULL。
21295: (undo set),
。 ,
(semadj ) struct sem_undo ,
。 struct sem_undo。
21311: , un NULL。
21313: try_atomic_semop(20838 , )
。 ,un ; ,
。
21315:try_atomic_semop 0 , 。 ,
21359 。
21321: ,try_atomic_semop 。 ,
。 struct sem_queue 。
21328: ; 0
。 update_queue (20900 )
。
—— ;
(heap-allocated) 。
, ;
。 , sem_exit(21379 ) 。
21333: ,
。
21336: (point) 。
21342: update_queue ,
。
21358: 。
21360: ,
。Sys_semop update_queue 。
Sys_semctl
21013: semctl sys_semctl sys_msgctl
。 , , sys_msgctl
sys_semctl (command)。
21093:GETVAL、GETPID、GETNCNT、GETZCNT, SETVAL 、
, semnum
。 semnum ,curr 。
21115: ——GETVAL、GETPID、GETNCNT, GETZCNT——
。 。
sempid 21116 ——
。
21121:GETALL 。
, ; 。
21126:SETVAL —— , 。
, —— 。
21142:SETALL SETVAL ; 。
SETVAL , 。
21173:GETALL 。
21175: 。 21112 。
21177: sem_io ,
。
21183:SETVAL 。
21187: , semnum
。 0 。
21189: , update_queue(20900 )
。
21220:SETALL 。
21224: 。
21226: 0。
, ——
。 ,
。 ,
SETVAL 。
Sem_exit
21379:sem_exit 。
。 , (23285 )。
21389: semsleeping , :
sem_queue ,
semsleeping 。 , 。
21395: struct sem_undo 。
。
21397: , 。struct
semundo semid freeary -1, 。
21399: , semque , 。
21406: , sma
struct semundos 。 ,sem_exit
21413 found 。
21411: sma , 。sem_exit
。 ,
。
。 “ ” , 。
, , 。
21414: sma ,unp 。
un 。
21417: 。
21427: , update_queue
。
21429: struct sem_undo —— 21412
。 , NULL
。
Append_to_queue
20805: q sma sem_pending 。 ;
:
P534_1
。 sem_
pending_last ,
, 。
Prepend_to_queue
20812: q sma sem_pending 。 sem_pending
, 。
Remove_from_queue
20823: struct sem_queue ,
。
20826: next , q 。
20828: , prev ;
, sma->sem_pending_last。
—— ,
。
20831: prev NULL, 21350 21390
。
Try_atomic_semop
20838:
。 ,
。
20846: 。
20850:sem_op 0 curr->semval 0。 ,
curr->semval 0, (block),
( )。
20853: PID curr->sempid 16 ; PID
16 。
20854:curr->semval sem_op —— 。
,
sem_op 。 sem_op semval (
wrap around), 。
20855: SEM_UNDO ,
, 。 un ——
。
20858: semval 。
20864: , 。
, , 。 ,
, try_atomic_semop 。
20874: semval , out_of_range 。
ERANGE , 。
20878: 0
, would_block 。
, EAGAIN 。 , 1 。
20884: undo 20846 for 。
20888: 20853
curr->sempid 16 。 16 ( 32 )
0:C 0 。
, , ,
, 。(C
。) , 0 1,
21116 16 。
Update_queue
20900:update_queue 。
( ) , 。
20907: status update_queue ,
。
, 。
20910: 。q->alter
, (mutating) 。
, 。
20914: ( ),
, 。 ,
。
20917: ,
; 。 ,
21342 。
20920: ,
。 , ,
。 , ( ) ,
。
20922: , 。 q->status ,
。
Count_semncnt
20938:count_semncnt 21117 sys_semctl GETNCNT 。
。
20949: sma
。 semncnt——
IPC_NOWAIT 。
Count_semzcnt
20957:count_semzcnt 21119 sys_semctl GET ZCNT
。 0 ( )
, count_semncnt 。 20970 ,
0 0 。
(shared memory) : ,
。 IPC ,
8 。
, IPC ,
—— ,
。 ——
, 。 ,
System V :
,
。 SMP , UP ——
, ,
。
, (
, )。
。 :
。 ,
。
——
,
。 ,
。
。 A B
, A , B
。 , 。
。
, (segments), VMA
。 , ; 8
(MMU) 。
, (regions) 。
。 ,
shm_init(21482 ) findkey(21493 ) 。
, 。
Struct shmid_ds
17042: ,struct shmid_ds
。 ,struct shmid_ds
, struct shmid_kernel 。 struct
shmid_ds :
? shm_segsz—— , ( ) 。
? shm_nattch—— , “ (attached)”
—— , 。 (
reference count)。
? shm_unused、shm_unused2 shm_unused3—— ,
; 。
Struct shmid_kernel
17056:struct shmid_kernel “ (private)”
“ (public)” 。struct shmid_ds
struct shmid _ds , struct
shmid_kernel 。 struct shmid_ds shmctl
, ,
struct 。 , 。struct
shmid_kernel ;
? u—— struct shmid_ds, 。
? shm_npages—— 。 shm_segsz
PAGE_SIZE(10791 ) 。
? shm_pages—— “ ”——“
” , 、 。
。
? attaches—— VMA 。
VMA 8 。
Newseg
21511: newque newary 。 struct
shmid_kernel, shm_segs 。
21537: “ ”。 struct shmid_kernel
IPC , 。 ,
struct shmid_kernel kmalloc ( ), “
” vmalloc ( )。
21546: 。
Sys_shmget
21573: sys_msgget sys_semget 。
struct mm_struct 。 ,
System V —— 10 。
Killseg
21610: freeque freeary。 ,
。
21616: shm_segs killseg ,
。 。
21629: shm_pages NULL, 。
struct shmid_kernel ,
, “ ” 。
21635: 。
21638: , 。
21640: , ,
。
21643: , , 。
21648: 。
Sys_shmctl
21654: sys_msgctl sys_semctl ,
。 。
21733:SHM_UNLOCK SHM_LOCK ,case 21742 。SHM_LOCK
, 。
SHM_UNLOCK , 。
case : 、
( ), 。
—— shm_swap(22172 ) 。
, CAP_IPC_LOCK(14021 )。
Insert_attach
21823: VMA struct shmid_kernel
VMA 。 VMA —— ,
。 ,attaches 。
Remove_attach
21833: struct shmid_kernel VMA
。 shp —— ,
VMA VMA shp attaches , 21829 ,
VMA ( ,
attaches )。
Sys_shmat
21898: shmat ,
。
21923: ,sys_shmat
。 , 。
NULL, SHM_REMAP ( 21959 ), —
—NULL 。
21929: NULL , sys_shmat
。get_unmapped_area (33432 ),
。 0(
NULL), 。
21932: ,
, 。
get_unmapped_area ,
, 。
(
): sys_shmat , 。
get_unmapped_area
, , , get_unmapped_area…
…
SHMLBA(11777 ) PAGE_SIZE(10791 )
。 , ,SHMLBA PAGE_SIZE,
。
SHMLBA PAGE_SIZE , ?
SHMLBA PAGE_SIZE, 。
MIPS ——CPU 4K PAGE_SIZE——Linux SHMLBA 0x40000(
256K), MIPS SGI
(ABI——Application Binary Interface)。 ,MIPS ABI 2 3
SHMLBA “ ”,
256K 。 ABI
, ABI 1.2 。
, SPARC-64 ,SHMLBA PAGE_SIZE ; ,
。
21936: , 。 ,
。
21945: len 。(
len ,21913 。)
, sys_shmat get_unmapped_area
。 ,get_unmapped_area
,struct shmid_ds shm_segsz len ——len
PAGE_SIZE , shm_segsz 。
, get_unmapped_area ,
。
21951: , 。
—— ,
。 , 。
, ——
, 。
21959:SHM_REMAP(17075 ) : SHM_REMAP
, , SHM_REMAP
—— 。
, 。
21971: , 。
SHM_RDONLY( ) , ; ,
。
21991: VMA。 vm_ops shm_vm_ops(
21809 ), 8 。
22004: , 。
22005: shm_map(21844 ) 。
, , , ,
, VMA, 。
,VMA ; SHM_DEST
(17106 ) 。SHM_DEST ;
sys_shmctl IPC_RMID —— 21780 。 ,
。
(checkpoint) ,
: ,
。
, 。(
, —— —— ,
。)
22014: VMA ,
。
22019: , 。
Shm_open
22028:shm_open sys_shmat (21898 )。
VMA 。 VMA VMA
, VMA ;shm_open
。
shm_open , do_fork(23953 )
, 7 。 , dup_mmap (
23654 ) 23692 。 ,dup_mmap copy_mm (23774 )
23801 ; copy_mm do_fork 24051 。
22033: VMA vm_pte shm_segs , 。
, SHM_ID_MADK (11757 )
。
22040: VMA 。
Shm_close
22050:shm_close shm_open , VMA
。 VMA close , 33821
shm_close 。 exit_mmap (33802 ),
mmput(23764 ) 、mmput __exit_mm(23174 ) ,
__exit_mm do_exit(23267 ) ,do_exit 7 。
shm_close , 。
22056: VMA vm_pte shm_segs VMA 。
shm_open , 。 shm_close
shm_segs 。 ,remove_attach
shp , 。 shm_close
, “ ”
。
22058: VMA 。
22061: , 。
Sys_shmdt
22068: sys_shmat ,sys_shmdt
。
22074: VMA 。
22076: VMA ( vm_ops
), VMA , VMA 。
22079:do_munmap(33689 ) unmap_fixup(33578 ),
33592 shm_close。do_munmap unmap_fixup 8 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.