9.3-chinese
9.3 本章总结在本章中,我们了解各种“高级”线程管理技术:线程池和中断线程。也了解了如何使用本地任务队列,使用任务窃取的方式减小同步开销,提高线程池的吞吐量;等待子任务完成的同时执行队列中其他任务,从而来避免死锁。 也了解了使用线程去中断另一个处理线程的各种方式,比如:使用特定的断点和函数执行中断,要不就是使用某种方法,对阻塞等待进行中断。
附录7 MySQL并发机制
1 并发机制 什么是并发,并发与多线程有什么关系? 先从广义上来说,或者从实际场景上来说. 高并发通常是海量用户同时访问(比如:12306买票、淘宝的双十一抢购),如果把一个用户看做一个线程的话那么并发可以理解成多线程同时访问,高并发即海量线程同时访问。(ps:我们在这里模拟高并发可以for循环多个线程即可) 从代码或数据的层次上来说。多个线程同时在一条相同的数据上执行多个数据库操作。 2 如何避免并发冲突 参考文献 锁与并发 积极并发(乐观锁)积极并发(乐观并发、乐观锁):无论何时从数据库请求数据,数据都会被读取并保存到应用内存中。数据库级别没有放置任何显式锁。数据操作会按照数据层接收到的先后顺序来执行。 积极并发本质就是允许冲突发生,然后在代码本身采取一种合理的方式去解决这个并发冲突,常见的方式有: 忽略冲突强制更新:数据库会保存最后一次更新操作(以更新为例),会损失很多用户的更新操作。 部分更新:允许所有的更改,但是不允许更新完整的行,只有特定用户拥有的列更新了。这就意味着,如果两个用户更新相同的记录但却不同的列,那么这两个更新都会成功,而且来自这两个用...
附录12 并发编程
并发编程1 并发概述 并发一般应用在高性能服务器上,用来响应多个客户端的并发访问。但是在客户端也会用到并发的方法,如某些耗时长的文件读取(并发读取,不会阻塞用户进程)、点对点通信(并发通信不会阻塞用户界面)、ajax异步通信(并发获取服务器上的数据,不会阻塞界面)等。 问题重述 什么是并发, 并发编程的应用场景。并发编程与网络编程的关系,并发编程与进程同步、进程通信、设备IO的关系,并发与并行的关系,并发与同步异步的关系 并发编程的核心问题(并发机制、并发同步、并发通信) 并发编程的具体实例(在各种系统和场景下的表现) 并发概念并发和独占对应。 在程序设计的角度,希望通过某些机制让计算机可以在一个时间段内,执行多个任务。 一个或多个物理 CPU 在多个程序之间多路复用,提高对计算机资源的利用率。 任务数多余 CPU 的核数,通过操作系统的任务调度算法,实现多个任务一起执行。 有多个线程在执行,计算机只有一个 CPU,不可能真正同时运行多个线程,操作系统只能把 CPU 运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。...
附录13 网络编程
网络编程网络编程概述问题重述 什么是网络编程,解决了那些问题? 网络编程与同步异步、阻塞非阻塞的关系 网络编程的核心机制 网络编程的具体实现 什么是网络编程 既是进程线程通信的一部分 也是设备IO(network IO)的一部分。 当然也是独立的一部分。 解决了两个客户端的通信问题 网络编程与同步异步的关系 没有绝对关系,只是在其中一两个步骤中用到了同步思想或者异步思想。无法用同步异步的方式或者阻塞非阻塞的方式,来区分网络编程的类型。 网络编程的核心机制 这里简单介绍一下网络编程通用的核心的原理和模型。 数据交换和通信方式 socket编程 消息队列模式 网络编程的具体实现 每个场景每种语言都有自己的具体实现方案。可以对应到笔记中的其他模块了解网络编程的具体实现。 Linux 网络编程 C++网络编程库 Java网络编程 Python网络编程 Go网络编程 原理和模型阻塞模式 普通的socket编程,连接建立过程是阻塞的、读写过程也是阻塞的。 阻塞模式:比如调用send时,把要发送的数据放到网络发送缓冲区才返回。如果这时,网络发送缓冲区满了,则需要等待更久的...
Select socket
过程分析 用户进程创建socket对象,拷贝监听的fd到内核空间,每一个fd会对应一张系统文件表,内核空间的fd响应到数据后,就会发送信号给用户进程数据已到; 用户进程再发送系统调用,比如(accept)将内核空间的数据copy到用户空间,同时作为接受数据端内核空间的数据清除,这样重新监听时fd再有新的数据又可以响应到了(发送端因为基于TCP协议所以需要收到应答后才会清除) 优点 相比其他模型,使用select() 的事件驱动模型只用单线程(进程)执行,占用资源少,不消耗太多 CPU,同时能够为多客户端提供服务。如果试图建立一个简单的事件驱动的服务器程序,这个模型有一定的参考价值。 缺点 首先select()接口并不是实现“事件驱动”的最好选择。因为当需要探测的句柄值较大时,select()接口本身需要消耗大量时间去轮询各个句柄。 很多操作系统提供了更为高效的接口,如linux提供了epoll,BSD提供了kqueue,Solaris提供了/dev/poll,…。 如果需要实现更高效的服务器程序,类似epoll这样的接口更被推荐。遗憾的是不同的操作系统特供...














