进程相关概念

一、进程的相关介绍及查看指令

windows下查看进程:任务管理器

Linux下如何查看进程:

(1)ps -aux

(2)ps -ef

(3)ps axj

(4)top

(5)pstree

查看信号(kill -l)

1.进程的概念

进程是程序的一次动态执行过程,包括创建、调度、消亡

1)进程和程序的区别

程序的静态的,他是一些保存在磁盘上的指令的有序集合,没有任何执行的概念

进程是一个动态的概念,他是程序的执行过程,包括创建、调度和消亡

2)进程是程序执行和资源(内存)管理的最小单位

为什么进程是资源管理的最小单位?

因为每一个进程都有0~4G的虚拟内存

3)如何区分不同的进程

PID(子进程号)PPID(父进程号)

进程是由进程创建的,有父进程、子进程

2.进程的类型

1)交互进程

该列进程是由shell控制和运行的。交互进程既可以在前台运行,也可以在后台运行。

前台运行

后台运行

2)待处理进程

该类进程不属于某个终端,他被提交到一个队列中以便顺序执行

3)守护进程

该类进程在后台运行。他一般在Linux启动时开始执行,系统关闭时才结束。

3.进程的状态

1)运行态

此时进程正在运行或准备运行

2)等待态

此时进程在等待一个时间的发生或者某种系统资源

3)停止态

此时进程被中止

4)死亡态(僵尸态)

这是一个终止的进程,但还在进程向量数组中占有一个task_struct(PCB)结构

PCB结构(内核空间):包括进程控制块本身、打开的文件表象、当时目录、当前终端信息、线程基本信息、可访问的内存空间、PID、PPID、UID、EUID等,也就是说,内核通过PCB可以访问到进程的所有资源

4.进程的模式

5.调度进程

6.进程相关的系统调用

1)创建进程

注意:fork函数是父进程调用的,在父进程返回值之前,子进程已经创建好了,子进程和父进程的返回值是不一样的(子进程的返回值为0)

在子进程创建成功后,它会和父进程抢占资源,存在竞争关系,谁先调度由调度算法决定

加上换行符之后,缓冲区刷新

2)getpid()和getppid()

头文件: #include <sys/types.h>

               #include <unistd.h>

函数原型:pid_t getpid(void);

函数功能:获取进程的ID号

返回值:返回调用进程的PID号

函数原型:pid_t getppid(void);

函数功能:获取父进程的PID号

./a.out(子进程)-->./a.out(父进程)-->bash-->terminal-->systemd-->init

3)进程的退出

exit、_exit、return(main函数中的return)

注意:exit会刷新缓冲区,_exit会刷新缓冲区

4)wait和waitpid

wait函数

调用该函数使进程阻塞,直到任意一个子进程结束或者该进程接收到一个信号为止。如果该进程没有子进程或者子进程已经结束,wait函数会立刻返回。

waitpid

获取子进程退出的状态

7.孤儿进程

父进程先退出,子进程被systemd进程收养变成后台进程

8.僵尸进程

子进程先于父进程退出,父进程没有回收子进程的资源(task_struct),此时子进程变成僵尸进程

注意:如果父进程一直不退出,子进程就一直保持僵尸状态,知道父进程退出,task_struct就会被systemed回收

9.exec函数族

不想让子进程执行父进程的代码段

l:表示列表

v:向量(数组)

p:系统会自动从环境变量“$PATH”所包含的路径中进行查找(不用添加路径)

10.守护进程

1)特点

在后台运行与终端无关

在系统启动时运行,系统关闭时停止运行

2)进程与终端的关系

实现守护进程的条件:不能与终端具有血缘关系

                                    守护进程没有控制终端(备注:?表示没有控制终端)

3)进程组

进程组是一个或多个进程的集合。进程组由进程组ID来唯一标识

每个进程组都有一个组长,进程组ID就是组长进程的进程号

4)会话组

会话组是一个或多个进程组的集合

5)实现效果

守护进程自成一格进程组和会话组,也就是说PID、PGID、SID是一样的,而且该进程的父进程只能是systemd,不能是终端

没有控制终端,也就是说TTY变成?

6)守护进程的创建步骤

1.创建子进程,父进程退出

备注:完成第一步以后,子进程就是形式上做到了与控制终端的脱离

2.在子进程中创建新会话

3.改变当前目录为根目录

4.重设文件权限码

5.关闭文件描述符

整体代码如下

11、UNIX平台进程通信方式

早期进程间通信方式

AT&T的贝尔实验室,对Unix早期的进程间通信进行了改进和扩充,形成了“system V IPC”,其通信进程主要局限在单个计算机内

BSD(加州大学伯克利分校的伯克利软件发布中心),跳过了该限制,形成了基于套接字(socket)的进程间通信机制

Linux继承了上述所有的通信方式

1)通信的概念

通信的模式

(1)单工、半双工、全双工

单工:A-->B (键盘输入)(只能单向进行)

半双工:A-->B 或者 B-->A(对讲机)(可以双向进行,但是不能同时进行)

全双工:A-->B 同时 B-->A (打电话)(可以双向进行,可以同时进行)

(2)同步、异步

同步:

异步

通信协议:双方约定号的规则

2)无名管道

特点:只能用于具有亲缘关系(父子进程,兄弟进程)的进程之间的通信

        半双工通信模式,具有固定的读端和写端

        管道可以成事一种特殊的文件(内核中的一块内存)

管道是基于文件描述符的通信方式。当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。

为什么无名管道只能用于具有亲缘关系之间的通信?

父进程创建了管道,获得了文件描述符,子进程继承了父进程的文件描述符(fd[0]、fd[1])

测试管道破裂

3)有名管道

特点:有名管道可以使互不相关的两个进程相互通信。可以通过路径来指出并且在文件系统中可见

           进程通过文件IO来操作有名管道

           有名管道遵循先进先出的原则

           不支持如lseek()操作

写端

读端

总结:管道文件存在的意义

                进程1创建并打开有名管道得到了一个内存文件(管道文件)+文件描述符

                进程2通过进程1创建的管道文件就可以得到一个同样的文件描述符,最终进程1和进程2就可以通信

        无名管道:因为父进程创建并打开管道,得到了一个管道文件描述符,而子进程可以继承父进程的文件描述符,所以就可以直接进行通信

注意:当只有读端的时候,系统会阻塞,直到一个进程(包括自己)以另一种方式打开管道

12.信号

1)信号相关概念

2)查看信号

3)信号安装函数or信号注册函数

该函数有两个参数,一个参数为int类型、另一个为函数指针类型,返回值也是一个函数指针,这两个函数指针指向的都是参数为int,返回值为void的函数

自定义信号处理函数

使用信号回收子进程

4)alarm

alarm()也称为闹钟函数,它可以在进程中设置一个定时器。当定时器指定的时间到时,内核就向进程发送SIGALARM信号。

5)pause

pause()函数是用于将调用进程挂起直到收到信号为止。

6)kill(给指定进程发送信号)

7)raise(给自己发送信号)

案例:子进程每10s给自己发送一个暂停信号,父进程每15s给子进程发送一个继续信号

13.systemV进程间通信(IPC)

1)systemV的IPC基础

消息队列、共享内存和信号量这3中机制和文件一样,IPC在使用之前必须先创建,每种IPC对象都有自己的生产者,所有者和访问权限,使用ipcs命令可以查看系统正在使用的IPC工具

2)IPC通信的工作原理

Linux系统为每个IPC机制都分配了一个唯一的ID值,所有支队该IPC机制的操作都使用该ID值,因此,通信的双方都需要通过某种办法来获取ID值

如何获得相同的ID值,为了解决这一问题,IPC在实现约定使用key作为参数,如果在创建的时候使用相同的key值将得到同一个IPC对象的ID值

3)共享内存

(1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何的拷贝

(2)为了在多个进程间交换信息,内核专门流出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间

(3)进程可以直接读写这一内存区而不需要进行任何的数据拷贝,从而大大提高效率

(4)由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等

共享内存创建步骤

(1)创建/打开共享内存

注意:再获取ID值之前先获取key值

(2)映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问

撤销共享内存映射

删除共享内存对象

写端

读端

4)消息队列

消息队列创建步骤

(1)创建并打开消息队列

(2)添加消息

注意:消息的类型不能为0

(3)读取消息

(4)删除消息队列

读端

写端

二、线程

1.线程的概念

2.创建线程

第三个参数:指向的是一个参数为void *返回值也为void *的函数

3.线程的退出

4.线程等待函数

5.将线程设置为游离态

6.线程的同步与互斥

1)互斥

注意:互斥吃能保证临界资源的完整性,不能保证访问顺序

(1)互斥锁

(2)初始化锁

(3)上锁

(4)解锁

(5)销毁锁

2)同步

同不是在互斥的基础上,限制了访问的顺序

posix中定义了两类信号量

有名信号量:进程

无名信号量:线程

信号量代表某一类资源,其值表示系统中该资源的数量

信号量是一个受保护的变量,只能通过三种操作来访问

信号量的值为非负整数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值