Linux复习(第三次课)__2018.07.27

进程间通信:管道、共享内存、信号量、消息队列、套接字。

共享内存:必须用信号量同步。

共享内存的实现。

消息队列不需要同步。

共享内存:《内核代码情景分析》(《Linux内核****》)

知识体现不出能力,把知识串起来,将问题解决掉。(考任人人之间的差异)

临界资源:同一时刻只允许一个进程或线程访问的资源。

临界区:访问临界资源的代码段,(软件或硬件),用锁或信号量来同步,两个人不能同时操作.多线程环境中就会出错。

是不是临界资源,需要自己去思考。

先拿一下锁,在进行处理。

进程就是一个正在运行的程序(动态概念),线程就是进程内部的一条执行路径或执行序列。

线程的实现:用户级线程\内核级线程\组合模型。

内核级线程由内核管理。

面试的时候,很多问题的答案都不是绝对的。

Linux轻量级进程:do_fork()实现,多个进程访问同一份资源。内核级。

显示线程:ps -efL

显示线程在那个CPU上执行:top->F->J

top -H:会把所有的线程都显示出来。(以进程形式显示)

线程在那个CPU上运行:CPU的亲和力。

4个进程放在4个CPU上。

Linux复习(第三次课)__2018.07.27

Linux复习(第三次课)__2018.07.27

CPU的调度算法。

共享内存的开辟是在内存中,

处理器的cache命中率都在90%以上。

将线程固定在一个处理器上可以提高程序的性能,防止cache失效。cache的命中率是很高的。所以尽量将线程固定到一个CPU上可以防止CPUcache缓存失效。提高线程执行速率。

查看线程可以在哪写CPU上运行taskset -p 3309

将线程固定到指定的cpu上:taskset -p 2 3309

Linux复习(第三次课)__2018.07.27

同步:信号量、互斥锁、条件变量、读写锁。

自旋锁在多处理器上有用,在单CPU上无用。

但凡同步,一定会有人阻塞。

适合的就是最好的。

线程把自己挂起,等待的时间小于,把它换上换下的时间,就忙等待。

线程安全的函数:可重入函数。

磁盘、内存、cache。

OSI:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

tcp:应用层、传输层、网络层、数据链路层、物理层

tcp:面向链接的、可靠的、流式服务

udp:无连接、不可靠、数据报

面向链接通过三次握手完成。

connect()执行后,就会完成三次握手。connect()函数就是发起一个链接。

创建链接,会有有一个结构体、文件描述符。

问的问题高大上,但是知识是很基础的。

tcp和udp在网络层都是通过IP协议实现的。

超时:数据包丢失、ACK丢失。

TCP有***,它会把重复的数据包丢掉,可以对收到的数据包进行排序。

tcp通过:1)应答确认,超时重传。2)滑动窗口。保证数据的可靠性。

udp可以以恒定的速率发送。tcp不能以恒定的速率发送。

流式发送的次数和接收的顺序不一定相同,这会造成粘包问题。

timewait状态:等待两个报文的最大生存时间。变成timewait就不会再发了,

某一时刻注入网络中的数据超过网络的最大负载。网络承受不了。

listen()中的第二个参数:已完成了三次握手的链接队列长度。未完成三次握手的链接队列长度。

不能超过计算机的最大负载。

《Linux内核设计与实现》内存管理。12章。