[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