一、新系统,新软件
1.新系统
哈喽宝子们,从今以后我们不再使用风靡一时的CentOS系统了,因为CentOS已经不在维护了,各大公司几乎也都从CentOS转入其他操作系统了;我们现在由原来的CentOS系统切换到最新的Ubuntu系统,各大公司不用,我们为什么还要学习一个不维护的系统呢?
我目前使用的是Ubuntu最新的系统了
注意:我们切换系统的时候是要重装系统的哦,所以我们需要把我们之前的东西传到代码托管平台上,切换新系统后在克隆下来就好了
那么有了新系统,我们当然也要搭配新软件了,之前的Vim是不是超级难用,快捷命令太多容易忘,而且上下左右走到代码指定位置特别烦!!所以我们换一个新的软件,他就是VSCode
2.新软件
VS Code安装很简单,咱们都是学计算机的,到官网下载一个软件都不会吗??
下载完成后,我需要介绍几个插件
1️⃣Chinese (Simplified) (简体中文)
你如果不下载这个,那么我会非常佩服你的英语水平
2️⃣C/C++ 和 C/C++ Extension Pack
这个重要性就应该不需要我多说了
3️⃣Remote - SSH
这个就是用来链接云服务器的插件了
点连接
输入密码就添加成功了
基本的就介绍到这里了,相信大家的学习能力,我也知道写的并不详细,这里就是快入入门吧,开启我们的新篇章!!进程间的通信!!
二、通信引入
1.进程为什么要通信
首先计算机是人类发明的,人类都要通信,计算机怎么不需要呢?
进程也是需要某种协同的,所以如何协同的前提条件就是要通信,通信的本质也就是传递数据等,数据也是有类别的,有的数据是通知就绪的(就比如老师通知你上课),有的数据就是单纯要传递给我的(比如,老师这是我们写的作业,你来看看我们写的怎么样),还有控制相关的信息(比如下课了老师还在拖堂,校长就打电话给老师,你赶紧下课,不许占用学生们课下的时间)等等等
另外我们要拉出来一个事实:进程是具有独立性的,进程 = 内核数据结构 + 代码和数据
2.进程如何通信
1️⃣进程间通信,成本可能会稍微高一些(因为进程是具有独立性的)
2️⃣进程间通信的前提,先让不同的进程,看到同一份(操作系统)资源(“一段内存”)
通信一定是某一个进程发出来的,比如进程A需要与进程B通信,为了保证进程的独立性,A的代码和数据不能被B看到,B的代码和数据不能被A看到,那么A、B就需要在页表映射的时候,指向同一块内存,用于通信;
其中公共的区域是操作系统完成的,为了访问这块资源,操作系统必须提供很多的系统调用,这就会有许多的接口,接口的不同那么进程间的通信也会有不同的种类
3.进程通信的常见方式
无论是什么方式都要遵循通信的标准;我们这里介绍两个标准
1️⃣system V本地通信标准
通信的三种方式 a.消息队列 b.共享内存 c.信号量
我们这里只谈共享内存
人都是喜欢偷懒的,在这三种方式出来前,人就想着能不能直接复用内核代码直接通信?那么结果肯定是可以的,于是就发明了管道,管道有命名的和匿名的
2️⃣Posix(网络通信
三、管道
什么是管道
-
管道是Unix中最古老的进程间的通信形式
-
我们把一个进程连接到另一个进程的一个数据流称为一个“管道”
匿名管道
匿名管道的引入
【理解一种现象】为什么父子进程会向同一个显示器终端打印数据?
进程默认会打开三个标准输入输出错误0,1,2;这是因为这个进程是bash的子进程,bash打开了,所有的子进程也就打开了,我们只要做好约定即可!!不懂?我们接着往下看⬇️
-
【问题】如果我们以读的方式打开一个文件,写的方式打开同一个文件会发生什么?
首先同一个文件打开两次,struct file会被创建两次,但因为是同一个文件,并不会再单独创建文件的Inode等,而是直接指向同一块空间,操作系统不会去做浪费时间,浪费空间的事
-
我们假设父进程以读的方式打开,子进程以写的方式打开,那么子进程以写的方式打开,会拷贝一份父进程的PCB和文件描述符表(浅拷贝),但是struct file等不会拷贝;我们之间不是说进程要保证独立性吗?为什么这里不拷贝,因为进程具有独立性是进程的事,与文件系统无关
-
既然是浅拷贝那么指针的指向都是不变的,所以父进程打开的文件子进程也能看见了
【问题】为什么我们子进程主动close(0/1/2),不影响父进程继续使用显示器文件呢?
因为在文件系统内存在内存级引用计数,与硬连接数类似,只有当引用计数为0的时候,才会真正的释放文件资源(file -> ref_count --; if(ref_count == 0) 释放文件资源)
不同的进程看到的同一份资源,比如这里的父子进程,看到同一份文件不重要,重要的是看见同一份文件缓冲区,这个基于文件的文件缓冲区我们就叫做管道文件
进程间的通信也就不需要再将内容刷新到磁盘上去了,于是就给管道重新设计通信接口,只需要让进程间进行内存级通信就可以了