您的位置:首页 > 产品设计 > UI/UE

APUE读书笔记-第8章进程控制

2013-07-29 10:33 337 查看
第8章 进程控制

8.1 引言

*进程控制包括创建新进程、执行程序、进程终止

8.2 进程标识符

*每个进程都有一个非负整型的唯一进程ID。因为进程ID标识符总是唯一的,常将其用作其它标识符的一部分以保证其唯一性。例如,应用程序有时就把进程ID作为名字的一部分来

创建一个唯一的文件名

*ID为0的进程通常是调度进程,常常被称为交换进程(swapper)

*ID为1的进程通常是init进程,在自举过程结束时由内核调用

*ID为2的进程在某些UNIX的虚拟存储器实现中,页守护进程(pagedaemon)。此进程负责支持虚拟存储系统的分页操作

8.3 fork函数

*由fork创建的新进程被称为子进程(child process)

*fork函数被调用一次,但返回两次。两次返回的唯一区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID

*由于在fork之后经常跟随着exec,所以现在的很多实现并不执行一个父进程数据段、栈、堆的完全复制。作为替代,使用了写时复制(Copy-On-Write,COW)技术

*在fork之后处理文件描述符有两种常见的情况

(1)父进程等待子进程完成。

(2)父子进程各自执行不同的程序段

8.4 vfork函数

*vfork与fork相同之处:都创建一个子进程

*vfork与fork不同之处:

(1)vfork并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec/exit,于是也就不会存访该地址空间。相反,在子进程调用exec/exit之前,它在父进程的空

间中运行

(2)vfork保证子进程先运行,在它调用exec/exit之后父进程才可能被调度运行。

8.5 exit函数

*进程有五种正常终止方式:

(1)在main函数内执行return语句

(2)调用exit函数

(3)调用_exit或_Exit函数

(4)进程的最后一个线程在其启动例程中执行返回语句

(5)进程的最后一个线程调用pthread_exit函数

*三种异常终止方式:

(1)调用abort

(2)当进程接收到某些信号时

(3)最后一个线程对"取消(cancellation)"请求做出响应

*在UNIX术语中,一个已经终止、但是父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占用的资源)的进程被称为僵死进程(zombie)

8.6wait和waitpid函数

*调用wait或waitpid的进程可能会发生这些情况:

(1)如果其所有子进程都还在运行,则阻塞

(2)如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回

(3)如果它没有任何子进程,则立即出错返回

8.7 waitid函数

*与waitpid相似,waitpid允许一个进程指定要等待的子进程。但它使用单独的参数表示要等待的子进程类型,而不是将此ID或进程组ID组合成一个参数。

8.8 wait3和wait4函数

资源统计信息包括用户CPU时间总量,系统CPU时间总量,页面出错次数,接收到信号的次数等。

8.9 竞争条件

*当多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程运行的顺序时,则我们认为这发生了竞争条件(race condition)

*为了避免竞争条件和轮询,在多个进程之间需要有某种形式的信号发送和接收的方法。在UNIX中可以使用信号机制,也可使用各种形式的进程间通信(IPC)

8.10 exec函数

*exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段

*用fork可以创建新进程,用exec可以执行新程序,exit函数和两个wait函数处理终止和等待终止

8.11 更改用户ID和组ID

*一般而言,在设计应用程序时,我们总是试图使用最小特权模型(least privilege)。依照此模型,我们的程序应当只具有为完成给定任务所需的最小特权

8.12 解释器文件

*所有现今的UNIX系统都支持解释器文件(interpreter file)。这种文件是文本文件,其起始行的形式是

#! pathname [optional-argument]

感叹号和pathname之间的空格是可选的,最常见的解释器文件以下列行开始:

#!/bin/sh

8.13 system函数

*使用system函数而不是直接使用fork和exec的优点是:system进行了所需的各种出错处理,以及各种信号处理



8.14 进程会计

*大多数UNIX系统提供了一个选项进行进程会计(process accounting)处理。启用该选项后,每当进程结束时内核就写一个会计记录。典型的会计记录包含总量最小的二进制数据,一般包括命令名、所使用的CPU时间总量、用户ID和组ID、启动时间等



8.15进程标识

*如果一个用户有多个登录名,这些登录名又对应着同一个用户ID,该怎么获取运行某一程序的用户登录名呢?系统通常记录用户登录时使用的名字,用getlogin函数可以获取此登录名。



8.16进程时间

*任一进程都可调用times函数以获得它自己及已终止子进程的墙上时钟时间、用户CPU时间、系统CPU时间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: