线程和进程

线程和进程之间的区别:
线程是指进程内的一个执行单元,也是进程内的可调度的实体。
线程与进程的区别:
1、调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
2、并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。
3、拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
4、系统开销:在创建或撤销进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤销线程时的开销。

网络编程中设计并发服务器,使用多进程和多线程,请问有什么区别?
1、进程:子进程是父进程的复制品,子进程获得父进程的数据空间、堆和栈的复制品。
2、线程:相对于进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
两个都可以提高程序的并发度,提高程序运行效率和响应时间。
线程和进程在使用上各有缺点:线程执行开销小,但不利于资源管理和保护;
而进程正相反。同时,线程适合在SMP机器上运行,而进程则可以跨机器迁移。

几种进程的同步机制,并比较其优缺点。
1、原子操作
2、信号量机制
3、自旋锁
4、管程,会合,分布式系统

进程间的通信和线程间通信:
管道、消息队列、信号量、共享内存、套接字(socket)、条件变量

进程死锁的原因:
资源竞争及进程推进顺序非法。

死锁的4个必要条件:
互斥、请求保持、不可剥夺、环路

死锁的处理
鸵鸟策略、预防策略、避免策略、检测与解除死锁

操作系统中进程调度策略有哪几种?
FCFS(先来先服务)、优先级、时间片轮转、多级反馈

线程与进程的区别和联系?线程是否具有相同的堆栈?dll是否有独立的堆栈?
进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。每个线程都有自己的堆栈。
DLL中有没有独立的堆栈,这个问题不好回答,DLL中的代码是被某些线程所执行,只有线程拥有堆栈,如果代码是exe执行,那么这时是不是说这个DLL没有自己独立的堆栈?如果DLL中的代码是由DLL自己创建的线程所执行,那么是不是说DLL有独立的堆栈?
此时是针对堆栈,如果对于堆来说,每个DLL有自己的堆,所以如果是从DLL中动态分配的内存,最好是从DLL中删除,如果你从DLL中分配内存,然后EXE中,或者另外一个DLL中删除,很可能导致程序崩溃。

多线程和多进程的区别?
(必须从cpu的调度,上下文的切换,数据共享,多核cpu利用率,资源占用等
有一个问题会被问到,哪些东西是一个线程私有的?答案必须包含寄存器)
1、进程数据是分开的:共享复杂,需要IPC,同步简单;
多线程共享进程数据:共享简单,同步复杂
2、进程创建销毁、切换复杂,速度慢;线程创建销毁、切换简单,速度快
3、进程占用内存多,CPU利用率低;线程占用内存少,CPU利用率高
4、进程编程简单,调试简单;线程变成复杂,调试复杂
5、进程间不会相互影响;线程一个线程挂掉将导致整个进程挂掉
4、进程适应于多核、多机分布;线程适用于多核
线程所私有的:
线程id、寄存器的值、栈、线程的优先级和调度策略、线程的私有数据、信号屏蔽字、errno变量

多线程锁的种类有哪些?
互斥锁,递归锁,自旋锁,读写锁

自旋锁和互斥锁的区别?
当锁被其他线程占用时,其他线程并不是睡眠状态,而是不停的消耗CPU,获取锁;互斥锁则不然,保持睡眠,知道互斥锁被释放激活。
自旋锁,递归调用容易造成死锁,对长时间才能获得到锁的情况,使用自旋锁容易造成CPU效率低,只有内核可抢占式或SMP情况下才真正需要自旋锁。

多线程程序架构,线程数量应该如何设置?
应尽量和CPU核数相等或者为CPU核数+1的个数

什么是原子操作,gcc提供的原子操作原语,使用这些原语如何实现读写锁?
原子操作时指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何context switch。

有一个计数器,多个线程都需要更新,会遇到什么问题,原因是什么,应该如何做?
有可能一个线程更新的数据已经被另外一个线程更新了,更新的数据就会出现异常,可以加锁,保证数据更新只会被一个线程完成。

如果selsect返回可读,结果只读到0字节,什么情况?
某个套接字集合中没有准备好,可能会select内存用FD_CLR清为0。

connect可能会长时间阻塞,怎么解决?
1、使用定时器;(最常用也最有效的一种方法)
2、采用非阻塞模式:设置非阻塞,返回之后用select检测状态。

keepalive是什么东西?如何使用?
keepalive,是在TCP中一个可以检测死连接的机制。
1、如果主机可达,对方就会响应ACK应答,就认为是存活的。
2、如果可达,但应用程序退出,对方就发RST应答,发送TCP撤销连接。
3、如果可达,但应用程序崩溃,对方就发FIN消息。
4、如果对方主机不响应ack,rst,继续发送直到超时,就撤销连接。默认两个小时。

socket什么情况下可读?
1、socket接受缓冲区中已经接收的数据的字节数大于等于socket接收缓冲区低潮限度的当前值;对这样的socket的读操作不会阻塞,并返回一个大于0的值(准备好读入的数据的字节数)。
2、连接的读一半关闭(即:接收到对方发过来的FIN的TCP连接),并且返回0;
3、socket收到了对方的connect请求已经完成的连接数为非0.这样socket处于可读状态;
4、异常的情况下socket的读操作将不会阻塞,并且返回一个错误(-1)。

UDP调用connect有什么作用?
1、因为UDP可以是一对一,多对一,一对多,或者多对多的通信,所以每次调用sendto()/recvfrom()时都必须制定目标IP和端口号,通过调用connect()建立一个端对端的连接,就可以和TCP一样使用send()/recv()传递数据,而不需要每次都指定目标IP和端口号。但是它和TCP不同的是它没有三次握手的过程。
2、可以通过在已连接的UDP套接字上,调用connect()实现指定新的IP地址和端口号以及断开连接。

socket编程,如果client断电了,服务器如何快速知道?
使用定时器(适合有数据流动的情况);
使用socket选型SO_KEEPALIVE(适合没有数据流动的情况);
1、自己编写心跳包程序,简单的说就是自己的程序加入一条线程,定时向对端发送数据包,查看是否有ACK,根据ACK的返回情况来管理连接。此方法比较通用,一般使用业务层心跳处理,灵活可控,但改变了现有的协议。
2、使用TCP的keepalive机制,UNIX网络编程不推荐使用SO_KEEPALIVE来做心跳检测。
keepalive原理:TCP内嵌有心跳包,以服务端为例,当server检测到超过一定时间(2个小时)没有数据传输,那么会向client端发送一个keepalive packet。

TCP的三次握手与四次挥手过程,每个状态名称与含义,TIMEWAIT的作用。
TimeWait作用:
1、防止上一次连接中的包,迷路后重新出现,影响新连接。
(经过2MSL,上一次连接中所有的重复包都会消失)
2、可靠的关闭TCP连接
在主动关闭方发送的最后一个ack(fin),有可能丢失,这时被动方会重新发送fin,如果这时主动方处于CLOSED状态,就会响应rst而不是ack。所以主动方要处于Time_Wait状态,而不是CLOSED。
Time_Wait并不会占用很大资源的,除非受到攻击。
还有,如果一方send或recv超时,就会直接进入CLOSED状态。

TCP拥塞控制
1、在通信子网出现过多数据包的情况,使得网络的性能下降,甚至不能正常工作,这种现象就称为阻塞。
2、网络阻塞的成因主要有三:
(1)处理器速度太慢
(2)线路容量的限制
(3)节点输出包的能力小于输入包的能力
3、拥塞控制与流量控制是相关的,流量控制在数据链路层对一条通信路径上的流量进行控制,其目的是保证发送者的发送速度不超过接受者的接受速度,它只涉及一个发送者和一个接受者,是局部控制。拥塞控制是对整个通信子网的流量进行控制,其目的是保证通信子网中的流量与其资源相匹配,使子网不会出现性能下降和恶化,甚至崩溃,是全局控制。
4、拥塞控制的最终目标是:
(1)防止由于过载而使吞吐量下降,损失效率;
(2)合理分配网络资源
(3)避免死锁
(4)匹配传输速度
5、对拥塞控制,可用的方法有两类:开环控制和闭环控制
(1)开环控制的思想是通过良好的设计避免拥塞问题的出现,确保拥塞问题在开始时就不可能发生。开环控制方法包括何时接受新的通信何时丢包、丢弃哪些包。其特点是在作出决定时不考虑网络当前的状态。
(2)闭环控制的思想是反馈控制。即通过将网络工作的动态信息反馈给网络中节点的有关进程,节点根据网络当前的动态信息,调整转发数据包的策略。闭环控制过程包括三部分:1.监视系统 检测网络发生或将要发生拥塞的时间和地点。2.报告 将见识中检测到的信息传送到可以进行拥塞控制的节点。3.决策 调整系统的操作行为,以解决问题。
6、对应于开环控制的方法有:
(1)预定缓冲区(2)合理分配缓冲区(3)通信量整形法(A、许可证算法,B、漏桶算法,C、令牌漏桶算法)
7、对应于闭环控制的方法有:(基于拥塞控制,即拥塞出现或即将出现时采用适当的措施进行控制,直到消除拥塞)
(1)阻塞包法
(2)负载丢弃法

Http的报文结构
1、HTTP请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成。
2、HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。

Http1.1和Http1.0的区别?
HTTP协议老的标准是1.0,目前最通用的是1.1。
在同一个tcp的连接中可以传送多个HTTP请求和响应。
多个请求和响应可以重叠,多个请求和响应可以同时进行。

Http怎么处理场链接?
http1.0请求与服务端的交互过程:
1、客户端发出带有包含一个header:“connection:keep-alive”的请求
2、服务端接受到这个请求后,根据http1.0和connection判断出这是一个长连接,就会在response的header中也增加connection:keep-alive,同时不会关闭已建立的tcp连接。
3、客户端收到服务端的response后,发现其中包含connection:keep-alive,就认为是一个长连接,不关闭这个连接。并用该连接再发送request转到(1)。
http1.1请求与服务端的交互过程:
1、客户端发出http1.1的请求。
2、服务端接受到这个请求后,就认为这是一个长连接,会在返回的response设置connection:keep-alive,同时不会关闭已建立的连接。
3、客户端收到服务端的response后,发现其中包含connection:keep-alive,就认为是一个长连接,不关闭这个连接。并用该连接再发送request转到(1)。
基于http协议的长连接减少了请求,减少了建立连接的时间,但是每次交互都是由客户端发起的,客户端发送消息,服务端才能返回客户端消息。因为客户端也不知道服务端什么时候会把结果准备好,所以客户端的很多请求是多余的,仅是维持一个心跳,浪费了带宽。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值