计算机基础复习8.29
进程,线程,协程的区别
进程是操作系统中进行资源分配和调度的基本单位,他拥有自己的独立内存空间和系统资源。每个进程都有独立的堆和栈,不与其他进程共享。进程间通信需要通过特定的机制,如管道,消息队列,信号量等。由于进程拥有独立的内存空间,因此其稳定性和安全性相对较高,但同时上下文切换的开销较大,因为需要保存和恢复整个进程的状态
线程是进程内的一个执行单元,也是CPU调度和分派的基本单位。与进程不同,线程共享进程的内存空间,包括堆和全局变量。线程之间通信更加高效,因为他们可以直接读写共享内存。线程的上下文切换开销较小,因为只需要保存和恢复线程的上下文,而不是整个进程的状态。然而,由于多个线程共享内存空间,因此只需要保存和线程安全的问题,需要通过同步和互斥机制来解决。
协程是一种用户态的轻量级线程,其调度完全由用户程序控制,而不需要内核的参与。协程拥有自己的寄存器上下文和栈,但与其他协程共享堆内存。协程的切换开销非常小,因为只需要保存和恢复协程的上下文,而无需进行内核级的上下文切换。这使得协程在处理大量并发任务时具有非常高的效率。
进程的状态
进程有着运行-暂停-运行的活动规律,一般来说,一个进程并不是自始至终连续不停地运行的,他与并发执行中的其他进程的执行是相互制约的。
在一个进程的活动期间至少具备三种基本状态,即运行状态,就绪状态,阻塞状态。
创建状态:一个新进程被创建时的第一个状态
就绪状态:当进程被创建完成并初始化后,一切就绪准备运行时,变为就绪状态。
运行状态:处于就绪状态的进程被操作系统的进程调度器选中后,就分配给CPU正式运行该进程
阻塞状态:当进程请求某个事件且必须等待时,例如请求I/O事件
挂起状态:在虚拟内存管理的操作系统中,通常会把阻塞状态的进程的物理内存空间换出到硬盘,等需要再次运行时,再从硬盘换入到物理内存,描述进程没有占用实际的物理内存空间的情况,这个状态就是挂起状态。
挂起状态分为两种:
阻塞挂起状态:进程在外存并等待某个事件的出现
就绪挂起状态:进程在外存,但只需要进入内存,即刻立刻运行
僵尸进程
父进程创建子进程为客户服务,当子进程退出时,实际上内核里还会保留该进程的一些信息,也是会占用内存的,如果不做好回收工作,就会变成僵尸进程。随着僵尸进程越多,会慢慢耗尽我们的系统资源
当子进程终止时,其在父进程处继承的资源应当还给父进程。当父进程被终止时,该父进程的子进程就会变味孤儿进程,会被一号进程收养,并由1号进程对他们完成状态收集工作
自旋锁
自旋锁是通过CPU提供的CAS函数,在用户态完成加锁和解锁操作,不会主动产生线程上下文切换,所以相比互斥锁来说,会快一些,开销也小一些。CAS函数是将查看锁状态是否空闲,将锁设置为当前线程持有两个步骤形成一条原子指令。使用自旋锁的时候,当发生多线程竞争锁的情况,加锁失败的线程会忙等待,直到他拿到锁。这里的忙等待可以用while循环等待实现,不过最好是使用CPU提供的PAUSE指令来实现忙等待,因为可以减少循环等待时的耗电量。
数组和链表区别
访问效率:数组可以通过索引直接访问任何位置的元素,访问效率高,时间复杂度为O(1),而链表需要从头节点开始遍历到目标位置,访问效率较低,时间复杂度为O(n)
插入和删除操作效率:数组插入和删除操作可能需要移动其他元素,时间复杂度为O(n),而链表只需要修改指针指向,时间复杂度为O(1)
缓存命中率:由于数组元素在内存中连续存储,可以提高CPU缓存的命中率,而链表节点不连续存储,可能导致CPU缓存的命中率较低,频繁的缓存失效会影响性能
TCP头部格式
源端口号(16位) 目标端口号(16位) 序列号(32位) 确认应答号(32位) 首部长度(4位) 保留6位 窗口大小(16位) 校验和(16位) 紧急指针(16位)
拥塞控制
慢启动:TCP在刚建立连接完成后,首先是有个慢启动的过程,这个慢启动的意思就是一点一点的提高发送数据包的数量。当发送方每次收到一个ACK,拥塞窗口cwnd的大小就会加1
拥塞避免:当拥塞窗口超过慢启动门限就会进入拥塞避免。他的规则是每个收到一个ACK时,cwnd增加1/cwnd,由指数增长变成线性增长
拥塞发生时会有重传机制,超时重传是ssthresh设为cwnd/2,cwnd重置为1。快速重传是当接受方发现丢了一个中间包的时候,发送三次前一个包的ack,于是发送端就会迅速地重传,不必等待超时再重传
快速恢复算法如下:
拥塞窗口cwnd=ssthresh+3
重传丢失的数据包
如果再收到重复的ACK,那么cwnd增加1
如果收到新数据的ACK后,把cwnd设置为第一步中的ssthresh的值,原因是该ACK确认了新的数据,说明从duplicated ACK时的数据已经收到,该恢复过程已经结束,恢复到原来的状态
缺页中断
操作系统以page为单位管理内存,当进程发现需要访问的数据不在内存时,操作系统可能将数据以页的方式加载到内存中。上述过程称为缺页中断,当操作系统发生缺页中断时,就会通过系统调用将page再次读到内存中
UDP和TCP有区别吗
UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务
UDP协议真的非常简单,头部只有8个字节
TCP是面向连接的传输层协议,传输数据前先要建立连接。UDP是不需要连接,即刻传输数据
TCP是一对一的两点服务,即一条数据只有两个端点
UDP支持一对一,一对多,多对多的交互通信
TCP是可靠交付数据的,数据可以无差错,无丢失,不重复,按序到达。
UDP是尽最大努力交付,不保证可靠交付数据。
TCP有拥塞控制和流量控制机制,保证数据传输的安全性
UDP则没有,即使网络非常堵塞,也不会影响UDP发送效率
TCP首部长度较长,会有一定的开销
UDP首部只有8个字节,并且是固定不变的,开销较小
TCP是流式传输,没有边界,但保证顺序和可靠
UDP是一个包一个包的发送,是有边界的,但可能会丢包和乱序
TCP的数据大小如果大于MSS大小,则会在传输层进行分片,目标主机收到后,也同样在传输层组装TCP数据包,如果中途丢失了一个分片,只需要传输丢失的这个分片
UDP的数据大小如果大于MTU大小,则会在IP层进行分片,目标主机收到后,在IP层组装完数据,接着再传给传输层
线程同步的方式
锁:加锁,解锁操作
任何进入临界区的线程,必须先执行加锁操作。若加锁操作顺利通过,则线程可进入临界区,在完成对临界资源的访问再执行解锁操作,以释放该临界资源
信号量:P,V操作
信号量表示资源的数量,对应的变量是一个整形的变量,采用P操作,变量减一,如果变量<0,则进程和线程进入阻塞等待,否则继续,表明P操作可能会阻塞。采用V操作,变量加1,唤醒一个等待中的线程。
关系型数据库和非关系型数据库区别
关系型采用二维表结构非常贴近正常开发逻辑
支持使用SQL结构化查询语句
数据全部由表结构组成,文件格式一致
非关系型数据库存储数据的格式可以是key-value形式,文档形式,使用灵活
速度快,效率高,nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘
参考资料
小林coding