当前位置: 首页 > wzjs >正文

基于拍卖的拍卖网站开发seo01网站

基于拍卖的拍卖网站开发,seo01网站,wordpress伪静态不现实,网站 系统 的开发技术我们知道,进程具有独立性,各进程之间互不干扰,但我们为什么还要让其联系,建立通信呢?比如:数据传输,资源共享,通知某个事件,或控制某个进程。因此,让进程间建…

我们知道,进程具有独立性,各进程之间互不干扰,但我们为什么还要让其联系,建立通信呢?比如:数据传输,资源共享,通知某个事件,或控制某个进程。因此,让进程间建立通信是必不可少的。但如何通信呢?

根据进程的独立性,我们需要保证,让不同的进程看到同一份资源!但这个资源若是进程a建立的则b看不到,b建立的a看不到,因此,这份资源必须由操作系统提供!

   进程间通信分类

      一、.管道

管道在Linux中算是比较古老经典的一种通信方式

假设我们现在有一个进程(PCB,内存 mm_struct等结构),同时其有一个文件描述符表,对应了 某个正在加载的文件(文件在加载就有对应的struct _file、inode),现在我让进程fork出一个子进程,那么PCB等结构会以父进程为模板进行拷贝。但是内核缓冲区、inode也会拷贝吗?不会!文件只会被加载一次,(但struct_file会拷贝,子进程需要有自己的读写位置)那么这个文件是父子进程的共享资源。那么如果我们让父子进程中一方对文件进行写,一方进行读,不就形成了进程间通信了吗?这个以文件方式进行通信的方式我们称为管道。

实际上,两个进程的共享资源是文件内核缓冲区,而且,要让两个进程间通信,就没必要把数据刷新到磁盘。我们用一张图解释一下管道的原理

从图里我们也能看出,管道只能进行单向通信。

我们概念解释一下就是,从一个进程连接到另一个进程的一个数据流。

2.管道创建的接口

如果创建成功就返回0,失败返回-1,其中参数是一个输出型参数,输出管道所连的两个文件的fd。

3.按顺序创建一下管道

#include <iostream>
#include <string>
#include <cstdlib>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>// 让父进程写
// 让子进程读
int main()
{// 1. 创建管道int fds[2] = {0};int n = pipe(fds); // fds:输出型参数if (n != 0){//创建管道失败了std::cerr << "pipe error" << std::endl;return 1;}// Father -> read// Child  -> write// 2. 创建子进程pid_t id = fork();if (id < 0){std::cerr << "fork error" << std::endl;return 2;}else if (id == 0){// 子进程// 3. 关闭不需要的fd,关闭readclose(fds[0]);int cnt = 0;while (true){std::string message = "hello";message += std::to_string(getpid());message += ", ";message += std::to_string(cnt);// fds[1]write(fds[1],message.c_str,message.size());cnt++;sleep(1);// break;}exit(0);}else{// 父进程// 3. 关闭不需要的fd,关闭writeclose(fds[1]);char buffer[1024];while (true){sleep(1);ssize_t n = read(fds[0], buffer, 1024);if (n > 0){buffer[n] = 0;std::cout << "child->father, message: " << buffer << std::endl;}else if(n == 0) {}close(fds[0]);break;std::cout << std::endl;}}return 0;
}

我们想让子进程写就需要把读的接口关闭,同理就需要关闭父进程的写入接口。而通常我们的fds[0]表示读,fds[1]表示写。我们这里实现让子进程向文件写入,然后让父进程读取。

3.管道的一些情况

在管道正常的情况下,如果管道为空,那么read会阻塞,如果管道写满了,write会阻塞,其中并不会出现在写入的过程中去读,也不会在读的过程中进行写,这种保护机制在管道本身就已经形成。如果管道写端关闭(比如子进程写入后退出),读端继续,知道读到0表示读到文件结尾。如果管道写端正常,读端关闭,操作系统会直接杀掉写入的进程(此时的写入已经没有意义)

4.管道的特性

我们以上说的管道的相关问题都指的是匿名管道。因为创建管道时并没有名称。关于匿名管道我们有以下特性:


可以用来进行具有血缘关系的进程间通信

文件的生命周期随进程终止而终止,管道也是

只能做到单向数据通信

管道自带同步互斥等保护机制(读写有相对顺序)

二、管道通信的具体场景——进程池

我们刚才说到,如果管道为空,那么read方就会阻塞,知道有人写入才会读,假设有一个父进程fork出好几个子进程,此时其又为每一个子进程建立了管道,但此时在管道中没有内容,那么作为子进程就只能阻塞,等到父进程进行写入后进行通信。此时如果父进程向管道中写入某些命令,并让子进程们去执行,那么我们就可以像分派任务一样完成操作。像这样的模型我们称为进程池。

三、命名管道

上面我们的所有管道都是匿名管道,匿名管道没有名字,那么在通信时父子进程时如何看到这个管道的呢?->因为子进程继承了父进程的资源。但如果我想让任意两个进程间进行通信呢?此时就需要对管道进行命名了。

创建命名管道:

mkfifo name

我们来用一下,此时我们写入命令:echo "hello">fifo。我们发现卡住了,我们再启动一个终端并写入"cat <fifo"我们发现两个终端恢复正常并打印hello。相当于把内容写在管道然后等待另一端进行读,这就是基本的通信流程。

1.为什么叫命名管道

我们查看管道的详细信息发现,它是一个文件,有自己的inode,文件类型以p开头,也就是说它也有唯一的路径和文件名。这样我们可以用同一个文件系统路径,让两个进程看到同一份进程进行通信。其原理就是让操作系统只使用内核文件缓冲区,只是不刷新就可以了。

我们还有用函数来创建命名管道的方式:

第一个参数就是创建管道的路径,第二个参数是权限。创建成功返回0,出错返回-1

四、system V共享内存

我们知道,一个进程有自己的虚拟地址空间,然后通过页表映射到真实的物理地址,在虚拟地址空间中,有一块共享区,前面我们提到过,一般会把动态库映射到此部分,但现在如果我们在物理内存上开辟一块空间,然后让其通过页表映射到共享区,同样地,另一个进程也进行此操作,那么最终就会形成一个物理地址对应两个虚拟地址,就成功让两个进程看到同一份资源了。这就是共享内存。

共享内存可以在任何时刻在OS内存在多个。

创建共享内存的接口:shmget

第三个参数是一个标记位,我们常用的有IPC_CREAT和IPC_EXCL(宏),前者的作用是,如果内存不存在则创建,如果存在,将其获取并返回。对于后者,如果单独使用无意义,一般二者组合使用(|)。表示,如果内存不存在则创建,如果存在,出错返回。

返回值是一个shmid(共享内存标识符),可以看成数组下标,但和文件描述符相比,这个下标可以从0开始。失败返回-1.

第一个参数必须由用户手动输入,这个参数是用来保证两个进程所映射的是同一份内存,因为我们往往会有很多对共享内存同时存在,为了保证不出错,我们需要让每一份内存都具有唯一性,我们就可以用这个参数进行编号(具体输入由用户决定,能体现唯一性即可),这样我们就可以通过路径+id即可保证映射同一份资源。同时,系统中也有用来生成key值对应的函数:key_t ftok(路径,projid)

共享内存生命周期随内核!

已经开辟的共享内存要么手动释放,要么让OS重启。

五、共享内存的管理指令

1.查看已经开辟的共享内存——ipcs -m

2.删除共享内存——ipcrm -m shmid

3.控制共享内存的相关属性——shmctl函数 

第二个参数我们传对应的宏选项即可,第三个参数用于获取共享内存的相关属性,一般置为nullptr。

比如我们可以用函数删除共享内存

shmctl( shmid,IPC_RMID,nullptr);

六、共享内存的特点 

1.通信速度最快,相比于管道,共享内存只需要一次拷贝,提高了效率。

2.可以让两个进程在各自的用户空间共享内存块,但是没有加任何保护机制!

3.这个保护机制需要由用户自己完成,其中,共享资源被保护起来的话就称临界资源,而我们的代码并不完全都是访问共享内存的,只有访问公共资源的代码我们称临界区,对应的就是非临界区  

http://www.dtcms.com/wzjs/396707.html

相关文章:

  • 网站服务器有问题怎么办啊百度收录提交网址
  • 部队门户网站建设方案指数函数公式
  • 备案期间 网站想正常网推是什么
  • 做软件开发有前途吗宁波最好的seo外包
  • 学电商好还是平面设计好志鸿优化设计
  • 景区网站怎么做线下推广
  • 浙江省建设厅举报网站企业培训课程安排表
  • 上海家居网站建设seo难不难
  • 高端网站建设 深圳佛山网站定制
  • wordpress图片模板下载抖音seo优化排名
  • 北京网站备案真实性核验变更常德网站seo
  • 郑州做网站第一人手机百度最新正版下载
  • 汽车网站开发流程新网域名查询
  • 临西网站建设价格今日足球赛事分析推荐
  • 自己怎么制作企业网站seo专员岗位职责
  • 厦门专业网站设计公司单页站好做seo吗
  • 服装类电子商务网站建设报告百度推广一个关键词多少钱
  • 全栈网站开发流程图互联网营销师报名费
  • 东莞市国外网站建设平台秦皇岛seo优化
  • 网站建设网站公司的序汕头网站建设方案外包
  • 网站里面的数据库是怎么做的百度推广联盟
  • 做日用品的要找什么网站澳门seo关键词排名
  • html网页设计代码购物网站免费投放广告的平台
  • 淄博周村网站建设公司建网站用什么软件
  • b2b网站免费推广平台推荐企业网站优化
  • 企业网站需要响应式seo管理工具
  • 网站建设完毕后怎么加后台百度人工客服在线咨询
  • 问题反馈的网站怎么做下载关键词推广软件
  • app安装官方免费下载seo优化服务是什么意思
  • 网站建设企业网站百度快速优化软件排名