(Linux1)指令,工具,进程概念,进程间通信(管道,消息队列,信号量)

一、指令:

基础指令?
目录相关的 ls,pwd,mkdir,rm,cp,mv
文件指令:cat ,touch,more,less,head,tail
打包指令:zip/unzip,gzip/gunzip,bzip2/bunzip2,tar
文件的匹配查找指令:grep,find
权限指令:
系统操作权限:su,sudo
文件权限:
访问用户:所有者-u,所数组-g,其他-o;
访问操作:可读-r,可写-r,可执行-x
权限表示:rwxrwxrwx;0777
权限指令;umask,777-umask 777&(~umask),chmod,chown,chgrp

二、工具

1、yum:管理工具的软件包
Yum list,yum install,yu, remove
2、vim
操作模式十二种,常见的只有三种。–普通(默认打开),插入模式,保存数据(底行模式)
模式切换:
普通–》插入 i,a,o
普通–》底行 :
其他–》普通 esc
操作指令:
底行命令::w,:q ,:wq , :q!
普通:光标移动 hjkl,wb(单词的移动),ctrl+f/b(上下翻页),gg/G(首行和尾行的操作),nyy(进行复制)ndd(进行剪贴)/p(粘贴) u(撤销上一次操作)ctrl+r(撤销的返回操作)
3、gcc-g++编译器
编译过程:预处理阶段(展开所有代码)–编译(语义语法纠错,成为汇编指令)–汇编(解释为二进制的机器指令)–链接(链接打包生成可执行程序)
gcc常见选项:-E(只进行预编译),-S(进行编译),-C(汇编),-o(制定生成的可执行文件),-g(生成debug版本的程序),-O(进行代码优化),–shared(生成动态库)
链接方式(两种静动)
静态程序大,依赖性低,程序可以单独运行;产生代码冗余
动态链接装载速度慢,依赖性高,运行时依赖库,好处是程序生成的体积小,内存中的代码共享,不会有冗余。gcc默认是动态冗余

gdb–调试器
常见操作:
首先,通过gcc-g选项生成debug版本程序。
调试指令:
start,run,step,next,until,continue,list,break(打断点),watch(给变量监控打断点),info break,delete,print,backtrace。
make/Makefile:
git:三板斧:git clone,git add–all,git commit-m "备注“;git push prigin branchname

三、进程概念:

进程概念:进程是什么?进程就是运行中的长须,但是在操作系统中,进程是一个程序运行的动态描述-pcb-task-struct,通过描述完成操作系统对程序运行的调度管理。
进程是系统进行资源分配的基本单元,线程是CPU调度的基本单元。
描述信息:内存指针,上下文数据,程序计数器优先级,io信息,状态信息。
进程控制:创建:通过pid_t fork();–通过父进程创建子进程–创建一个pcb复制父进程pcb的大多数信息–父子进程代码共享,数据独有。
创建流程:写时拷贝技术子进程创建出来与父进程在物理内存中指向同一处数据以及代码,但是当数据发生改变时,位紫禁城充新开辟空间,拷贝数据过来,此时子进程就有了自己的新开辟的空间。
终止:main中return;exit;-exit;
替换:替换一个进程pcb正在调度的程序(内存中的代码和数据);exec函数簇
进程状态:三种基本状态–运行,就绪,阻塞;Linux下的状态–运行状态,可中断休眠状态,不可中断休眠状态,停止状态,僵尸状态。

僵尸状态:描述的是一个已经推出的但是没有完全释放资源的进程的一种状态,这种进程称作僵尸进程。
僵尸进程的产生原因:子进程先于父进程退出,向父进程发送sigchid信号,但是sigchid信号默认处理方式是忽略处理,因此父进程无法直接获知子进程的状态。
危害:资源泄露。
僵尸进程的避免:在父进程创建子进程之后进行进程等待,等待子进程退出,获取返回值,释放子进程资源。

程序地址空间:进程的虚拟地址空间。本质:操作系通过一个结构体描述的一个虚拟空间。有时也被称为内存描述符
如何描述?起始地址,起始编号,进行分段,接口,操作

为什么要用虚拟地址空间?使用他的优点。1、每个进程都有虚拟地址空间,提高进程独立性。2、用映射虚拟与物理地址,实现离散式存储提高内存利用率页表(不用连续的内存)。3、提高内存访问控制(虚拟地址访问,页表,访问权限)如何通过虚拟地址找到物理地址?
映射关系随着内存管理方式不同。(三种)
分段式,分页式,段页式。
分段式:将地址空间分为多个段,(正文段,数据段,堆,栈。。。),便于地址管理
分页式:将地址空间分为大量的内存页,进程使用大块连续的虚拟地址,但是通过页表映射能够实现数据存放在不同的物理内存块上,提高内存利用率。
段页式:先对地址空间进行分段,在每个分段内进行分页管理。
分页式的实现:
虚拟地址由两部分组成:虚拟地址组成+页表
虚拟地址组成:页号(对应内存页的编号)+页内偏移(对应数据在内存页中的偏移量)
页表的关键信息:页号,物理地址,
有一个虚拟地址,通过一个虚拟地址中的页号,找到对应页表中的页表项,鸡儿获取到也表象中对应的物理地址,物理地址加上页内偏移

四、进程间通信

真正学的:操作系统为用户提供的进程间通信方式。
用户如何实现进程间通信?
1、为什么操作系统要为用户提供实现进程间通信的方式?
答:因为进程之间具有独立性,每个进程都有自己的虚拟地址空间,访问的都是自己的虚拟地址。(两个地址之间互不相干,相当于是两个平行线,而要让他们通信也就是说要让他们变成相交线,那么如何让他们变成相交线呢?)想要实现进程间通信是不可能的,因为他们没有办法直接通信,因此需要操作系统提供媒介(也就是进程间通信方式:开辟一个都能访问的内存。)完成通信。
2、进程之间通信有不同的应用场景,所以操作系统提供了不同的通信方式应对不同的场景:
进程间通信方式——管道,共享内存,消息队列,信号量(本质都是开辟一个共享内存,让其他进程都可以访问到,产生一个相交的节点,从而实现通信)

3、管道

(1)适用场景:用于实现进程间的数据传输
(2)管道的本质:内核中的一块缓冲区
(3)实现通信的原理:在内核中创建一块缓冲区,所有能够访问同一块缓冲区的进程就能实现通信
在这里插入图片描述
(4)管道的分类:
(4.1)分类及定义
a:匿名管道:管道没有名字,内核中的缓冲区没有标识符
意味着其他的进程没有办法找到内核中相同的缓冲区,只能通过子进程复制父进程的方式访问同一个管道。
只能用于具有亲缘关系的进程间通信
b:命名管道:管道有名字,内核中的缓冲区有标识符
其他的进程可以通过相同的标识符,找到相同的缓冲区,实现通信,
可以用于同一主机上的任意进程间通信
(类似于QQ建的私密的家人群,只能通过亲人拉进去和开放的群,搜索就能进)
(4.2)匿名管道如何进行访问?
int pipe(int pipefd[2]);–创建匿名管道,管道的操作句柄通过参数返回。
pipefd【0】:用于从管道读取数据
pipefd【1】:用于向管道写入数据在这里插入图片描述
匿名管道的代码实现:
首先定义一个有两个int元素的数组,之后用pipe创建管道,将pipifd空间的首地址传递进去,就返回两个描述符。
管道创建成功之后再创建子进程,匿名管道子进程是通过复制父进程得到操作句柄的,fork创建子进程,如果返回值等于0是子进程,大于0是父进程,父子进程各自进行了不同的操作,子进程是从管道中读取数据,父进程是向管道中去写入数据匿名管道代码实现

(5)管道的特性
1)半双工通信:可以选择方向的单向通信。
通信中的通信方式:单工(只能从左到右),双工(可以从左到右也可以从右到左),半双工(同时从左到右和从右到左)。
2)管道自带同步与互斥
同步:按照某种秩序对管道进行访问,保证访问的合理性。
管道的数据满了,继续写入就阻塞;如果管道中没有数据,继续读取就会阻塞。 (父进程写入数据,子进程提取数据。若是让父进程等待三秒再写,那这时候子进程读不出来,阻塞,等到父进程开始写了,他才能读;同理,让子进程等待300秒,父进程一直写,会写满,阻塞,直到子进程开始读了,才会继续开始。)
互斥:只能我一个进程访问,我访问的时候别人不可以访问。通过同一时间的唯一访问,保证本次访问安全。
对于互斥的体现:管道数据操作时操作大小不超过PIPE_BUF(宏,默认4096),保证操作原子性(一步完成,中间不会被打断)
3)管道提供字节流服务——提供的是有序的,安全的,基于连接的,可靠的以字节为单位的传输方式。
基于连接:有读才有写,有写才有读。如果所有读端(父子进程的读端)被关闭,则write会触发异常,进程退出。(已经完全没有人读了,再写没有意义了);如果所有写端被关闭,则read读取完管道中的数据后,就不再阻塞而是返回0。
有序的:先进先出的数据传输。写入有序的
4)管道的生命周期随进程
进程在内核中创建了一个缓冲区,在所有的访问进程都退出之后,管道也随之销毁

(6)命名管道的实现:
int mkfifo(char *filename,mode_t mode);
命名管道的本质也是管道,也是一块内核中的缓冲区,但是这块缓冲区有标识,有名字,这个名字标识就是一个可见于文件系统的管道文件。
多个进程通过打开同一个管道文件,访问同一块内核中的缓冲区(管道的本质),进而实现通信。

(7)管道总结:
管道:本质是什么?分类?总体性,特性对代码的影响。
管道本质上是一个缓冲区,多进程通过打开同一个缓冲区来实现进程间通信。管道分为命名管道和匿名管道。匿名管道指缓冲区没有标识符,只能通过子进程复制父进程的方式来访问缓冲区。命名管道,有标识符,是可见于文件系统的一个管道文件,所以多个文件可以通过打开同一个文件来实现进程间通信。可以用于同一主机上的任意进程间通信,两类管道的不同之处。有共同特性,无论是匿名还是命名管道,管道是一个半双工通信,自带同步与互斥,保证读写操作安全,并且合理,如果管道里面没有数据,则写会阻塞,若是管道里面数据满了,则write会阻塞,并且有字节流服务,如果所有写或者读端全部关闭,会异常或者关闭。生命周期随进程,所有进程关闭,管道会被释放。

重点(进程间通信的概念理解,表达上没有问题。管道的相关知识点。)

五、共享内存

1、共享内存的本质原理:
开辟一块共享内存(一块物理内存,并且在内核中进行了各种描述----名字,标识符),多个进程通过相同的标识符,找到同一块物理内存,通过页表将其映射到自己的虚拟地址空间中,然后通过自己的虚拟地址进行访问,实现最终的通信。

共享内存图
共享内存图的描述
(有一块物理内存,有一个进程,进程包括虚拟地址空间,页表,PCB。进程通过页表访问到内存中的数据。这时候要创建一个共享内存,就是在物理内存中找一个内存把它开辟出来,这时候在内存中有很多种描述,描述很关键,有标识符,描述信息。通过页表将共享内存映射到进程的虚拟地址空间中,在进程的虚拟地址空间当中映射成功之后,就可以通过虚拟地址间接的访问到物理内存。这时候如果有另一个进程,也有PCB,虚拟地址空间,页表,通过相同的标识符在内存中就可以找到这块物理内存,然后让操作系统对它映射,将相同的物理内存经过页表映射到虚拟地址空间,映射后就可以通过虚拟地址访问真正的物理内存了。虽然两个进程的虚拟地址不一样,但是最终访问的是同一块物理内存。证明同一块物理内存就是他们通信交叉的节点。)

2、操作流程:
1)创建、打开共享内存 int shmget(key_t key,int size,int flag)标识符,共享内存的大小(若是已经存在,则不操作),访问权限
2)与共享内存建立映射关系,int shmat(int shmid,void addr,int flag)创建返回的标识符,映射首地址,标志位,只读,或者可读可写0
3)内存操作–这边进行修改,另一边便可以看到修改的内容
4)解除映射关系 int shmdt(void
addr);映射的首地址,共享内存还在
5)删除共享内存 int shmctl(int shmid,int cmd,struct shmid_ds*buf)

代码:
首先包含头文件#include<sy/shm.h>
每次都是从起始位置开始写入,覆盖
若是正在使用,则删除会有问题,所以删除的时候不会被立即删除,当解除了所有的映射关系之后,就删除。
在这里插入图片描述
在这里插入图片描述

3、基本特性:
1)最快的进程间通信方式(直接通过虚拟地址直接访问),管道是在内核中的,要来回拷贝。所以说他相较于其他方式少了两步用户态与内核态之间的数据拷贝操作。
2)共享内存生命周期随着内核,不随着进程走
4、使用的注意事项:
共享内存的操作并非是安全的,需要我们自己保证安全。可能两方都在写入,数据的二义性。
5、问题:
进程间通信都有哪几种方式?操作系统提供的有几种方式?管道,共享内存(本质,原理,使用特性,使用的注意事项)。

六、消息队列

1、本质原理:
是内核中的一个优先级队列,多个进程通过相同的标识符访问同一个队列,碎裂就是交叉节点,实现通信。那么如何实现通信呢?通过向队列中插入节点或者获取节点实现通信。
==2、特性:==生命周期随内核,自带同步与互斥

七、信号量

==1、作用:==用来实现进程间的同步与互斥
唯一时间的唯一访问,资源访问的合理性,让资源嗯你个狗访问的时候再去访问。
==2、本质原理:==是一个计数器,统计资源数量,实现资源访问的合理性。相当于停车场的车位计数牌。(通过计数来判断,有资源才能访问,没有资源就等着。)
3、信号量的操作(P/V操作):
P操作:计数-1,判断是否小于0,小于0,表示没有资源,则进程等待
v操作:计数+1,判断有没有等待的进程,若是有,则唤醒下一个。
4、信号量如何实现互斥?
同一时间对资源的唯一访问,保证资源数量只有一个,只有一个进程可以访问,访问完鼻子后计数还原。相当于一个停车场。
5、信号量实现同步
信号量本身默认常规都是用于同步的,用计数进行资源获取合理性的判断。(大于0可以访问,小于或者等于0不能访问,这就是合理的秩序)

(重点)进程间通信的问题?

进程间通信是什么,因为进程具有独立性,无法直接通信,操作系统为程序员提供的通信方式,针对不同的应用场景有不同的方式,针对不同的应用场景有不同的方式。
分类方式:管道,共享内存,消息队列,信号量
不同方式各自本质以及提供的功能。管道,共享内存,信号量(是什么,)
单独各种方式的本质原理,基本特性,对编程的影响。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值