Technology sharing

Princeps concurrency reactor server [medium]

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

4. Processus control et processus synchronisation

1. signum

1.1 Basic notiones significationum

Signum (signum) interregem est programmatis. Methodus est nuntiis inter processuum transmittendi. Solet notificare processum quem res incidit, sed aliquas notitias ad processum transire non potest.

Multae causae sunt quare signa generanturkilletkillallPraecipe signum mittere;

kill -信号的类型 进程编号
killall -信号的类型 进程名
  • 1
  • 2

Annuit 1.2 Genera

signum nomenSignum valoremDefault processus actioCausa significat
SIGHUP1ATerminus dependet vel potestate processus terminatur
SIGINT2ACtrlTab + CtrlTab + c
SIGQUIT3CClavis scriptor effugium tincidunt premitur
SIGILL4CIllegalis disciplinam
SIGTRAP5Cbreakpoint instructions
SIGABRT6CSignum abort ab abort edita (III)
SIGBUS7Cbus errorum
SIGFPE8Cfluctuetur exceptio
SIGKILL9A-9 occidere processus necat, hoc signum capi non potest et neglecta
SIGUSR110AUser definitum signum 1
SIGSEGV11CAliquam referat memoria (ex terminis ordinata, operatio nulla regula)
SIGUSR212AUser signum definitum 2
SIGPIPE13AScribere data ad fistulam sine processu legere
SIGALRM14ATerror horologii signum, signum a terrore missum () munus
SIGTERM15ATerminatio signum, signum ab defectu
SIGSTKFLT16ABIBLIOTHECA errorum
SIGCHLD17BEmittitur cum puer processus finit
SIGCONT18DResumere cessaverunt processum
SIGSTOP19DSubsisto processus
SIGTSTP20DTerminatio torcular subsisto clavis
SIGTTIN21DProcessus background petitiones terminatio legere
SIGTTOU22DIn background processus postulat ut scribere ad terminum
SIGURGO23BSubitis conditio deprehensio (nervum)
SIGXCPU24CCPU terminum exceditur
SIGXFSZ25CFile size modus exceditur
SIGVTALRM26Avirtualis horologium signum
SIGPROF27ADuis horologium annuit
SIGWINCH28BFenestra magnitudine mutationes
SIGPOLL29BPolling (Sys V)
SIGPWR30Aelectricity defectum
SIGSYS31CIllegalis ratio vocationis

Actio defalta est processus terminare.

Actio defectus B est hoc signum ignorare.

Actio defalta C est processus terminare et imaginem nuclei accipere.

Defalta actio D processu prohibere est, et propositum, quod rem publicam impeditam intrat, exsequi pergere potest.

1.3 signum processui

Tripliciter processuum ad signa tractanda;

  1. Operatio defalta systema hoc signo tractabat. Operatio defectus plurium significationum est processus terminare.
  2. Munus processus interregem constitue. Accepto signo, munus illud tractabit.
  3. Ignorare signum et nihil facere signo quasi numquam factum.

signal()functiones quomodo programma ansas significationibus exponere possunt.

Munus declaratio;

#include <signal.h>

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
  • 1
  • 2
  • 3
  • 4

Parameter Description:

  • sig: Specificare signum capere.
  • func : Monstratorem signum processus muneris. Munus processus in integro modulo recipiendo indiget, qui numerus signo captus est.
  1. SIG_DFL The : SIG_DFL tortor significat processui default signum methodi.ususSIG_DFLassignalSecundus functionis parameter indicat modum processus default systema pro signo adhiberi.
  2. SIG_IGN The : SIG_IGN tortor significat signum ignorare.ususSIG_IGNassignal Secundus functionis parameter indicat, cum signum processus accipit, eam negliget nec processui ullo fungi debet. Hoc impedire potest quin processus inopinatus in aliquibus adiunctis terminetur vel interveniat.
  3. SIG_ERR:SIG_ERR Macros errores indicantes adhibentur.non utsignalSecundus functionis modulus loco ponitursignal Reditus valor functionis indicat vocationem incassum.sisignalSi vocatio ad munus defecerit, reverteturSIG_ERR .Hoc est typice ad deprehendere et processumsignalError munere vocent in qui.

image-20240709113614147

image-20240709113230874

image-20240709113240944

1.4 Quis est usus significationum?

Ministerium programmatis in curriculo decurrit. Si vis prohibere, non est bona idea occidere, quia cum processus occiditur, subito perit nec opus reparatum componitur.

Si signum mittes progressioni ad servitium, accepto signo, servitium programma vocat functionem et scribens in functioni codice reparatum, et propositum potest exire modo proposito.

Signum mittendi 0 ad programmata muneris programma deprehendere potest num programmata viva sint.

image-202407091335336848

1.5 Mittens annuit

Linux operating ratio praebet kill etkillall Mandatum signum mittit programmatiskill() Bibliotheca munera aliis processibus annuit.

Munus declaratio;

int kill(pid_t pid, int sig);
  • 1

kill() Munus accipit parametrisig Praefinitum signum transit ad parametripid certo processu.

modulus pid Plures sunt condiciones:

  1. pid > 0 Transire signum ad processum utpid processum.
  2. pid = 0 Signum omnibus processibus in eodem processu globi ac currenti transeo. Saepe a parente processum adhibetur ut signa mittat puero processus.
  3. pid < -1 Signum processus transiet ad id coetus of *|pid| omnium processuum.
  4. pid = -1 Signum transit omnibus processibus, qui permittitur ut signum mittat, sed non processus qui misit signum.

2. Processus terminationis

Sunt autem VIII modi processus terminandi, 5 quarum terminationes normales sunt;

  1. exist main() Nam munerareturn remittere;
  2. Dicitur in aliquo function exit() officium;
  3. Dicitur in aliquo function _exit() or *_Exit() officium;
  4. Ultimum filum incipit ab eius exercitatione startup (filum principale munus) cum return remittere;
  5. Vocavit in ultimo stamina pthread_exit() remittere;

Tripliciter enormis terminati sunt;

  1. translatio abort() munus abort;
  2. Signum recipitur;
  3. Ultimum filum respondet indultum petitioni.

2.1 Status processus terminationem

exist main() in munere,return Valor est terminus status redditus, si nonreturn dicitur vel vocationisexit()ergo terminus processus status est 0 .

In testa, vide statum processus terminationis;

echo $?
  • 1

III munera processus Northmanni terminare (exit() et_Exit() specificatur ab ISO C,_exit() specificatur per POSIX):

void exit(int status);
void _exit(int status);
void _Exit(int status);
  • 1
  • 2
  • 3

status Status processus terminationis.

image-20240709143530327

image-20240709143615950

2.2 Resource release exitus

  • return Cum redit munus indicat, destructor loci objecti vocabitur.main() in munusreturn Destructor obiecti globalis etiam vocatur.
  • exit() Processum terminare indicat, destructor loci objecti non vocabitur, nisi destructor obiecti globalis vocabitur.
  • _exit() et_Exit() Exit directe et nullum opus tersus perficietur.

2.3 munus processus Cessatio

Processus is available atexit() Munus adnotatione functiones terminat (usque ad 32), haec munera eruntexit() Automatarie dicta.

int atexit(void (*function)(void));
  • 1

exit() Ordo, quo functiones terminationes vocantur, praeposterus ex tempore adnotationes.

image-20240709143824286

image-20240709143830549

3. Voca progressio exsecutabile

3.1 ratio () munus

system()Munus praebet methodum simplicem programma exequendi, praeteriens programmata et parametri, quae sicut filo exsecutioni mandanda sunt.system()Munus iusti.

Munus declaratio;

int system(const char * string);
  • 1

system()Valor muneris reditus molestior est.

  1. Si progressio exsecuta non est,system()Munus non- nulla redit;
  2. Si progressio exsecutio felix est et status exsecutionis progressio exsecutionis 0 est,system()Munus redit 0;
  3. Si progressio exsecutio felix est et finis status progressionis exsecutionis non est 0;system()Munus non-nulla redit.

3.2 munus familiae exec

execMunus familiae alium modum praebent ut programmata (binarii vel scripta testa) vocant intra processum.

execOfficium familiae declaratur sic:

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Notice

  1. Si progressionis exsecutio deficit, -1 directe redditur, et ratio deficiendi reponitur inerrnomedium.
  2. Processus numerus novi processus idem est ac processus primigenii, sed novus processus segmentum, segmentum datae, et acervus processus primigenii substituit.
  3. Si exsecutio proficiat, munus non reverteturexecDeinde, programma vocatum locum vocationis restituet, id est,execNullus post munus codice exsecutus erit.
  4. In ipsa evolutione, quae in usu estexecl()etexecv()alii raro utuntur.

4. crea in processus

4.1 Linux processuum 0, 1 et 2

Omnes processus in tota Linux systemate in structura arboris sunt.

  • Processus No. 0 (processus systematis) est antecessorum omnium processuum.
  • **Processus No. 1 (systemd) praestandi nucleum initializationem et conformationem systematis responsabilis est.
  • Processus No. 2 (kthreadd) pertinet ad schedulingam et administrationem omnium nucleorum filorum.

ususpstreePotes videre processum arboris cum imperio;

pstree -p 进程编号
  • 1

4.2 processus idem

Quisque processus unicum processum habet ID per integrum non negativum repraesentatum. Etsi unicum, processus IDs reddi potest. Cum processus terminatur, eius processus ID candidatus reuse fit. Linux algorithm tardae reuse utitur ita ut ID processus novi creati differat ab ID, quod nuper terminatum est. Hoc impedit quominus novos processus fallat per processum terminatum eodem ID utens.

Munus ad processum ID:

pid_t getpid(void);    // 获取当前进程的ID。
pid_t getppid(void);   // 获取父进程的ID。
  • 1
  • 2

4.3 furca () function

Processus existens potest vocarefork()Munus novum processum creat.

Munus declaratio;

pid_t fork(void);
  • 1

Dependetfork()Novus processus creatus appellatur processus infantis.

fork() Munus dicitur semel, sed bis redit. Discrimen inter duos reditus est quod processus reditus valorem prolis 0 est, cum valor reditus parentis processum est processus ID processus pueri novi creati.

Puer processum et processus parens exequi pergitfork()In codice deinde; Puer processus exemplar est processus parentis. Puer processum habet exemplar processus notitiae parentis spatium, cumulum et acervum (nota: processus exemplar habet, cum processu parentis non communicatur).

fork()Post haec exsecutio processus ordinis parentis et pueri est indeterminata.

image-20240709221535371

image-20240709221546617

4.4 Duo usus furca ()

  1. Processus parentis se imitari vult, et tunc processum parentis et filius processum unumquemque diversum codicem exequi.Hic usus est usitatissimus in programmatibus network muneris. Processus parentis exspectat nexum huius petitionisfork()has petitiones processus pertractet, dum processum parentis expectare pergit ad petitionem proximam nexum.
  2. Processus vult aliud propositum exequi.Hic usus in conchis usitatissimus est, processus infantis afork()Vocavit statim post reditusexec

4.5 Shared files

fork()Unum pluma est quod descriptores fasciculi in processu parentis aperti erunt et ad processum infantis transcribendum, et processum parentis et processus pueri eiusdem imaginis identidem communicant.

Si processus parens et filius processum scribant ad limam ab eodem descripto sine ulla synchronisationis forma demonstratam, eorum output inter se misceri potest.

image-20240709222929369

image-20240709222803641

Hic videre potes tantum 100,000 ordines datarum esse.

image-20240709222853769

image-20240709223236254

200,000 ordines notitiarum hoc tempore esse debet. Unus ordo minor est quia operatio tabellae scribentis non est atomica. the scribe to fail.

4.6 vfork() function

vfork()Munus vocat et reditus valores idem suntfork()Eadem, sed alia semantica eorum.

vfork()Munus adhibetur ad creare novum processum cuius finis estexecNovum propositum, quod spatium electronicae processus parentis non effingo, quia processus pueri statim vocatexec sic oratio spatium parentis processu non adhibebitur. Si puer processum inscriptionis spatio processus parentis adhibet, eventus ignotus accidere potest.

vfork()etfork()Alia differentia est:vfork()Curare ut processus pueri primo decurrat et eum in processu infantis appelletexecor *exitTum processus parentis operationem repetit.

5. Zombie processus

In systemate operante, processus zombie ad puerum processum terminatum refertur, sed processum parentis suum nondum legit statum exitum suum. Etsi processus zombie iam non est cursus, tamen ingressum in mensa processus occupat ita ut nucleus notitiae status processus exitus servare possit (sicut processus ID, status exitus, etc.) donec processus parentis haec informationes legit.

5,1 Causae Zombie processuum

Si processus parentis ante processum pueri exit, processus puer erit per processum 1 (haec quoque via est ut processus in curriculo percurrat).

Si filius processum exit ante processum parentis, et processum parentis non procedit processus pueri exitus informationis, tunc processus erit processus zombie.

5.2 Damnum processuum Zombie

nucleus structuram datam retinet pro quolibet infante processu, incluso numero processuum, status terminationis, CPU temporis adhibito, etc. Si processus parentis processus notitia exitus pueri processit, nucleus hanc structuram notitiarum solvet. Si processus parens non processum notitiae processus pueri exit, nucleus hanc structuram datam non dimittit, et processus numeri processus pueri semper occupabitur. Processus numeri praesto in systemate limitantur. Si numerus processus zombie generatur, ratio non poterit novos processus generare quia numeri processus praesto non sunt.

5,3 Ratio ne Zombie processuum

  1. SIGCHLD tractantem signum : Cum puer processum exit, nucleus signum SIGCHLD ad processum parentis mittet.Si parens processus usussignal(SIGCHLD, SIG_IGN)nucleum certiorem facere non interest in processu infantis exitus, et eius structurae notitia statim post exitum pueri solvetur.
  2. ususwait()/waitpid()officium: Processus parentis expectat processum infantis ad finem vocando has functiones et obtinet statum suum exitus, sic solvens facultates a puero processum occupatas.
pid_t wait(int *stat_loc); 
pid_t waitpid(pid_t pid, int *stat_loc, int options); 
pid_t wait3(int *status, int options, struct rusage *rusage); 
pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);
  • 1
  • 2
  • 3
  • 4

Valor reditus numerus processus pueri est.

stat_loc Estne notitia de terminatione pueri processus;

a) Si Northmanni terminabitur, tortor WIFEXITED(stat_loc) Vera redde, tortorWEXITSTATUS(stat_loc) Terminatio status obtineri potest;

b) Si enormis terminatur, macro WTERMSIG(stat_loc) Signum accipit ut processus terminetur.

image-20240709230911352

image-20240709231034423

image-20240709231050581

image-20240709231124375

image-20240709231140813

Si parens processus occupatus est, capere potes SIGCHLD Signum, vocatur in signo processus functioniswait()/waitpid()

image-20240709231439475

image-20240709231422927

6.Multiple processuum et annuit

[Mitte annuit inter processuum] (## 1.5 annuit mitte)

In multi-processus muneris programma, si signum exitus sub-processus acceperit, processus sub-sua exibit.

Si processus parentis signum exitus acceperit, signum ad omnes processuum infantis exitus mittere debet ac deinde ipsum exire.

image-20240711222919564

image-20240711222900141

image-2024071122311481

7. Shared memoria

Multi- stamina intra spatium processus inscriptionis communicant;Si plures filis ad eandem memoriam accedere necesse est, modo variabilium globalium utere.

In multiplicibus processibus electronica cuiusque processus spatium sui iuris est et non communicatum.Si plures processus necesse est eandem memoriam accedere, variabiles globales non possunt, solum memoria communis adhiberi potest.

Memoria communicata plures processus permittit (nec sanguinis necessitudines inter processuum requiritur) ut eiusdem memoriae spatium accedere. Processus memoriam communem cum spatio suo electronico coniungere possunt.

Communes memoria mechanismum seram non praebet, hoc est, cum processus memoriae communicatus legit/scribit, non impedit alios processus quin eam legere/scribat.Si legere velis claude / scribe memoriae communis, uti potes semaphoro . Linux copiam functionum praebet ad memoriam participandam operandam.

7.1 munus shmget

Munus hoc adhibetur ad memoriam participandam creare/acquirere.

 int shmget(key_t key, size_t size, int shmflg);
  • 1
  • clavis Valor clavem memoriae communium integer est.typedef unsigned int key_t) fere in hexadecimali, e.g 0x5005, claves diversorum memoriarum communium idem esse non possunt.
  • magnitudine Magnitudo communis memoriae, in bytes.
  • shmflg Accessus permissionum pro memoria communium eaedem sunt ac permissiones fasciculi, exempli gratia0666|IPC_CREAT Indicat, si memoria communis non est, creare.
  • reditus valorem: redit id memoriae communis (integrum majus quam 0) in successu, -1 in defectu (ratio insufficiens memoria et licentias nullas habet).

image-20240711224223200

image-20240711224212293

usus ipcs -m Inspicere potes rationem memoriae communis, inter quas: clavis (clavis), memoria communis id (shmid), dominus (dominus), permissiones (perms), et amplitudo (bytes).

usus ipcrm -m 共享内存id Communis memoria manually sic deleri potest:

image-202407112225202860

Nota: Vasa notata genera in communi memoria adhiberi non possunt, tantum notitiarum fundamentalium typi adhiberi possunt.

7.2 munus shmat

Munus hoc communes memoriae cum inscriptione spatium currentis processus coniungere solebat.

void *shmat(int shmid, const void *shmaddr, int shmflg);
  • 1
  • shmid Dependetshmget() Communis memoria identifier munus reddidit.
  • shmaddr Locum inscriptionis specificare ubi processus communis memoria coniungitur. Solet in 0 explere ut systema electronicum memoriae communicatae desumat.
  • shmflg Vexillum bis, plerumque 0 repletum.

Initium redit oratio communis memoriae cum vocationi succedit, redit cum deficit. (void *)-1

7.3 shmdt function

Munus hoc adhibitum est ad memoriam communitatis abtrahendam ex processu currenti, qui aequivalet isti shmat() Operatio inversa functionis.

int shmdt(const void *shmaddr);
  • 1
  • shmaddr shmat() Redit oratio munere.

Redit 0 si vocationem succedit et -1 si defecerit.

7.4 munus shmctl

Hoc munus memoria communi operabatur.

int shmctl(int shmid, int command, struct shmid_ds *buf);
  • 1
  • shmid shmget() Communis memoria id munus reddidit.
  • mandatum Instructiones ad memoriam operandi communicatam. Si memoriam communicatam delere vis, imple in .IPC_RMID
  • buf * * Oratio de notitia structurae quae communi memoria operatur.

Redit 0 si vocationem succedit et -1 si defecerit.

Nota, utere root Memoria communis creata non potest deleri ab usoribus ordinariis quarumcumque licentiarum factarum.

image-20240711230653886

image-20240711230522921

7.5 Circularis Queue

7.6 Circularis queue ex communi memoria

Redit 0 si vocationem succedit et -1 si defecerit.

7.4 munus shmctl

Hoc munus memoria communi operabatur.

int shmctl(int shmid, int command, struct shmid_ds *buf);
  • 1
  • shmid shmget() Communis memoria id munus reddidit.
  • mandatum Instructiones ad memoriam operandi communicatam. Si memoriam communicatam delere vis, imple in .IPC_RMID
  • buf * * Oratio de notitia structurae quae communi memoria operatur.

Redit 0 si vocationem succedit et -1 si defecerit.

Nota, utere root Memoria communis creata non potest deleri ab usoribus ordinariis quarumcumque licentiarum factarum.

[Imagines externae imagines transferuntur...(img-v6qW3XRA-1720711279572)]

[Imagines externae imagines transferuntur...(img-CG0tGAne-1720711279572)]Defecit translatio imaginis externae paginae. Fons situs anti-leeching mechanismum habere potest. Commendatur ut imaginem servas et eam directe imprimam.
Defecit translatio imaginis externae paginae. Fons situs anti-leeching mechanismum habere potest. Commendatur ut imaginem servas et eam directe imprimam.
Defecit translatio imaginis externae paginae. Fons situs anti-leeching mechanismum habere potest. Commendatur ut imaginem servas et eam directe imprimam.

7.5 Circularis Queue

7.6 Circularis queue ex communi memoria