Linux复习(第三次课)__2018.07.27
进程间通信:管道、共享内存、信号量、消息队列、套接字。
共享内存:必须用信号量同步。
共享内存的实现。
消息队列不需要同步。
共享内存:《内核代码情景分析》(《Linux内核****》)
知识体现不出能力,把知识串起来,将问题解决掉。(考任人人之间的差异)
临界资源:同一时刻只允许一个进程或线程访问的资源。
临界区:访问临界资源的代码段,(软件或硬件),用锁或信号量来同步,两个人不能同时操作.多线程环境中就会出错。
是不是临界资源,需要自己去思考。
先拿一下锁,在进行处理。
进程就是一个正在运行的程序(动态概念),线程就是进程内部的一条执行路径或执行序列。
线程的实现:用户级线程\内核级线程\组合模型。
内核级线程由内核管理。
面试的时候,很多问题的答案都不是绝对的。
Linux轻量级进程:do_fork()实现,多个进程访问同一份资源。内核级。
显示线程:ps -efL
显示线程在那个CPU上执行:top->F->J
top -H:会把所有的线程都显示出来。(以进程形式显示)
线程在那个CPU上运行:CPU的亲和力。
4个进程放在4个CPU上。
CPU的调度算法。
共享内存的开辟是在内存中,
处理器的cache命中率都在90%以上。
将线程固定在一个处理器上可以提高程序的性能,防止cache失效。cache的命中率是很高的。所以尽量将线程固定到一个CPU上可以防止CPUcache缓存失效。提高线程执行速率。
查看线程可以在哪写CPU上运行taskset -p 3309
将线程固定到指定的cpu上:taskset -p 2 3309
同步:信号量、互斥锁、条件变量、读写锁。
自旋锁在多处理器上有用,在单CPU上无用。
但凡同步,一定会有人阻塞。
适合的就是最好的。
线程把自己挂起,等待的时间小于,把它换上换下的时间,就忙等待。
线程安全的函数:可重入函数。
磁盘、内存、cache。
OSI:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
tcp:应用层、传输层、网络层、数据链路层、物理层
tcp:面向链接的、可靠的、流式服务
udp:无连接、不可靠、数据报
面向链接通过三次握手完成。
connect()执行后,就会完成三次握手。connect()函数就是发起一个链接。
创建链接,会有有一个结构体、文件描述符。
问的问题高大上,但是知识是很基础的。
tcp和udp在网络层都是通过IP协议实现的。
超时:数据包丢失、ACK丢失。
TCP有***,它会把重复的数据包丢掉,可以对收到的数据包进行排序。
tcp通过:1)应答确认,超时重传。2)滑动窗口。保证数据的可靠性。
udp可以以恒定的速率发送。tcp不能以恒定的速率发送。
流式发送的次数和接收的顺序不一定相同,这会造成粘包问题。
timewait状态:等待两个报文的最大生存时间。变成timewait就不会再发了,
某一时刻注入网络中的数据超过网络的最大负载。网络承受不了。
listen()中的第二个参数:已完成了三次握手的链接队列长度。未完成三次握手的链接队列长度。
不能超过计算机的最大负载。
《Linux内核设计与实现》内存管理。12章。