一、进程
1.程序和进程的区别
程序:在磁盘空间中存放的一串数据的集合
进程:程序运行的过程
2.进程的命令:
1.top:根据CPU占用率查看进程信息
PID:唯一识别一个进程的ID号
q:退出
2.ps -ef
PPID:一个进程的父进程
3.ps -aux
可以看到进程的状态
4.pstree
查看进程关系
5.kill
kill -9 进程的ID号
kill -9进程名
6.ps -ef | grep 字符串
在ps -ef生成的信息中找字符串相关联的若干行
7../a.out &
让a.out在后台运行
8.jobs
查看后台运行的任务
9.fg 标号
标号对应的后台任务放到前台运行
3.精灵进程/守护进程
随着操作系统开启运行进程,随着操作系统结束,进程结束,为用户提供服务。
4.进程的创建
32位操作系统中:进程创建时,操作系统分配0-4G内存空间,分为:文本段、数据段、系统数据段。
文本段:存放代码和指令
数据段:存放字符串常量、全局变量、静态常量
系统数据段:堆区:malloc申请空间
栈区:局部变量
5.进程创建的特点:
1.一个进程占0-4G内存空间;
2.两个及两个以上的进程也占0-4G内存空间
3.进程空间彼此相互独立
4.0-4G为虚拟内存空间,进程1运行时映射到进程1的实际物理内存空间、进程2运行时映射到进程2的实际物理内存空间。
6.进程的调度
1.宏观并行,微观串行
2.宏观并行:从用户角度出发,在多个任务中来回切换调度任务实现多任务执行
3.微观串行:从CPU角度出发,在多个任务中来回切换调度任务实现多个任务的执行
4.进程状态:
1.就绪态、运行态 R
2.睡眠态(可唤醒等待态) S
3.不可唤醒等待态 D
4.暂停态 T
5.僵尸态 Z
6.结束态 X
7.进程的相关函数接口:
1.fork
pid_t fork(void)
功能:创建一个子进程
参数:缺省
返回值:成功在父进程中返回创建的子进程的PID;在子进程中返回0;失败返回-1。
2.getpid
pid_t getpid(void)
功能:获得调用该函数的进程的ID号
参数:缺省
返回值:进程的ID号
8.进程的消亡:
1.僵尸态:进程代码执行结束,但空间没有被回收
2.僵尸进程如何产生:子进程结束,父进程没有回收子进程空间,子进程会成为僵尸进程。
3.如何避免产生僵尸进程:
1.让父进程先结束,子进程会成为孤儿进程,此时子进程再结束,会被系统回收进程空间。
2.子进程结束时,父进程回收子进程空间,避免产生僵尸进程。
9.孤儿进程
一个进程的父进程先结束,子进程会成为成为孤儿进程,被init进程收养,子进程再结束,被init进程回收空间。
10.exit
1.void exit(int status)
功能:让进程空间结束
参数:status:进程结束的状态
返回值:缺省
2.void _exit(int status)
功能:让进程立即结束
参数:status:进程结束的状态
返回值:缺省
11.wait
pid_t wait(int *wstatus)
功能:回收子进程空间
参数:wstatus:存放子进程结束状态空间的首地址
NULL:不关注子进程结束状态
返回值:成功返回回收到的子进程的PID
失败返回-1
注意事项:
1.wait具有阻塞功能,只有一个子进程时,阻塞等待直到子进程结束才会继续向下执行
2.一个进程没有子进程,调用wait,wait会直接返回-1
3.一个进程有多个子进程时,wait回收先结束的子进程
4.wait可以实现同步的功能
12.waitpid
pid_t waitpid(pid_t pid, int *wstatus, int options);
功能:回收指定的子进程空间
参数:
pid:想要回收的子进程的PID号
wstatus:回收子进程结束的状态
options:
0 阻塞回收
WNOHANG 非阻塞回收
返回值:
成功返回接收到的子进程的PID
失败返回-1
没有回收到子进程空间返回0
13.exec函数族:
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:执行新代码时,参数以列表形式传递
v:执行新代码时,参数以指针数组形式传递
p:执行新代码时,代码在系统路径PATH下查找
fork + exec:可以启动一个新的软件代码