进程操作

2018-10-09  本文已影响0人  啦啦哇哈哈

一、进程创建

进程树

父进程创建若干子进程,子进程再创建其子进程,依次类推,构成进程树。进程的调度,其实就是在进程树上进行各种调度。
创建的过程,就是:

子进程的资源

获取资源有不同的方式:

一个简单的例子
除了各种物理和逻辑资源外,初始化数据(或输入)一般由父进程传递给子进程。一个进程,功能是在终端屏幕上面显示文件(如img.jpg)的状态。创建时,作为它的父进程的输入,会得到文件img.jpg的名称,并能用此名称打开文件,以及写出内容,得到输出设备的名称等等。

执行代码的顺序

创建新进程时候,有两种执行可能:

新进程的地址空间

有两种可能:

Unix环境创建子进程

  • fork系统调用创建一个新的子进程(fork是创建新进程的系统调用)
  • fork之后,exec系统调用装入一个新程序



    fork完成的一刹那,返回到用户态就完成了创建子进程,子进程和父进程相互独立,而且一模一样,是duplication。唯一不同的是pid,父亲的pid和子的pid不一样。对于父进程fork返回值为子进程的进程标识符,正整数,而对于子进程,fork的返回值为0.


这里的代码就是上面那张流程图的具体实现。子进程调用的execlp是exec()的一个版本,也是系统调用,这里用UNIX命令/bin/ls(列出目录清单)来覆盖其地址空间。而父进程则是调用wait()交出CPU,来等待子进程的完成,并最后exit退出。

关于fork的补充:
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
几乎是完全的复制除了pid,所以子进程的program counter也会和父进程一样,什么意思呢?子进程的执行代码是从fork那句开始的。

二、进程终止

进程终止语义

有两个语义

三、进程间合作

进程都是独立的,有独立的代码,独立的资源申请,独立的运行工作。独立进程不影响其它进程的执行,也不被影响。但是完完全全独立,很多进程干不了任何事情。合作进程影响其它进程,或者受其影响。
进程间合作是必须的,好处有:

共享内存系统

经典案例:生产者-消费者问题



对于Bounded Buffer,缓冲区空了,消费者进程去消费什么?显然要等待啊,而缓冲区满了,生产者还往哪生产?继续生产就撑死了。这就是典型的进程间合作的案例,他们之间相互协作,用两个指针来判断是空了还是满了,参见P87有代码。

Interprocess Communication(IPC)进程间通信

IPC提供一套进程通信、进程同步的机制,消息系统是进程间相互通信的途径。

同步通信和异步通信
上一篇 下一篇

猜你喜欢

热点阅读