विज्ञापन बन्द गर्नुहोस्

माइक ऐश आफ्नो ब्लगमा समर्पित iPhone 64S मा 5-बिट आर्किटेक्चरमा स्विच गर्ने व्यावहारिक प्रभावहरू। यो आलेखले उहाँको निष्कर्षमा आधारित छ।

यस पाठको कारण मुख्यतया 5-बिट एआरएम प्रोसेसरको साथ नयाँ iPhone 64s ले प्रयोगकर्ताहरू र बजारका लागि वास्तवमा के अर्थ राख्छ भन्ने बारे फैलिएको ठूलो मात्रामा गलत जानकारीको कारण हो। यहाँ हामी विकासकर्ताहरूको लागि यस संक्रमणको कार्यसम्पादन, क्षमता र प्रभावहरूको बारेमा वस्तुनिष्ठ जानकारी ल्याउने प्रयास गर्नेछौं।

"64 बिट"

त्यहाँ प्रोसेसरका दुई भागहरू छन् जुन "X-bit" लेबलले सन्दर्भ गर्न सक्छ - पूर्णांक दर्ताहरूको चौडाइ र सूचकहरूको चौडाइ। सौभाग्य देखि, धेरै आधुनिक प्रोसेसरहरूमा यी चौडाइहरू समान छन्, त्यसैले A7 को मामलामा यसको मतलब 64-बिट पूर्णांक दर्ताहरू र 64-बिट पोइन्टर्सहरू छन्।

यद्यपि, "64bit" को मतलब के होइन भनेर औंल्याउन पनि उत्तिकै महत्त्वपूर्ण छ: RAM भौतिक ठेगाना आकार। RAM सँग सञ्चार गर्नका लागि बिटहरूको संख्या (यसैले उपकरणले समर्थन गर्न सक्ने RAM को मात्रा) CPU बिट्सको संख्यासँग सम्बन्धित छैन। एआरएम प्रोसेसरहरूसँग 26- र 40-बिट ठेगानाहरू बीचमा छ र बाँकी प्रणालीबाट स्वतन्त्र रूपमा परिवर्तन गर्न सकिन्छ।

  • डाटा बस आकार। RAM वा बफर मेमोरीबाट प्राप्त डाटाको मात्रा यस कारकबाट समान रूपमा स्वतन्त्र छ। व्यक्तिगत प्रोसेसर निर्देशनहरूले डेटाको विभिन्न मात्रा अनुरोध गर्न सक्छ, तर तिनीहरू या त टुक्राहरूमा पठाइन्छ वा मेमोरीबाट आवश्यक भन्दा बढी प्राप्त गरिन्छ। यो डाटा क्वान्टम को आकार मा निर्भर गर्दछ। iPhone 5 ले पहिले नै मेमोरीबाट 64-बिट क्वान्टामा डेटा प्राप्त गर्दछ (र यसमा 32-बिट प्रोसेसर छ), र हामीले 192 बिट सम्मको आकारहरू सामना गर्न सक्छौं।
  • फ्लोटिंग बिन्दुसँग सम्बन्धित कुनै पनि कुरा। त्यस्ता दर्ताहरूको साइज (FPU) फेरि प्रोसेसरको आन्तरिक कार्यहरूबाट स्वतन्त्र हुन्छ। ARM ले ARM64 (64-bit ARM प्रोसेसर) अघिदेखि 64-bit FPU प्रयोग गर्दै आएको छ।

सामान्य फाइदा र हानि

यदि हामीले अन्यथा समान 32bit र 64bit आर्किटेक्चरहरू तुलना गर्छौं भने, तिनीहरू सामान्यतया फरक छैनन्। एप्पल मोबाइल उपकरणहरूमा पनि 64 बिटमा सर्ने कारण खोज्दै सर्वसाधारणको भ्रमको यो एउटा कारण हो। यद्यपि, यो सबै A7 (ARM64) प्रोसेसरको विशिष्ट प्यारामिटरहरूबाट आउँछ र एप्पलले यसलाई कसरी प्रयोग गर्दछ, प्रोसेसरसँग 64-बिट आर्किटेक्चर छ भन्ने तथ्यबाट मात्र होइन।

यद्यपि, यदि हामी अझै पनि यी दुई वास्तुकलाहरू बीचको भिन्नताहरू हेर्छौं भने, हामी धेरै भिन्नताहरू भेट्टाउनेछौं। स्पष्ट छ कि 64-बिट पूर्णांक दर्ताहरूले 64-बिट पूर्णांकहरूलाई अझ कुशलतापूर्वक ह्यान्डल गर्न सक्छ। पहिले पनि, यो 32-बिट प्रोसेसरहरूमा तिनीहरूसँग काम गर्न सम्भव थियो, तर यो सामान्यतया तिनीहरूलाई 32-बिट लामो टुक्राहरूमा विभाजन गर्ने हो, जसले ढिलो गणनाको कारण बनायो। त्यसोभए 64-बिट प्रोसेसरले सामान्यतया 64-बिट प्रकारहरूसँग 32-बिटहरू जस्तै छिटो गणना गर्न सक्छ। यसको मतलब यो हो कि सामान्यतया 64-बिट प्रकारहरू प्रयोग गर्ने अनुप्रयोगहरू 64-बिट प्रोसेसरमा धेरै छिटो चल्न सक्छन्।

यद्यपि 64bit ले प्रोसेसरले प्रयोग गर्न सक्ने RAM को कुल मात्रालाई असर गर्दैन, यसले एक कार्यक्रममा RAM को ठूलो भागहरूसँग काम गर्न सजिलो बनाउन सक्छ। 32-बिट प्रोसेसरमा चल्ने कुनै पनि एकल प्रोग्राममा 4 GB ठेगाना स्पेस मात्र हुन्छ। अपरेटिङ सिस्टम र मानक पुस्तकालयहरूले केहि लिन्छन् भन्ने कुरालाई ध्यानमा राख्दै, यसले अनुप्रयोग प्रयोगको लागि 1-3 GB को बीचमा प्रोग्राम छोड्छ। यद्यपि, यदि 32-बिट प्रणालीमा 4 GB भन्दा बढी RAM छ भने, त्यो मेमोरी प्रयोग गर्न अलि बढी जटिल छ। हामीले अपरेटिङ सिस्टमलाई हाम्रो कार्यक्रम (मेमोरी भर्चुअलाइजेसन) को लागि मेमोरीको यी ठूला टुक्राहरू नक्सा गर्न बाध्य पार्नको लागि रिसोर्ट गर्नुपर्छ, वा हामी प्रोग्रामलाई धेरै प्रक्रियाहरूमा विभाजन गर्न सक्छौं (जहाँ प्रत्येक प्रक्रियामा फेरि 4GB मेमोरी प्रत्यक्ष ठेगानाको लागि उपलब्ध छ)।

यद्यपि, यी "ह्याकहरू" यति गाह्रो र ढिलो छन् कि न्यूनतम अनुप्रयोगहरूले तिनीहरूलाई प्रयोग गर्छन्। अभ्यासमा, 32-बिट प्रोसेसरमा, प्रत्येक प्रोग्रामले यसको 1-3 GB मेमोरी मात्र प्रयोग गर्नेछ, र थप उपलब्ध RAM एकै समयमा धेरै प्रोग्रामहरू चलाउन वा यो मेमोरीलाई बफर (क्यासिङ) को रूपमा प्रयोग गर्न प्रयोग गर्न सकिन्छ। यी प्रयोगहरू व्यावहारिक छन्, तर हामी कुनै पनि कार्यक्रम 4GB भन्दा ठूलो मेमोरीको टुक्रा सजिलै प्रयोग गर्न सक्षम भएको चाहन्छौं।

अब हामी बारम्बार (वास्तवमा गलत) दावीमा आउँछौं कि 4GB भन्दा बढी मेमोरी बिना, 64-बिट आर्किटेक्चर बेकार छ। कम मेमोरी भएको प्रणालीमा पनि ठूलो ठेगाना ठाउँ उपयोगी हुन्छ। मेमोरी-म्याप गरिएका फाइलहरू एक उपयोगी उपकरण हो जहाँ फाइलको सामग्रीको अंश तार्किक रूपमा सम्पूर्ण फाइल मेमोरीमा लोड नगरी प्रक्रियाको मेमोरीसँग जोडिएको हुन्छ। यसरी, प्रणालीले, उदाहरणका लागि, र्याम क्षमता भन्दा धेरै गुणा ठूला फाइलहरूलाई क्रमशः प्रशोधन गर्न सक्छ। 32-बिट प्रणालीमा, त्यस्ता ठूला फाइलहरूलाई विश्वसनीय रूपमा मेमोरी-म्याप गर्न सकिँदैन, जबकि 64-बिट प्रणालीमा, यो केकको टुक्रा हो, धेरै ठूलो ठेगाना ठाउँको लागि धन्यवाद।

जे होस्, पोइन्टर्सको ठूलो साइजले एउटा ठूलो बेफाइदा पनि ल्याउँछ: अन्यथा समान प्रोग्रामहरूलाई 64-बिट प्रोसेसरमा थप मेमोरी चाहिन्छ (यी ठूला सूचकहरूलाई कतै भण्डारण गर्नुपर्छ)। पोइन्टरहरू प्रोग्रामहरूको लगातार भाग हुनाले, यो भिन्नताले क्यासलाई बोझ गर्न सक्छ, जसले गर्दा सम्पूर्ण प्रणाली ढिलो चल्न सक्छ। त्यसोभए परिप्रेक्ष्यमा, हामी देख्न सक्छौं कि यदि हामीले भर्खरै प्रोसेसर आर्किटेक्चरलाई 64-बिटमा परिवर्तन गर्यौं भने, यसले वास्तवमा सम्पूर्ण प्रणालीलाई ढिलो गर्नेछ। त्यसैले यस कारकलाई अन्य ठाउँहरूमा थप अनुकूलनद्वारा सन्तुलित गर्नुपर्छ।

ARM64

A7, नयाँ iPhone 64s लाई पावर गर्ने 5-बिट प्रोसेसर, फराकिलो दर्ता भएको नियमित एआरएम प्रोसेसर मात्र होइन। ARM64 ले पुरानो, 32-बिट संस्करणमा प्रमुख सुधारहरू समावेश गर्दछ।

Apple A7 प्रोसेसर।

रजिस्ट्री

ARM64 ले 32-bit ARM भन्दा दोब्बर पूर्णांक दर्ताहरू राख्छ (रजिस्टरहरूको संख्या र चौडाइलाई भ्रमित नगर्न सावधान रहनुहोस् - हामीले "64-bit" खण्डमा चौडाइको बारेमा कुरा गर्यौं। त्यसैले ARM64 सँग दुई गुणा फराकिलो दर्ताहरू र दुई गुणा धेरै छन्। दर्ता)। 32-बिट एआरएममा 16 पूर्णांक दर्ताहरू छन्: एउटा प्रोग्राम काउन्टर (पीसी - हालको निर्देशनको संख्या समावेश गर्दछ), स्ट्याक पोइन्टर (प्रगतिमा रहेको प्रकार्यको लागि सूचक), लिङ्क दर्ता (अन्तमा फिर्ताको लागि सूचक। प्रकार्यको), र बाँकी 13 अनुप्रयोग प्रयोगको लागि हो। जे होस्, ARM64 सँग 32 पूर्णांक दर्ताहरू छन्, जसमा एउटा शून्य दर्ता, एउटा लिङ्क दर्ता, एउटा फ्रेम पोइन्टर (स्ट्याक पोइन्टर जस्तै), र एउटा भविष्यको लागि आरक्षित छ। यसले हामीलाई 28-बिट एआरएमको दोब्बर भन्दा बढी एप्लिकेसन प्रयोगको लागि 32 दर्ताहरू छोड्छ। एकै समयमा, ARM64 ले फ्लोटिंग-पोइन्ट नम्बर (FPU) दर्ताहरूको संख्यालाई 16 बाट 32 128-बिट दर्ताहरूमा दोब्बर बनायो।

तर दर्ताको संख्या किन यति महत्त्वपूर्ण छ? मेमोरी सामान्यतया CPU गणनाहरू भन्दा ढिलो हुन्छ र पढ्न/लेखन धेरै लामो समय लिन सक्छ। यसले छिटो प्रोसेसरलाई मेमोरीको लागि पर्खिरहनु पर्ने हुन्छ र हामीले प्रणालीको प्राकृतिक गति सीमालाई मार्नेछौं। प्रोसेसरहरूले यस बाधालाई बफरहरूको तहहरूबाट लुकाउने प्रयास गर्छन्, तर सबैभन्दा छिटो (L1) अझै पनि प्रोसेसरको गणना भन्दा ढिलो छ। यद्यपि, रेजिष्टरहरू प्रोसेसरमा सिधै मेमोरी सेलहरू हुन् र तिनीहरूको पढाइ/लेखन प्रोसेसरलाई ढिलो गर्न पर्याप्त छिटो छ। रेजिस्टरहरूको संख्या व्यावहारिक रूपमा प्रोसेसरको गणनाको लागि सबैभन्दा छिटो मेमोरीको मात्रा हो, जसले सम्पूर्ण प्रणालीको गतिलाई धेरै असर गर्छ।

एकै समयमा, यो गतिलाई कम्पाइलरबाट राम्रो अप्टिमाइजेसन समर्थन चाहिन्छ, ताकि भाषाले यी दर्ताहरू प्रयोग गर्न सक्छ र सामान्य अनुप्रयोग (ढिलो) मेमोरीमा सबै कुरा भण्डारण गर्नुपर्दैन।

निर्देशन सेट

ARM64 ले निर्देशन सेटमा पनि प्रमुख परिवर्तनहरू ल्याउँछ। एक निर्देशन सेट परमाणु अपरेसनहरूको सेट हो जुन एक प्रोसेसरले गर्न सक्छ (जस्तै 'ADD register1 register2' ले दुई दर्ताहरूमा संख्याहरू थप्छ)। व्यक्तिगत भाषाहरूमा उपलब्ध कार्यहरू यी निर्देशनहरू मिलेर बनेका छन्। थप जटिल प्रकार्यहरूले थप निर्देशनहरू कार्यान्वयन गर्नुपर्छ, त्यसैले तिनीहरू ढिलो हुन सक्छन्।

ARM64 मा नयाँ AES इन्क्रिप्सन, SHA-1 र SHA-256 ह्यास प्रकार्यहरूका लागि निर्देशनहरू छन्। त्यसैले जटिल कार्यान्वयनको सट्टा, भाषाले मात्र यो निर्देशनलाई कल गर्नेछ - जसले त्यस्ता प्रकार्यहरूको गणनामा ठूलो गति ल्याउनेछ र आशा छ कि अनुप्रयोगहरूमा सुरक्षा थपिनेछ। जस्तै नयाँ टच आईडीले यी निर्देशनहरू इन्क्रिप्सनमा पनि प्रयोग गर्दछ, वास्तविक गति र सुरक्षाको लागि अनुमति दिँदै (सैद्धान्तिक रूपमा, एक आक्रमणकर्ताले डाटा पहुँच गर्न प्रोसेसरलाई परिमार्जन गर्नुपर्नेछ - कम से कम यसको सानो आकार दिएर भन्नु अव्यावहारिक)।

32bit संग अनुकूलता

यो उल्लेख गर्न महत्त्वपूर्ण छ कि A7 इम्युलेसनको आवश्यकता बिना 32-बिट मोडमा पूर्ण रूपमा चल्न सक्छ। यसको मतलब नयाँ iPhone 5s ले 32-बिट एआरएममा कम्पाइल गरिएका एप्लिकेसनहरू बिना कुनै ढिलो चलाउन सक्छ। यद्यपि, त्यसपछि यसले नयाँ ARM64 प्रकार्यहरू प्रयोग गर्न सक्दैन, त्यसैले A7 को लागि मात्र विशेष निर्माण गर्न सँधै सार्थक हुन्छ, जुन धेरै छिटो चल्नु पर्छ।

रनटाइम परिवर्तनहरू

रनटाइम कोड हो जसले प्रोग्रामिङ भाषामा प्रकार्यहरू थप्छ, जुन अनुप्रयोग चलिरहेको बेला, अनुवाद पछिसम्म प्रयोग गर्न सक्षम हुन्छ। एप्पलले एप्लिकेसन कम्प्याटिबिलिटी कायम राख्न नपर्ने भएकोले (६४-बिट बाइनरी ३२-बिटमा चल्छ), उनीहरूले उद्देश्य-सी भाषामा केही थप सुधारहरू गर्न सक्नेछन्।

ती मध्ये एक तथाकथित छ ट्याग गरिएको सूचक (चिह्नित सूचक)। सामान्यतया, ती वस्तुहरूमा वस्तुहरू र संकेतकहरू मेमोरीको छुट्टै भागहरूमा भण्डारण गरिन्छ। यद्यपि, नयाँ सूचक प्रकारहरूले थोरै डाटा भएका कक्षाहरूलाई वस्तुहरू सिधै सूचकमा भण्डारण गर्न अनुमति दिन्छ। यो चरणले वस्तुको लागि सिधै मेमोरी आवंटित गर्ने आवश्यकतालाई हटाउँछ, केवल एउटा सूचक र यसको भित्रको वस्तु सिर्जना गर्नुहोस्। ट्याग गरिएका पोइन्टरहरू 64-बिट आर्किटेक्चरमा मात्र समर्थित छन् किनभने 32-बिट पोइन्टरमा पर्याप्त उपयोगी डाटा भण्डारण गर्न पर्याप्त ठाउँ छैन। तसर्थ, iOS, OS X को विपरीत, अझै यो सुविधा समर्थन गर्दैन। जे होस्, ARM64 को आगमन संग, यो परिवर्तन हुँदैछ, र iOS ले यस सम्बन्धमा OS X को साथ पनि समातेको छ।

यद्यपि पोइन्टरहरू 64 बिट लामो छन्, ARM64 मा केवल 33 बिटहरू सूचकको आफ्नै ठेगानाको लागि प्रयोग गरिन्छ। र यदि हामी बाँकी पोइन्टर बिटहरूलाई भरपर्दो रूपमा अनमास्क गर्न सक्षम छौं भने, हामी यो ठाउँलाई थप डाटा भण्डारण गर्न प्रयोग गर्न सक्छौं - उल्लेख गरिएको ट्याग गरिएको पोइन्टर्सको मामलामा। अवधारणात्मक रूपमा, यो उद्देश्य-C को इतिहासमा सबैभन्दा ठूलो परिवर्तनहरू मध्ये एक हो, यद्यपि यो बजार योग्य सुविधा होइन - त्यसैले धेरै प्रयोगकर्ताहरूले थाहा पाउने छैनन् कि एप्पलले उद्देश्य-सी कसरी अगाडि बढिरहेको छ।

यस्तो ट्याग गरिएको सूचकको बाँकी ठाउँमा भण्डारण गर्न सकिने उपयोगी डाटाको लागि, उद्देश्य-सी, उदाहरणका लागि, अब यसलाई तथाकथित भण्डारण गर्न प्रयोग गर्दैछ। सन्दर्भ गणना (सन्दर्भ संख्या)। पहिले, सन्दर्भ गणना मेमोरीमा फरक ठाउँमा भण्डार गरिएको थियो, यसको लागि तयार गरिएको ह्यास तालिकामा, तर यसले ठूलो संख्यामा alloc/dealloc/retain/release कलहरूको अवस्थामा सम्पूर्ण प्रणालीलाई ढिलो गर्न सक्छ। थ्रेड सुरक्षाको कारणले तालिका लक गरिएको थियो, त्यसैले दुई थ्रेडहरूमा दुई वस्तुहरूको सन्दर्भ गणना एकै समयमा परिवर्तन गर्न सकिँदैन। यद्यपि, यो मान नयाँ तथाकथित बाँकीमा सम्मिलित गरिएको छ isa सूचकहरू। यो अर्को अस्पष्ट, तर ठूलो लाभ र भविष्यमा त्वरण हो। यद्यपि, यो 32-बिट वास्तुकलामा कहिल्यै प्राप्त गर्न सकिँदैन।

सम्बद्ध वस्तुहरूको बारेमा जानकारी, वस्तु कमजोर रूपमा सन्दर्भ गरिएको छ कि छैन, वस्तुको लागि एक विनाशक उत्पन्न गर्न आवश्यक छ कि छैन, आदि, पनि वस्तुहरूमा पोइन्टर्सको बाँकी स्थानमा नयाँ घुसाइएको छ। यस जानकारीको लागि धन्यवाद, उद्देश्य-C रनटाइमले मौलिक रूपमा रनटाइमलाई गति दिन सक्षम छ, जुन प्रत्येक अनुप्रयोगको गतिमा प्रतिबिम्बित हुन्छ। परीक्षणबाट, यसको मतलब सबै मेमोरी व्यवस्थापन कलहरूको लगभग 40-50% गति हुन्छ। केवल 64-बिट सूचकहरूमा स्विच गरेर र यो नयाँ ठाउँ प्रयोग गरेर।

निष्कर्ष

यद्यपि प्रतियोगीहरूले 64-बिट आर्किटेक्चरमा सार्नु अनावश्यक छ भन्ने विचार फैलाउने प्रयास गर्नेछन्, तपाईले पहिले नै थाहा पाउनुहुनेछ कि यो केवल एक धेरै अनजान राय हो। यो सत्य हो कि तपाइँको भाषा वा अनुप्रयोगहरू अनुकूलन नगरी 64-बिटमा स्विच गर्नुको कुनै अर्थ छैन - यसले सम्पूर्ण प्रणालीलाई पनि ढिलो बनाउँछ। तर नयाँ A7 ले नयाँ निर्देशन सेटको साथ आधुनिक ARM64 प्रयोग गर्दछ, र Apple ले सम्पूर्ण Objective-C भाषालाई आधुनिकीकरण गर्न र नयाँ क्षमताहरूको फाइदा उठाउन समस्या उठाएको छ - त्यसैले प्रतिज्ञा गरिएको स्पीडअप।

यहाँ हामीले 64-बिट आर्किटेक्चर सही कदम अगाडि बढ्नुको कारणहरूको ठूलो संख्या उल्लेख गरेका छौं। यो "हुडमुनि" अर्को क्रान्ति हो, जसको लागि एप्पलले डिजाइन, प्रयोगकर्ता इन्टरफेस र समृद्ध इकोसिस्टमको साथ मात्र होइन, तर मुख्यतया बजारमा सबैभन्दा आधुनिक प्रविधिहरूसँग अगाडि रहन प्रयास गर्नेछ।

मुहान: mikeash.com
.