一、进程
1、进程的概念
- 程序:为了实现特定任务的一系列指令的有序合集
- 进程:
- 从用户角度看:进程是程序的一次动态执行过程。
- 从操作系统角度看:
- 进程是系统分配CPU,内存,时间片等系统资源的基本单位。
- 也是系统分配资源的最小单位。
- 每个进程都有自己独立的地址空间和运行状态。
补充:
内核:操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。内核态是操作系统内核所运行的模式,运行在该模式的代码,可以无限制地对系统存储、外部设备进行访问。
2、PCB
进程是程序的一次执行过程,那操作系统就需要有相关的数据结构来保存一个进程的一系列信息,C语言就用结构体来表示。这个结构体叫PCB(Process contrl block)。Linux操作系统下的PCB是:task_struct
操作系统内部有一个PCB链表。用来标识系统内当前所有的进程。
3、程序和进程的区别
- 程序:
代码+数据+data+bss 进程:
代码+数据+PCB+堆栈进程和程序的区别:
1、进程是动态的,程序是静态的。
2、进程的生命周期相对短暂,程序的生命周期相对永久。
3、进程有PCB
4、一个进程只能对应一个程序,一个程序可以对应多个进程。
4、查看进程
# /proc/(pid)
//例: 查看PID为1的进程信息
# /proc/1
二、fork函数
fork用于创建进程
//需要的头文件
#include <unistd.h>
//函数原型
pid_t fork(void);
- fork有两个返回值
如果子进程创建成功,则向父进程返回子进程的pid,向子进程返回0;如果创建失败,则向父进程返回-1
fork的两个返回值那个先返回时不确定的,不同平台不一样 - 父子进程代码共享,数据各自开辟空间,私有一份,采用写时拷贝
- fork之后通常要用if进行分流
#include <stdio.h>
#include <unsitd.h>
#include <sys/types.h>
int main(void)
{
pid_t ret = fork();
if(id < 0)
{
perror("fork");
return 1;
}
else if(id > 0) //父进程
{
printf("I am parent: %d, ret: %d\n",getpid(), ret );
}
else //子进程
{
printf("I am child: %d, ret: %d\n",getpid(), ret );
}
sleep(1);
return 0;
}
【运行结果】:
三、进程状态
- R运行状态(runing):并不意味着进程一定在运行中,它表明进程要么是在运行中,要么在运行队列里。
- S睡眠进程(sleeping):意味着进程在等待事件完成(也可叫做可终端睡眠)。
- D磁盘休眠状态(Disk sleep):有时候也叫不可中断睡眠状态。在这个状态的进程通常会等IO的结束。
- T停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止进程。这个被暂时的进程可以通过发送SIFGCONT信号可以让进程继续运行。
- X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
- 僵尸进程(zombie)
子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。 - 孤儿进程
父进程提前退出,子进程进入Z状态,这是子进程就称为“孤儿进程”
孤儿进程会被1号init进程领养,也有init进程回收。
查看系统支持的信号列表(1-31为普通信号)
# kill -l
kill使用方法
kill -n pid
四、 进程优先级(PIR)
- PIR值越小越快被执行(PIR默认值为80)
- NI就是nice值,表示进程可被执行的优先级的修正数值。
- 加入nice值后,PRI(new) = PRI(old) + nice
- 所以调整进程优先级,在Linux下,就是调整进程nice值。
NI 范围 -20 – 19(值越小,优先级越高)
查看当前进程
# ps -l
- 启动进程前调整:nice
//nice
# nice -n -5 ./test
- 调整已存在进程的nice:
# renice -5 -p 5200 //5200为进程PID
- top命令更改已存在进程的nice:
# top
//进入top后按“r”->输入进程PID->输入nice值
nice不是进程优先级,他们不是一个概念,但他可以更改进程优先级
五、环境变量
- name = val #定义本地变量,只能在当前进程使用,不能在子进程使用。
- 将本地变量变成环境变量 export name,环境变量可以在本进程和子进程使用,但不能在父进程使用
- unset name 删除变量
- 查看系统到底有哪些环境变量:
# env
HOME:指定用户的主工作目录
HISTSIZE:保存历史命令记录的条数
PATH:指定命令的搜索路径
SHELL:当前shell,它的值通常为/bin/bash。
系统会为我们定义很多环境变量:
/etc/profile
~/.bash_profile程序中如何获得环境变量:
//1. 获取环境变量值
char *getenv(const char *name)
//2.设置环境变量
int putenv(const char *name) // "name=value"