[LinuxFocus-icon]
��ҳ  |  վ���ͼ  |  ����  |  ����

���� | �����ڿ� | ���� | ����LF
This document is available in: English  Castellano  ChineseGB  Deutsch  Francais  Italiano  Nederlands  Russian  Turkce  Polish  

[Leonardo]
by Leonardo Giordani
<leo.giordani(at)libero.it>

��������:

�������������ѧԺ���ߵ繤��ϵѧ�����������Ա�������ڱ�̣���Ҫʹ�û���C/C++���ԣ���1999���Ժ������ֻ��Linux/Unix�¹�����
Ŀ¼:


 

Concurrent programming - Principles and introduction to processes

[run in paralell]

ժҪ:

��ϵ����������������߽��ܶ�������(multitasking)�������Linuxϵͳ�е�ʵʩ�����Ȳ����������������ۻ��������󽲽�һ��ʹ�ü򵥸�Ч��ͨѶЭ������ʾ���̼�ͨѶ�������������豳��֪ʶ��

���ж��ֲ�ҳ(man page)�����÷��������������С�����glibc������gnu infoҳ��˵����info Libc������konqueror�м���info:/libc/Top����



 

���

����ϵͳ��ʷ������Ҫ��ת�۵�֮һ���Ƕ��������ƣ�multiprogramming������ij��֣�����һ�ֽ���ִ�У�interlacing�����������Դﵽ��ϵͳ��Դ���ȶ�����Ŀ�ĵļ���������һ�£���һ̨����վ�ϣ��û�����ͬʱ�����ִ���������Ƶ����������ӡ���У�������������������ִ�����ϵͳ��һ����Ҫ����������ٵ����ӽ������ڼ���������е����г����к�С��һ���֣��������Ǻ�����עĿ��visual-striking����  

���̸���

����ִ�г���������ϵͳ���������ĸ��ӻ���Ϊ�˷�ֹ��������ʱ�����ͻ����ȻҪ������������ʱ�����������Ϣ��װ������

��̽��Linuxϵͳ�ڲ�ϸ��ǰ�������ȶ���һЩ�������һ�����е�����PROGRAM��, ��ijһʱ�̣����루CODE������ɳ����ָ��ڴ�ռ䣨MEMORY SPACE���DZ���������ռ�õIJ����ڴ棬������״̬��PROCESSOR STATUS����΢�������IJ����������ǣ�flag���ͳ����������Program Counter����һ��Ҫ��ִ�е�ָ��ĵ�ַ����

���Ƕ�������̬����RUNNING PROGRAM��Ϊ���룬�ڴ�ռ䣬������״̬�ȶ���ļ��ϡ��ڼ�������е�ijһʱ�̣����DZ���һ������̬��������ݣ�������һ����̬��������ݲ�ִ�У�֮�����ô˳������ǰ�жϴ�����ִ�У����ʵ����ǰ�����Ľ���ִ�С����̣�PROCESS��������TASK������������������̬����

���ǽ���һ�¼�����ᵽ�Ĺ���վ�����л��ƣ�����һʱ�̶�ֻ��һ��������ִ�У�������������ͬʱ�������£��������ִ�����Ĵ��룬�ڳ���һʱ��Σ�QUANTUM���������֮�󱣴��������ݲ�������һ�Ⱥ���̵����ݣ�ִ��һʱ��κ��л����������ν�Ķ���������

���������Ķ���������������������Ҫ��������д󲿷��Dz��ܱ����ӵģ�����ȴ����̶��еĹ�����SCHEDULING����Ȼ�����Dz���ϵͳ���ʱҪ���ǵ����⣬���ǻ����Ժ�����������ۣ�Ҳ��Ҳ������һЩLinux�ں˴��롣  

Linux/Unix����

�ܹ���ʾ����������н�����Ϣ��������ps(1)�����ǡ�����״̬��process status��������д����shell���ڲ�����ps�����Եõ����������

  PID TTY          TIME CMD
 2241 ttyp4    00:00:00 bash
 2346 ttyp4    00:00:00 ps

���������������������������������ǿ���˵�����⣺ps�и��������дӵ�ǰ�ն����еĽ��̡����һ�и��������д˽��̵����������mozilla����Mozilla Web���������gcc����GNU������������ȻpsӦ�ó���������У�������Ϊps�г��������еĽ���ʱ�䱾��Ҳ�������С��������һ������Bourne Again Shell���������ڴ��ն��ϵ�shell��

�����ݲ�����TIME�к�TTY�У�������PID��Process IDentifier�����̱�־�����С�pid�Ƿ����ÿһ���̵������������㣬���ظ������ڽ��̽���������ظ�ʹ�ã��ڽ��������ڼ䱣�ֲ��䡣��������ļ����������ps�õ��Ľ������������ӿ��ܲ���һ�������Ǵ�����һ��shell���ڲ�����ps��ͬʱ�����ر�ǰһshell���ڡ����ǵõ�ͬ�����������ǽ��̱�־����һ����֤���˼�ʹ����ͬ�ij���Ҳ�����Dz�ͬ�Ľ��̡�

���ǿ����г�Linuxϵͳ�����е����н��̣�Linux�ֲ�ҳ���ᵽps��-eѡ����ν�š�ѡ�����н��̡��� ��shell�������롰ps -e�������Եõ�������������ͬ��ʽ�ij����Ľ����б���Ϊ�˷��������������ǽ�ps������ض���ps.log�ļ��У�

ps -e > ps.log

�������ǿ���ʹ������ϲ���ı༭���Ķ��ͱ༭����ļ������߽���ʹ��less����������¿�ʼ�������������еĽ�������������Ԥ�ڵĶࡣ�ڴ�ָ�������������������������Ľ��̣�ͨ�������л�ͼ�λ���������������������һЩ���̣�������Щ���ֺ���֡�����Ľ��������ͽ������������ϵͳ���þ���������������һЩ��ͬ�㡣���ȣ��������������ϵͳ��pidΪ1�Ľ��̱�Ȼ��init���̣����������������̵ĸ����̡�init������Զ�Dz���ϵͳ������ִ�еĽ��̣����ӵ�е�pidΪ1����һ����Ҫָ�����ǣ���������������������d��β�Ľ��̣����DZ���Ϊ�ػ����̣�daemon������ϵͳ������Ҫ��һЩ���̡��й�init���̺��ػ����̵�ϸ�ڽ����Ժ�����������ۡ�  

libc�еĶ�������

�������ڲ����˽��̵ĸ��������ϵͳ�е���Ҫ�ԣ����潫����һЩ������������Ĵ��룺�Ӽ򵥵Ľ���ͬʱִ�е����н��̼�ͨ�ź�ͬ����synchronization�������ǽ����۽��̼�ͨ�ź�ͬ������������Ľ����������Ϣ��message�����ź�����semaphore������������Ϣ������ڴ˻����Ͽ��������Լ���Ӧ�ó����ź��������Ժ�������к��̣߳�thread��һ��������ۡ�

C���Ա�׼�⺯����libc����Linux����glibcʵʩ��ʹ��Unix System V�Ķ����������ơ�Unix System V�����ڳ�ΪSysV����һ����ҵ����Unixʵʩ�汾������������Ҫ��Unix����֮һ�Ļ�������һ��Unix����Ļ�����BSD Unix��

��libc����������pid_t������Ϊ�ܹ�����pid�������������ڿ�ʼ������pid_t���ͱ�ʾpid��ֵ������������һЩ����Ȼ�����Ϳ���ͬ������pid��ֵ��

���º������ص��ô˺����Ľ��̵�pid��

pid_t getpid (void)

��pid_t��unistd.h��sys/types.h�ж��壩���DZ�дһ����������������Լ���pid������ϲ���õı༭���м������´��룺

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>

int main()
{
  pid_t pid;

  pid = getpid();
  printf("The pid assigned to the process is %d\n", pid);

  return 0;
}
�������Ϊprint_pid.c�����룺
gcc -Wall -o print_pid print_pid.c
����������һ����Ϊprint_pid�Ŀ�ִ�г��������ǰĿ¼û�а�����path���������У���Ҫ�á�./print_pid��������ִ�д˳���ִ�н�������������Ǹе����⣺���һ�������������ִ�ж�Σ�������������������ֵ�����̶�����Ϊ�����������������print_pidִ�м����С����磬����������print_pidִ�м�����ps��

����������δ������̣���������һ�´����Ĺ��̡���һ�����򣨽���A����������һ������Bʱ��������������ͬ�ġ���������ͬ�Ĵ��룬�ڴ�ռ��������ͬ����ͬ���ڴ�ռ䣩��������״̬��ͬ����֮������в�ͬ��ִ�����̡���������û������ijЩ������ݵIJ�ͬ����ͬ������A�Ǹ����̶�����B���ӽ��̣��������ǿ��Ը��õ��˽�Ϊʲôinit�����������������̵ĸ����̡������½��̵ĺ���Ϊ��

pid_t fork(void)
����������Դ����ʹ���̵�ִ��·���ֲ�����ԣ�����ֵ��pid��ֵ��ע����ǣ���ǰ���̸����Լ����ɸ����̺��ӽ��̣�����������һ�𽻴�ִ�У���ɲ�ͬ�Ĺ����������Ƹո����ʱ��һ�����̻ᱻִ�У������̻����ӽ��̣��𰸺ܼ򵥣�����֮һ��������ע��Ҳ���ܶ��߶���ִ�У�����ϵͳ���ȳ������ִ���ĸ����̣����������ĵȴ�ִ�еĽ����Ǹ����̻����ӽ��̣������㷨����������������

֪���ĸ�������ִ������Ҫ�ģ���Ϊ���ǵĴ�����ͬ���������̶����������̺��ӽ��̵Ĵ��룬����ÿ�����̶�ִֻ�����е�һ���֡�Ϊ�˳���˸�����ǿ��������㷨��

- FORK
- IF YOU ARE THE SON EXECUTE (...)
- IF YOU ARE THE FATHER EXECUTE (...)
�����㷨��α��������������ʵ��fork�������ӽ����з���0���ڸ������з����ӽ��̵�pid�����Ը���fork�������ص�pid�Ƿ�Ϊ0������Ч���ж�������Ҫִ���IJ��ִ��롣�����㷨����C���Գ����У�
int main()
{
  pid_t pid;

  pid = fork();
  if (pid == 0)
  {
    CODE OF THE SON PROCESS
  }
  CODE OF THE FATHER PROCESS
}
�������DZ�д��һ�������Ķ��������������´�����Դ�Ϊfork_demo.c����ǰ���������룬�����е��кſ��Է����Ķ������ڱ���ʱҪɾ�����˳��򴴽�һ���ӽ��̣�Ȼ�󸸽��̺��ӽ��̷ֱ����һЩ�ַ������û�г����Ļ��������̺��ӽ���Ӧ�ý��������
(01) #include <unistd.h>
(02) #include <sys/types.h>
(03) #include <stdio.h>

(04) int main()
(05) {
(05)   pid_t pid;
(06)   int i;

(07)   pid = fork();

(08)   if (pid == 0){
(09)     for (i = 0; i  < 8; i++){
(10)       printf("-SON-\n");
(11)     }
(12)     return(0);
(13)   }

(14)   for (i = 0; i < 8; i++){
(15)     printf("+FATHER+\n");
(16)   }

(17)   return(0);
(18) }

(01)-(03)�����Ҫ��ͷ�ļ�����׼I/O��������������
main������GNU�����������ڳ�������������û�д��������·���0����������򷵻ش���(05)����pid���ͣ�(06)����ѭ�����Ʊ�����������������ʵ����ͬ�ģ����ڴ�Ϊ���ó������������ֿ�����
(07)����fork���������ӽ����з���0���ڸ������з����ӽ���pid������ֵ��(08)�в��ԡ��ӽ���ִ��(09)-(13)��������ִ��(14)-(16)��
�����ִ�������Ǹ����̻����ӽ��̷ֱ����8���ַ�����-SON-���͡�+FATHER+����Ȼ�󷵻�0����������0�������ӽ��̺���Ҫ����Ϊ�ӽ���ѭ����������������أ������ִ�и����̵Ĵ��루��������һ�£��Լ�����޺���ֻ���޷���ȷ��������������Ĺ��ܣ�����Ϊ�����������������Ǹ��ӳ��򣩵Ķ�����н����һ����ͬ����������������ױ����֣�������ݽ�����Գ���ͨ����̫���ܡ�

����ܶ�ִ�н���������⣺�������̲���һ���ϸ�ؽ�����������������Ϊ����ѭ����ִ���ٶȿ��ܲ�ͬ�����������������һ�顰+FATHER+���ַ�������һ����-SON-"�ַ������������෴������ִ�ж�γ�����ᷢ����������仯��

��printf����ǰ����һ��������ӳٻ�ʹ���������������ж�������Ч����������sleep��rand������ʵ�֡�

sleep(rand()%4)
���ʹ���̹���0��3֮���һ�����������%�������������������������ڴ����Ϊ��
(09)  for (i = 0; i < 8; i++){
(->)    sleep (rand()%4);
(10)    printf("-FIGLIO-\n");
(11)  }
��������Ҳ��ͬ�����޸ģ���Ϊfork_demo2.c��Ȼ�����ִ�С������ִ���ٶȱ����������ǿ��Թ۲쵽���˳��ĸı䡣
[leo@mobile ipc2]$ ./fork_demo2
-SON-
+FATHER+
+FATHER+
-SON-
-SON-
+FATHER+
+FATHER+
-SON-
-FIGLIO-
+FATHER+
+FATHER+
-SON-
-SON-
-SON-
+FATHER+
+FATHER+
[leo@mobile ipc2]$

������������һ���µ����⣺��һ�����д��������и����̿��Դ���һ���������ӽ��̣��ӽ���ִ�еIJ����͸�����ִ�еIJ�����ͬ�������̾�����Ҫ���ӽ���ͨ�Ż�����Ҫ���ӽ���ͬ����synchronize��������ȷ��ʱ��ִ���ض����������̼�ͬ���ĵ�һ�ֽ�������ǵ���wait������������ע��synchronizationͨ��ָ���̻��̼߳��ֹͬʱ��д��ͬ������ϵͳ��Դ�Ļ��ƣ��ڴ�����ָ��������֪���ӽ��̽�����ʱ�䣩

pid_t waitpid (pid_t PID, int *STATUS_PTR, int OPTIONS)
PID�����ǵȴ������Ľ��̵�pid��STATUS_PTR��ָ���ӽ���״̬������ָ�루�粻��Ҫ����Ϣ����ΪNULL����OPTIONS��һЩѡ��������ڲ���Ҫ���ǡ�������һ�������̴����ӽ��̲��ȴ�����������ӣ�
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>

int main()
{
  pid_t pid;
  int i;

  pid = fork();

  if (pid == 0){
    for (i = 0; i < 14; i++){
      sleep (rand()%4);
      printf("-SON-\n");
    }
    return 0;
  }

  sleep (rand()%4);
  printf("+FATHER+ Waiting for son's termination...\n");
  waitpid (pid, NULL, 0);
  printf("+FATHER+ ...ended\n");

  return 0;
}
�������Ѽ���sleep�����ĵ��ã���ʹ����������С����˳����Ϊfork_demo3.c������ִ�С��������Ǿ�����˵�һ��ͬ���Ķ�����������

��ƪ���������ǽ����۸���Ľ��̼�ͨ�ź�ͬ�����⡣���ǿ�����������ܵĺ�����д���򲢷����ң������ҿ��������е�һЩ��Ϊ������ʹ���ʵ�����뷢�ʹ�ע�͵�C�ļ��Ͱ�������˵����������֣�email��ַ��˵���ļ����ҡ�  

�Ƽ��Ķ�����

 

����ƪ���·�������

ÿƪ���¶��и��Եķ���ҳ�档�����ҳ����������ύ���ۣ�Ҳ���Բ鿴�������ߵ����ۣ�
 ����ҳ�� 

��ҳ��LinuxFocus�༭��ά��
© Leonardo Giordani, FDL
LinuxFocus.org

���������LinuxFocus��������������
������Ϣ:
it --> -- : Leonardo Giordani <leo.giordani(at)libero.it>
it --> en: Leonardo Giordani <leo.giordani(at)libero.it>
en --> zh: ztyus <ztyus(at)yahoo.com>

2003-04-06, generated by lfparser version 2.25