Каква е разликата между блокиращо системно повикване и неблокиращо системно повикване?


Отговор 1:

Може да има 2 определения:

Първо:

Блокиращият системен разговор е този, който спира или поставя процеса на повикване в изчакване, докато се случи събитието (при което разговорът е блокиран), след което блокираният процес се събужда и е готов за изпълнение.

За да бъдем конкретни, след като системното обаждане се извика от нишка и начинът на изпълнение се прехвърли в ядрото, а системното извикване блокира до завършване на определено събитие, конкретната извикваща нишка, изпълняваща се в режим на ядрото, е блокирана и е поставете на някаква опашка за чакане. След като събитието приключи, нишката се събужда и отново се поставя на опашката за готовност на процесора и по този начин може да бъде назначена на CPU по всяко време в зависимост от планирането на ОС.

От друга страна, не блокиращото системно обаждане всъщност не поставя изходящата нишка в някакъв режим на изчакване / спиране.

Например вземете системния разговор read (), който чете определено количество данни от файл, в буфера, определен от потребителската програма. Обаждането се връща в потребителското пространство само след като потребителският буфер е попълнен с желаните данни. След като системното обаждане вътрешно издава диск, който чете, за да прочете конкретния блок и контролът е прехвърлен на дисковия контролер, потокът по същество се поставя в режим на заспиване, за да бъде по-късно събуден, когато контрола на диска е завършил I / O от устройството за съхранение и поставете данните в буфера за пространство на ядрото чрез DMA. След това данните се копират от буфера на пространството на ядрото в буфер за потребителско пространство и тогава четенето () системното повикване се връща.

Второ:

Друго определение за блокиране и не блокиращо системно повикване може да бъде дадено в контекста на синхронни и асинхронни повиквания.

Вземете системния разговор write (). Обаждането се връща обратно в потребителска земя, след като желаните данни са записани в буфера за пространство на ядрото от потребителския буфер, както е посочено в параметрите на повикването. Това е напълно различно от действителното I / O, което се прави на диск. I / O всъщност не е направено. Данните все още са в DRAM и разговорът не блокира (известен още като не беше синхронен), за да завърши действителния I / O на устройството за съхранение. Това е случай на блокиране на системно повикване за запис.

Друг пример е блокиране на операцията за изпращане () на сокета. Ако блокирането му изпрати (), тогава повикването изчаква данните да бъдат изпратени от източника до местоназначението. По този начин може да се извърши следния път:

потребителски буфер => ядро ​​буфер => слой протокол (NIC буфер)


Отговор 2:

На високо ниво разликата е, че ядрото веднага ще върне грешка (-EWOULDBLOCK) или ще маркира вашата задача / процес като „блокирана“ и остави планиращия да спре вашата задача, ако исканите данни не са налични веднага.

С други думи, ако отворите файл в режим, който не блокира, можете да анкетирате файлов дескриптор или сокет за входящи данни или да опитате да запишете данни в изходни буфери, без да се отказвате от останалата част от времевия си отрязък и без да бъдете „блокирани“ на специфичен I / O канал (или "канал за изчакване"). В противен случай вашите разговори могат да преустановят задачите ви за произволни периоди от време. (Този риск може да бъде смекчен при аларми и обработващи сигнали, между другото).

Обърнете внимание, че има механизми като anketa () и select () и асинхронни I / O функции, които не се вписват добре в това блокиращо / не блокиращо разграничение. Те могат да „блокират“, но с опция за автоматично деблокиране след даден период от време, например.

Не че обичайните системни обаждания за четене () и запис () нямат блокиращи и блокиращи алтернативи или флагове. Те работят в един или друг режим въз основа на начина, по който дескриптор на файл или сокет е бил отворен или манипулиран (например чрез fcntl).


Отговор 3:

На високо ниво разликата е, че ядрото веднага ще върне грешка (-EWOULDBLOCK) или ще маркира вашата задача / процес като „блокирана“ и остави планиращия да спре вашата задача, ако исканите данни не са налични веднага.

С други думи, ако отворите файл в режим, който не блокира, можете да анкетирате файлов дескриптор или сокет за входящи данни или да опитате да запишете данни в изходни буфери, без да се отказвате от останалата част от времевия си отрязък и без да бъдете „блокирани“ на специфичен I / O канал (или "канал за изчакване"). В противен случай вашите разговори могат да преустановят задачите ви за произволни периоди от време. (Този риск може да бъде смекчен при аларми и обработващи сигнали, между другото).

Обърнете внимание, че има механизми като anketa () и select () и асинхронни I / O функции, които не се вписват добре в това блокиращо / не блокиращо разграничение. Те могат да „блокират“, но с опция за автоматично деблокиране след даден период от време, например.

Не че обичайните системни обаждания за четене () и запис () нямат блокиращи и блокиращи алтернативи или флагове. Те работят в един или друг режим въз основа на начина, по който дескриптор на файл или сокет е бил отворен или манипулиран (например чрез fcntl).