برنامه نویسی

با tla+ pt.1 سخت نمی میرید

مقدمه

این اولین پست وبلاگ در سری Concpectus دوره “مقدمه TLA+” توسط لسلی لامپورت است. این به طور مستقیم از ساختار دوره پیروی می کند و برای کسانی که دوره را طی می کنند ، مرجع خوبی خواهد بود زیرا اطلاعات و توضیحات اضافی را به مطالب دوره اضافه می کند. بنابراین تمام اعتبارات مربوط به لسلی لامپورت و دوره وی است که می توانید در وب سایت وی پیدا کنید.

TLA + مبتنی بر منطق زمانی است ، بنابراین ممکن است در مورد برنامه های LTL و CTL ما برای پست وبلاگ امنیتی قراردادهای هوشمند در مورد آن بخوانید.

Inrotuction برای آمدن+

tla+ یک زبان برای سطح بالایی (سطح طراحی ، بالاتر از کد) سیستم ها (ماژول ها ، الگوریتم ها و غیره) مدل سازی و از اجزای زیر تشکیل شده است:

  • TLC – چک کننده مدل ؛
  • TLAPS – سیستم اثبات TLA+ ؛
  • جعبه ابزار TLA+ – IDE.

TLA+ از سیستم برای مدل سازی استفاده می شود قطعات بحرانی سیستم های دیجیتالی ، انتزاع قطعات کمتر بحرانی و جزئیات اجرای سطح پایین. TLA+ برای طراحی همزمان و سیستم های توزیع شده به منظور کمک به یافتن و تصحیح خطاهای طراحی پیدا کردن آن با آزمایش و پیش از نوشتن هر خط کد.

opencomrtos یک سیستم عامل شبکه تجاری محور و در زمان واقعی است [3] که به شدت از TLA+ در طی فرآیند طراحی و توسعه استفاده می شود و تجربه خود را در کتاب آزادانه در دسترس به اشتراک می گذارد [4]بشر و نشان داد که استفاده از طراحی با قدردانی ، اندازه پایه کد و تعداد خطاها را کاهش می دهد و نمای مهندسی را به طور کلی تقویت می کند.

در نتیجه ، TLA+ برنامه نویسان و مهندسان را ارائه می دهد یک روش جدید برای تفکر این که آنها را به برنامه نویسان و مهندسان بهتر می کند حتی وقتی TLA+ مفید نیست. TLA+ مهندسان را مجبور می کند تا با انتزاعی تر فکر کنند.

انتزاع – روند از بین بردن جزئیات بی ربط و مهمترین بخش مهندسی. بدون آنها ، ما نمی توانیم سیستم های کوچک را طراحی و درک کنیم.

نمونه ای از استفاده از TLA+ در یک شرکت عظیم برای تأیید سیستمی که بسیاری از ما روزانه از آن استفاده می کنیم ، خدمات وب آمازون است. آنها از TLA+ برای تأیید صحت الگوریتم های توزیع شده و طراحی سیستم AWS استفاده می کنند [5]بشر مشکل الگوریتم ها و ارتباطات در سیستم های توزیع شده به خوبی در مقاله لسلی لامپورت “زمان ، ساعت و ترتیب وقایع در یک سیستم توزیع شده” شرح داده شده است. [6]بشر

یک طراحی سیستم به روشی رسمی بیان شده است مشخصاتبشر

مشخصات-مدل دقیق سطح بالا.

TLA+ مشخصات را تعریف می کند ، اما نمی تواند کد را تولید کند. اما این امر به معماری بسیار واضح تر کمک می کند و در بعضی موارد کد جمع و جور دقیق تر ، دقیق تر می نویسد. قادر است خواصی را که در یک اجرای فردی بیان می کند ، بررسی کند (یک سیستم در صورتی که هر اعدام آن را برآورده کند ، یک ملک را برآورده می کند).

انتزاع اساسی TLA+ به شرح زیر است: اجرای یک سیستم به عنوان دنباله ای از مراحل گسسته نشان داده می شود ، جایی که یک مرحله تغییر از یک حالت به حالت بعدی است:

  • گسسته-تکامل مداوم دنباله ای از وقایع گسسته است (رایانه یک سیستم مبتنی بر رویدادهای گسسته است).
  • دنباله – یک سیستم همزمان را می توان با یک برنامه متوالی شبیه سازی کرد.
  • مرحله – تغییر دولت ؛
  • حالت – واگذاری مقادیر به متغیرها.

رفتار – دنباله ای از حالت ها.

یک دستگاه دولتی در زمینه سیستم TLA+ توسط:

  1. همه حالتهای اولیه ممکن – [what the variables are] وت [their possible initial values]؛
  2. چه کشورهای بعدی می توانند از هر حالت معین پیروی کنند – رابطه ای بین ارزشهای آنها در وضعیت فعلی و ارزشهای احتمالی آنها در حالت بعدی.
  3. اگر وضعیت بعدی امکان پذیر نباشد ، متوقف می شود.

حالت کنترل – بیانیه بعدی که باید اجرا شود.

دستگاه های دولتی جزئیات اجرای سطح پایین را از بین می برند ، و TLA+ زبانی برای توصیف ماشین های دولتی است.

ماشین های دولتی در TLA+

TLA+ از ریاضی معمولی و ساده استفاده می کند. برای موارد زیر یک مثال دستگاه حالت تعریف شده را در نظر بگیرید C رمز

int i;
void main()
{
    i = someNumber();
    i = i + 1;
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

برای تبدیل این کد به تعریف دستگاه TLA+ حالت ، باید جریان اجرای این کد را به حالت ها (مجموعه متغیرها) بسته بندی کنیم. برای مثال داده شده ، نحوه تعریف آن واضح است i متغیر اما ما همچنین باید حالت کنترل را فوری کنیم. ما آن را صدا می کنیم pc مانند:

  • pc = "start" = i = someNumber();
  • pc = "middle" = i = i + 1;
  • pc = "done" = اعدام به پایان رسیده است.

برای این مثال فرض کنید someNumber() یک عدد صحیح را از [0:1000] فاصله

برای تعریف سیستم باید تعریف کنیم اولی حالت سیستم طرف دیگر وضعیت سیستم ممکن ، به عنوان یک فرمول بیان شده است که می تواند از وضعیت فعلی حاصل شود.

اینجا است فرمول از C کد بالا ، نه توالی اجرای.

  • فرمول حالت اولیه: (i = 0) /\ (pc = "start")
  • فرمول حالت بعدی:
\/    /\ pc = "start"
      /\ i' \in 0..1000
      /\ pc' = "middle"
\/    /\ pc = "middle"
      /\ i' = i + 1
      /\ pc' = "done"
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

از آنجا که این فرمول است ، به خصوصیات فرمول مانند رفت و آمد ، همبستگی و غیره احترام می گذارد.

فرمول های فرعی نیز می توانند در تعاریف خود استخراج شوند تا مشخصات بیشتری جمع کنند.

A == /\ pc = "start"
     /\ i' \in 0..1000
     /\ pc' = "middle"

B == /\ pc = "middle"
     /\ i' = i + 1
     /\ pc' = "done"

Next == A \/ B
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

از این مشخصات ، می بینیم که دو امکان وجود دارد ایالات بعدی که می تواند از ابتدا حاصل شود اولی دولت A آغاز اعدام را بیان می کند و یک شماره را به آن اختصاص می دهد i و حرکت به سمت بعدی pc حالت برابر است p'با B افزایش می دهد i و حرکت به حالت نهایی.

منابع و ابزارها

منابع یادگیری زیادی از TLA+وجود ندارد. با این حال ، مواردی وجود دارد که باید به آنها اشاره کنیم:

بررسی مدل

حال ، اجازه دهید در مورد موضوعات مربوط به TLC و مدل بررسی مدل صحبت کنیم.

TLC تمام رفتارهای احتمالی مجاز توسط مشخصات را محاسبه می کند. به طور دقیق تر ، TLC بررسی می کند مدل مشخصات

  • گزارش های TLC بن بست اگر اعدام متوقف شود وقتی قرار نبود ؛
  • گزارش های TLC خاتمه اگر اعدام وقتی قرار بود متوقف شود.

TLA+ اجازه نوشتن قضایای و اثبات رسمی آن قضیه ها را می دهد.
tlaps (TLA سیستم اثبات) ابزاری برای بررسی این اثبات است ، می تواند اثبات صحت الگوریتم ها را بررسی کند.

عملاً ، اصطلاح نشان (مشخصات) به معنای:

  1. مجموعه ماژول ها ، از جمله ماژول های وارداتی شامل .tla پرونده ها
  2. در TLA فرمول مجموعه رفتارهای مجاز سیستم یا الگوریتم را مشخص می کند.

مشخصات ممکن است حاوی چندین مدل باشد. این مدل به TLC می گوید چه کاری باید انجام دهد. در اینجا بخش هایی از مدل وجود دارد که باید صریحاً انتخاب شوند:

  • مشخصات رفتار چیست (مشخصات رفتار فرمول یا جفت فرمولهایی است که رفتارهای احتمالی سیستم یا الگوریتمی را که می خواهید بررسی کنید توصیف می کند).
  • چه TLC باید بررسی کند.
  • چه مقادیری برای جایگزینی پارامترهای ثابت.

مشخصات رفتار

دو روش برای نوشتن مشخصات رفتار وجود دارد:

  1. آغاز و بعدی

    • یک جفت فرمول که به ترتیب وضعیت اولیه و رابطه بعدی را مشخص می کنند.
  2. تک فرمول

    • یک فرمول زمانی واحد از فرم Init and [][Next]_{vars} and F، کجا
      • Init محمول اولیه است ؛
      • Next رابطه دولت بعدی است ؛
      • vars تپل متغیرها است.
      • وت F یک فرمول انصاف اختیاری است.

تنها راه برای نوشتن مشخصات رفتاری که شامل انصاف است ، با یک فرمول زمانی است ، در غیر این صورت ، یک مشخصات متغیرهایی نخواهد داشت و در این حالت ، TLC فرضیات را بررسی می کند و یک بیان ثابت را ارزیابی می کند.

سه نوع خاصیت از مشخصات رفتار وجود دارد که TLC می تواند بررسی کند:

  • بن بست – الف بن بست گفته می شود که در وضعیتی رخ می دهد که رابطه دولت بعدی اجازه نمی دهد دولت جانشین باشد.
  • متغیر -یک محمول حالت که در مورد همه حالت های قابل دسترسی صادق است-یعنی حالت هایی که می توانند در یک رفتار مجاز توسط مشخصات رفتار رخ دهند.
  • خواص -TLC می تواند بررسی کند که آیا مشخصات رفتار یک خاصیت زمانی را برآورده می کند (دلالت می کند) ، که به عنوان یک فرمول-logic موقتی بیان شده است یا خیر.

مدل

ابتدایی ترین بخش یک مدل مجموعه ای از تکالیف مقادیر به ثابت اعلام شده است.

تکلیف عادی

می توان مقدار ثابت را بر روی هر عبارت TLA+ ثابت که فقط نمادهای تعریف شده در مشخصات را شامل می شود ، تنظیم کرد. این عبارت حتی می تواند شامل ثابت های اعلام شده باشد ، تا زمانی که مقدار اختصاص یافته به ثابت به آن بستگی ندارد (وابستگی های دایره ای فرار). یک مدل باید مقادیر تمام ثابت های اعلام شده را مشخص کند.

مقدار مدل

مقدار مدل یک مقدار نامشخص است که TLC می داند برای هر مقداری که می توانید در TLA+بیان کنید نابرابر است. می توانید مجموعه را جایگزین کنید {p1, p2, p3\} از سه مقدار مدل برای Procبشر اگر به اشتباه عبارتی بنویسید مانند p+1 جایی که ارزش p یک فرآیند است ، TLC هنگام تلاش برای ارزیابی این عبارت ، خطایی را گزارش می کند زیرا می داند که یک فرآیند یک مقدار مدل است و بنابراین یک عدد نیست. یک دلیل مهم برای جایگزینی مجموعه ای از مقادیر مدل برای Proc این است که اجازه دهید TLC از تقارن استفاده کند.

مثال: NotANat == CHOOSE n : n \notin Nat

تعریف می کند NotANat یک مقدار دلخواه بودن که یک عدد طبیعی نیست. TLC نمی تواند این تعریف را ارزیابی کند زیرا نمی تواند بی حد و مرز را ارزیابی کند CHOOSE بیان برای اجازه دادن به TLC برای رسیدگی به مشخصات ، باید مقدار مدل را جایگزین کنید NotANatبشر بهترین مقدار مدل برای جایگزینی آن یکی از آنها نامگذاری شده است NotANatبشر این کار با تعریف نادیده گرفتن انجام می شود. جعبه ابزار TLA+ در صورت ایجاد یک مدل در صورت تعریفی که دارای نحو دقیق در بالا یا نحو باشد ، ورود مناسب را در آن بخش ایجاد می کند:
NotANat == CHOOSE n: ~(n \in Nat)، کجا Nat می تواند هر بیان باشد ، و NotANat وت n می تواند هر شناسه ای باشد.

مقادیر مدل را می توان به شرح زیر تایپ کرد: یک مقدار مدل دارای نوع است T اگر و فقط اگر نام آن با دو شخصیت شروع شود T_ بشر

مقدار مدل اعلام شده در مدل می تواند به عنوان یک مقدار معمولی در هر عبارتی که بخشی از مشخصات مدل است استفاده شود.

تقارن

مشخصات سیستم حافظه حاوی ثابت اعلام شده را در نظر بگیرید Val این نشان دهنده مجموعه مقادیر احتمالی یک ثبت حافظه است. مجموعه Val مقادیر احتمالاً a است مجموعه برای مشخصات رفتار سیستم حافظه ، به این معنی که اجازه دادن عناصر در مجموعه مقادیر تغییر نمی کند که آیا یک رفتار آن مشخصات رفتار را برآورده می کند یا خیر. TLC می تواند از این امر برای سرعت بخشیدن به بررسی خود استفاده کند. فرض کنید ما یک مجموعه را جایگزین می کنیم {v1, v2, v3} از مقادیر مدل برای Valبشر ما می توانیم از مجموعه گزینه ای برای اعلام این مجموعه از مقادیر مدل به عنوان مجموعه تقارن از مشخصات رفتار است. این باعث می شود تعداد حالتهای قابل دستیابی که TLC باید تا حداکثر بررسی کند ، کاهش دهد 3!، یا 6بشر

می توانید بیش از یک مجموعه از مقادیر مدل را به عنوان یک مجموعه تقارن اعلام کنید. با این حال ، اتحاد همه مجموعه های تقارن نمی تواند حاوی دو مقدار مدل تایپ شده با انواع مختلف باشد.

TLC بررسی نمی کند که آیا مجموعه ای که شما اعلام می کنید یک مجموعه تقارن است ، واقعاً یکی است. اگر یک مجموعه را به عنوان یک مجموعه تقارن اعلام کنید و اینگونه نیست ، پس TLC می تواند خطایی را پیدا کند که در غیر این صورت پیدا می کند. یک عبارت است متقارن برای یک مجموعه S اگر و فقط در صورت تعویض هر دو مقدار S مقدار بیان را تغییر نمی دهد. بیان {{v1, v2}, {v1, v3}, {v2, v3}} متقارن برای مجموعه است {v1, v2, v3} – به عنوان مثال ، تعویض v1 وت v3 در این بیان تولید می شود {{v3, v2}, {v3, v1}, {v2, v1}}، که برابر با بیان اصلی است. شما باید یک مجموعه را اعلام کنید S مقادیر مدل به عنوان یک تقارن فقط در صورتی که مشخصات و کلیه خصوصیاتی که بررسی می کنید متقارن است S پس از تعویض ثابت ها و اپراتورهای تعریف شده مشخص شده توسط مدل انجام می شود. به عنوان مثال ، شما نباید اعلام کنید {v1, v2, v3} در صورت جایگزینی مدل ، یک مجموعه تقارن باشد v1 برای برخی ثابت تنها اپراتور TLA+ که می تواند هنگام استفاده از یک بیان متقارن یک عبارت غیر متقارن ایجاد کند CHOOSEبشر به عنوان مثال ، عبارت CHOOSE x \in {v1, v2, v3} : TRUE متقارن نیست {v1, v2, v3}بشر

از مجموعه های تقارن نباید هنگام بررسی خصوصیات زنده بودن استفاده شود. انجام این کار می تواند باعث شود TLC در یافتن خطا ، یا گزارش خطاهای وجود ندارد.

سخت مرگ

Die Hard یک فیلم اکشن از سال 1988 است. در این فیلم ، صحنه ای وجود دارد که قهرمانان ما برای غیرفعال کردن یک بمب باید با دو کوزه مشکل حل کنند. مشکل اندازه گیری 4 گالن آب با استفاده از کوزه های 3 و 5 گالن است.

برای طرح ، جستجو کنید: “مشکل کوزه های سخت” در YouTube یا به سادگی اینجا را کلیک کنید. ما این مشکل را با استفاده از TLA+حل خواهیم کرد.

https://www.youtube.com/watch؟v=2vdf6nasmie

اول ، ما باید رفتار را بنویسیم. اجازه دهید مقادیر از small وت big تعدادی گالن را در هر کوزه نشان دهید.


[small0 big0 ][small3 big0 ][small0 big3 ][small3 big3 ]بشربشربشر

\ شروع {bmatrix} کوچک و 0 \ big & 0 \ \ end {bmatrix} \ rightarrow \ start {bmatrix} کوچک و 3 \ big & 0 \ end {bmatrix} \ rightarrow \ {bmatrix} small & 0 \ big بزرگ & 3 \ \ end {bmatrix} \ RightArrow \ شروع {bmatrix} کوچک و 3 \ big & 3 \ \ end {bmatrix} \ rightarrow …

پر کردن کوزه یک مرحله واحد است. هیچ مرحله میانی وجود ندارد.

مشخصات واقعی برای از بین بردن انواع خطاها نوشته شده است.

TLA+ هیچ نوع اعلامیه ای ندارد. با این حال ، تعریف فرمولی که صحت نوع را اثبات می کند ، مهم است. این به درک مشخصات کمک می کند و TLC می تواند با بررسی اینکه آیا چنین فرمولی همیشه است ، انواع را بررسی کنید trueبشر

TypeOK == /\ small \in 0..3
          /\ big   \in 0..5
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در اینجا ، ما آن را تعریف می کنیم small یک عدد صحیح در محدوده است [0:3] وت big یک عدد صحیح در محدوده است [0:5]بشر اما این تعریف بخشی از مشخصات نیست.

در فرمول حالت اولیه Init == small = 0 /\ big = 0 وضعیت اولیه سیستم را تعریف می کند.
در فرمول حالت بعدی نقل و انتقالات احتمالی را از ایالت به ایالت تعریف می کند و معمولاً به صورت نوشته می شود F_1 or F_2 or ... or F_n، جایی که هر فرمول F_i نوع دیگری از گام را امکان پذیر می کند.

مشکل ما 3 نوع مرحله دارد:

  • یک کوزه را پر کنید
  • یک کوزه خالی ؛
  • از یک کوزه به دیگری بریزید.

ما مشخصات را به شرح زیر تعریف می کنیم:

Next == \/ FillSmall  \* fill the small jug
        \/ FillBig    \* fill the big jug
        \/ EmptySmall \* empty the small jug
        \/ EmptyBig   \* empty the big jug
        \/ SmallToBig \* pour water from small jug in the big jug
        \/ BigToSmall \* pour water from the big jug in the small jug
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نام تعاریف (مانند FillSmall، و غیره) باید قبل از استفاده تعریف شود (پیش از تعریف Next).

FillSmall == /\ small' = 3
             /\ big' = big
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

هنگام تعریف فرمول ها ، ما باید در نظر داشته باشیم که سیستم به عنوان یک کل و در مورد مراحل به عنوان انتقال از یک حالت به حالت دیگر فکر کنیم. در مورد ما ، این بدان معنی است که ما نمی توانیم تعریف کنیم FillSmall به عنوان FillSmall == small' = 3 از آنجا که این فرمول بخشی از قسمت دوم وضعیت برنامه را ندارد (big). به عبارت دیگر ، این فرمول تبدیل می شود true اگر small' برابر است 3 وت big' برابر با هر چیزی است. اما این درست نیست. در حقیقت ، اگر کوزه کوچک را پر کنیم ، کوزه بزرگ را در حالت نگه می داریم و بدون تغییر است.

اکنون ، ما تعریف می کنیم SmallToBigبشر دو مورد احتمالی وجود دارد که باید در نظر بگیریم:

SmallToBig == /\ IF big + small <= 5
                  THEN /* There is room -> empty small.
                  ELSE /* There is no room -> fill big.
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

SmallToBig == /\ IF big + small <= 5
                  THEN /\ big' = big + small
                       /\ small' = 0
                  ELSE /\ big' = 5
                       /\ small' = small - (5 - big)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

------------------------------ MODULE DieHard ------------------------------
EXTENDS Integers

VARIABLES small, big

TypeOK == /\ small \in 0..3
          /\ big \in 0..5

Init == /\ big = 0
        /\ small = 0

FillSmall == /\ small' = 3
             /\ big' = big

FillBig == /\ big' = 5
           /\ small' = small

EmptySmall == /\ small' = 0
              /\ big' = big

EmptyBig == /\ big' = 0
            /\ small' = small

SmallToBig == IF big + small =< 5
                THEN /\ big' = big + small
                     /\ small' = 0
                ELSE /\ big' = 5
                     /\ small' = small - (5 - big)

BigToSmall == IF big + small =< 3
               THEN /\ big' = 0
                    /\ small' = big + small
               ELSE /\ big' = big - (3 - small)
                    /\ small' = 3

Next == \/ FillSmall
        \/ FillBig
        \/ EmptySmall
        \/ EmptyBig
        \/ SmallToBig
        \/ BigToSmall

=============================================================================

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اگر مدلی را برای این مشخصات ایجاد و اجرا کنیم ، هیچ خطایی نخواهیم دید و این خوب است. با این حال ، هیچ ثابت خاص از مشخصات ما را بررسی نمی کند.

ثابت فرمولی است true در هر حالت قابل دستیابی

ما تعریف کرده ایم TypeOK به عنوان یک نوع تعریف برای small وت big، بنابراین ما می توانیم این فرمول را به عنوان یک ثابت اضافه کنیم تا بررسی کنیم که این ثابت شکسته نشده است.

Typeok Funariant را اضافه کنید

اگر اکنون آن را اجرا کنیم ، هنوز هیچ خطایی نمی بینیم small وت big احترام به انواع آنها در هر حالت قابل دستیابی.

اکنون می توانیم حل کنیم مودب مشکل ریختن big دقیقاً با 4 گالن آب. برای انجام آن ، ما یک ثابت جدید اضافه می کنیم big /= 4 به بخش متغیرها.

Bigneg 4 را ثابت اضافه کنید

در اینجا ، این ثابت به عنوان یک نمونه متقابل عمل می کند. ثابت یک فرمول است که به آن تبدیل می شود true در هر حالت قابل دسترسی ما باید یک حالت (در واقع یک دنباله حالت) پیدا کنیم big = 4، بنابراین ما این را توسط /= نمادی که برابر است neqبشر با استفاده از این فرمول جدید ، اگر مدل را اجرا کنیم ، خطایی پیدا می کند (وضعیتی که یک متغیر شکسته است) و دنباله ای از حالت هایی را نشان می دهد که منجر به این حالت می شود.

نتیجه اجرا

اکنون می توانیم مراحل دقیقی را که برای حل مشکل لازم است انجام دهیم و قهرمانان ما بتوانند حرکت کنند.

انتشار اصلی

منابع

  • لسلی لامپورت. یادگیری tla +
  • برنامه های LTL و CTL برای امنیت قراردادهای هوشمند
  • OpenComrtos
  • اریک ورهولست. توسعه رسمی RTO های محور شبکه. ژانویه 2011. 10،1007/978-1-4419-9736-4. ISBN: 978-1-4419-9735-7
  • Chris Newcombe ، Tim Rath ، Fan Zhang ، Bogdan Munteanu ، Marc Brooker و Michael Deardeuff.How Services Web Amazon از روشهای رسمی استفاده می کند. 2015 ، ارتباطات ACM
  • لسلی لامپورت. زمان ، ساعت و ترتیب وقایع در یک سیستم توزیع شده. 1978. ماساچوست همکاران رایانه ، شرکت

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا