简单介绍进程间有哪几种通信机制(揭开进程的概念)
程序顺序执行的特征
- 顺序性顺序执行
- 封闭性独占资源
- 可再现性只要程序执行环境和初始条件相同,重复执行时结果都相同
- 间断性
- 失去封闭性
- 不可再现性因为程序并发执行时,是多个程序共享系统中的各种资源,因而这些资源的状态是由多个程序来改变,致使程序的运行失去了封闭性。而程序一旦失去了封闭性也会导致其再失去可再现性。执行结果与并发程序的执行速度相关
非正式地说,进程是执行的程序。进程不只是程序代码,程序代码又称为文本段或代码段。进程还包括当前活动(程序计数器的值、处理器寄存器的内容)。通常还包括进程堆栈(临时数据)、数据段(全部变量)。还可能包括堆(进程运行时动态分配的内存)。
进程的特征- 动态性进程有生命周期,最基本特征。
- 并发性可并发执行;引入进程的目的是为了使其进程实体能和其他进程实体并发执行
- 独立性进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位
- 制约性进程间对资源的争用而相互制约
- 异步性进程按照各自独立的、不可预知的速度向前推进
- 结构特征进程=程序 数据 PCB
进程是程序的一次运行过程,是一个动态实体,而程序是一个指令的集合,是静态实体。进程具有生命周期,具有创建、执行和撤销的过程,而程序一旦创建,可以永远存在 。进程实体由程序段、数据段及进程控制块组成。进程与程序之间不存在一一对应的关系,不同的进程可以对应相同的程序,一个进程中还可以同时调用多个程序。进程实体是一个能独立运行的基本单位,可独立获得资源和独立调度;而程序不能作为独立的单位参加运行。进程可按异步方式运行,程序不是运行实体,所以不可以异步执行。
进程的状态就绪、运行、等待是三个基本状态。
- 提交状态
- 后备状态
- 就绪状态
- 运行状态
- 等待状态
- 结束状态
进程的挂起/解挂
- 设置挂起/解挂的原因用户需要:中间结果与预期不符。操作系统需要:系统某些功能故障。系统负荷过重 。父进程请求:修改或协调子进程 。对换的需要。
进程控制块(PCB)
PCB是用以记录与进程相关信息的主存区,是进程存在的唯一标志
具有相同状态进程的PCB分别通过PCB中的链接字链接成一个队列。
C/C Linux服务器开发高级架构师学习文档电子书籍 点击 正在跳转 获取,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。视频学习链接点击:C/C Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂
索引方式
系统根据所有进程状态的不同,建立几张索引表,并把索引表的首地址记录在内存的专用单元中。
Linux PCB的例子
进程切换/上下文切换
切换CPU到另一个进程需要保存当前进程状态和恢复另一个进程的状态,内核会将旧进程状态保存在PCB中,并加载调度新的进程。上下文切换的时间是纯粹的开销。有的处理器提供多个寄存器组,上下文切换只需简单改变当前寄存器组的指针(如果活动进程数量超过寄存器组的组数,系统仍要在寄存器和内存之间复制数据)。
进程的创建进程图
进程图(有向树)与前趋图(有向无环图)的2个区别:1、表示的含义不同;2、执行时处理不同:可并发执行
进程创建原语Creat()- 申请空白PCB
- 为新进程分配资源
- 初始化PCB
- 新进程插入就绪队列
当一个进程创建子进程时,子进程会需要一定的资源。子进程可以直接从操作系统那获得资源,也可以只从父进程那里获得资源子集。父进程可能要在子进程之间分配资源或共享资源。限制父进程只能使用父进程的资源,可以防止创建过多进程,导致系统超载。
- 父与子进程的执行可能父进程和子进程并发执行父进程等待,直到某个或某些子进程执行完毕
- 新进程的地址空间的情况子进程完全复制父进程,拥有同样的程序和数据子进程加载另一个新程序
- fork()通过系统调用fork()创建新进程,新进程的地址空间复制了原来进程的地址空间。子进程和父进程都继续执行fork()调用后的指令。但对于父进程,fork()返回子进程的进程标识。对于子进程,fork()返回0。
- exec()在调用fork()后,可以有个进程调用exec(),用新程序取代进程的地址空间(加载二进制文件到内存),并开始执行。
- wait()父进程创建子进程后,如果无事可做,就调用wait()把自己移除就绪队列,直到子进程结束,wait()返回(可以获得子进程的标识符、退出状态等信息),父进程从wait()的下一条指令开始继续执行。
如果一个进程终止,那么它的所有子进程也相应终止,称为级联终止。
僵尸进程当一个进程终止时,操作系统会释放它的资源,但是位与进程表中的条目还在,直到它的父进程调用wait()。因为进程表中包含了进程的退出状态,当进程已经终止,但它的父进程还没有调用wait()时,这样的进程称为僵尸进程。一旦父进程调用wait(),僵尸进程的进程标识符和进程表中的条目就会被释放。
孤儿进程如果父进程没有调用wait()就终止,它的子进程称为孤儿进程。Linux和Unix的做法是,将init进程作为孤儿进程的父进程。init进程定期调用wait(),以便收集孤儿进程的退出状态,释放孤儿进程的标识符和进程表条目。
进程间通信操作系统内的并发执行程序可以是独立的,也可以是协作的,若是协作的,那么就需要有一种进程间通信(IPC)的机制。
生产者-消费者问题进程通信的类型
消息传递对于较小数量的数据交换很有用,因为无需避免冲突。对于分布式系统,消息传递也比共享内存更易实现。共享内存可能快于消息传递,因为消息传递的实现经常采用系统调用,需要消耗更多时间使内核介入。共享内存仅在建立共享内存区域使需要系统调用,建立后所有访问都可作为常规内存访问,无需借助内核。
- 共享存储器
- 消息传递
由操作系统提供机制,利用系统提供的通信原语,以消息或报文为单位进行信息交换。
- 命名
- 间接通信
- 同步
- 缓存
- 管道通信
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com