文件描述符

进程间通信(一)

坚强是说给别人听的谎言 提交于 2020-01-10 03:40:06
进程间通信 一、进程间通信简介 1.进程间是相互独立的,每个进程都有自己的进程虚拟地址空间,二进程通讯需要介子,使得两个进程都能访问的公共资源; 2.进程间通讯的目的: 数据传输:一个进程需要将他的数据发送给另一个进程 资源共享:多个进程间共享同样的资源 通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件(如子进程退出时要通知父进程回收其资源等) 进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程所有陷入和异常,并能及时的知道他的改变状态 二、进程间通讯的发展及分类: 1.管道 匿名管道pipe 命名管道 2.System V进程间通讯 System V消息共享队列 System V共享内存 System V信号量 3.POSIX进程间通讯 消息队列 共享内存 信号量 互斥量 条件变量 读写锁 三、管道 1.什么是管道: 管道是内核中的一块内存 ,构成一个队列, 使用一对文件描述符来进行访问管理这个内存 ,读文件描述符相当于从这个内存中取数据,写文件描述符相当于往这块内存中写数据 2.匿名管道 匿名管道的创建 int pipe(int pipefd[2]); 功能:是创建一个无名管道; 参数:是两个输出型参数,fd表示文件描述符数组,其中fd[0]端表示读端,fd[1]端表示写端。 返回值:创建成功返回0;失败返回错误码。

Redis 单线程却能支撑高并发 - 简书 https://www.jianshu.com/p/2d293482f272

时间秒杀一切 提交于 2020-01-09 18:14:33
小结: 1、 在 I/O 多路复用模型中,最重要的函数调用就是 select,该方法的能够同时监控多个文件描述符的可读可写情况; 2、 Redis 服务采用 Reactor 的方式来实现文件事件处理器(每一个网络连接其实都对应一个文件描述符); 3、 虽然整个文件事件处理器是在单线程上运行的,但是通过 I/O 多路复用模块的引入,实现了同时对多个 FD 读写的监控,提高了网络通信模型的性能,同时也可以保证整个 Redis 服务实现的简单 4、 Redis 会优先选择时间复杂度为 O(1) 的 I/O 多路复用函数作为底层实现,包括 Solaries 10 中的 evport、Linux 中的 epoll 和 macOS/FreeBSD 中的 kqueue,上述的这些函数都使用了内核内部的结构,并且能够服务几十万的文件描述符。 但是如果当前编译环境没有上述函数,就会选择 select 作为备选方案,由于其在使用时会扫描全部监听的描述符,所以其时间复杂度较差 O(n),并且只能同时服务 1024 个文件描述符,所以一般并不会以 select 作为第一方案使用。 https://mp.weixin.qq.com/s/ySG2Qtitr6b8Zcb-SAMnGQ Redis 和 I/O 多路复用 https://draveness.me/redis-io-multiplexing

UNIX基础知识

ⅰ亾dé卋堺 提交于 2020-01-08 00:37:10
1 UNIX基础知识 1.1 UNIX体系结构 操作系统可定义为一种软件,它控制计算机硬件资源,提供程序运行环境,通常将这种软件称为内核(kernel)。UNIX操作系统的体系结构如下图所示,其中内核的接口被称为系统调用(system call图中阴影部分),公共函数库构建在系统调用接口之上,应用程序可调用公共函数库,也可以直接使用系统调用。shell是一种特殊的应用程序,为运行其他应用程序提供一个接口。 1.2 登录 (1) 登录名 用户在登录UNIX时,先键入登录名,然后键入口令。系统在其口令接口(Redhat 2.6.32-431.el6.x86_64在/etc/passwd下)中查看登录名。如下: 口令文件中的登录项是由7个以冒号分隔的字段组成,依次是:登录名、加密口令、数字用户ID、数字组ID、字段注释、起始目录以及shell程序。 (2)shell 用户登录后,系统通常先显示一些系统信息,然后用户可通过shell程序键入命令。shell是一个命令行解释器,可读取用户输入,然后执行命令。shell的用户输入通常来自于终端(交互式shell),有时则来自于文件(称为shell脚本)。UNIX系统中shell有多种,用得比较多的是Bash shell。 1.3 文件和目录 (1)文件系统 UNIX文件系统是目录和文件的一种层次结构,所有东西的起点是称为根(root)目录

多进程下的文件描述符

风流意气都作罢 提交于 2020-01-07 07:52:30
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 多进程下的文件描述符 我们都知道fork之后, 子进程继承了父进程的文件描述符. 但是这是什么意思? 如果父子进程或多个子进程同时操作这个文件描述符会如何? 奇怪的表现 脚本的基本逻辑是父进程读取要处理的文件是计算行数, 然后根据配置的子进程个数fork子进程,子进程处理某一范围的数据,比如子进程1处理1到10行, 子进程2处理11到20. 因为对这个文件的处理是只读操作, 所以没有进行文件拆分,而是直接使用继承的文件描述符, 各子进程移动到自己处理的范围进行处理. 但是在测试的时候, 发现有些子进程总是无法读到数据, strace 调试发现read(2)返回0. 但是增加fseek之后,又正常了, 见当时代码注释: //开发时发现如果没有这个fseek, 会导致$proc_idx=0的那个子进程fgets读不到数据,strace显示read返回0 //原因不明 fseek($order_file, ftell($order_file)); while(($line_no <= $stop) && $line = fgets($order_file, 4096)) { .... } 可以看到这个fseek到ftell完全是没有用的,但加了这句这后就就正常了. 真是匪夷所思. 开发时, 一开始是正常的,

Linux下进程中的通信(上)

给你一囗甜甜゛ 提交于 2020-01-04 19:23:31
一.进程通信的概念 为什么要进程通信? 进程通信:顾名思义,应该是两个进程间进行通信。 进程之间具有独立性,每个进程都有自己的虚拟地址空间,进程A不知道进程B的虚拟地址空间的数据内容(类似于一个人不知道另一个人脑子里在想啥) 二.进程间通信方式的分类 进程间通信方式的共同点: 进程间需要“介质”—两个进程都能访问到的公共资源。 常见的通信方式: 文件(最简单的方法) 假如用vim打开一个test.c文件,这时候会自动产生一个以文件名结尾的.swap文件,用于保存数据。 当正常关闭时,此文件会被删除。当文件非正常关闭时(比如编辑代码时突然断网),如果此时再次通过vim打开该文件,就会提示存在.swap文件,此时你可以通过它来恢复文件:vim -r filename.c 恢复以后把.swap文件删掉,就不会再出现一堆提示了。所以该文件存在就是为了进行进程中的通信。 管道 1.管道定义:一个进程连接到另一个进程的数据流。 ps aux | grep test ,将前一个进程(ps)的输出作为后一个进程(grep)的输入两进程间通过管道进行通信。 ps aux | -l :wc指word count,-l指行数,将ps aux进程的标准输出作为wc -l的标准输入。 2.管道分类 匿名管道和命名管道。 匿名管道 管道是在内核中的一块内存(构成了一个队列)

网络IO模型

拈花ヽ惹草 提交于 2020-01-02 09:21:16
在介绍网络IO模型,我们先来看一下同步和异步,以及阻塞和非阻塞的概念。 同步和异步关注的是结果消息的通信机制 同步:同步的意思就是调用方需要主动等待结果的返回 异步:异步的意思就是不需要主动等待结果的返回,而是通过其他手段比如,状态通知,回调函数等。 阻塞和非阻塞主要关注的是等待结果返回调用方的状态 阻塞:是指结果返回之前,当前线程被挂起,不做任何事 非阻塞:是指结果在返回之前,线程可以做一些其他事,不会被挂起。 然后我们就来了解一些基本的网络IO模型 阻塞I/O(blocking I/O) 非阻塞I/O (nonblocking I/O) I/O复用(select 、poll和epoll) (I/O multiplexing) 信号驱动I/O (signal driven I/O (SIGIO)) 异步I/O (asynchronous I/O ) 阻塞I/O模型 应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待,知道数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。 当调用recvfrom()函数时,系统首先查是否有准备好的数据。如果数据没有准备好,那么系统就处于等待状态。当数据准备好后,将数据从系统缓冲区复制到用户空间,然后该函数返回。在套接应用程序中,当调用recvfrom()函数时,未必用户空间就已经存在数据

Linux进程间通信

一曲冷凌霜 提交于 2020-01-01 16:10:02
写在前面 为什么 要进行进程间通信? 因为进程间具有独立性(每一个进程都有自己的虚拟地址空间,进程A并不知道进程B的虚拟地址空间中的内容),因此导致了进程之间协作的问题 进程间通信的 目的 : 数据传输:一个进程需要将它的数据发送给另一个进程 数据共享:多个进程间需要共享同样的数据、资源 进程控制:一个进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变 进程间通信 分类 : 管道 System V IPC POSIX IPC 网络 是当前最大的进程间通信 本篇文章中只针对管道及System V中的共享内存、消息队列和信号量进行解释 管道 概念: 我们把从一个进程连接到另一个进程的一个数据流称为一个管道 管道是Unix中最古老的进程间通信的形式。它本质是一个内核中的内存,也可以将这块内存称为缓冲区,当其中的数据被读走后,管道就为空 管道是半双工的,即数据只能由一个流向 匿名管道 # include <unistd.h> int pipe(int fd[2]); 功能:创建一个匿名管道 参数:fd[]:文件描述符数组,fd[0]表示读端,fd[1]表示写端,使用这一对文件描述符访问内存 返回值:成功返回0,失败返回-1 【注】: 1、pipe()函数的参数是 输出型参数 ,也就是意味着需要传入一个int类型数组,数组大小为2

shell脚本学习4-输入和输出

两盒软妹~` 提交于 2019-12-27 05:11:16
上一节讲了shel的循环语句,本节介绍shell的输入和输出。输入包括命令行的输入和键盘或文件的输入,输出主要讲解输出重定向。 1. shell的输入 1.1 读取命令行中参数 shell脚本通过美元符号读取命令行中的参数,比如$0表示程序名,$1表示第一个参数,$2表示第二个参数,${10}表示表示第10各参数,以此类推。建立脚本test34.sh如下: #/bin/bash total=$[ $1 * $2 + $3 ] echo "$1 * $2 + $3 = $total" 运行如下: ./test34.sh 4 5 6 结果如下: 4 * 5 + 6 = 26 1)注意,当把字符串输入给shell脚本的时候,注意是以空格作为分隔符,如果字符串本身就有空格的话,那么用双引号或者单引号。举例脚本test35.sh如下: #/bin/bash echo "$1 is pretty nice!" 运行如下: ./test35.sh "wu lin wai zhuan" 结果如下: wu lin wai zhuan is pretty nice! 2) 注意,$0是程序名,这个程序名是运行时输入的完整路径,而不是文件名。比如下面的test36.sh脚本: #/bin/bash echo "shell path is $0" 运行输入: bash shell/test36.sh

linux 根据端口号查询进程

亡梦爱人 提交于 2019-12-24 17:49:52
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> netstat -apn 查看网络连接状态。 lsof -i :9988 查看9988端口运行的程序。 lsof(list open files)是一个列出当前系统打开文件的工具。 要充分地发挥功能必须以 root 用户的身份运行。 每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的如下: COMMAND:进程的名称 PID:进程标识符 USER:进程所有者 FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等 DEVICE:指定磁盘的名称 SIZE:文件的大小 NODE:索引节点(文件在磁盘上的标识) NAME:打开文件的确切名称 lsof语法格式是:lsof [options] filename 复制代码常用的参数列表: lsof filename 显示打开指定文件的所有进程 lsof -a 表示两个参数都必须满足时才显示结果 lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件 lsof -u username 显示所属user进程打开的文件 lsof -g gid 显示归属gid的进程情况 lsof +d /DIR/ 显示目录下被进程打开的文件 lsof +D /DIR/

select、poll和epoll的比较

蓝咒 提交于 2019-12-24 07:25:40
一、select机制   在linux下网络通信中,经常用到select机制,这是一种异步通信的实现方式,select中提供一fd_set的数据结果, 实际上是一个long类型的数组 , 每一个数组元素都能与一打开的文件句柄建立联系,通常这个句柄并不局限于网络通信中的socket句柄,还包括其他文件、命名管道或设备句柄等。 当程序中调用select()时,由内核 根据IO状态修改fd_set的内容,由此来通知执select()的进程哪一Socket或文件可读或者可写。    select的本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是:   1、单个进程可监视的fd数量受到了限制,在32位机器上,他所能管理的fd数量最大为1024。   2、 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大。   3、 对socket进行扫描时是线性扫描,当socket文件描述符数量变多时,大量的时间是被白白浪费掉的。 二、poll机制   poll是 Linux中的字符设备驱动 中有一个函数,Linux 2.5.44版本后已经被epoll所取代。 poll机制是用在某些Unix系统中,使用poll()函数用于执行与select()函数同等功能的函数。    poll本质上和select没有区别