Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17390
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-04 10:14
文章分类
文章存档

2013年(12)

我的朋友

分类: C/C++

2013-12-08 21:31:00

下面是百度百科对于多进程的解释

UNIX操作系统是分时。在处理过程中,将CPU时间片分配给每个进程。由于每个进程都有各自的运行环境,因此在进程状态转换控制过程中要考虑处理不同的内容数据:
1)
用户数据保存:包括正文段(TEXT)、、(Stack)和段;
2)
寄存器数据保存:包括PC(指向下一条要执行地址 )、PSW(处理机状态)、SP()PCBP(指针),FP(指向堆栈中一个 函数的Local的地址)、AP(指向堆栈中的位置)、ISP(中断堆栈指针)及其他等。
3) 系统层次保存:包括管理表格,。
当该进程再得到CPU时间片时,能够从“”处开始正常地运行处理。

这个是转载别人的:

  2.1 Linux下进程的结构
   Linux下一个进程在内存里有三部分的数据,就是"代码段"、"堆栈段"和"数据段"。其实学过汇编语言的人一定知道,一般的CPU都有上述三种段寄存器,以方便操作系统的运行。这三个部分也是构成一个完整的执行序列的必要的部分。
   "代码段",顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用相同的代码段。"堆栈段"存放的就是子程序的返回地址、子程序的参数以及程序的局部变量。而数据段则存放程序的全局变量,常数以及动态数据分配的数据空间(比如用malloc之类的函数取得的空间)。这其中有许多细节问题,这里限于篇幅就不多介绍了。系统如果同时运行数个相同的程序,它们之间就不能使用同一个堆栈段和数据段。

  2.2 Linux下的进程控制
   在传统的Unix环境下,有两个基本的操作用于创建和修改进程:函数fork( )用来创建一个新的进程,该进程几乎是当前进程的一个完全拷贝;函数族exec( )用来启动另外的进程以取代当前运行的进程。Linux的进程控制和传统的Unix进程控制基本一致,只在一些细节的地方有些区别,例如在Linux系统中调用vfork和fork完全相同,而在有些版本的Unix系统中,vfork调用有不同的功能。由于这些差别几乎不影响我们大多数的编程,在这里我们不予考虑。
   2.2.1 fork( )
   fork在英文中是"分叉"的意思。为什么取这个名字呢?因为一个进程在运行中,如果使用了fork,就产生了另一个进程,于是进程就"分叉"了,所以这个名字取得很形象。下面就看看如何具体使用fork,这段程序演示了使用fork的基本框架:

##########################################################################################################


在linux下创建进程有两个函数:
    1.pid_t  fork():    头文件:#include  #include
                             fork()的返回值pid_t实质上是int型:定义在在#include<sys/types.h>中;
                              在程序中调用fork()会产生两次返回,用于区分子进程和父进程:子进程时返回值为0,父进程时返回值为子进程的ID
                  
  例子:                                

#include
#include
#include

int main()
{
 pid_t ret;
 
 ret=fork();
 
 if(ret==0)
 {
  //子进程
  printf("this is child process!\n");
 }
 else if(ret>0)
 {
  //父进程
  printf("this is parent process!\n");
 }
 else
  exit(1);//创建失败
 
 return 0;
}
编译运行后两个printf都会打印出来,他们的先后是随机的;
    
    2.pid_t vfork():头文件:#include
                                       在创建子进程后将会是子进程先运行
例子:

#include
#include
#include

int main()
{
 pid_t ret;
 
 ret=vfork();
 
 if(ret==0)
 {
  //子进程
  printf("this is child process!\n");
 }
 else if(ret>0)
 {
  //父进程
  printf("this is parent process!\n");
 }
 else
  exit(1);//创建失败
 
 return 0;
}
编译运行后将先打印this is child process!后打印this is parent process!

####下面简单介绍一下fork()和vfork()的区别
1.fork():子进程将拷贝父进程的数据段和堆栈段;vfork():子进程将与父进程共享数据段和堆栈段
例子

#include
#include
#include

int main()
{
 pid_t ret;
 int count=0;
 
 ret=fork();
 count++;
 printf("count:%d\n",count); 

 return 0;
}
编译运行结果:两个count打印的都是1
如果将fork()换成vfork()运行结果是:

2.fork():子进程和父进程的运行顺序将是随机的;vfork():将是子进程先运行

#include
#include
#include

int main()
{
 pid_t ret;
 
 ret=fork();
 if(ret==0)
 {
  for(int i=0;i<10;i++)
   printf("child\n");
 }
 else if(ret>0)
 {
  for(int i=0;i<10;i++)
   printf("parent\n");
 }
 else
  exit(1);//创建失败
 
 return 0;
}

结果将看到:child   和parent 随机输出
如果将fork()换成vfork()运行结果是:输出child

若fork()想让子进程先运行可以在父进程中使用wait()函数

阅读(166) | 评论(0) | 转发(0) |
0

上一篇:顺序表练习1

下一篇:进程通信-管道通信

给主人留下些什么吧!~~