3、进程描述
进程是进程实体的运行过程,是系统进行_资源分配_和_调度_的一个独立单位。
为了使参与并发执行的每个程序(含数据)都能独立地运行,在操作系统中必须为之配置一个专门的数据结构PCB(进程控制块Process Control Block), 系统利用PCB来描述进程的基本情况和活动过程,进而控制和管理进程。
由程序段、相关的数据段和PCB三部分便构成了进程实体(进程) ,所谓创建进程实质上就是创建PCB
3.1 进程的基本状态及切换
(1) 就绪状态
这是指进程已处于准备好运行的状态,即进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行。如果系统中有许多处于就绪状态的进程,通常将它们按照一定的策略(如优先级策略)排成一个队列,称该队列为就绪队列。
(2) 执行状态
**这是指进程已获得CPU,其程序正在执行的状态。**对任何一个时刻而言,在单处理机系统中,只有一个进程处于执行状态,而在多处理剂中有多个进程处于执行状态(并行)
(3) 阻塞状态
这是指正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行时的状态,即进程执行受到阻塞。 此时引起进程调度,OS吧处理机分配给另一个就绪进程,而让受阻进程处于暂停状态,一般讲这种暂停状态称为阻塞状态。 通常系统将处于阻塞状态的进程也排成一个队列,称为阻塞队列。 实际上,在较大的系统中,为了减少队列操作的开销,提高系统效率,根据阻塞原因的不同,会设置多个阻塞队列。
4、 进程控制
4.1进程标识
每个进程都有一个非负整数标识的唯一进程ID。因为进程ID标识符总是唯一的,常将其用作其他标识符的一部分以保证唯一性。
虽然是唯一的,但是进程ID是可复用的。当一个进程终止后,其进程ID就成为复用的候选者。
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void); //返回值: 调用进程的进程ID
pid_t getppid(void); //返回值:调用进程的父进程ID
4.2 fork函数
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);//返回值: 子进程返回0, 父进程返回子进程ID, 若出错,返回-1
由fork创建的新进程被称为子进程(child process)。 fork函数调用一次,但返回2次
子进程 返回0, 父进程返回值是子进程的进程ID
fork函数调用成功后,将为子进程申请PCB(进程控制块)和用户内存空间。子进程将会复制父进程的几乎所有信息,在用户空间将复制父亲用户空间的所有数据(代码段、数据段、BSS、堆、栈),复制父亲进程内核空间PCB中的绝大多数信息。子进程从父进程继承下列属性:有效用户/组号、进程组号、环境变量、对文件的执行时关闭标志、信号处理方式设置、信号屏蔽集合、当前工作目录、根目录、文件模式掩码、文件大小限制 、打开的文件描述符(共用同一个文件表项)
子进程是父进程的副本。例如,子进程获得父进程数据空间、堆和栈的副本。注意,这是子进程所拥有的副本。父进程和子进程并不共享这些存储空间部分。
子进程是从fork函数返回处 开始执行
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(int</