2010/06/10

Чөтгөрийн зүрхэнд хүрэх замд ...

За надад бол мэргэн цоохор, бусдад бол эрээн цоохор байж болох нэг юм энд сараачаад орхие.

FreeBSD үйлдлийн системийг үүнээс хойш чөтгөр гэж нэрлэе.

За тэгэхээр чөтгөрийн цөмийн эх код нь /usr/src/sys санд байдаг. Цөмийн эх кодоос хайлт хийхдээ хэд хэдэн аргаар хайж болно. Жишээ нь:

find /usr/src/sys -name "*.c"|xargs grep -i 'sockbuf_waste_factor'
grep -R 'sockbuf_waste_factor' /usr/src/sys/*

гэх мэт.
Програм бичихэд цөмийн талбар эсвэл хэрэглэгчийн талбар гэсэн үндсэн ойлголтыг санаж үзэх хэрэгтэй. Хэрэглэгчийн талбарын програмуудын ихэнх нь олон урсгалт биш боловч цөмийн код нь асар төвөгтэй олон урсгалт програм бөгөөд ихэнх хэцүү асуудлууд нь урсгалын загваржилт болон цөмийг илүү параллел болгоход чиглэсэн байдаг.

Хэрэглэгчийн талбарын програм цөмийн хамгаалагдсан эсвэл хамгаалагдаагүй хэсгээс хувьсагч эсвэл утга шууд авах бол sysctl(3) эсвэл kvm(3) интерфэйс ашиглана. Өөрөөр хэлбэл цөмийн хамгаалагдсан өгөгдлийн бүтцийн хувьсагч руу шууд хандаж утга авч болохгүй гэсэн үг юм. Цөм нь хэрэглэгчийн талбараас авч болох утгыг SYSCTL макронууд ашиглан хэрэглэгчийн талбараас авч болохоор гаргаж болно. Мөн цөмийн талбарт програм бичих эсвэл өөрчлөлт хийх, жишээ нь тогтмолууд нэмэх зэрэг зүйлс хийх бол ABI буюу application binary interface болон зохих дүрэм журмыг харгалзан үзэх ёстой.

Цөмийн өгөгдлийн бүтцийг шууд тэр чигээр нь хэрэглэгчийн талбар руу авч болохоор хийж болохгүй. Өөрөөр хэлбэл тийм өгөгдлийн бүтцэд заагч эсвэл тогтмол массив зэргийг зарлаж болохгүй юм. Нэг шалтгаан нь заагч нь 64 бит болон 32 битийн систем дээр хэмжээ нь өөр байдаг явдал юм. Мөн ингэж зарласан тохиолдолд цөмийн хувьсагч руу хэрэглэгчийн програм шууд хандаж цөмийг сүйрүүлэх боломжтой болох юм. Цөмийн заагч болон өгөгдлийн бүтцийг хэрэглэгчийн талбарт шууд авах боломжтойгоор хийх нь ABI-г зөрчиж байгаа явдал юм.

Мөн хэрэглэгчийн санах ойгоос өгөгдлийн бүтэц авах эсвэл хэрэглэгчийн санах ой руу өгөгдлийн бүтэц хуулах бол тийм өгөгдлийн бүтэц дотор аль болох заагч хэрэглэхгүй байх хэрэгтэй. Учир нь цөмийн талбарын заагчийн хэмжээ хэрэглэгчийн талбарын заагчийн хэмжээнээс өөр байх боломжтой. Ингэж өөр байх тохиолдолд 32-бит/64-битийн compat shim-үүд буюу таарамжтай нийцтэй байлгах тохиргоонууд хэрэгтэй болно.

Цөмийн талбарын програмд хувьсагч зарлахдаа санах ойд аль болох бага зай эзлэхээр зарлаж өгөх хэрэгтэй. Жишээ нь:


гэсэн өгөгдлийн бүтэц байя гэж бодоё. Энэ бүтцийг ашиглах үндсэн програмд struct ipfw_port_table_entry *ent гэж зарлан санах ойн талбарт зай гарган өгвөл энэ хувьсагч нь 64 битийн систем дээрх заагчийн хэмжээтэй адил санах ойн хэмжээ эзлэх болно.

64 бит архитектурын гол дутагдал нь 32 битийн архитектуртай харьцуулбал өгөгдөл нь санах ойд 32 битийнхээс илүү хэмжээний зай эзэлдэг (заагчийн хэмжээ, бусад төрлүүд болон тэдгээрийг зэрэгцүүлж адил болгох гэснээс болоод). Ингэснээр өгөгдсөн процессийн санах ойн шаардлагыг ихэсгэж процессорын кэшийн хэрэглээг үр ашигтай ашиглахад сөрөг нөлөө үзүүлж болзошгүй юм.

Цөмийн өгөгдлийн бүтцийг (жишээ нь struct дотор struct байхад тус тусад нь санах ойн талбар зааж өгөхөд санах ойн зайны хувьд үр ашиггүй ашиглагдахаас гадна заагчтай ажиллахад төвөгтэй болно) аль болох цугт нь бүтнээр нь allocate хийх буюу санах ойн талбар зааж өгөх хэрэгтэй. Цугт нь санах ойн талбар хуваарилан зааж өгвөл санах ойн кэшийг үр дүнтэй ашиглахаас гадна өгөгдлийн бүтцийг унших үеийн эзлэх зайг багасгана.

Мөн өгөгдлийн бүтцүүдийг тодорхойлох бэлэн аргууд байдаг, бүх төрлийн list-үүд, queue, hash зэрэг өгөгдлийн бүтцүүдтэй ажиллах макронууд sys/queue.h толгой файлд заагдсан байдаг бөгөөд queue(3) гарын авлагаас уншиж болно.

Бичсэн кодоо style(9)-д дурдсан загварын дагуу хэлбэржүүлэх ёстойг бас мартаж болохгүй юм.

2 comments:

  1. Бяцхан чөтгөртэй үехрдэг нөхдүүдэд хэрэгтэй мэдээлэл байна. Миний одоо болтол оролдож үзмээр байгаа юмны нэгэнд нь энэ чөтгөр дээр өөрийн гэсэн модуль бэлдэж сурах байгаа юм. Цөм рүү шаардлагатай үед дуудагдаж хадагдаад хэрэгцээтэй үед ажиллаж байдаг ийм модуль бэлдээд сурчих ч зүгээр шүү. Энүүн шиг гарааны хэдэн өгүүлбэр сараачиж дэвсээд өгвөл ч мордож аваад туршмаар л байгаа юм.

    ReplyDelete
  2. надад бол эрээн цоохор л байлаа даа.
    уншиж сурсаны хэрэг гарсангүй.
    (толгой сэгсрээд гараад явлаа)

    ReplyDelete