On Monday 13 June 2005 14:04, Skeleta wrote: > George Danchev wrote: > >On Monday 13 June 2005 11:31, Vesselin Markov wrote: > >>Всъщност, май не зависи от времето за изпълнение нито на ps, нито на > >> grep. Иначе, при всяко положение grep се изпълнява по-бъзо от ps, но за > >> да тръгне той, ps трябва да е приключил вече. > > > >Това е не вярно. При process1 | process2 ядрото стартира двата процеса > >едновременно (осигурявайки им file descriptors, etc). Проблема е, че не се > >знае кой ще разруши тръбата първи, например process2 приключва преди > > process1 (прекратявайки съществуването на тръбата) тогава ядрото праща > > сигнал SIGPIPE ( EPIPE ) [1] на process1 който го хваща и ако не е лейм > > exit()-ва подобаващо, ако . Пример [2]. Работите за доста сложни и > > понякога зависи дали се пише атомично в тръбата или не, колко е атомично > > за дадена ОС и т.н. повече на [3]. > > В обсъждания случай "ps | grep" и двата процеса се стартират > едновременно, а пръв ще приключи ps, понеже grep ще чака затваряне на > входния си файл. На практика за друг наблюдаващ процес и двата ще > завършат едновременно. Поне на мен така ми се струва - самото > приключване на ps при добре направено ядро трябва да прехвърли > управлението директно на grep, което пък да си филтрира получения текст > и също да приключи работа.
Мда, май не сме точни в това какво значи едновременно защото ядрото отделя внимание на процесите в timeslices[0] нищо, че може да са и в pipe. Значи ядрото много бързо пуска (RN) и приспива процесите (S) (състоянията ги има описани в man ps) от двете страни на pipe-a с дискрет най-малко а може и няколко един timeslice защото не са само те. Какво ще стане ако ps приключи преди да е изтекъл неговия timeslice /много рядко може да стане, но има и такъв шанс както се вижда и тогава в неговия изход няма да има grep /. Дали ще бъде поставен в състояние RN - Running or runnable / low-priority , а после и приспан S /за да чака другия край /, а grep може ли да е (а може и да не е [1] ) все още стартиран камо ли пък поставен в състояние S - Interruptible sleep. А дали кернела в зависимост от това с какъв scheduler работи няма да реши, че има по-високо приоритетна задача с която да се заеме преди това. Все въпроси с ескалираща сложност и на които се притеснявам да отговоря, просто ей така ;-) [0] http://foldoc.doc.ic.ac.uk/foldoc/foldoc.cgi?query=Timeslice&action=Search [1] ако е SMP система, grep може да бъде стартиран на друго CPU1 в timeslice преди да е изтекъл timeslice на ps на CPU0, но след като този ps instance е завършил. -- pub 4096R/0E4BD0AB 2003-03-18 <danchev.fccf.net/key pgp.mit.edu> fingerprint 1AE7 7C66 0A26 5BFF DF22 5D55 1C57 0C89 0E4B D0AB