Re: lug-bg: ps ax|grep sth
- Subject: Re: lug-bg: ps ax|grep sth
- From: George Danchev <danchev@xxxxxxxxx>
- Date: Mon, 13 Jun 2005 16:42:49 +0300
- Delivered-to: lug-bg-list@xxxxxxxxxxxxxxxxxx
- Delivered-to: lug-bg@xxxxxxxxxxxxxxxxxx
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
|