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进程与线程的主要内容,如果未能解决你的问题,请参考以下文章

线程学习知识点总结

多线程

java并发工具学习 01 进程与线程基础

cpp►多线程

java并发

多个请求是多线程吗