一、Linux网络编程
1.1 进程通信的定义
进程通信IPC(Inter-ProcessCommunication)是进程之间互相交换信息的工作。进程的互斥、同步、通信是用来解决并发进程的资源竞争与协作的手段。通信包含同步,同步又包含互斥。
1.2 进程间通信的方式
信号,管道,管道又分为匿名管道和命名管道,共享资源。AT&T在UNIXSystem V中又引入了三种通信方式分别是:消息队列、信号量和共享内存。统称为System V IPC。
1.2.1 管道的定义
管道分为匿名管道和命名管道。匿名管道只能用于父子进程通讯,命名管道也就是FIFO管道可以用于公共通信。
1.2.2五种进程间通信方式的比较
1>管道:速度慢,容量优先,只能用于父子进程通信。
2>FIFO:速度慢,任何进程都能通信。
3>消息队列:容量受系统限制,而且要注意第一次读的时候要考虑上一次没有读完数据的问题。
4>信号量:不能传递复杂消息,只能用来同步。
5>共享内存区:能够很容易控制容量,速度快,但要保持同步。
1.3线程与进程的区别
进程是程序在执行过程中分配和管理资源的基本单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(程序计数器、一组寄存器和栈),它与进程的其他线程共享进程的资源。
进程和线程是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但是线程没有单独的地址空间。一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大。对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
进程的通信包含资源的通信和状态的同步。因为线程资源是共享的,所以线程的通信基本就是线程的同步。
1.4多线程之间通信方式or线程池内数据如何保证一致性
锁机制:悲观锁、乐观锁
同步原语:如volatile、sychronized、final
等待唤醒机制:wait、notify
线程需要返回数据的可以用Callable、Future、FutureTask这些。
1.4.1 volatile关键字的语义
通过在读写操作前后添加内存屏障,达到两个效果:1是强制将修改的值写入主存,并将工作内存的值缓存失效,保证了不同线程对这个变量进行操作时的可见性。2是禁止指令重排。
1.4.2 final关键字的语义
根据JSR133规范
1>对于final变量的初始化重排查规则是:final关键字修饰的变量初始化的代码不能重排序到构造函数结束之后。
2>对final变量的读取重排序规则是:初次读对象引用与初次读该对象包含的final域,JMM禁止处理器重排序这两个操作。
其他方面,编译器有很大自由,能将对final字段的读操作移到同步屏障之外,也允许编译器将final字段的值保存到寄存器,在非final字段需要重新加载的那些地方,final字段无需重新加载。
1.4.3 sychronized关键字的内存语义
进入管程时将同步块内使用到的变量从工作内存清除,退出管程时把共享变量刷新到主内存。
1.4.4 线程的5个基本的同步机制
互斥量、读写锁、条件变量、自旋锁以及屏障
1.5 Linux文件
1.5.1 Linux文件相关的系统调用都有哪些
最常用的是5个: open、read、write、lseek和close。
1.5 Java主流锁
1.5.1 悲观锁和乐观锁
悲观锁:获取数据时先加锁。如Synchronized关键字和基于AQS的锁。
乐观锁:基于无锁编程,常用的是CAS算法。如JUC的atomic包下的原子类。
1.5.2 阻塞和非阻塞
阻塞:需要操作系统切换CPU状态。
非阻塞:不需要切换CPU状态。
自旋锁:底层也是通过CAS实现。
自适应自旋锁:意味着自旋时间或次数不再固定,而是由前一次的状态来决定。
1.6 简述一下BIO、AIO和NIO的区别
1>BIO是同步阻塞通信
服务器实现模式为一个连接一个线程:客户端有连接请求时服务器端就需要启动一个线程进行处理。如果这个连接不做任何事情会造成不必要的线程开销。
2>NIO是同步非阻塞通信
服务器实现模式为一个请求一个线程:客户端发送的连接请求都会注册到多路复用器上,多路复用器轮序到连接有IO请求时才启动一个线程进行处理。
3>AIO是异步非阻塞通信
服务器实现模式为一个有效请求一个线程,客户端的IO请求是由操作系统先完成,再通知服务器应用去创建线程进行处理。
1.7 通信协议有哪些
XNS(XeroxNetwork Systems)协议、IPX(网际包交换)/SPX(排序包交换)协议、Apple Talk、SNA、TCP/IP
1.8 TCP/IP结构模型
大体分为三部分
1> Internet协议(IP)
2> 传输控制协议(TCP)和用户数据报文协议(UDP)
3> 处于TCP和UDP之上的一组协议专门开发的应用程序。它们包括:TELNET、文件传送协议(FTP)、域名服务(DNS)和简单的邮件传送程序(SMTP)等许多协议。
1.8.1 IP的四个主要功能
1>数据传送
2>寻址
3>路由选择
4> 数据报文的分段
1.8.2 控制位的取值及含义
URG 紧急指示字段
ACK 如果设置,该包包含确认
PSH 推入功能
RST 恢复链接
SYN 用于建立序号(同步序号)
FIN 数据不再从连接的发送点进入,结束总报文
1.8.3 套接字的三种类型
1>流式套接字(如TCP)
2>数据报套接字(如UDP)
3>原始套接字
1.8.4 五种IO模式
1>阻塞I/O
进程在调用recvfrom等待有拷贝到程序的数据区到一直到从recvfrom返回这段时间是阻塞的。进程这段时间会让出CPU时间片进行休眠等待。
2>非阻塞I/O
进程不断调用recvfrom进行检查,如果程序数据区还没有数据则立即返回一个错误。直到recvfrom检查到数据正常返回。
3>I/O多路复用
I/O多路复用是先调用select函数或poll函数,当有数据时才调用recvfrom进行真正的读写。
4>信号驱动I/O(SIGIO)
使用信号让内核在文件描述符就绪的时候使用SIGIO信号来通知。
5> 异步I/O
我们如果想进行I/O操作,只需要告诉内核我们要进行I/O操作,然后内核会马上返回。具体的I/O和数据的拷贝全部由内核来完成,我们的程序可以继续向下执行。当内核完成所有的I/O操作和数据拷贝后,内核将通知我们的程序。异步I/O和信号驱动I/O的区别是:信号驱动I/O模式下,内核在操作可以被操作的时候通知给我们应用程序发送SIGIO消息。异步I/O模式下,内核在所有的操作都已经被内核操作结束之后才会通知我们的应用程序。
1.8.5 简述Https流程
1.8.6 TCP/IP三次握手建立连接(连接是全双工)
第一次握手:建立连接时,客户端发送SYN包到服务器,并进入syn_send状态。
第二次握手:服务器收到syn包,确认客户端的syn为收到的序号+1,同时自己也发送一个syn包,即发送(syn+ack)包,此时服务器进入syn_recv状态。
第三次握手:客户端收到服务器的syn+ack包,向服务器发送确认包ack,其中ack的值+1,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
1.8.7 TPC/IP四次挥手关闭连接
第一次挥手,客户端A发送一个FIN,用来关闭客户端到服务器的数据传送。
第二次挥手,服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号+1。
第三次挥手,服务器关闭与客户端的连接,发送一个FIN给客户端。
第四次挥手,客户端发回ACK报文确认,并将确认序号设置为收到序号+1。