๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš— Major Study (Bachelor)/๐ŸŸง Operating System

[OS / ์šด์˜์ฒด์ œ] Socket, Java Socket, Remote Procedure Call, Remote Method Invocation

by UKHYUN22 2022. 3. 31.
728x90

Reading Assignment

 message queue๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ Queueใ…”์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๋‹ค. msgget()์€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋ผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ queue๋ฅผ ๊ฐ€์ ธ์˜ค๋ผ๋Š” ๊ฒƒ์ด๋‹ค. msgsnd() ๋ฉ”์‹œ์ง€๋ฅผ queue์— ๋„ฃ์–ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ๊ฒƒ. msgctl์˜ ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ IPC_RMID๋Š” ๋ฉ”์‹œ์ง€ Queue ์ž์ฒด๋ฅผ ์‚ญ์ œํ•˜๊ฒŒ ๋œ๋‹ค. 

 

Communications in Client-Server Systems

 

Socket์€ ๊ฐ€์žฅ Primitiveํ•œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋ฐฉ์‹์ด๋‹ค. RPC๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ํ•จ์ˆ˜์˜ ๋ณธ์ฒด๋Š” ์„œ๋ฒ„์— ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์ด๋‹ค. Pipe๋Š” ํด๋ผ์šฐ๋“œ๋ผ๊ธฐ ๋ณด๋‹ค ๋กœ์ปฌํ•œ ํ˜ธ์ถœ์— ํ•ด๋‹นํ•œ๋‹ค. Pipes.  RMI, RPC์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์ด๋Š” Java๋ฅผ ์ง€์›ํ•œ๋‹ค. C๋Š” procedure language์ด์ง€๋งŒ Java๋Š” Object Oriented ํ•จ์ˆ˜์ด๋‹ค. ๊ทธ๋ž˜์„œ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๋‹ค.

 

Socket

๋กœ์ง€์ปฌํ•œ endpoint๋ฅผ ๋ถ€๋ฅธ๋‹ค. ์ปดํ“จํ„ฐ์—๋„ Socket์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. Client์™€ Server์— ๊ฐ๊ฐ Socket์ด ์žˆ๋‹ค. ํ•˜๋‚˜์˜ Connection์€ 2๊ฐœ์˜ Socket์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ด๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ 2๊ฐœ๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค. ip address์™€ port ๋ฒˆํ˜ธ์ด๋‹ค.

 

Port

0๋ฒˆ๋ถ€ํ„ฐ 65535๊ฐœ์˜ Port ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ปดํ“จํ„ฐ ํ•˜๋‚˜๋‹น ์ € ์ˆซ์ž์— ํ•ด๋‹นํ•˜๋Š” Socket์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์ค‘์˜ ํ•˜๋‚˜๋ฅด ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ปดํ“จํ„ฐ ํ•˜๋‚˜๋Š” ๋ช‡ ๊ฐœ์˜ socket์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์„ ๊นŒ? LAN์นด๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋Š” ๊ฒƒ์€ IP address๊ฐ€ 1๊ฐœ ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์ด ์ค‘์—์„œ ํ†ต์‹ ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ด์„œ ์•„๋ฌด๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. 1024๋ฒˆ ์•„๋ž˜๋กœ์˜ ๋ฒˆํ˜ธ๋Š” ๋‚จ๋“ค์ด ์ด๋ฏธ ๋‹ค ์˜ˆ์•ฝ์„ ํ•ด๋†จ๋‹ค. ์š”์ฆ˜์€ ssh 20๋ฒˆ์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. 

 

web server์— socket 80๋ฒˆ์„ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•œ๋‹ค. client๋Š” socket์„ ํ•˜๋‚˜ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ 1024๋ณด๋‹ค ํฐ ์ˆซ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค๋ฉด ๊ฐ๊ฐ์˜ socket์„ ์—ฐ๊ฒฐ์‹œ์ผœ์„œ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

Socket

์šฐ์„  Port๋ฅผ ์—ด์–ด์•ผ ํ•œ๋‹ค. ๊ณ„์† Client์˜ ์š”์ฒญ์„ ๋ฐ›๊ธฐ ์œ„ํ•œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. Client๊ฐ€ ์ ‘์†์„ ํ•˜๋ ค๋ฉด Socket์„ ๋งŒ๋“ค๊ณ  ์›ํ•˜๋Š” Socket์—๋‹ค๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. ๋‚ด IP์—๋‹ค๊ฐ€ Port ๋ฒˆํ˜ธ๋ฅผ ๋ถ™์ด๋ฉด Socket ๋ฒˆํ˜ธ๊ฐ€ ๋œ๋‹ค. 

 

Java Socket

ServerSocket์€ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ด๋‹ค. Server๊ฐ€ ํฌํŠธ๋ฅผ ํ•˜๋‚˜ ์—ด์–ด์„œ CLient์˜ ์ ‘์† ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค๊ณ  ํ•˜๋ฉด ๊ทธ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ServerSocket์ด๋‹ค. ์‹ค์ œ์ ์ธ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ์œ„ํ•œ ํด๋ž˜์Šค๋Š” ์•„๋ž˜์˜ Socket ํด๋ž˜์Šค์ด๋‹ค. ํฌํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์—ฌ๋Š”๊ฐ€? ์ฒซ๋ฒˆ์งธ Class์— ํ•ด๋‹นํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์š”์ฒญ์„ ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ์— Client๊ฐ€ Socket์„ ๋งŒ๋“ค ๋•Œ๋Š” Socket ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ socket์„ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค. ServerSocket์€ ๋ฐ์ŠคํŠธ์— ์žˆ๋Š” ์‚ฌ๋žŒ์ด๊ณ  ๊ทธ ๋‹ค์Œ์— ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ์†Œ๊ฐœ์‹œ์ผœ ์ค€๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ์ž์‹ ์€ ๋‹ค์Œ ์†๋‹˜์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค. ์œ„์—๋Š” ์ ‘์† ์ „์ด๊ณ  ์•„๋ž˜๋Š” ์ ‘์† ํ›„๋ฅผ ์–˜๊ธฐํ•œ๋‹ค. 

 

Java Socket

ServerSocket ํด๋ž˜์Šค์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค. 6013๋Š” ํฌํŠธ๋ฒˆํ˜ธ์ด๋‹ค. accpet() ํ•จ์ˆ˜๋Š” Client์˜ ์ •๋ณด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. Client๊ฐ€ ์ ‘์†์„ ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค. Socket ํด๋ž˜์Šค์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“œ๋Š”๋ฐ IP ๋ฒˆํ˜ธ์™€ Port ๋ฒˆํ˜ธ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ๊ฒŒ ๋œ๋‹ค. 127.0.0.1์€ ์ž๊ธฐ ์ž์‹ ์— ํ•ด๋‹นํ•œ๋‹ค. Loop Back Address๋ผ๊ณ  ๋ถ€๋ฆ„. ๋‚˜ ์ž์‹ ์—๊ฒŒ 6013๋ฒˆํ˜ธ๋กœ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค. accpet๋กœ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํ™ฉ์—์„œ ์ ‘์† ์š”์ฒญ์ด ๋“ค์–ด๊ฐ€๋ฉด ์ ‘์†์˜ ๊ฒฐ๊ณผ๋กœ Socket์ด ์ƒ๊ธด๋‹ค. ์ฆ‰, client๋ผ๋Š” ์ด๋ฆ„์— socket์ด ์ €์žฅ๋˜๊ฒŒ ๋œ๋‹ค. 

 

Java Socket

Server๋Š” client๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  CLient๋Š” sock ์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. clinet.getOUTputStream() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. pout์ด๋ผ๋Š” ๋ณ€์ˆ˜์— ํ•ด๋‹น write ๊ฐ์ฒด๋ฅผ ๋„ฃ๊ฒŒ ๋œ๋‹ค. ์˜ค๋Š˜ ๋‚ ์งœ๋ฅผ toString ํ•จ์ˆ˜๋ฅผ ํ•ด์„œ pout์— ๋„ฃ๊ฒŒ ๋œ๋‹ค. 

Client๋Š” sock.getInputSTream() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. InputStream ํƒ€์ž…์ธ ๋ณ€์ˆ˜ in์—๋‹ค๊ฐ€ ์ง‘์–ด๋„ฃ๊ฒŒ ๋œ๋‹ค. BufferedReader ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ๋” ์‰ฝ๊ฒŒ ์ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. bin.readLine() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์ž…๋ ฅํ•œ ๋‚ ์งœ ์ •๋ณด๋ฅผ ์ฝ๊ฒŒ ๋œ๋‹ค. Server๊ฐ€ Stream์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ง‘์–ด๋„ฃ๊ฒŒ ๋˜๋ฉด ๋‹ค ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  client.close()๋ฅผ ํ•˜๋ฉด socket์ด ๋‹ซํžˆ๊ฒŒ ๋˜๊ณ  ์ด ๋œป์€ ๋‚˜๋Š” ๋” ์ด์ƒ ์“ธ ๊ฒƒ์ด ์—†๋‹ค๋ผ๊ณ  ํ‘œํ˜„ํ•˜๊ฒŒ ๋˜๊ณ  null์„ ๋„ฃ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  sock.close๋ฅผ ํ•˜๋ฉด Client์˜ socket์„ ๋‹ซ๊ฒŒ ๋œ๋‹ค. 

 

Remote Procedure Call

Client๊ฐ€ fn์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ ์ด๋Š” Server ์ƒ์— ์กด์žฌํ•˜๋ฏ€๋กœ Server์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ํ•˜๊ฒŒ ๋œ๋‹ค. Client์— client stub์ด ์žˆ๊ณ  server์—๋„ server stub์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. Client์ž…์žฅ์—์„œ๋Š” ์•„๋ฌด ์ƒ๊ฐ ์—†์ด fn์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๊ณ  client stub์—๋„ fn์ด๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•ด์„œ Server์ชฝ์— ์กด์žฌํ•˜๋Š” fn ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ๋˜ํ•œ stub์—์„œ ๊ฐ€์ ธ์™€์„œ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค. 

 

Remote Procedure Calls

์กฐ๊ทธ๋งŒํ•œ stub์— ์˜ฌ๋ ค์ ธ์„œ ๊ตฌํ˜„์ด ๋˜๊ฒŒ ๋œ๋‹ค. ๋ชจ๋“  ์†Œํ†ต์˜ ์—ญํ• ์„ stub์ด ๋‹ค ๋งก๊ณ  ์žˆ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ์–ด๋–ค Server์— ์—ฐ๊ฒฐํ•˜๊ณ  ์–ด๋–ค Port์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. Client์™€ Server๊ฐ€ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ ์กด์žฌํ•œ๋‹ค๊ณ  ํ•˜๋ฉด 32๋น„ํŠธ ์ปดํ“จํ„ฐ์™€ 64๋น„ํŠธ ์ปดํ“จํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Client์™€ Server์˜ INT ํ˜ธํ™˜์ด ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ‘œ์ค€ Format์„ ๋งŒ๋“ค์–ด์„œ ์†Œํ†ต์„ ํ•œ๋‹ค. 

 

Remote procedure Calls

Standard Representation์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค. marshaling์™€ unmarshalling์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. 

 

Pipes

ํ•˜๋‚˜์˜ ๊ฐ€์ƒ ํ™˜๊ฒฝ. Fileํ•˜๊ณ  ์‚ฌ์šฉ๋ฒ•์ด ๋™์ผํ•˜๋‹ค. ๋‘ ๊ฐœ์˜ ๋ฆฌํ„ด ๊ฐ’์„ ๊ฐ€์ง€๊ณ  fd[0]์€ Read์ด๊ณ  fd[1]์€ Writeํ•  ๋•Œ ์“ฐ์ธ๋‹ค. Parent Child๊ฐ€ Producer Consumer๋กœ ๋ฌถ์—ฌ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด parent๋Š” fd[1]์„ ์‚ฌ์šฉํ•œ๋‹ค. Producer๋Š” Write ํ•˜๋Š” ํ”„๋กœ์„ธ์„œ์ด๋‹ค. Producer์ชฝ fd[0]๋Š” close๋ฅผ ํ•œ๋‹ค. Consumer๋Š” fd[1]์„ ์‚ฌ์šฉํ•œ๋‹ค. fd[0]์™€ fd[1]์€ ๊ณต์œ  ํด๋”๋ฅผ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•œ๋‹ค. fork ์ด์ „์— ์˜คํ”ˆ ๋œ ๊ฒƒ์€ ๊ณต์œ ๋˜๊ณ  ์ดํ›„์— ์˜คํ”ˆ ๋œ ๊ฒƒ์€ ๋”ฐ๋กœ ์กด์žฌํ•œ๋‹ค. forkํ•˜๊ธฐ ์ „์— PIPE๋ฅผ ๋จผ์ € ๋งŒ๋“ค๋ฉด ๋œ๋‹ค. Ordinary Pipe๋Š” Parent child ๊ด€๊ณ„์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  Named Pipe๋Š” Parent child ๊ด€๊ณ„๊ฐ€ ์•„๋‹Œ ๊ณณ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

๋‚˜์ค‘ ๊ณผ์ œ ํ• ๋•Œ ๋„์›€์ด ๋  ๊ฒƒ

write๋ฅผ closeํ•  ๋•Œ error๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ์จ write๊ฐ€ ๋‹ค ๋๋‚ฌ๋‹ค๊ณ  ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉด read ๋„ ํƒˆ์ถœํ•˜๊ฒŒ ๋œ๋‹ค. 

 

Remote Method Invocation

RMI๋Š” OOP๋ฅผ ์œ„ํ•ด์„œ ๋งŒ๋“ค์–ด์กŒ๋‹ค. Java์— ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ๋“ค์€ ํด๋ž˜์Šค์™€ ์˜ค๋ธŒ์ ํŠธ์— ์†ํ•ด์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— RMI๋„ ํด๋ž˜์Šค์™€ ์˜ค๋ธŒ์ ํŠธ์— ์†ํ•ด์žˆ๋‹ค. server์—์„œ stub์„ ๋ฐ›์•„์ฃผ๋Š” ๊ฒƒ๋“ค์„ skeleton์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. 

 

Remote Method Innovation

Client์—์„œ ๋ฉ”์†Œ๋“œ m์„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ Server์— m์ด ์†ํ•œ ํด๋ž˜์Šค์™€ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.