ELEC ¡/ ¡COMP ¡177 ¡– ¡Fall ¡2015 ¡ Some ¡slides ¡from ¡Kurose ¡and ¡Ross, ¡ Computer ¡Networking , ¡5 th ¡Edition ¡
¡ Project ¡2 ¡– ¡Python ¡HTTP ¡Server ¡v2 ¡ § Starts ¡today! ¡ ¡ Checkpoint ¡1 ¡-‑ ¡ Due ¡Oct ¡4 th ¡ ¡ ¡ Checkpoint ¡1 ¡-‑ ¡ Due ¡Oct ¡11 th ¡ ¡ ¡ Final ¡Project ¡-‑ ¡ Due ¡Oct ¡18 th ¡ ¡ 2 ¡
¡ Presentations ¡on ¡Thursday ¡ 1. Craig ¡Goble ¡ -‑ ¡XMPP ¡(Jabber) ¡ 2. Taylor ¡Yatogo ¡ -‑ ¡Internet ¡of ¡Things ¡(CoAP) ¡ 3. Tyler ¡Fernandez ¡ -‑ ¡Secure ¡Shell ¡(SSH) ¡ 4. Kenneth ¡Thompson ¡ -‑ ¡Building ¡Automation ¡and ¡ Control ¡Networks ¡(BACnet) ¡ 5. Marcus ¡Barnes ¡ -‑ ¡Real ¡Time ¡Messaging ¡Protocol ¡ (RTMP) ¡ 6. Yunpeng ¡Zhang ¡ -‑ ¡Post ¡Office ¡Protocol ¡(POP) ¡ 7. Alexander ¡Murray ¡ -‑ ¡BitTorrent ¡Protocol ¡ 3 ¡
4 ¡
¡ Survey: ¡ § ¡Who ¡has ¡done ¡parallel ¡programming ¡before? ¡ § What ¡did ¡you ¡do? ¡ 5 ¡
¡ Why ¡do ¡I ¡need ¡concurrency ¡in ¡a ¡web ¡server? ¡ § Many ¡clients ¡making ¡requests ¡in ¡parallel ¡ § What ¡if ¡several ¡clients ¡each ¡attempt ¡to ¡download ¡ a ¡large ¡file? ¡ ▪ Ugly ¡to ¡make ¡everyone ¡wait ¡on ¡the ¡first ¡user ¡to ¡finish ¡ ▪ Eventually ¡other ¡clients ¡would ¡timeout ¡and ¡fail ¡ § A ¡multi-‑CPU ¡server ¡should ¡use ¡all ¡its ¡resources ¡ (multiple ¡cores) ¡to ¡satisfy ¡multiple ¡clients ¡ 6 ¡
MAXIMIZE ¡ MINIMIZE ¡ ¡ Request ¡throughput ¡ ¡ Response ¡times ¡ (#/sec) ¡ (ms) ¡ ¡ Raw ¡data ¡throughput ¡ ¡ Server ¡CPU ¡utilization ¡ (Mbps) ¡ ¡ Server ¡memory ¡usage ¡ ¡ Number ¡of ¡concurrent ¡ connections ¡ 7 ¡
¡ We’ll ¡use ¡the ¡ recv() ¡function ¡for ¡today’s ¡examples ¡ User-‑space ¡ App ¡1 ¡ App ¡2 ¡ App ¡n ¡ . ¡. ¡. ¡ Buffer ¡ recv() Kernel-‑space ¡ (OS) ¡ TCP ¡ (per-‑socket ¡struct) ¡ Buffer ¡ recv() ¡copies ¡data ¡from ¡kernel ¡space ¡to ¡user-‑space. ¡ If ¡data ¡is ¡available, ¡the ¡function ¡returns ¡immediately ¡with ¡data ¡ 8 ¡
recv() ¡copies ¡data ¡from ¡kernel ¡space ¡to ¡user-‑space. ¡ If ¡data ¡is ¡available, ¡the ¡function ¡returns ¡immediately ¡with ¡data ¡ BLOCKING ¡ NON-‑BLOCKING ¡ ¡ Standard ¡mode ¡ ¡ Special ¡mode ¡for ¡many ¡ ¡ When ¡your ¡program ¡calls ¡ socket ¡calls, ¡including ¡ recv() , ¡if ¡no ¡data ¡is ¡ recv() available, ¡the ¡OS ¡puts ¡your ¡ ¡ When ¡your ¡program ¡calls ¡ program ¡to ¡ sleep ¡ ¡ recv() , ¡if ¡no ¡data ¡is ¡ ¡ Your ¡program ¡is ¡“blocked” ¡ available, ¡ recv() ¡ on ¡ recv() immediately ¡returns ¡ 9 ¡
SYNCHRONOUS ¡ ASYNCHRONOUS ¡ ¡ “With ¡Synchronization” ¡ ¡ “Without ¡Synchronization” ¡ ¡ One ¡operation ¡at ¡a ¡time… ¡ ¡ Function ¡calls ¡to ¡OS ¡ ¡ Function ¡calls ¡to ¡OS ¡ services ¡return ¡ services ¡do ¡not ¡return ¡until ¡ immediately, ¡while ¡OS ¡ action ¡is ¡complete ¡ action ¡can ¡proceed ¡ independently ¡of ¡user ¡ program ¡ 10 ¡
Synchronous ¡ Synchronous ¡ ¡ Blocking ¡I/O ¡ Non-‑Blocking ¡I/O ¡ Asynchronous ¡ Asynchronous ¡ ¡ Blocking ¡I/O ¡ Non-‑Blocking ¡I/O ¡ 11 ¡
Pseudo-‑code: ¡ ¡ Program ¡requests ¡ ¡ data ¡from ¡OS ¡ data = socket1.recv() # Data now available ¡ recv() ¡only ¡returns ¡ once ¡data ¡is ¡available ¡ ¡ Works ¡fine ¡for ¡ managing ¡one ¡socket ¡ § How ¡about ¡ two ¡ sockets ¡with ¡different ¡ clients? ¡ 12 ¡
Pseudo-‑code: ¡ ¡ Program ¡requests ¡ ¡ data ¡from ¡OS ¡ socket1.blocking(off) data = socket1.recv() ¡ recv() ¡will ¡return ¡ while(!data) data = socket1.recv() immediately, ¡but ¡may ¡ # Data now available not ¡have ¡any ¡data ¡ ¡ Busy-‑wait ¡loop ¡ wastes ¡CPU ¡time ¡ ¡ How ¡would ¡this ¡work ¡if ¡we ¡had ¡ two ¡sockets ¡ to ¡manage? ¡ 13 ¡
¡ recv() ¡still ¡blocking ¡ Pseudo-‑code: ¡ ¡ ¡ Busy-‑wait ¡loop ¡ list_recv = (socket1) replaced ¡with ¡ new ¡ list = select(list_recv) select() ¡ function ¡ ready_sock = list[0] data = ready_sock.recv() that ¡ tests ¡multiple ¡ # Data now available sockets ¡at ¡once ¡ ¡ Give ¡ select() ¡ separate ¡list ¡of ¡sockets ¡ ¡ select() ¡returns ¡ the ¡subset ¡of ¡lists ¡that ¡ § Want ¡to ¡ recv() are ¡ ready ¡ ¡ § Want ¡to ¡ send() (for ¡send/recv/err) ¡ § Check ¡for ¡error ¡ ¡ Not ¡the ¡most ¡efficient ¡ function… ¡ 14 ¡
Pseudo-‑code: ¡ ¡ recv() ¡returns ¡ ¡ immediately ¡ data = socket.q_recv(done) # Do something else ¡ In ¡background, ¡OS ¡ # in program performs ¡ recv() ¡ fun done() # When called, data work ¡ # is available ¡ When ¡ready, ¡OS ¡calls ¡ a ¡“callback” ¡function ¡ in ¡your ¡program ¡ 15 ¡
Process ¡ Thread ¡ What’s ¡the ¡difference? ¡ 16 ¡
PROCESSES ¡ THREADS ¡ ¡ Use ¡multi ¡cores/CPUs ¡ ¡ Use ¡multi ¡cores/CPUs ¡ ¡ Same ¡memory ¡ space ¡ ¡ Separate ¡ memory ¡space ¡ ¡ Can ¡communicate ¡with ¡other ¡ ¡ Can ¡communicate ¡with ¡ threads ¡by ¡ shared ¡memory ¡ other ¡processes ¡only ¡by ¡ IPC ¡ ¡ “Harder” ¡ to ¡program ¡(other ¡ (inter-‑program ¡comm.) ¡ buggy ¡threads ¡can ¡easily ¡ ¡ “Safer” ¡ to ¡program ¡(other ¡ corrupt ¡your ¡memory ¡+ ¡ processes ¡can’t ¡hurt ¡you) ¡ synchronization ¡is ¡hard!) ¡ ¡ “Heavy-‑weight” ¡ -‑ ¡Slower ¡ ¡ “Light-‑weight” ¡ -‑ ¡Fast ¡to ¡start ¡ to ¡start ¡a ¡new ¡process ¡ a ¡new ¡thread ¡ ¡ ¡(lots ¡of ¡OS ¡work) ¡ (minimal ¡OS ¡work) ¡ 17 ¡
PROCESSES ¡ THREADS ¡ ¡ Slow ¡start? ¡ ¡ Fast ¡start? ¡ § Typical ¡servers ¡start ¡a ¡“pool” ¡ § OK ¡to ¡start ¡threads ¡“on ¡ of ¡processes ¡when ¡launched ¡ demand” ¡ § Requests ¡are ¡quickly ¡assigned ¡ ¡ Shared ¡data? ¡ to ¡an ¡already-‑running ¡process ¡ § Need ¡synchronization ¡(locks, ¡ when ¡received ¡ semaphores, ¡etc…) ¡to ¡prevent ¡ ¡ Shared ¡data? ¡ corruption ¡of ¡shared ¡data ¡ § Need ¡to ¡use ¡OS ¡IPC ¡ mechanisms ¡to ¡communicate ¡ § Needed ¡to ¡assign ¡requests ¡to ¡ processes, ¡store ¡log ¡data ¡from ¡ processes ¡to ¡single ¡file, ¡… ¡ 18 ¡
Processes ¡or ¡ ¡Threads ¡ Non-‑blocking ¡sockets ¡ with ¡blocking ¡sockets ¡ Synchronous ¡ Synchronous ¡ ¡ Blocking ¡I/O ¡ Non-‑Blocking ¡I/O ¡ Asynchronous ¡ Asynchronous ¡ ¡ Blocking ¡I/O ¡ Non-‑Blocking ¡I/O ¡ Single ¡process ¡ Single ¡process, ¡ ¡ with ¡select() ¡ Event ¡driven ¡ 19 ¡
And ¡now, ¡a ¡note ¡ about ¡Python… ¡ 20 ¡
(Only ¡if ¡Google ¡helps…) ¡ Pro ¡ Intermediate ¡ Novice ¡ 21 ¡
So ¡before ¡assigning ¡class ¡ projects, ¡I ¡wrote ¡a ¡Python ¡ web ¡server ¡using ¡ threads . ¡ ¡ Once ¡working, ¡I ¡measured ¡ its ¡performance… ¡ 22 ¡
Results ¡were ¡“sub ¡optimal” ¡ Not ¡this ¡bad, ¡but ¡it ¡certainly ¡did ¡not ¡scale ¡ well ¡as ¡the ¡number ¡of ¡concurrent ¡clients ¡ increased… ¡ 23 ¡
¡ Python ¡is ¡an ¡ interpreted ¡language ¡ § Several ¡different ¡interpreters ¡exist… ¡ § Most ¡common ¡interpreter ¡is ¡written ¡in ¡C ¡(“ CPython ”) ¡ ¡ CPython ¡has ¡a ¡global ¡lock ¡ ¡ (GIL ¡= ¡Global ¡Interpreter ¡Lock) ¡ ¡ § Lock ¡prevents ¡two ¡threads ¡from ¡running ¡in ¡the ¡ interpreter ¡and ¡manipulating ¡memory ¡at ¡same ¡time ¡ § Allows ¡interpreter ¡to ¡run ¡safely ¡(correctly), ¡perform ¡ garbage ¡collection, ¡etc… ¡ 24 ¡
Recommend
More recommend