Linux高级编程之进程

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</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值