一、进程概念
进程:程序动态执行的过程,包括创建、调度、消亡
程序:存放在外存中的一段代码的集合
二、进程相关命令
1.top
根据CPU占用率动态查看进程信息
2.ps -ef
查看当前时刻所有进程的信息
3.ps -aux
查看当前时刻进程的信息
4.pstree
查看进程关系
5.kill -9 PID
杀死PID对应的进程
6.killall -9 进程名
杀死进程名对应的所有进程
三、进程内容
-
进程的创建
进程被执行后,操作系统为进程分配进程空间:
1.文本段
文本区
代码、指令
2.数据段
数据区
字符串常量
未初始化静态变量/全局变量
已初始化静态变量/全局变量
3.系统数据段
堆:程序手动管理malloc 申请 free释放
栈:操作系统管理
进程空间:是独立的,每个进程占用独立的内存空间,不同的进程不存在共享空间
-
进程的调度
宏观并行,微观串行
内核进程调度算法
1.先来先执行,后来后执行
2.高优先级调度算法
3.时间片轮转调度算法
时间片:CPU在某段任务执行的一段时间
4.多级队列反馈调度算法
5.负载均衡调度算法
-
进程的状态
R运行态、就绪态
S 睡眠态、可唤醒等待态
D不可唤醒等待态
T 暂停态
Z僵尸态
X结束态
四、进程相关函数接口
1.fork
pid_t fork(void);
功能:
创建一个子进程
参数:
缺省
返回值:
成功在父进程中返回子进程PID
在子进程中返回0
失败返回-1
2.getpid
pid_t getpid(void);
功能:
获得调用该函数的进程的PID
3.getppid
pid_t getppid(void);
功能:
获得调用该函数父进程的ID
写时拷贝:
调用fork创建子进程,子进程空间不会立即被创建,只有当父进程或子进程空间中数据发生修改时,才会触发拷贝
4.exit
void exit(int status);
功能:
进程退出
参数:
status:进程结束的状态
返回值:
缺省
5._exit
void _exit(int status);
功能:
进程退出
参数:
status:进程结束的状态
返回值:
缺省
僵尸进程:
代码执行结束,空间没有被回收
1.父进程先结束,子进程会成为孤儿进程,被系统进程收养,子进程再结束,被系统进程回收空间
2.父进程在进程结束时回收子进程空间
6.wait
pid_t wait(int *wstatus);
功能:
回收子进程空间
参数:
wstatus:存放子进程结束状态空间首地址
返回值:
成功返回回收到子进程的ID
失败返回-1
wait具有阻塞功能
WIFEXITED(wstatus)
判断是否正常结束
WEXITSTATUS(wstatus)
获得正常结束时返回的值
WIFSIGNALED(wstatus)
判断是否被信号杀死
WTERMSIG(wstatus)
获得杀死进程任务的信号编号
作用:
1.回收子进程空间
2.具有同步功能
7.waitpid
pid_t waitpid(pid_t pid, int *wstatus, int options);
功能:
回收子进程空间
参数:
pid:想要回收的子进程空间对应的PID
-1回收任意一个子进程空间
wstatus:存放进程状态空间首地址
options:
0:阻塞回收子进程空间
WNOHANG:非阻塞回收子进程空间
返回值:
成功返回回收到的子进程空间
失败返回-1
非阻塞形式没有回收到子进程空间返回0
wait(NULL) 等价于 waitpid(-1, NULL, 0)
7.exec函数族:
extern char **environ;
int execl(const char *path, const char *arg, ... /* (char *) NULL */);
int execlp(const char *file, const char *arg, ... /* (char *) NULL */);
int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
功能:
利用进程空间执行一段新的代码
l:参数以列表形式传递
p:在系统路径下查找文件
e:执行新代码时,更新环境变量
v:参数以指针数组形式传递
参数:
返回值:
失败返回-1
execlp:
利用进程空间执行一个系统命令
7.getenv
char *getenv(const char *name);
功能:
获得环境变量name对应的值
参数:
name:环境变量名
返回值:
成功返回环境变量对应的值
失败返回NULL
8.setenv
int setenv(const char *name, const char *value, int overwrite);
功能:
设置环境变量的值
参数:
name:环境变量名
value:环境变量的值
overwrite:
0值 如果变量名存在不会替换旧值
非0值 如果变量名存在会替换旧值
返回值:
成功返回0
失败返回-1
fork + exec
当前进程启动一个新的进程任务
附加:system
int system(const char *command);
功能:
执行一条command shell命令