fork引发的问题

今天看了fork的一些问题,然后引发了下面的一些问题。

题目:

int main(void)
{
  int i=0;
  printf("i son/pa ppid pid fpid/n");
  //ppid指当前进程的父进程pid
  //pid指当前进程的pid,
  //fpid指fork返回给当前进程的值
  for(i=0;i<2;i++)
	{
	  pid_t fpid=fork();
	  if(fpid==0)
	  	printf("%d child %4d %4d %4d/n",i,getppid(),getpid(),fpid);
	  else
	  	printf("%d parent %4d %4d %4d/n",i,getppid(),getpid(),fpid);
  }
  return 0;
}
int main()
{
    pid_t pid1;
    pid_t pid2;
    pid1 = fork();
    pid2 = fork();
    printf("pid1:%d, pid2:%d\n", pid1, pid2);
}
以上两个题目的问题如下:

1、进程和线程的区别是什么?

2、请说出执行这个程序后,将一共运行几个进程。

3、打印输入结果,进程号不做要求。

我感觉这些问题的出错主要是对进程的不了解,特别是父子进程执行过程和父子进程的地址空间问题

进程和线程的区别:

进程概念 
  进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。 
  在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发功能的单位是线程。
线程概念 
  线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。例如,假设用户启动了一个窗口中的数据库应用程序,操作系统就将对数据库的调用表示为一个进程。假设用户要从数据库中产生一份工资单报表,并传到一个文件中,这是一个子任务;在产生工资单报表的过程中,用户又可以输人数据库查询请求,这又是一个子任务。这样,操作系统则把每一个请求――工资单报表和新输人的数据查询表示为数据库进程中的独立的线程。线程可以在处理器上独立调度执行,这样,在多处理器环境下就允许几个线程各自在单独处理器上进行。操作系统提供线程就是为了方便而有效地实现这种并发性 
引入线程的好处 
(1)易于调度。 
(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。 
(3)开销少。创建线程比创建进程要快,所需开销很少。。 
(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。 
进程和线程的关系 
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。 
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。 
(3)处理机分给线程,即真正在处理机上运行的是线程。 
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

我自己画的fork分析图

父子进程的空间和执行过程

进程和线程区别,摘抄自http://blog.ednchina.com/beihai084/233649/message.aspx,谢谢原作者~~~

问题一来自http://blog.sina.com.cn/s/blog_7582409f0100v6cp.html,讲的很详细

问题二来自http://www.cnblogs.com/leoo2sk/archive/2009/12/11/talk-about-fork-in-linux.html 同样很好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值