文件描述符

文件描述符FD的含义

余生长醉 提交于 2019-11-30 14:45:13
使用sudo lsof -nP -iTCP -sTCP:LISTEN查看占用端口的程序 FD:文件描述符,应用程序通过文件描述符识别该文件    1)cwd:表示 current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改 2)txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序 3)lnn: library references (AIX) 4)er: FD information error (see NAME column) 5)jld: jail directory(FreeBSD) 6)ltx: shared library text(code and data) 7)mxx: hex memory-mapped type number xx. 8)m86:DOS Merge mapped file 9) mem: memory-mapped file 10)mmap: memory-mapped device 11)pd: parent directory 12)rtd: root directory 13)tr: kernel trace file (OpenBSD) 14)v86 VP/ix mapped file 15)0:表示标准输出

Concurrency and Parallelism

﹥>﹥吖頭↗ 提交于 2019-11-30 12:21:18
0 Concurrency and Parallelism 当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。区别:并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。 1. 网络编程 1.1 TCP/IP网络编程 Client: socket connect write recv Server: socket bind listen accept read send An example: Simple TCP/IP C/S . a. socket #include <sys/socket.h> sockfd = socket(int socket_family, int socket_type, int protocol); b. connect #include <sys/types.h> #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); c. bind #include <sys/types.h> #include <sys/socket.h> int bind

socket、端口、进程的关系

烂漫一生 提交于 2019-11-30 10:55:41
本文属网络编程部分。 socket的引入是为了解决不同计算机间进程间通信的问题。 端口是TCP/IP协议中的概念,描述的是TCP协议上的对应的应用,可以理解为基于TCP的系统服务,或者说系统进程!如下图,FTP就需要占用特定的TCP端口。 TCP 而 socket 呢,是网络编程中的概念,对TCP/IP协议进行了抽象和实现,并为应用层提供接口。这里的应用A,可以是FTP应用,它属于用户进程,通过socket与内核中的网络协议栈进行交互。 socket socket 是核心,是枢纽,是进程与网络建立关系的必经之路! 1.内核是如何将数据包转发至 socket 的呢? 网络数据首先到达网卡,然后进入内核,由网络协议栈去处理,那么内核是如何进行数据分发的呢?它怎么知道该如何把数据交给特定的用户进程呢? 这时,就需要 socket 发挥作用了! socket 中存储了特定的四元组: 源ip+port,目的ip+port; 1> bind 到特定 ip 和 port 的socket 对应 [src ip, src port) <=> (*, *)] ; 2> connect 到特定目的ip+port 的 socket 对应 [src ip, src port) <=> (dst ip, dst port)]; 3> accept 返回了的 socket 对应 [src ip, src

QNX----第3章 进程间通信(1部分)

為{幸葍}努か 提交于 2019-11-30 10:52:48
QNX----第3章 进程间通信(1部分) 进程间通信在将微内核从嵌入式实时内核转换为全面的POSIX操作系统的过程中起着至关重要的作用。随着各种服务提供进程被添加到微内核中,IPC是将这些组件连接到一个内聚整体的粘合剂。 虽然消息传递是QNX中微子RTOS中IPC的主要形式,但也有其他几种形式。除非另有说明,那些其他形式的IPC是在我们的本机消息传递之上构建的。策略是创建一个简单、健壮的IPC服务,可以通过微内核中的简化代码路径进行性能调优;这样就可以实现更多“功能混乱”的IPC服务。 将更高级别的IPC服务(如通过我们的消息传递实现的管道和FIFOs)与它们的单内核对应服务进行比较的基准测试显示了类似的性能。 QNX Neutrino至少提供了以下形式的IPC: 设计人员可以根据带宽需求、排队需求、网络透明性等因素选择这些服务。这种权衡可能很复杂,但灵活性是有用的。 作为定义微内核的工程工作的一部分,将消息传递作为基本的IPC原语是经过深思熟虑的。作为IPC的一种形式,消息传递(如MsgSend()、MsgReceive()和MsgReply()中实现的那样)是同步的,并复制数据。让我们更详细地研究这两个属性。 同步消息传递 同步消息传递是QNX中微子RTOS中IPC的主要形式。向另一个线程(可能在另一个进程中)执行MsgSend()的线程将被阻塞

shell重定向的顺序问题

旧街凉风 提交于 2019-11-30 05:27:58
三个默认的文件描述符 0 : stdin(标准输入) 1 : stdout(标准输出) 2 : stderr(标准错误输出) 系统中这3个文件描述符所对应的文件: 重定向顺序 示例脚本 echo "hello world" echo "xxx" sh test.sh hello world xxx sh test.sh >/tmp/out $ cat /tmp/out hello world xxx sh -x test.sh >/tmp/out 2>/tmp/err stdout和stderr分别被重定向到/tmp/out和/tmp/err。 $ cat /tmp/out hello world xxx $ cat /tmp/err + echo 'hello world' + echo xxx sh -x test.sh 2>&1 >/tmp/out stdout被重定向到/tmp/out,stderr被重定向到stdout。因为在执行2>&1的时候,stdout对应的文件为/dev/pts/2,所以stderr的输出仍为stdout,后面的stdout被重定向到/tmp/out。 $ sh -x test.sh 2>&1 >/tmp/out + echo 'hello world' + echo xxx $ cat /tmp/out hello world xxx 文件描述符

网络IO

﹥>﹥吖頭↗ 提交于 2019-11-30 02:42:13
大并发服务器框架 大并发服务器设计目标 高性能(High Performance). 要求编写出来的服务器能够最大限度发挥机器性能, 使得机器在满负荷的情况下能够处理尽可能多的并发请求, 对于大量并发请求能够及时快速做出响应 高可用(High Availability). 要求服务器7*24小时服务, 故障转移 伸缩性(Scalability). 服务器具有良好框架, 分层设计, 业务分离, 并且能够进行灵活部署 分布式: 负载均衡 分布式存储 分布式计算 C/S结构: 任何网络系统都可以抽象为C/S结构(客户端, 服务端) 网络I/O+服务器高性能编程技术+数据库 超出数据库连接数: 数据库并发连接数10个, 应用服务器这边有1000个并发请求, 将会有990个请求失败. 解决办法: 增加一个中间层DAL(数据库访问控制层), 一个队列进行排队 超出时限: 数据库并发连接数10个, 数据库1秒钟之内最能处理1000个请求, 应用服务器这边有10000个并发请求, 会出现0-10秒的等待. 如果系统规定响应时间5秒, 则该系统不能处理10000个并发请求, 这时数据库并发能力5000, 数据出现瓶颈. 数据库瓶颈缓解 提高数据库的并发能力 队列+连接池(DAL) 主要逻辑挪到应用服务器处理, 数据库只做辅助的业务处理. 在数据库上进行计算能力或处理处理逻辑不如操作系统效率高. --

Redis源码剖析和注释(十六)---- Redis输入输出的抽象(rio)

让人想犯罪 __ 提交于 2019-11-29 23:27:47
Redis 输入输出的抽象(rio) 1. 概述 rio是Redis对IO操作的一个抽象,可以面向不同的输入输出设备,例如一个缓冲区IO、文件IO和socket IO。 一个rio对象提供一下四个方法: read:读操作 write:写操作 tell:读写的偏移量 flush:冲洗缓冲区操作 使用C语言,实现面向对象的思想。 2. rio对象的抽象 rio结构体如下: rio.c 和 rio.h 文件详细注释 struct _rio { /* Backend functions. * Since this functions do not tolerate short writes or reads the return * value is simplified to: zero on error, non zero on complete success. */ // 读,写,读写偏移量、冲洗操作的函数指针,非0表示成功 size_t (*read)( struct _rio *, void *buf, size_t len); size_t (*write)( struct _rio *, const void *buf, size_t len); off_t (*tell)( struct _rio *); int (*flush)( struct _rio *); /*

进程间通信:管道及命名管道(代码实现)

六月ゝ 毕业季﹏ 提交于 2019-11-29 22:12:15
管道:1.管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 2.只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 3.单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统, 并且只存在与内存中; 4.数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据; 5.管道通信是于流式符的; 6.管道的生命周期是随进程的; 7.管道已经给进程提供了同步与互斥; pipe: 当一个管道建立时,它会创建两个文件描述符pipefd[0]和pipefd[1]。其中pipefd[0]固定用于读管道,而pipefd[1]固定用于写管道,一般文件I/O的函数都可以用来操作管道。 测试pipe的大小 单独创建一个无名管道,并没有实际的意义。我们一般是在一个进程在由pipe()创建管道后,一般再由fork一个子进程,然后通过管道实现父子进程间的通信(因此也不难推出,只要两个进程中存在亲缘关系,这里的亲缘关系指的是具有共同的祖先,都可以采用管道方式来进行通信)。 代码: 结果: 使用管道需要注意以下4中情况: 1.如果所有指向管道写端的文件描述符没关闭,而持有管道写端的进程也没有向管道中写数据

Redis03——Redis架构

冷暖自知 提交于 2019-11-29 10:29:59
Redis架构 1.1.问题 redis是单线程,单实例,为什么并发那么多,依旧很快呢? 回答:因为调用了系统内核的epoll 1.2.Linux的早期版本 Linux有Linux kernal,我们的客户端,进行连接,首先到达的是Linux kernal,在Linux的早期版本,只有read和write进行文件读写。我们使用一个线程/进程 进行调用read和write函数,那么将会返回一个文件描述符fd(file description)。我们开启线程/进程去调用read进行读取。因为socket在这个时期是blocking(阻塞的),遇到高并发,就会阻塞,也就是bio时期。 1.3.内核的跃迁 Linux kernal在之后的发展,有了很大的变化,Linux到达率NIO时期。我们可以使用客户端进行轮询访问。但是,我们如果打进1000个线程访问,那么成本就会很大。我们出现了select函数,select函数和pselect函数,我们可以直接传1000个文件描述符,一旦有返回,那么再去调read函数。这个叫做多路复用的NIO。 紧接着,内核再次跃迁,我们出现了一个共享空间,通过mmap进行空间映射。(本质是红黑树+链表//红黑树是一种自平衡的二叉查找树)。我们将1000个文件描述符写进共享空间,如果我们的数据有返回,那么加入链表,我们从链表取出调用read进行读取

shell爬虫

空扰寡人 提交于 2019-11-29 10:08:04
#!/bin/bash curl_str='curl -x "http://http-pro.abuyun.com:9010" --proxy-basic --proxy-user H78H42TCN191075P:3D1EA6E4F458AB69' curl_str='curl -L --socks5 socks-cla.abuyun.com:8030 --proxy-user S822RB9T27K96TPC:5E68523C79E62C41' ### encode url encode_url(){ local supplier_name_encode="$(echo "$1" | tr -d '\n' | xxd -plain | sed 's/\(..\)/%\1/g')" echo "https://xin.baidu.com/s?q=${supplier_name_encode}&t=0"|perl -npe 's/\n//' } do_down_web_info_html(){ local url=$(encode_url "$1") local html_file="$2" # wget ${url} -O ${html_file} #echo -e "\n===================================> " ${curl_str} "$