Оролтын хэсэг

Чөлөөт нэвтэрхий толь — Википедиагаас
Jump to navigation Jump to search

Процесс болгон эгзэгтэй муж руу орохын тулд эхлээд хүсэлт явуулдаг байх ёстой. Энэ хүсэлтийг хүлээн авч хэрэгжүүлж буй кодыг оролтын хэсэг гэнэ.

Эгзэгтэй муж[засварлах | edit source]

critical section

Систем нь n тооны {P0, P1, P2.... Pn-1 г.м} процессоос бүрддэг гэж үзье. Процесс бүрт эгзэгтэй муж гэж байх ба аль нэг процесс дундын эзэмшлийн хувьсагч өөрчлөх, хүснэгт шинэчлэх, файл үүсгэх аль эсвэл өгөгдлийг өөрчлөх зэрэг нь процессийн эгзэгтэй муж болно. Системийг бүрдүүлж буй аль нэг процесс эгзэгтэй муждаа биелэгдэж байвал, өөр ямар ч процесс эгзэгтэй муждаа биелэгдэхгүй. Энэ нь хоёр процесс нэг агшинд эгзэгтэй муждаа зэрэг биелэгдэх боломжгүй гэсэн үг. Өөрөөр хэлбэл хоёр процесс нэг зэрэг файл үүсгэх гэх зэрэг эгзэгтэй мужид хамаарагдах үйлдэл хийж чадахгүй. Эгзэгтэй мужийн асуудал бол процессуудыг хамтран ажилладаг болгох юм. Процесс эгзэгтэй мужид орохын тулд эхлээд оролтын хэсгээр дамжсан бол дуусахдаа гаралтын хэсэг-н кодоор дуусна. Үлдсэн бусад кодын хэсгийг үлдэгдэл хэсэг гэнэ.

Оролтын кодын хэсэг[засварлах | edit source]

Entry section

Эгзэгтэй мужийн асуудлыг шийдвэрлэхийн тулд дараах гурван шаардлагыг хангасан байх шаардлагатай:

1. Солбилцол (Mutual exclusion)

Хэрэв нэг процесс эгзэгтэй мужид нэвтэрсэн бол өөр процесс үл нэвтрүүлэх

mutual exclusion

2. Үйл явцыг дэмжих (progress)

Өөр ямар ч процессд эгзэгтэй муж үүсээгүй байхад зарим процесс эгзэгтэй  мужид нэвтрэх гэж байвал тэдгээр процессууд үлдэгдэл хэсэгтээ нэвтрэх боломжгүй бөгөөд аль процесс түрүүлж эгзэгтээ муждаа биелэгдэхийг шийдэхэд оролцдог. Сонгогдсон процесс тодорхойгүйгээр хойшлогдох болон хүлээх ёсгүй.

3. Хүлээлтийг хязгаарлах (bounded waiting)

Процесс тодорхой хугацаанд л эгзэгтэй мужид байх ёстой.

POSIX pthread library ашигласан эгзэгтэй мужийн жишээ код

/* Sample C/C++, Unix/Linux */
#include <pthread.h>

/* This is the critical section object (statically allocated). */
static pthread_mutex_t cs_mutex = PTHREAD_MUTEX_INITIALIZER;

void f()
{
    /* Enter the critical section -- other threads are locked out */
    pthread_mutex_lock( &cs_mutex );
 
    /* Do some thread-safe processing! */

    /*Leave the critical section -- other threads can now pthread_mutex_lock()  */
    pthread_mutex_unlock( &cs_mutex );
}

int main()
{
    f();

    return 0;
}

Win32 API ашигласан эгзэгтэй мужийн жишээ код

/* Sample C/C++, Windows, link to kernel32.dll */
#include <windows.h>

static CRITICAL_SECTION cs; /* This is the critical section object -- once initialized,
                               it cannot be moved in memory */
                            /* If you program in OOP, declare this as a non-static member in your class */ 
void f()
{
    /* Enter the critical section -- other threads are locked out */
    EnterCriticalSection(&cs);

    /* Do some thread-safe processing! */

    /* Leave the critical section -- other threads can now EnterCriticalSection() */
    LeaveCriticalSection(&cs);
}

int main()
{
    /* Initialize the critical section before entering multi-threaded context. */
    InitializeCriticalSection(&cs);

    f(); 

    /* Release system object when all finished -- usually at the end of the cleanup code */
    DeleteCriticalSection(&cs);

    return 0;
}

Ашигласан материал:

 - Abraham Silberschatz. Operating system concepts, 7th edition