Skip to content

Latest commit

 

History

History
51 lines (39 loc) · 3.72 KB

007-B.md

File metadata and controls

51 lines (39 loc) · 3.72 KB

Санах ой зохицуулагч

Манай улсын анхны үйлдлийн системт БерлOS-г гаргахад тун бага хугацаа үлдээд байна. Тэгэхдээ энэ үйлдлийн системийн хэд хэдэн хэсэг, тэр дундаа санах ой зохицуулагч хийгдэж дуусаагүй л байна. Хөгжүүлэгчдийн төлөвснөөр анхны хувилбарын санах ой зохицуулагч маш энгийн, дараах 3 үйлдлийг хийдэг байх ёстой юм.

  • $alloc \ n$ - $n$ байт санах ойг хуваарилах бөгөөд, хуваарилагдсан санах ойн заагч $x$-г буцаана.
  • $erase \ x$ - $x$ заагчтай санах ойг устгана.
  • $defragment$ - Санах ойг цэгцэлнэ. Бүх хуваарилагдсан санах ойг байгаа дарааллаар нь санах ойн эхрүү шахна.

Бидний хэрэглэх санах ой ч гэсэн энгийн бүтэцтэй. $m$ хүртэл дугаарлагдсан $m$ байт санах ой юм.

Эхний үйлдлэл болох $alloc \ n$ нь хуваарилгдах санах ойн хэмжээ болох $n$ аргумент авах бөгөөд санах ойд $n$ байтыг хуваарилж, эхний заагчийг нь буцаана. Хуваарилагдсан бүх санах ойн блок нь хоосон биш болно. Хэрвээ хуваарилагдах боломжтой олон блок байвал хамгийн эхнийхд нь хуваарилна. Хэрвээ хуваарилах боломжтой санах ой олдохгүй бол $NULL$ гэсэн утга буцаана.

Дараагийн үйлдэл $erase \ x$ нь ямар нэг заагчийн утгыг параметртээ авах бөгөөд. Уг блокыг хоосолж, дараа хэрэглэхэд бэлэн болгоно. Хэрвээ уг заагчид хуваарилсан утга байхгүй байвал $ILLEGAL_ERASE_ARGUMENT$ гэсэн утга буцаана.

Сүүлийн үйлдэл $defragment$ нь ямар ч аргумент авахгүй бөгөөд хуваарилагдсан санах ойнуудыг санах ойн эхэнрүү дарааллыг нь алдагдуулахгүйгээр шахна.

Таны програм санах ойн заагчийг $1$-с дугаарлах хэрэгтэй бөгөөд, амжилтгүй болсон хуваарилалт заагчид нөлөөлөхгүй.

Таны програм $alloc$ команд бүрт утга хэвлэх ёстой бөгөөд, мөн $erase$ командын үед $ILLEGAL_ERASE_ARGUMENT$ утгыг хэвлэнэ.

Оролт

Оролтын эхний мөрөнд нийт үйлдлийн тоо $t$ ба санах ойн хэмжээ $t$ ($1 ≤ t ≤ 100$, $1 ≤ m ≤ 100$) өгөгдөнө. Дараагийн $t$ мөрөнд командууд байна. Эхний команд $alloc n$ хэлбэртэй байна ($1 ≤ n ≤ 100$). Дараагийн команд $erase x$ байх бөгөөд $x$ нь 32-битийн заагч утга байна. 3-р команд $defragment$ гэж байна.

Гаралт

Гаралтанд $alloc$ командын үр дүн, эсвэл амжилтгүй болсон $erase$ командыг илгэх $ILLEGAL_ERASE_ARGUMENT$ утга оролтонд өгсөн дарааллаар байна. $alloc$ команд нь 1-с эхэлж дугаарласан утгыг хэвлэнэ.

-- zoloogg