首先对堆栈等进程运行过程中的内存有了更深层次的理解:
我们之前了解到,程序在运行中存在堆栈,字符串常量区代码区。
现在我们提出虚拟内存的概念:程序在运行的过程中开辟0~4G的虚拟空间使用MUU映射单元映射到物理地址上
简而言之,进程是运行中的程序,可参考windows下的任务管理器,或者手机的后台应用。而程序则可认为是应用、代码等。
当应用在运行的过程中则为进程。
1·进程:
程序:存放在外存一个数据文件 固定的、死的
进程:程序 动态执行 的过程(程序的运行) 运行的、活的
包括:进程的创建、进程的调度、进程的消亡2·进程的命令:
1·top
动态查看当前系统中的所有进程信息 (类似于windows的任务管理器)
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
PID:唯一识别进程的ID号(例如QQ登两个账号,就需要两个PID)
USER:进程所属用户名
PR优先级:数值低 优先级高(-20 ~ 19) (window下数值高 优先级高)NI:进程的nice值,用来调整进程的优先级
VIRT:进程使用的虚拟内存RES:进程占用的物理内存
SHR:进程占用的共享内存
S :
进程状态:
R 运行态/就绪态
S 睡眠态
D 不可唤醒等待态
T 暂停态
Z 僵尸态 代码执行结束但是空间未回收
X 结束态%MEM:进程占用物理内存的百分比
q 退出top//设定进程优先级
2·nice
设定优先级运行进程
nice -n 优先级 要进行的进程任务renice
重新设定一个运行进程的优先级
renice -n 优先级 进程PID3·kill
杀死指定的进程任务
示例:
kill -9 进程PID(47914)
-9: kill的方式killall
杀死进程名对应的所有进程任务示例:
killall -9 进程名(a.out)
4·ps -ef
查看当前时刻所有的进程信息(10:14) 静止的
PPID:父进程的ID号ps -ef | grep a.out
查看a.out的信息5·pstree
查看树形进程联系6·ps -aux
TTY:? 精灵进程不依赖于终端7·./a.out &
将进程放在后台运行jobs:查看一个终端下后台执行的所有任务
fg 1/2/3(编号)
将后台任务放在前台来执行
进程的调度:
1·常见的调度算法
1·先来先执行
2·短作业优先
3·优先级调度
4·时间片轮转调度算法
宏观并行 微观串行 (多任务)
5·多级反馈队列调度
6.负载均衡调度
1.进程的创建
fork
pid_t fork(void);
功能:
创建一个子进程,新创建的进程称为原来进程的子进程,原来的进程称为新进程的父进程
参数:
void 缺省
返回值:
成功子进程返回0
父进程返回子进程的PID
失败返回-1父进程调用fork创建子进程,子进程拷贝父进程的文本段、数据段、系统数据段
getpid
pid_t getpid(void);
功能:
获得调用进程的PID号
getppid
pid_t getppid(void);
功能:
获得调用进程的PPID练习:
创建一个父进程的2个子进程,子进程中打印自己的PID和父进程的PID
父进程中打印自己的PID和两个子进程的PID2.exit
void exit(int status);
功能:
让进程结束
参数:
status:进程结束的状态
返回值:
缺省exit在主函数中使用和return效果一致
exit会刷新缓存区_exit
void _exit(int status);
功能:
让进程直接结束
参数:
status:进程结束的状态
返回值:
缺省
7.进程的消亡
1.僵尸进程:
进程代码执行结束,空间没有被回收,称为僵尸进程
2.如何避免产生僵尸进程?
1.让父进程先结束
2.让父进程回收子进程空间3.孤儿进程:
进程的父进程先结束,此时该进程称为孤儿进程,被系统进程收养,进程再结束时,会被系统进程回收进程空间8.wait
pid_t wait(int *wstatus);
功能:
回收子进程空间
参数:
wstatus:存放子进程结束状态空间的首地址
返回值:
成功返回回收到的子进程PID
失败返回-11.wait函数具有阻塞功能
2.wait函数具有同步功能WIFEXITED(wstatus)
进程是否正常退出WEXITSTATUS(wstatus)
进程结束状态值WIFSIGNALED(wstatus)
进程是否被信号杀死WTERMSIG(wstatus)
获得杀死进程的信号编号