进程状态,多进程和多线程(了解),了解进程关系(进程控制)【linux】(zo)

进程状态

每个进程与其它进程并发运行时,该进程会在不同的“进程状态”之间进行转换。
三种基本状态:
在这里插入图片描述

进程的五种状态:
在这里插入图片描述

进程运行状态有哪些:.
就绪态:表示进程准备就绪,随时等待被调度运行

执行态:被PID=0的调用进程调度,开始占有CPU,被cpu执行,运行的时间片到后让出CPU,再次进入就绪态,然后PID==0的调度进程开始调度其它进程,CPU去执行其他进程的指令

阻塞态:当进程需要的某些条件的不满足,进程会进入阻塞态(休眠)当条件满足后,会再次进入就绪态,等待再次被调度执行。

多进程和多线程

多进程

在自己的程序里面调用fork、exec来创建多个进程,特别是当我们需要多进程并发工作时,
我们完全可以使用这种多进程的方式来实现。

程序多进程的例子:同时读鼠标和键盘

当鼠标和键盘没有数据时,这两个读操作会阻塞,如果在一个进程即读键盘、也读鼠标的话,就会出现相互堵的情况。

while(1)
{
read(键盘);
read(鼠标);
}

此时就可以fork创建出一个子进程,然后让父子进程并发的读数据。
------父进程 ------------------------------------ 子进程--------
--------- ↓---------------------------------------------↓------------
----read(键盘) ------------------------------- read(鼠标)------

父子进程并发运行,各自读各自的,互不干扰,这样就不会出现相互堵的情况了。

多线程并发

多进程太过耗费计算机资源。
如果程序真的需要并发的话,我们会在进程内部创建多个线程,使用多个线程来实现并发,比如:

				 主线程          次线程
				read(键盘)      read(鼠标)

后面会有博客详细说明线程。

什么情况下,我们让程序创建出多进程,实现多进程的并发

编写框架

安卓的系统框架,中大型游戏底层框架等,软件框架属于结构性的代码,在实现框架结构的过程中,基本都要使用多进程来搭建这个框架。

像框架这种东西,在实际开发中,并不是任何人都会涉及到的,对于绝大多数人来说,在实际开发中,基本只涉及到框架的使用,但不涉及到框架的编写。

如果你的程序必须启动新程序

比如windows图形界面、命令行,当我们在图形界面或者命令启动新程序时,必须创建子进程,然后在子进程空间中运行新代码,这个时候必须要涉及多进程。

大型的业务功能复杂的软件,基本都是多进程的

这里说的大型软件,有可能是客户端软件,也有可能是服务器端的软件。
对于大型的软件程序来说,往往包含很多种功能(功能套件),而且每一个功能具有相当的独立性,所以大型复杂的软件在实现时,如果将这些独立功能全都放到单进程里面来实现,很不现实,因为所有的东西都杂糅在一起,很不好实现。

既然每个功能具有独立性,在大型软件里面,每个独立的功能,均由独立的进程来实现,其中有一个是主进程,主进程往往会提供主的交互界面,主进程启动起来后,会去启动不同的子进程,每个子进程负责实现不同的功能。
在每个子进程的内部往往还会有多线程的参与,所以对于大型软件来说,多进程和 多线程都会涉及。

进程关系

进程间的关系,大致有三种
父子关系、进程组关系、会话期关系

父子关系
已有进程调用fork创建出一个新的进程,那么这两个进程之间就是父子进程关系,子进程会继承和父进程的属性。

进程组关系
什么是进程组
多个进程可以在一起组成一个进程组,其中某个进程会担任组长,组长进程的pid就是整个进程组的组ID。

进程组的生命周期
就算进程组的组长终止了,只要进程中还有一个进程存在,这个进程组就存在。
进程组从开始被创建,到进程组最后一个进程结束,这段时间就是进程组的生命周期。

进程组举例
当我们自己的程序fork出很多子进程时,所有的进程会默认的为一组,我自己程序中的原始父进程会担任组长。
命令行终端窗口与最开始的父进程建立联系,最原始的父进程结束了,就会将终端交互权还给shell程序。

会话期关系
多个进程组在一起,就组成了会话期。

守护进程

对于一些稍大型的软件来说,往往都是多进程的,而且其中好多进程都是默默无闻运行的,像这种默默无闻运行的进程都需要做成守护进程。

发布了163 篇原创文章 · 获赞 94 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43648751/article/details/104514642