Chinaunix首页 | 论坛 | 博客
  • 博客访问: 376272
  • 博文数量: 80
  • 博客积分: 1750
  • 博客等级: 上尉
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-13 11:35
文章分类
文章存档

2014年(3)

2013年(1)

2012年(54)

2011年(22)

分类: C/C++

2012-07-19 13:51:35

进程与fork
     Linux系统的一个重要的特点就是可以同时启动多个进程。由OS的定义有进程是OS资源管理的最小单位;进程是程序的一次执行形成的动态实体,在执行的过程中拥有独立的内存单元,每个进程都通过唯一的进程ID表示
 
    进程被创建时分配一个唯一的表示ID,当一个进程结束时,释放所占有的资源,包括ID标识
 
    进程的创建方式:1、由系统创建(系统进程),它们之间是平等的;2、它的父进程创建(系统调用fork创建进程),子进程和父进程有隶属关系,子进程可以创建进程,子进程可以继承父进程几乎所有资源。
 
    fork函数:调用一次返回两个值,一个是父进程调用fork函数的返回值为子进程的进程ID;另一个是子进程中fork函数的返回值“0”(0表示成功调用)。创建失败返回“-1”
 
一个简单的fork例子

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<unistd.h>
  4. #include<sys/types.h>

  5. int main(void)
  6. {
  7.     pid_t pid;
  8.     
  9.     printf("Process Creation Study\n");
  10.     pid = fork();
  11.     switch(pid){
  12.        case 0:
  13.          printf("ChildP running, CurPid is %d, ParentPid is %d\n", pid, getppid());
  14.          break;
  15.        case -1:
  16.          perror("Process creation failed\n");
  17.          break;
  18.        default :
  19.          printf("ParentP running, ChildPid is %d, ParentPid is %d\n", pid, getpid());
  20.     }
  21. exit(0);
  22. }

 
linux进程的状态
  • 运行状态:进程正在运行或在运行队列中等待运行
  • 可中断等待状态:进程正在等待某个时间完成的过程中可以被信号或定时器唤醒
  • 不可中断等待状态:进程正在等待某个时间完成的过程中不可以被信号或定时器唤醒
  • 僵死状态:进程已终止,但进程描述符仍在,需父进程调用wait释放
  • 停止状态:进程收到SIGSTOP,SIGSTP,SIGTIN,SIGTOU信号后停止运行
fork和vfork的异同
  1. 都是一次调用返回两个值
  2. fork创建子进程,子进程仅完全复制父进程的资源,这样的子进程独立于父进程
  3. vfork创建的子进程父进程的地址空间,子进程对该地址空间的任何修改为父进程所见
  4. fork创建的子进程,哪一个先运行取决于OS的调度算法
  5. vfork保证子进程先运行,只有在调用exec或exit,父进程才可能被调度运行

fork创建进程会使系统的开销很大,这些开销并不是所有情况都需要的;vfork不会拷贝父进程的地址空间,大大的减少了系统开销。

进程终止顺序不通产生的效果:

  • 父子进程的终止先后顺序不通会产生不通的结果
  • 父进程先于子进程退出,则子进程会被init进程接管
  • 子进程先于父进程终止,若父进程又没有调用wait函数等待子进程结束,子进程进入僵死状态

僵死状态的进程(僵尸进程):进程处于僵死状态时,内存只保留该进程的一些必要信息(PCB)以备父进程所需,此时子进程始终占用着资源,同时也减少了系统可以创建的最大进程数;如果子进程先于父进程终止,且父进程调用了wait,则父进程会等待子进程结束。

 

  
阅读(878) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~