Програмна транзакційна пам'ять (англ.software transactional memory, STM) — це механізм управління паралелізмом, що є аналогічним механізму транзакційбаз даних, що використовується для управління доступом до спільно використовуваноїпам'яті в паралельних обчисленнях. Це альтернатива для синхронізації на основі блокування. Транзакція в цьому контексті є частиною коду, який виконує зчитування і запис в поділювану (спільно використовувану) пам'ять. Зчитування і запис логічно відбувається в одиничний момент часу, а проміжні стани невидимі для інших (результативних) транзакцій. Ідея забезпечення транзакцій апаратною підтримкою зародилася в 1986 році в роботі і патенті Тома Найта[en][1]. Ідея отримала публічне висвітлення завдяки Морісу Герлігі[en] і Еліоту Моссу[en][2]. У 1995 році Нір Шавіт[en] і Ден Тойту доповнили цю ідею до програмної транзакційної пам'яті (ЅТМ)[3]. STM як і раніше знаходиться в центрі інтенсивних досліджень[4]; зростає її підтримка для практичних реалізацій.
Характеристика
На відміну від методів блокування, що використовуються в більшості сучасних багатопоточних додатків, STM дуже оптимістична: потік завершує зміни поділюваної пам'яті без урахування того, що роблять інші потоки, і реєструє будь-яке зчитування і запис в лог. Замість того, щоб використовувати записувальний пристрій для перевірки, чи не має він негативного впливу на інші діючі операції, відповідальність передається зчитувальному пристрою, який після завершення повної транзакції перевіряє, чи не зробили інші потоки паралельно зміни в пам'яті, до якої був отриманий доступ в минулому. Ця остання операція, в якій перевіряються зміни транзакцій і яка, якщо перевірка успішна, залишається незмінною, називається фіксацією. Транзакція може припинитися в будь-який час, в результаті чого всі останні зміни будуть скасовані. Якщо транзакція не може бути здійснена через конфлікти змін, вона переривається і повторно виконується спочатку до тих пір, поки результативно не завершиться.
Перевага такого оптимістичного підходу зростає завдяки паралелізму: жодному потоку не потрібно чекати отримання доступу до ресурсу, і різні потоки можуть одночасно і безпечно модифікувати непересічні частини структури даних, які захищалися б одним локом.
Однак на практиці ЅТМ-системи програють в продуктивності дрібномодульним системам, заснованим на блокуваннях, на невеликій кількості процесорів (від 1 до 4 в залежності від програми). Це пов'язано в першу чергу з накладними витратами на підтримку лога і з часом, що витрачається на здійснення транзакцій. Але навіть у цьому випадку продуктивність відрізняється не більш, ніж в 2 рази[5]. Прихильники STM вважають, що такі втрати виправдані концептуальними перевагами ЅТМ.
Теоретично, часова і просторова складності виконання n паралельних транзакцій в гіршому випадку - O(n). Фактичні витрати залежать від реалізації (можна скасувати транзакцію на ранній стадії, щоб уникнути накладних витрат), але завжди будуть випадки, хоч і рідкі, коли lock-алгоритми будуть мати кращу часову складність, ніж програмна транзакційна пам'ять.
Концептуальні переваги і недоліки
Також STM значно спрощує концептуальне розуміння багатопотокових програм і допомагає їх зручному супроводу, злагоджено працюючи з існуючими високорівневими абстракціями, такими як об'єкти і модулі.
Lock-програмування містить ряд відомих проблем, які часто виникають на практиці:
Важливо пам'ятати про операції, які перетинаються, і часткових операціях в розділених і непов'язаних з першого погляду частинах коду — завдання дуже важке і в ньому можна зробити багато помилок.
Воно вимагає від програмістів освоювати політику блокування, щоб уникнути тупиків (Deadlock) та інших проблем управління процесами. Така політика часто приводиться у виконання довільним чином і буває помилковою, і коли виникають проблеми, їх важко відновити і налагодити.
Це може призвести до інверсії пріоритетів — явище, при якому високопріоритетний потік змушений очікувати низькопріоритетний потік, що має винятковий доступ до необхідного ресурсу.
Навпаки, концепція транзакційної пам'яті набагато простіша, тому що кожна транзакція може розглядатися окремо, як однопотокове обчислення. Тупики або запобігаються повністю, або дозволяються зовнішньою програмою управління транзакціями; програмісту навряд чи потрібно турбуватися про це. Інверсія пріоритетів може бути проблемою, але пріоритетні транзакції можуть перервати конфліктні низькопріоритетні операції, які ще не були здійснені.
З іншого боку, необхідність переривання невдалих транзакцій також накладає обмеження на їх поведінку: вони не можуть виконувати будь-які операції, які не можуть бути скасовані, у тому числі більшість вводів-виводів. Такі обмеження, як правило, на практиці долаються шляхом створення буферів, які ставлять в чергу незворотні операції і виконують їх через деякий час поза будь-якою транзакцією. У мові Хаскель це обмеження приводиться у виконання системою типів під час компіляції.
Компонувальні операції
У 2005 році Тім Харріс, Саймон Марлоу, Саймон Пейтон Джонс і Моріс Герлігі[en] описали STM-систему, створену на Хаскелі, який реалізує паралелізм. Ця система дозволяє довільним атомарним операціями компонуватися в більш великі атомарні операції — корисна концепція, неможлива при lock-програмуванні. За словами авторів:
«Мабуть, найфундаментальніший недолік у тому, що lock-програми не можуть компонувати: коректні фрагменти можуть не спрацювати, пропри скомпонованість. Розглянемо, наприклад, геш-таблицю з потокобезпечними операціями вставлення і видалення. Тепер припустимо, що ми хочемо видалити один елемент з таблиці t1 і вставити його в таблицю t2, але проміжний стан (у якому жодна таблиця не містить цього елемента) не має бути видимим для інших потоків. Поки конструктор геш-таблиці не передбачить цієї потреби, просто не існує способу задовольнити цю вимогу. Загалом, операції, коректні поодинці (вставлення, видалення), не можна скомпонувати в більші коректні операції»
— Tim Harris et al., "Composable Memory Transactions", Section 2: Background, pg.2[6]
З STM ця проблема вирішується просто: просте об'єднання двох операцій в одній транзакції перетворює операцію яка компонується в атомарну. Єдиним каменем спотикання є те, що для абонента, який не знає деталей реалізації методів компонування, неясно коли вони повинні спробувати повторно виконати транзакцію, якщо вона не проводиться. У відповідь на це, автори запропонували команду повторної спроби, яка використовує журнал транзакцій (log-файл), що генерується невдалою транзакцією для визначення нею ділянки пам'яті яка зчитується. Тоді вона знову автоматично запускає дану транзакцію, коли одна з цих ділянок пам'яті змінюється. Це ґрунтується на логіці, що транзакція не буде вести себе інакше, поки хоча б одне таке значення не змінилося.
Автори також запропонували механізм побудови альтернатив (функція абоІнакше — orElse). Він запускає одну транзакцію і, якщо транзакція робить повторну спробу, запускає другу. Якщо те ж відбувається і з другою, механізм запускає їх обидві знову, поки не відбудуться суттєві зміни. Дана функція, зіставлювана з функцією мережевого стандарту POSIX select(), дозволяє тому, хто викликає її, очікувати будь-яке з ряду подій одночасно. Вона також спрощує програмування інтерфейсів, наприклад, шляхом надання простого механізму конвертації між блокуючими і неблокуючими операціями.
Ця схема була реалізована в компіляторі мови ХаскельGHC.
Пропонована допоміжна мова
Концептуальна простота ЅТМ-систем дозволяє програмісту легко працювати з ними, використовуючи відносно простий синтаксис мови. У своїй книзі «Допоміжна мова для легких транзакцій» Тім Харріс і Кейр Фрейзер запропонували ідею використання класичної умовної критичної області (CCR) для подання транзакцій. У своїй найпростішій формі це всього лише «атомарний блок», ділянка коду, яка послідовно виконується в одиничний момент часу:
По досягненні кінця блоку транзакція здійснюється, якщо це можливо, інакше припиняється і повторюється. Умовні критичні області також допускають умову збереження, що дозволяє транзакції очікувати виконання, поки діє її завдання.
atomic (queueSize > 0) {
remove item from queue and use it
}
Якщо умова не виконується, програма управління (менеджер) транзакцій буде чекати, поки не прийде інша, яка вплине на умову перш, ніж повторить спробу. Такий вільний зв'язок між виробниками і споживачами удосконалює модульний принцип порівняно з чітким сигналізуванням між потоками. Книга «Компонована операція звернення до пам'яті» пішла далі зі своєю командою повторної спроби (див. вище), яка може в будь-який час перервати транзакцію і чекати, поки не відбудеться яка-небудь зміна значення, раніше зчитаного цією операцією, перед повторенням спроби. Приклад:
atomic {
if (queueSize > 0) {
remove item from queue and use it
}
else {
retry
}
}
Ця здатність динамічного повторення в кінці транзакції спрощує модель програмування і відкриває нові можливості.
Однією з проблем є поведінка винятків, коли вони поширюються за межі транзакцій. У праці "Компонована операція звернення до пам'яті" автори вирішили, що це має перервати транзакцію, так як виключення зазвичай вказують на несподівані помилки в мові Хаскель (з паралелізмом), але те, що цей виняток може зберігати надану інформацію та зчитувати її під час транзакції в цілях діагностики. Вони підкреслюють, що ймовірні також інші проектні рішення при інших параметрах.
Транзакційне блокування
ЅТМ може бути реалізована як алгоритм без блокувань і з блокуваннями. Є два типи блокування.
Блокування при зіткненні операцій (Еналса, Саха і Харріса), при якому записи в пам'ять здійснюються, спочатку тимчасово блокуючи цю область пам'яті, безпосередньо записуючи значення і реєструючи їх у журналі реєстрації відкатів операцій.
Блокування при здійсненні транзакції, яке блокує комірки пам'яті тільки під час вчинення фази.
Схема здійснення транзакції, названа «Транзакційне блокування-2» і реалізована Дайсом, Шалевим і Шавітом, використовує глобальний час. Кожна транзакція починається із зчитування поточного значення часу і зберігає його для зчитування. Потім при кожному зчитуванні і записі версія певної області пам'яті порівнюється з версією для читання, і, якщо воно більше, то транзакція скасовується. Це гарантує, що код виконається на відповідній копії пам'яті. Під час вчинення всі області читання заблоковані, і значення даної версії всіх областей пам'яті для запису і читання повторно перевіряються. Нарешті, глобальний час збільшується, нові значення запису з журналу записуються назад в пам'ять із зазначенням нової версії часу.
Все більш популярним методом управління транзакційними конфліктами в транзакційної пам'яті, особливо в ЅТМ, є порядок вчинення[en] (ПВ). Він використовується для досягнення впорядкованості безблоковувано (тобто без блокування при конфлікті операцій і тільки з блокуванням при здійсненні транзакції) за допомогою зміни порядку здійснення транзакцій (наприклад, Рамадан і співавтори, 2009, і Жанг і співавтори, 2006). Впорядкованість є основою для коректного стану транзакційної пам'яті (при виконанні паралельних транзакцій). Вже були опубліковані десятки статей та патентів про STM із застосуванням «порядку вчинення».
«Жанг і співавтори, 2006» — патент США, який несе назву «Програмне забезпечення порядку здійснення транзакцій і управління конфліктами» (який посилається на патент США 5701480 про порядок вчинення).
Розробляються різні технології та методи для застосування порядку вчинення в системі програмної транзакційної пам'яті.
Система програмної транзакційної пам'яті забезпечена функцією, щоб зумовлений порядок вчинення був застосовний для
безлічі операцій. Визначений порядок вчинення використовується під час виконання, щоб встановити порядок, в якому
здійснювати транзакції в системі програмної транзакційної пам'яті. Процес управління конфліктами викликається, коли відбувається
конфлікт між першою і другою транзакціями. Визначений порядок вчинення використовується в процесі управління конфліктами,
щоб визначити, яка з транзакцій повинна виграти конфлікт і отримати дозвіл на продовження.
З порядком здійснення бажана властивість впорядкованості відбувається шляхом здійснення транзакцій тільки в хронологічному порядку, сумісному з порядком по пріоритету (як визначено хронологічним порядком операцій в конфліктах)
Реалізації
SRTM було реалізовано (різної якості і стабільності) на різних мовах програмування. Таких, як:
TinySTM a time-based STM і Tanger to integrate STMs з C and C++ через LLVM.
Lightweight Transaction Library (LibLTX), реалізація для C, (автор Robert Ennals) основний акцент зроблено на ефективність. Реалізація ґрунтується на його статтях «Software Transactional Memory Should Not Be Obstruction-Free» і «Cache Sensitive Software Transactional Memory».
LibCMT, реалізація з відкритим кодом для C, зроблена Duilio Protti і заснована на «Composable Memory Transactions». Ця реалізація також включає C# binding.
TARIFA є прототипом, який дає «atomic» ключове слово в C/C++.
Intel STM Compiler Prototype Edition реалізація STM для C/C++ безпосередньо в компіляторі (Intel Compiler) для Linux або Windows, генеруючому 32 або 64 бітний код для процесорів Intel і AMD. Реалізує «атомне» ключове слово, а також надає способи декорації визначення функцій (declspec) для управління / дозволу на використання в «атомних» секціях.
stmmap реалізація STM в C, заснована на поділюваній пам'яті. Призначена для спільного використання пам'яті між потоками і / або процесами (а не тільки між потоками всередині процесу) з семантикою транзакцій. В C++ реалізована багатопотокова версія даного аллокатора.
CTL реалізація STM в C, заснована на TL2, але з багатьма розширеннями і оптимізаціями.
RSTM University of Rochester STM написана командою вчених під керівництвом Michael L. Scott.
G++ 4.7 вже підтримує STM для C/C++ прямо в компіляторі. Ця можливість досі числиться експериментальною, але забезпечує необхідну для тестування функціональність.
XSTM є відкритим вихідним кодом для Java і .NET з розширюваною архітектурою. XSTM реалізований у вигляді бібліотеки, а також надає розширення для повідомлення про зміни, наполегливості і реплікації об'єктів.
Deuce Середовище розробки для Java Software Transactional Memory, використовує байт-код.
Multiverse Java 1.6+ заснована на Software Transactional Memory (STM). Ця реалізація, використовує Multi Version Concurrency Control (MVCC) як паралельний механізм контролю.
coThreads і одночасно бібліотека програмування OCaml, пропонує STM (originally STMLib) як модуль. Як і будь-який інший компонент у цій бібліотеці, STM модуль може бути використаний разом з VM-level threads, системою потоків і процесів.
Durus проста, але повна і швидка, STM реалізація для Python, що дозволяє використовувати STM усередині одного процесу і STM в server/multiple клієнт архітектурі. На додаток до вбудованої пам'яті формату існують і інші, наприклад Berkeley DB доступна тут.
pypy-stm — надбудова над PyPy c робочої реалізацією інтерпретатора Python 2.7, підтримує одночасне виконання ниток існуючих багатопоточних додатків на різних ядрах CPU.
atomic (queueSize > 0) {
remove item from queue and use it
}
Якщо умова не виконується, програма управління (менеджер) транзакцій буде чекати, поки не прийде інша, яка вплине на умову перш, ніж повторить спробу. Такий вільний зв'язок між виробниками і споживачами удосконалює модульний принцип порівняно з чітким сигналізуванням між потоками. Книга «Компонована операція звернення до пам'яті» пішла далі зі своєю командою повторної спроби (див. вище), яка може в будь-який час перервати транзакцію і чекати, поки не відбудеться яка-небудь зміна значення, раніше зчитаного цією операцією, перед повторенням спроби. Приклад:
ЅТМ може бути реалізована як алгоритм без блокувань і з блокуваннями. Є два типи блокування.
Блокування при зіткненні операцій (Еналса, Саха і Харріса), при якому записи в пам'ять здійснюються, спочатку тимчасово блокуючи цю область пам'яті, безпосередньо записуючи значення і реєструючи їх у журналі реєстрації відкатів операцій.
Блокування при здійсненні транзакції, яке блокує комірки пам'яті тільки під час вчинення фази.
З порядком здійснення бажана властивість впорядкованості відбувається шляхом здійснення транзакцій тільки в хронологічному порядку, сумісному з порядком по пріоритету (як визначено хронологічним порядком операцій в конфліктах)
Smalltalk
GemStone/S [1] Transactional Memory Object Server для Smalltalk.
↑Maurice Herlihy and J. Eliot B. Moss. Transactional memory: architectural support for lock-free data structures. Proceedings of the 20th annual international symposium on Computer architecture (ISCA '93). Volume 21, Issue 2, May 1993.
↑Nir Shavit and Dan Touitou. Software transactional memory. Distributed Computing. Volume 10, Number 2. February 1997.
Nils Liedholm Informasi pribadiTanggal lahir (1922-10-08)8 Oktober 1922Tempat lahir Valdemarsvik, SwediaTanggal meninggal 5 November 2007(2007-11-05) (umur 85)Tempat meninggal Cuccaro Monferrato, ItaliaTinggi 1,83 m (6 ft 0 in)Posisi bermain Gelandang serangKarier senior*Tahun Tim Tampil (Gol)1938–1943 Valdemarsviks IF 1943–1946 IK Sleipner 60 (24)1946–1949 IFK Norrköping 48 (22)1949–1961 AC Milan 359 (81)Tim nasional1947–1958 Swedia 23 (12)Kepelatihan1961–19...
Ivan Petrovich KorchaginKorchagin antara 1943 dan 1944Lahir24 Agustus [K.J.: 12 Agustus] 1898Desa Byltsino, volost Kozhanskoy, uyezd Gorokhovetsky, kegubernuran Vladimir, Kekaisaran RusiaMeninggal24 Juli 1951(1951-07-24) (umur 52)Moskwa, Uni SovietPengabdian Kekaisaran Rusia SFSR Rusia Uni Soviet Dinas/cabang Angkatan Darat Kekaisaran Rusia Tentara Merah (kemudian Angkatan Darat Uni Soviet) Lama dinas 1914–1918 1919–1937 1940–1951 PangkatLetnan jenderalPerang/pertempuran Peran...
كأس اليونان 1991–92 تفاصيل الموسم كأس اليونان النسخة 50 البلد اليونان المنظم الاتحاد الإغريقي لكرة القدم البطل نادي أولمبياكوس عدد المشاركين 72 كأس اليونان 1990–91 كأس اليونان 1992–93 تعديل مصدري - تعديل كأس اليونان 1991–92 (باليونانية: Κύπελλο Ελλάδος...
В Википедии есть статьи о других людях с фамилией Розенталь.Дитмар Эльяшевич Розентальнем. Dietmar Rosenthalпольск. Ditmar Rozental Дата рождения 24 февраля 1900(1900-02-24) Место рождения Лодзь, Петроковская губерния, Российская империя Дата смерти 29 июля 1994(1994-07-29)[1] (94 года) Место смерт...
Cet article est une ébauche concernant une université américaine et Hawaï. Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants. Université d'Hawaï à MānoaHistoireFondation 1907StatutType Université publiqueDevise Ma luna a'e o na lahui a pau ke ola o ke kanaka., Above all nations is humanity.Membre de Asociación de Universidades de la Cuenca del Pacífico, Association of Public and Land-grant Universities (...
Mitra Waterboom & Toys Wahana di Mitra Waterboom & Toys Informasi Lokasi Jepara. Negara indonesia Pengelola CV. Mitra Waterboom & Toys Awal pembangunan 2011 Penyelesaian 2012 Jenis objek wisata Wisata Air Gaya Alam Fasilitas • Waterboom • Kolam Renang • Kid's Pool • Mandi Bola • Perosotan • Air Mancur • dll Mitra Waterboom & Toys adalah tempat wisata yang terdapat di Kabupaten Jepara yang terdapat di Desa Bangsri. Mitra ...
Poem by Iolo Goch Ploughing with a 14th-century two-handled mouldboard plough such as the poem describes.[1] Y Llafurwr, known in English as The Ploughman or The Labourer, is a poem in the form of a cywydd by the 14th-century Welsh poet Iolo Goch. Often compared with William Langland's Middle English Piers Plowman, it presents a sympathetic portrayal of the meek and godly ploughman; no other Welsh bardic poem takes an ordinary working man as its subject.[2][3] It has b...
Temporary race track in Monte Carlo, Monaco Circuit de Monaco Grand Prix circuitLocationLa Condamine and Monte Carlo, MonacoTime zoneCET (UTC+1)CEST (DST)Coordinates43°44′5″N 7°25′14″E / 43.73472°N 7.42056°E / 43.73472; 7.42056Capacity37,000FIA Grade1 (GP)3E (Formula E)Opened14 April 1929; 95 years ago (1929-04-14)Major eventsCurrent:Formula OneMonaco Grand Prix (1950, 1955–2019, 2021–present)Formula EMonaco ePrix (2015, 2017, 2019, 20...
Эта статья — об измерении гравитационного поля. О химическом анализе см. Гравиметрический анализ. Гравитационные аномалии Земли (по данным спутниковой миссии GRACE) Гравиме́трия (от лат. gravis — «тяжёлый» и греч. μετρέω — «измеряю»); геодезическая гравиме�...
Державний комітет телебачення і радіомовлення України (Держкомтелерадіо) Приміщення комітетуЗагальна інформаціяКраїна УкраїнаДата створення 2003Керівне відомство Кабінет Міністрів УкраїниРічний бюджет 1 964 898 500 ₴[1]Голова Олег НаливайкоПідвідомчі ор...
You can help expand this article with text translated from the corresponding article in Vietnamese. (March 2009) Click [show] for important translation instructions. View a machine-translated version of the Vietnamese article. Machine translation, like DeepL or Google Translate, is a useful starting point for translations, but translators must revise errors as necessary and confirm that the translation is accurate, rather than simply copy-pasting machine-translated text into the English ...
مرت سلطنة عمان بمختلف الأعاصير، تعرضت لاعصار جونو في 2007، واعصار فيت في 2010، واعصار مكونو فيه عام 2018، واعصار شاهين في أكتوبر من عام 2021.[1][2][3][4] قائمة الأعاصير إعصار جونو. في 2007 تعرضت السلطنة إلى أقوى إعصار مداري يضرب الشواطئ المطلة على بحر العرب منذ عام 1977م ووص...
American US soldier, 2023 defector to North Korea (born 2000) Travis KingAllegianceUnited StatesService/branch United States ArmyYears of service2021–present[a]Rank PrivateUnit1st Brigade Combat Team, 1st Armored Division4th Infantry Division[b]AwardsNational Defense Service MedalKorean Defense Service MedalOverseas Service Ribbon Travis Travale King is an American United States Army soldier known for crossing over the Military Demarcation Line in the Joint Securit...
2013 video game This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Asphalt 8: Airborne – news · newspapers · books · scholar · JSTOR (July 2022) (Learn how and when to remove this message)2013 video gameAsphalt 8: AirborneCover art featuring a McLaren Senna GTRDeveloper(s)Gameloft Barcelona[a]Publisher(...
Korps Relawan RusiaРусский добровольческий корпусLogo Korps Relawan RusiaPendiriDenis White Rex KapustinWaktu operasiAgustus 2022–sekarangJumlah anggota1,200Sekutu Ukraina Legiun Pembebasan RusiaLawan RusiaPertempuran dan perang Daftar pertempuran: Serangan Oblast Bryansk 2023Serangan Oblast Belgorod 2023 BenderaSitus webrusvolcorps.comKorps Relawan Rusia (bahasa Rusia: Русский добровольческий корпус, РДК, translit. Ru...
Lambang Provinsi Jawa Timur Peta Lokasi Provinsi Jawa Timur di Indonesia Peta Administrasi Provinsi Jawa Timur Berikut adalah daftar kecamatan dan kelurahan di Provinsi Jawa Timur, Indonesia. Provinsi Jawa Timur terdiri dari 29 kabupaten, 9 kota, 666 kecamatan, 777 kelurahan dan 7.724 desa. Pada tahun 2022, jumlah penduduknya diperkirakan mencapai 41.144.067 jiwa dengan total luas wilayah 48.033,00 km².[1][2] No. Kode Kemendagri Kabupaten/Kota Ibu kota Luas Wilayah (km2) Pen...
Ethical practice in scientific research You can help expand this article with text translated from the corresponding article in Portuguese. (January 2024) Click [show] for important translation instructions. View a machine-translated version of the Portuguese article. Machine translation, like DeepL or Google Translate, is a useful starting point for translations, but translators must revise errors as necessary and confirm that the translation is accurate, rather than simply copy-pasting...
Pour les articles homonymes, voir Hamlin. HamlinGéographiePays États-UnisÉtat New YorkSuperficie 19,97 km2 (2010)Surface en eau 0 %Altitude 98 mCoordonnées 43° 18′ 11″ N, 77° 55′ 16″ ODémographiePopulation 8 725 hab. (2020)Densité 436,9 hab./km2 (2020)FonctionnementStatut Petite ville aux États-Unis, town de l'État de New York (d)HistoireFondation 14 décembre 1852IdentifiantsCode FIPS 36-31797GNIS 979039Indicatif t�...