文章目录
1.线程资源共享与不共享
共享的资源有:
堆 由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的
全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的
静态变量 虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段,是共享的
文件等公用资源 这个是共享的,使用这些公共资源的线程必须同步。Win32 提供了几种同步资源的方式,包括信号、临界区、事件和互斥体。
独享的资源有:
栈 栈是独享的
寄存器 因为电脑的寄存器是物理的,每个线程去取值难道不一样吗?其实线程里存放的是副本,包括程序计数器PC
2.进程间通信
目的:
数据传输:一个进程需要将它的数据发送给另一个进程。
资源共享:多个进程之间共享同样的资源。
通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
管道:
一个进程通过调用管程的一个过程进入管程。在任何时候,只能有一个进程在管程中执行,调用管程的任何其他进程都被阻塞,以等待管程可用。
(1)无名管道(内存文件):是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用。进程的亲缘关系通常是指父子进程关系。
(2)有名管道(FIFO文件,借助文件系统):也是半双工的通信方式,但是允许在没有亲缘关系的进程之间使用,先进先出的通信方式。
共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。
消息队列:消息队列是有消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号:传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
套接字socket:适用于不同机器间进程通信,在本地也可作为两个进程通信的方式。
信号:用于通知接收进程某个事件已经发生,比如按下ctrl + C就是信号。
信号量:是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,实 现进程、线程的对临界区的同步及互斥访问。
3.线程间通信
线程间的同步方式包括互斥锁、信号量、条件变量、读写锁:
4.了解的锁机制?(线程同步)
(1)互斥锁:mutex,保证在任何时刻,都只有一个线程访问该资源,当获取锁操作失败时,线程进入阻塞,等待锁释放。
(2)读写锁:rwlock,分为读锁和写锁,处于读操作时,可以运行多个线程同时读。但写时同一时刻只能有一个线程获得写锁。
(3) 自旋锁:spinlock,在任何时刻只能有一个线程访问资源。但获取锁操作失败时,不会进入睡眠,而是原地自旋,直到锁被释放。这样节省了线程从睡眠到被唤醒的时间消耗,提高效率。
(4)条件锁:就是所谓的条件变量,某一个线程因为某个条件未满足时可以使用条件变量使该程序处于阻塞状态。一旦条件满足了,即可唤醒该线程(常和互斥锁配合使用)
(5) 信号量:计数器,允许多个线程同时访问同一个资源。
互斥锁和读写锁的区别:
(a)读写锁区分读锁和写锁,而互斥锁不区分
(b)互斥锁同一时间只允许一个线程访问,无论读写;读写锁同一时间只允许一个线程写,但可以多个线程同时读。
5.讲一下死锁
如果一组进程中的每个进程都在等待一个事件,而这个事件只能由该组的另一个进程触发,这种情况会导致死锁。可以理解为:死锁就是两个线程同时占用两个资源,但又在彼此等待对方释放锁。比如两只羊过独木桥。进程比作羊,资源比作桥。若两只羊互不相让,争着过桥,就产生死锁。
死锁产生条件:
1.互斥条件:进程对所需求的资源具有排他性,若有其他进程请求该资源,请求进程只能等待。
2.不剥夺条件:进程在所获得的资源未释放前,不能被其他进程强行夺走,只能自己释放。
3.请求和保持条件:进程当前所拥有的资源在进程请求其他新资源时,由该进程继续占有。
4.循环等待条件:存在一种进程资源循环等待链,链中每个进程已获得的资源同时被链中下一个进程所 请求。
常见的解决死锁的方法(数据库死锁)
1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
6.虚拟内存
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存 (一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换
7.大文件传输
基于socket
由于socket本身缓冲区的限制,大概一次只能发送4K左右的数据,所以在传输大数据时客户端就需要进行分包,在目的地重新组包。
使用现有的通讯中间件
基于共享文件、ftp(文件传输协议)、scp等
ftp:使用 TCP 传输
scp
用于在Linux下进行远程拷贝文件的命令,scp传输是加密的
scp 被复制目标 复制存储的目录