2019-08-17

1.如何实现Udp的高并发

目前比较简单的思路:

1.服务器主进程收到新的客户端发来的消息

2.服务器端动态创建一个新的套接字并bind新的地址信息

3.服务器端通过旧的套接字将新的套接字地址信息发送给客户端

4.fork子进程,处理新套接字发来的请求(关闭父进程的相同套接字)

5.返回第一步

2.进程和线程的相关问题

进程的地址空间分布:

2019-08-17_第1张图片
linux32位进程内存空间分布图.PNG

linux 操作系统每当生成一个进程时,它就具有了一个虚拟地址空间,通常在32位机中,它的大小为4G,按3:1的比例分配给用户空间。
如上图所示:
地址空间依次分为内核空间,栈空间,内存映射段,堆空间,Bss段,数据段,代码段.

内核空间:linux将最高的1G字节供内核使用,称为"内核空间"。对于linux来说,通过区分内核空间和用户空间的设计,隔离了操作系统代码与应用程序代码。即便是单个应用程序出现错误也不会影响到操作系统的稳定性及可用性。

栈空间:进程用户空间栈,由编译器自动分配释放,存放函数的参数值,局部变量的值等。linux32位线程默认栈空间最大8M

内存映射段:存储任何内存映射文件

堆空间: 存储动态内存分配,匿名的内存映射

Bss段: 未初始化的全局变量或者静态变量

数据段: 可执行文件代码的已初始化全局变量的内存映射

代码(程序)段:可执行文件代码的内存映射

  • 进程和线程的区别

    • 进程是操作系统的基本单位,线程是cpu调度和分配的基本单位
    • 线程的创建开销更小,因为它们的过程不需要独立的地址空间。
    • 由于线程共享地址空间,在修改某块共享数据时,应该保证只有一个线程进入了临界区,因此多线程需要小心使用。而进程是不共享地址空间的,不需要担心此问题
    • 线程相对于进程来说更加的轻量级,因为它相比进程使用更少的资源
    • 进程之间彼此独立,互不干扰;而线程之间是相互依存的,一个线程死亡这整个进程都将崩溃。
    • 一个进程能够包含多个线程。
    线程共享资源 线程独享资源
    地址空间 程序计数器
    全局变量,打开的文件描述符,子进程 寄存器
    信号及信号服务程序 栈,状态字

3.select ,poll,epoll相关问题

  • select ,poll,epoll哪个可移值性最好?

select 的可移植性最好,几乎所有的主流平台都支持。

在某些Unix系统上不支持poll(), epoll只在linux下支持

  • select,poll,epoll超时器的精度

select的timeout参数(结构体timeval)精确度为1ns(microsecond)微妙,而poll和epoll的精确度为1ms(milisecond)毫秒.因此select 更加适合实时性要求比较高的场景。

4.输入www.baidu.com会发生什么?输入一个URL又是什么结果

  1. 浏览器根据域名查找IP地址

  2. 浏览器根据解析到的IP地址向Web服务器发送一个Http请求

  3. 服务器收到请求并进行处理

  4. 服务器返回一个响应给浏览器

  5. 浏览器对服务器发来的响应进行解码,渲染显示。

  6. 服务器发送完数据后是否立即关闭Tcp连接需要分情况讨论

对每一个环节进行深入剖析,将会牵涉到网络相关知识

第一点:

关于浏览器是如何查找域名的ip地址,浏览器首先会查找浏览器缓存(会存取DNS记录一段时间),

若浏览器缓存没有相关数据,浏览器将会首先查看本地的hosts文件,查询其中是否有相应域名对应的规则。

若本地的hosts文件也没有,浏览器会发出一个DNS请求道本地DNS服务器,而本地DNS服务器一般都是你网络接入服务商提供的,如联通,电信。

浏览器查询请求到达本地DNS服务器后,本地DNS服务器会首先查询它的缓存记录,如果有,直接返回,如果没有本地DNs服务器还要向DNS根服务器查询,迭代查询根域名服务器,顶级域名服务器等。

最后本地DNS服务器收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给浏览器,还要把对应关系存取到本地DNS缓存中。

第六点:

服务器发送完数据后是否立即关闭Tcp连接

与HTTP协议的Keep-Alive模式是否开启有关,非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接 。当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

  • 若是http1.0协议,默认关闭keepalive,需要在http头加入"Connection:Keep-Alive",才能启用Keep-Alive。
  • http 1.1默认是启用Keep-Alive,如果加入"Connection:close"才关闭

5.fork()和vfork()

fork()创建的子进程复制了父进程的资源(写时复制技术)。

vfork()也是创建一个子进程,但是子进程共享父进程的空间。在vfork()创建子进程后,父进程会阻塞,直到子进程执行了exec()或exit()。vfork()创建出来的不是真正意义上的进程,而是一个线程,因为它缺少独立的内存资源。

6.exit()与_exit()区别?

2019-08-17_第2张图片
exit和exit_.png

系统调用_exit()直接陷入内核,而c语言库函数exit()是经过一系列的系统清理工作,再调用linux内核的

_exit()函数主要做了清理内存空间,结束进程调用等工作。

7.进程间的通信方式

原由: 不同进程之间是相互独立的,拥有独立的(虚拟)地址空间,所以进程间通信是很难的,所以内核给我们提供了一份公共资源让两进程都能访问就可以实现通信了。

1.无名管道: 只能用于有亲缘关系的进程间通信,从本质上来说,管道也是一种文件。通过管道通信的两个进程,一个进程向管道里写数据,另外一个从中读取数据,管道是半双工通信。(两个管道可以实现全双工通信)

#include
int pipe(int fd[2]);

2.有名管道(FIFO):可以使互不相关的两个进程间实现彼此通信。文件系统中存在命名管道。在共享进程执行输入 - 输出之后,管道仍然独立于进程存在于文件系统中,并且可以用于某些其他进程之间的通信。

消息队列:

#include
int msgget(key_t key,int msgflg);
...

3.消息队列其实是以链表实现的,进程A向队列中写数据(写满则不能写了,因为消息队列是固定的),队列中有数据了进程B就可以开始读取数据,读完了数据后不能读了。消息满了,则默认0为阻塞,直到有了空间位置,才能snd消息进入到内核。

消息队列相比于有名管道的优点:全双工通信,内置同步和互斥机制,

4.共享内存:IPC为一个进程创建一个特殊的地址范围,它将出现在进程的地址空间中。其他进程可以把同一段共享内存段"连接到"它们自己的地址空间里去。所有进程都可以访问共享内存中的地址。如果一个进程向这段共享内存写入了数据,所做的改动会立即被有访问同一段共享内存的其他进程看到。因此共享内存对于数据的传输是非常高效的。

#include
int shmget(key_t key,int size,int flag);

优点: 使用共享内存进行IPC非常方便,数据的共享还使进程间的数据不用传送,而是直接访问内存,提高了程序效率。可以使互不相关的两个进程间实现彼此通信。

缺点: 共享内存没有提供同步的机制,因此在使用共享内存进行IPC时,往往要借助其他的手段来进行进程间的同步工作。

5.信号量

用于控制进程间的同步和互斥,对临界资源的同步访问。

计数器+等待队列

每申请一次信号量减一,用完释放就加1,当资源被申请完时(信号量为0),再申请就会使信号量<0,那么此时将进程加入等待队列中,一旦有资源释放,就可以马上得到资源。

“信号量主要是实现进程对临界资源的同步访问,和进程间通信有什么关系啊?”

不同进程在通过唯一的semid访问信号量,并对信号量的值进行设置,着就是在通信,不同的进程在访问一个共享资源信号量,并修改其值。

8.http请求报文都包含那些部分?http的请求方法有什么?PUT和POST有什么区别?

Http协议无论是请求报文还是回应报文,都分为4个部分


HTTP-message   = start-line
                *( header-field CRLF )
                CRLF
                [ message-body ]
                

CRLF (carriage return followed by line feed) 网络换行标准 (\r\n)

四部分为

  • 起始行(start-line) 开始
  • 0或多个表头栏位(header-field)+CRLF
  • 再加上一个CRLF
  • 最后是可选的(optional)讯息主题(message-body)

Http请求报文的具体格式

2019-08-17_第3张图片
http请求报文格式.png

一个Http请求报文由请求行(request line),请求头部(header),CRLF和请求数据4个部分组成。

1.请求行

​ 请求行由请求方法字段URL字段HTTP协议版本字段3个字段组成,之间用空格分割。

​ 例如: POST /?id=1 HTTP/1.1

2.请求头部

​ 请求头部由关键字/值组成,每行一对,关键字和值用英文冒号":"分隔。请求头部通知服务器有关客户端 请求的信息。

​ 典型的请求头部信息有:

​ Host: echo.paw.cloud 请求的主机名

​ User-Agent: Mozilla/5.0 产生请求的浏览器类型

3.空行(CRLF)

最后一个请求头之后是一个空行,发生回车符和换行符,通知服务器不再有请求头。

4.请求数据

​ 请求的主体内容。一般在 POST 请求中才会使用这个字段。

请求报文的范例:

POST /?id=1 HTTP/1.1

Host: echo.paw.cloud
Content-Type: application/json; charset=utf-8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0
Connection: close
Content-Length: 136

{
 "status": "ok",
 "extended": true,
 "results": [
   {"value": 0, "type": "int64"},
   {"value": 1.0e+3, "type": "decimal"}
 ]
}

http的请求方法分类

http1.0定义了三种请求方法:GET,POST,HEAD

http1.1新增了六种请求方法:OPTIONS,PUT,PATCH,DELETE,TRACECONNECT方法

方法 描述
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容
DELETE 请求服务器删除指定的页面
CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
PATCH 对 PUT 方法的补充,用来对已知资源进行局部更新 。

PUT和POST有什么区别?

幂等: 对于单个输入或者无输入的运算方法,如果每次都是同样的结果,则称其为幂等的。

POST:用于提交请求,可以更新或者创建资源,是非幂等的

PUT: 用于向指定的URL传送更新资源,是幂等的。

GET和POST的主要区别

1.Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据

2.Get将表单中的数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接; Post 是将表单中的数据放在 message-body中,按照变量和值相对应的方式,传递到 action 所指向 URL。

3.Get是不安全的,因为在传输过程,数据被放在请求的 URL 中 ,这样就可能会有一些隐私的信息被第三方看到 。Post 的所有操作对用户来说都是不可见的

4.Get传输的数据量小,这主要因为瘦URL长度的限制;而Post可以传输大量的数据,所以在上传文件时只能使用Post(当然还有一个原因,将在后面的提到 )。

5.Get会限制Form表单的数据集的值必须为ASCII字符;而Post支持整个 ISO10646 字符集 。

9.常见http返回码和其状态描述说明如下?

返回码由3位数字组成,第一个数字定义了响应的类型,且有5种可能的取值。

(1) 1xx: 指示信息,表示请求已接收,继续处理。

(2) 2xx: 成功,表示请求已被成功接收,理解,接受。

(3) 3xx:重定向,要完成请求必须进行更进一步的操作。

(4) 4xx:客户端错误,请求有语法错误或请求无法实现。

(5) 5xx:服务器端错误,服务器未能实现合法的请求。

常见返回码和其状态描述说明如下:

200 OK 客户端请求成功
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未被授权,这个状态代码必须和www-authenticate 报文域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found 由于客户端的错误操作导致请求资源不存在,比如:输入了错误的URL
500 Internal Server Error 服务器发生不可预期的错误
503 Server unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

你可能感兴趣的:(2019-08-17)