ckxy——并发处理——1进程与线程
Posted 想文艺一点的程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ckxy——并发处理——1进程与线程相关的知识,希望对你有一定的参考价值。
目录
进程及守护进程
D2
1、查看进程信息
- ps :查看系统进程快照
ps -ef | more (管道:命令1的输出、作为命令2的输入)
// ps -ef 打印所有的进程信息
// more 将信息一页一页的进行显示
UID:用户名称
PID :当前进程名称
PPID :父进程名称
C :cpu 的占用率
STIME :start time 开始时间
TTY :该进程关联的控制台
TIME :该进程运行的实践
CMD :对应的二进制程序
ps -ef | grep test
ps -aux | grep test // 可以多显示进程的状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A7pcLzBh-1620741448128)(C:\\桌面\\个人笔记\\嵌入式三级考试\\笔记图片\\image-20210413093045297.png)]
通过 man 2 ps 命令: 即可查看这几个标识是什么意思。
R + : 代表该进程市运行态
S +:代表该进程是 等待态。 getchar() ;阻塞之后其实就是进入了等待态。
- top:查看进程动态信息 (每隔 3 秒钟刷新一次进程信息)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hu6nPbPi-1620741448136)(C:\\桌面\\个人笔记\\嵌入式三级考试\\笔记图片\\image-20210413093600880.png)]
我们可以看到哪个进程最占用资源:我们进行程序优化的过程中,最占资源的进程就是优化的对象。
- /proc 查看进程详细信息
/proc 目录下面会存放我们所有的进程文件,文件以进程号命名。
2、修改进程的优先级
1、NI (nice) :优先级范围为 -19 ~ 20
2、默认优先级为 0
3、最高优先级为 -19.
4、普通用户:只能指定值为 正值。 root 可以指定 -19 ~ 20 任意值。
nice -n 2 .test (使用 top 命令可以进行查看)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P7tRzIgM-1620741448141)(C:\\桌面\\个人笔记\\嵌入式三级考试\\笔记图片\\image-20210413094222831.png)]
- renice :改变正在运行进程的优先级
renice -n 2 29070
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GQ0y7r5w-1620741448144)(C:\\桌面\\个人笔记\\嵌入式三级考试\\笔记图片\\image-20210413094551209.png)]
3、前后台进程的切换
一般后台进程称为:作业
- jobs、fg 、ctrl + z 、bg
./test & (将该进程后台运行)
jobs (显示当前后台运行的进程)
fg (将后台进程放到前台运行)
ctrl + z(将当前台进程放到后台运行,并且暂时挂起)
bg (将后台挂起的进程运行起来)
D3
1、父子进程
-
子进程会继承父进程的内容
-
父子进程有独有的地址空间,互不影响
-
若父进程先结束,子进程就成为 孤儿进程,被 init 进程收养。 (所有的孤儿进程的父进程都是 进程1 init 进程)
因为 Linux 规定一个进程,只能被父进程回收。
- 若子进程先结束,但是父进程没有及时回收,子进程就会变成僵尸进程。
僵尸态:当进程结束的时候,进程 PCB 没有被释放
PCB :存放进程的返回值,以及结束方式。
如果父进程没有及时利用子进程的 PCB 将其回收的话,这个子进程就无法回收,变成了僵尸进程。
思考:子进程从何处开始运行?
父进程:从 main 函数开始运行
子进程:从 fork 函数之后的语句开始运行。
思考:子进程会继承父进程的什么资源?
(1)PC 值:当父进程执行 fork 函数时候, PC 里面存放 fork 函数之后的第一条语句地址。
所以子进程会利用当前 PC 值,来执行下一条语句。
(2)父进程打开的文件描述符
(3)PCB 控制块等等。
注意:子进程只是将父进程的资源进行复制。复制了一份新的出来,他们各自有各自的地址空间。
思考:fork 进程之后,父子进程谁执行?
不确定:取决于操作系统的调度。
如果在 fork 之后,父进程的 时间片 ,还没有用完,那么就会继续执行父进程。
2、进程退出
exit(0); // 会刷新 (流) 缓冲区
_exit(0); // 不会刷新, 所以可能会丢失数据
怎么理解刷新缓冲区?
1、将缓冲区的数据,写入到文件
2、将缓冲区的数据,输出到屏幕(其实也是写入到文件)
什么时候会刷新(流)缓冲区?
1、 \\n :换行符会强制刷新缓冲区
2、缓冲区满了,也会刷新缓冲区
3、exit(0) 退出。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nsaj5Jp2-1620741448145)(C:\\桌面\\个人笔记\\嵌入式三级考试\\笔记图片\\image-20210413103129570.png)]
D4 如何在当前进程中 执行另外一个程序
步骤:
1、在当前进程当中创建一个子进程
2、在子进程当中利用 exec 函数族 来调用另外一个程序
3、子进程在成功执行 exec 函数之后,后面的代码就没有作用了
1、exec 函数族
-
进程调用 exec 函数族执行某个程序
-
进程当前内容被指定的程序替换, execl 后面的代码就没有作用了。(因为后面的代码会被 指定的程序代替)
-
实现让父子进程执行不同的程序
1、父进程创建子进程
2、子进程调用 exec 函数族
3、父进程不受影响
举例:一个shell 交互界面,其实就是一个父进程,当我们输入指定的命令的时候,相当于在shell 这个父进程当中创建了一个子进程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XDDhxU00-1620741448147)(C:\\桌面\\个人笔记\\嵌入式三级考试\\笔记图片\\image-20210413221343766.png)]
l(list):列表,相当于直接将所传递的参数列举出来。
path:指完整路径
arg[0] :程序名称
arg[1]:指传给这个程序的第一个参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-payYZDRW-1620741448149)(C:\\桌面\\个人笔记\\嵌入式三级考试\\笔记图片\\image-20210413221621906.png)]
2、system 函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OKfYaoiJ-1620741448153)(C:\\桌面\\个人笔记\\嵌入式三级考试\\笔记图片\\image-20210413221726373.png)]
D5 如何回收子进程
Linux 规定:
1、子进程在结束时、必须由父进程进行回收。
2、孤儿进程由 init 进程回收
3、若没有及时回收,会出现僵尸进程
1、wait()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-db4BsOyA-1620741448155)(C:\\桌面\\个人笔记\\嵌入式三级考试\\笔记图片\\image-20210413222236199.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MONs42st-1620741448157)(C:\\桌面\\个人笔记\\嵌入式三级考试\\笔记图片\\image-20210413222745864.png)]
2、waitpid()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pp9taaFI-1620741448158)(C:\\桌面\\个人笔记\\嵌入式三级考试\\笔记图片\\image-20210413223030629.png)]
阻塞回收:如果子进程还没有结束,父进程会被阻塞在 waitpid 函数。
非阻塞回收:
1、如果子进程结束,waitpid 返回子进程号
2、如果子进程没有结束,waitpid 返回 0 .
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QPEYXAUH-1620741448160)(C:\\桌面\\个人笔记\\嵌入式三级考试\\笔记图片\\image-20210413223500010.png)]
D6 守护进程、会话
1、守护进程
- 是 Linux 三种进程类型之一
- 通常在系统启动的时候运行,系统关闭时结束
- Linux 系统当中大量使用,很多服务程序以守护进程形式运行。(比如网络服务、打印等等)
2、守护进程的特点
- 始终在后台运行
- 独立于任何终端 (交互进程和一般和终端绑定)
- 周期性的执行某种任务或者处理特定的事件。
3、会话、进程组
为什么需要会话、进程组? —— 管理进程
-
Linux 以会话(session)、进程组的方式管理进程。
-
每个程序属于一个进程组。(如果在这个程序当中 fork 了子进程,那么该程序的所有子进程都属于这个进程组)
-
会话是一个或多个进程组的集合。
1、用户打开一个终端,就相当于系统创建了一个会话。
2、所有通过该终端运行的进程,都属于这个会话。
- 当一个控制终端关闭的时候,所有的相关进程就会被结束。(但是守护进程不受影响)
以上是关于ckxy——并发处理——1进程与线程的主要内容,如果未能解决你的问题,请参考以下文章