26 1 Small Architecture ü Ü Small Architecture1 Small Architecture ü Ü ³ ² È Þžë ãòð Ñ Â È È Ÿ components ª ŸŠ ¼ª components ë à Á È Ý å Ò ë Šˆ Ê Š ëý ³Š ª ³ëÈ Í ª È ë à ³  memory constraints È ë È ëã Ò È ë Buschmann et al. 1996; Shaw and Garlan 1996; Bass et al. 1998; Bosch 2000 Έ Strap-It-On ù PC «ùë ˆ ž ª Ý ª«éœ Þ«ù Ò ª Î cached Ì Þ«ˆ Þ«ò ã ù È Ý ³ žý ë Ñ ž bytes ö bytes Å«ë œ ª ³ë ² š ³ È ª ˆ Ð Ýë a monolithic single component Ý ˆæ Foote and Yoder 2000 ª Î ³ žá È þ Š ë ª Ý ŸáÈ ë ÎëÈ ³ æ «ë ž ÆÆ È ³ ³«þ ë Ã Ã È ³ë ž õ ¼ªí Ý š Ý œ Í ë ñ Í ùá Ê Ý Á Š ë Š ë Szyperski 1999
Small Architecture 27 Í ë ù Š ³ž (1) ª source libraries Ý (2) Ÿë ª object libraries ëùª È Ý (3) ª dynamic-linked library ëùªá ݪ ž CORBA Java Beans ActiveX ±¹ì Šë (4) é runtime objects ݪ Šë (5) ª separate executables Þ«ë ãš œ Œ ŠÚë À ª ÌŠ ³ ž È ë à áþ«ë Ã Ô Ã ë à á È ë Ã È ë Ž Š Ý ³ ãè ë ³ ² ž ü Î Íâ Ã ë žé Þ È ÌŠ á high-level ë ë œ Ø È ë architecture strategy Ô Bass et al. 1998; Brooks 1982 Ò È ë œ ó È ³ ùª Ã ë ¹ Ò Ò È Š à œ âÿþ Ê ž ë ³ ³ Ð å Small Data Structures 169 š ž ë È Þ ª Fixed Allocation (226) á þ «ÔØáÐ ë ³ heap á heap Variable Allocation, 236 ë ý «Þ«é É ë Cargill 1996 Ð ³ ³ Memory Limit 32 Ý Pooled Allocation 251 ªÎ é é ³ ž Small Interfaces 38 ó Šë Ã Þ È ž éë à ë Þ Ý È ë à ãè æ Ê ë à ³ ó Í Ò Partial Failure 48 ë Ý ³ ë þ Captain Oates, 57 È ³ ö Ð «Á ž
28 Î Strap-It-On PC ë ù E-mail Ø Ì Ã Ø ë ž ù ë í ³ Memory Limit ù Ò cache Ð ˆ E-mail ë í ë E-mail ˆù ˆ óµž ù ë Small Interface ù Ò ëˆ œè ù Ò ó Þ«òΞ Šë ù» Consequences œ ó Italic Times New Roman ù¹ forces ª ŠâŸ ³ ªë à memory requirement ªë ž Ý memory predictability Î ª² ÝÁ scalable žýá usable ë ª ³ programmer effort ª ÄØà ë ë Ô µ ³ Î Ýë ã ü þ³ È ë žý usability Î â È È ë ø design quality Ôá Ý maintainability ª Á µ ó öî Ã ë ª á programmer discipline ³ å Î Ÿ Ô ë¼ Ž Î Ð ë ë à ³ ãš Š È š È ˆ ë programmer effort ³ Š Š ³ËÍŠ žë Ò ë õ ªë ² Ý scalability šà Šœ ë Ñ á ª ã«á ž œšœ Í Ñ
Small Architecture 29 Implementation œ ª þë Ü Ý È ³ó þ È µ ë ³ ó Îë Ñ ³ ž ð ë ÑÌŠ class package Ý namespace ë ª separate executable Ý process COM Ý CORBA ŠŒ middleware Îë Ý é objects ÐªÔ ½ procedures é È Š Š ëé Š ë Ì Ý é Facades Gamma et al. 1995 Î ëœ È ë Œ «Ï ë 1. Tailorability Š ëü ÞΞë Ð Ã Š ž Ð žá Š contexts ë à Š Œ Š ë Î Ä ü Í Î žáðþ Î ² ž Fixed Allocation 226 ë œ Î žª creation time ó š ëœ ž Variable Allocation 236 ë á Í Îží ë žé Î ˆ ð Ÿì hash table Š ó Ÿì ë Ð ë Í ³ Î Ã Ý Ã Ò cache ì Έ Java ë vector class «ë methods žª Vectors š Ê ó Ø ëœ Î 10 Vector v = new Vector(10); Î 20 v.ensurecapacity(20); Ð ÎÐÞÎ ë Ê ó ëœ Î v.addelement( new Object() ); v.trimtosize();
30 ã ëˆ ë Ì Ú ÝÔ¹ «ë «vector žî 520 Œ à Œ vector ð ì 8 Œ ì ž þ ì Ì õœ Ð ì Š ì 520 Œ vector Á ˆ ë ž œ ëï Š ë ˆ ëš vector ð Ž µ 520 Œ ˆ Ë Ó È ë Þ Soukup 1994 2. º Õ «Š ë Íü ½ Ξ Pooled Allocation 251 package ëþ«é Ð ü Memory Limit 32 Ý Memory Discard 244 Íü Áå Ÿ system heap ë é ò ³ ² ³ ð Þ«Ã 3/2! Dbmmcbdlt ë æ Ó ü Îë Ъ non-oo Š ³ Ó ü ÎëЪ Ì ü Ô link Î C É ³ ΞЪ Ý ü Ÿ ª Î ëðª ù Î X Window System ë Xt Window System Toolkit callback Ъ XAlloc function hook ü Î ë Ъ Î ë áðª Gilly and O'Reilly 1990 3/3!! Nfnpsz!Tusbufhz OO Š ³ ž Strategy ª Gamma et al. 1995 Ø æ ëœ þ Ξ ë æ Î C++ Š Þ ë strategy class Î Ô á ë ³Ðª class MemoryStrategy { virtual char* Alloc(size_t nbytes) = 0; // returns null when exhausted. virtual void Free(char* anitem;) = 0; } þ MemoryStrategy class ë Ð ³éœ ³ Ø PooledStrategy ³ Pooled Allocation LimitStrategy ž Memory Limit TemporaryHeapStrategy ³ Memory Discard HeapStrategy ö È Îë malloc()ô free()¼ª Alloc Ô Free Ï ³ C++ ž ë template ò ë object C++ STL ë collection Ô string templates Ò class Allocator Î Ð
Small Architecture 31 ªÔ áðª Stroustrup 1997 STL Ì Î ³éœ Ξ ë heap ³ Þ STL ë set template class Ø template <class Key, class Compare = less<key>, class Allocator = allocator> class set; å Њ Allocator allocator þí strategy class ž ë heap æ f Specialzation Patterns œ ë Ž ª š RAM ž ë ÝÄ 1.1 š ë œ «ª š Š ð Secondary Storage Data Structure Pooled Allocation Small Architecture Memory Limit Sharing Small Interfaces Read-Only Memory Copy-On-Write Partial Failure Captain Oates ROM Hooks Application Switching Multiple Representations Fixed Allocation œ ª 1.1 ª ë ô Memory Limit 32 ë Small Interfaces 38 Œá žîâ ³øë à ³ Partial Failure 48 æ ² ó ª Š á žôý š «
32 Captain Oates 57 È á Ý ³ë ÞÎžë ž ŽÈ Ý Read-only Memory 65 žî Š Áë Ò Á Á ë Ξ Hooks 72 Î á Read-Only Memory Ý Í ë Á à v Known uses C++ standard template library Stroustrup 1997 Ô Booch components Booch 1987 Š ëé APIs Í ª Î«Þ ë standard Java Ô Smalltalk collection classes ³ë ý Ð š ã ë See Also µž Secondary Storage 79 ³ Ã Ý Small Data Structures 169 ž ³ Ì ë ª Ô Í Sharing, 182 Tom Cargill ë Localized Ownership ª Cargill 1996 ² óã ã é Hypoth-a-Sized Collection ª Auer and Beck 1996 ² žª collections Ê ë Êü à Šœ Software Requirements & Specifications Jackson 1995 Ô Software Architecture Shaw and Garlan 1996 È ó ë æ Software Architecture in Practice Bass et al. 1998 ˆ Design and Use of Software Architectures Bosch 2000 œ þ ³ È ëž Patterns in Software Architecture Buschmann et al. 1996 architecture-level ª «µá È Practice of Programming Kernighan and Pike 1999 Pragmatic Programmer Hunt and Thomas 2000 Ô High-Level and Process Patterns from the Memory Preservation Society Noble and Weir 2000 È ² Šë ²
Memory Limit 33 Memory Limit ð Fixed-sized Heap Ø Heap Memory Partitions ² éë ³ëÈ Ã «ë à ë à ªë Ž ã ³ º Ð ³ ³ à task Ø ë upper bounds ³ Small Architecture 25 ë ³ È Ì ë ž ç à ë à ªë ž Ž È ë ù Ø ãš Ñ Ã Þ ë Ð ë Ã é ŸáÐ È Ú¼ Î Strap-It-On ë Stare War Ñ ë à ë à ³ ãþ«í È Š ž Þ ³œ ž ³ Šº Captain Oates 57 ª ž ë ë Ë ÍΞ Captain Oates íë ³ ¹ ³ Í ÑØ ë ž ò«œ æ ó Ø ö áí ó á Ξ Fixed Allocation 226 ë É Õ ³ Ð É modeling Ð Ì óš Š ³ë òáí
34 à á ë Ã Þ ªë ž à 1. õã ë Î ³ Á ë ª memory allocation routine š 2. ó Þ ë Š ç Þ ëš ª È ž Þ ëš ª¼ ó µó Œ Partial Failure 48 3. é ž ë Î Ã Ø þš Ø ³ Ê Í ³œ Š Á Ý ž Ð ³ Þ þ Ñ accounting mechanism þ «þ ³ ë policies Þ«ë Ô áýˆá ž ÒÄáޫΞ ˆ Š çš Memory Limit 32 ë ž Ì ó à Ðë Š³ å «Ã«Þ Ž ë Š«áËÍ ˆ Ξ Fixed Allocation 226 Ô ž Ì Ž ë Ί Œ Î Stair Wars Š Îžë ˆ ÔÐ ë é entities ª Ÿ Ø Íé ë ˆ þ ë Î Î ˆ é ç Þ ë ë ˆ ÔØë Stair Wars Šœ» Consequences œ ó Italic Times New Roman ù¹ forces ŸáÃ ë ž «Ø Þ ³ à ó È Šš ª ³ È ë Ý predictability Ì ŠÊ š á È ë Ž localization
Memory Limit 35 ³ ë programmer effort Í tasks ³ Í ö š ã «ˆ ÍŠ Éë é Ô µîè Š «ˆ Ê š Þ œ ª ˆ ë Ñ æ Ä fragmentation É Memory Allocation, 219 ë š Á ë³ È Ñ Î Þ«ë heaps ë fragmentation Implementation «³ æ Î 1. qžh É ³ á ÐªÔ Ðª Ì Á ÍЪ ë Ð ò Ъ ë ³á ö þ ë ³ š C++ Š ³ Á š ë newôdelete ˆ Stroustrup 1995 œ ªÌŠ à «ëã ý ë Î ˆù ë ³ ÊÇ ã ë Š Ÿ ˆ Ÿª Î Ë ó task Þžë Î Stair Wars ªŠŠ é entities Ξë ÌŠ ³ ž ˆ Ôé ª Þ Ñé á ³ «ë C++ ³ class µ á ÐÞ«derived classes Á newô delete ˆ ³ ÝÁ ë ³æ ЫµÎ heap Š ªëŠ ö «Š ë Stroupstrup 1997 2. separate heaps ³ à Ξ ë heap Ì ë heap ÑÐ ˆ ³ È ë separate heaps Ð Windows Ô Windows CE Microsoft 1997a, Boling 1998
36 3. o separate processes ³ Îà ª ³ È Ý µ ÑÃ ë ž EPOC ˆ UNIX éœ ³ Ã Ø È Ð ë Ξ Š ² programmer effort ³ È Î ž Ð óá³ Ã Ø ë ³œ ³ë È Î ª È Š æý Ý ³ È ³ heap š ±¹ì Š ˆ ë full size heap É Paging, 119 Ò ªŠ heap heap ëˆ Š ÔØë ãšî ž heap œå«ë ªœ æë þ «È heap Šë ž Ì ÐŠë ž È Þ ˆ VM È Š ãîž full heap ª heap Ë á¼ é x Examples ë C++ ª Ñ MemoryResrictedClass Ð subclasses ÞΞë ã ë ŠÊ bad_alloc ë ë LIMIT_IN_BYTES Ø class MemoryRestrictedClass { public: enum { LIMIT_IN_BYTES = 10000 }; static size_t totalmemorycount; void* operator new(size_t asize); void operator delete(void* anitem, size_t asize); }; size_t MemoryRestrictedClass::totalMemoryCount = 0; class œ ³ operator new Ìᜠvoid* MemoryRestrictedClass::operator new(size_t asize) { if (totalmemorycount + asize > LIMIT_IN_BYTES) throw (bad_alloc()); } totalmemorycount += asize; return malloc(asize);