并发 同一个时间段内多个请求,跟cpu多核没关系,cpu来回切换处理不同的请求
并行:并发真子集,他是一个时间点,多个请求处理,如果处理器正好是多核,并行进行
多并发方式:进程、I/O多路复用、线程
进程:一个文件描述符一个进程,每个进程都有自己的虚拟地址空间,所以父子进程也不会对地址空间共享,不会出现莫名其妙的问题。进程间可以通过显示的IPC进行通信
多进程处理:一个多任务服务器监听,客户端发送请求,服务器监听并连接,接收客户端链接符, 然后fork子进程,然后关闭子进程的监听符,并处给客户端,关闭接收符, 父进程关闭连接符。
进程有点:有自己的地址空间,不会被其他进程覆盖自己的地址空间,缺点是进程间通讯,必须借助显示的IPC,消耗性能
I/O多路复用:应用程序在一个进程里面显示的上下文调用逻辑流,把逻辑流标示成状态机。他们共享一个地址空间,所以不需要额外的资源去处理通讯
I/O多路复用并发程序:对于一个链接和一个读的描述符操作,I/O多路复用可以实现这种形式,,通过FD_ZERO初始化,然后FD_SET事件,通过select阻塞然后获取到准好的描述符,然后再通过FD_ISSET哪种描述符已经完成,然后执行该描述符,优点:可以处理多种用户情况例如链接描述符和标准输入,还有都是在一个进程上下文状态处理,共享同一个地址内存,不需要额外处理通讯。缺点:一旦一个逻辑流读一个文本行,会让后面逻辑流的等待(会出现恶意客户端攻击发生)
线程:单一进程中多个处理的上下文的逻辑流,有内核控制,共享一个地址空间
进程里面多线程,一个主线程,其他都是对等线程,对等线程分为可结合和分离。可结合线程可以被其他对等进程杀死或回收,分离线程不可以被对等线程杀死或关闭,它由内存资源在它终止的时候被回收
共享变量是多线程可以很方便读取和共享数据,如果多线程并发会导致一个变量出错。
信号量同步线程:多线程一起读和写共同一个共享区变量时,会导致出错。解决该问题引入了信号量,
P(s):如果s非零,P将s取出来减1,当s=0时,会挂起这个进程
V(s):V把s取出来加1,当s大于0时,会触发等待线程中的一个去重启
多线程事例:1、生产者->消费者 2、读->写
一个生产者监听槽是否有空间,如果有创建放到缓冲期槽中,消费者等待消费,如果槽空就继续等待,信号通知槽有数据了消费者进行消费。
还有一种是读者优先,就是多进程中,第一个读开始到最后一个读结束,写进程都需要等待,这样会造成拥堵。
预线程服务:提前创建多个处理子线程,等待缓冲期槽中是否有套接字字符, 有的话处理,多个线程都分离出去,自己执行完系统自动回收
提高线程并发,多核多进程,比如4核处理器,就并发4个线程,这时候效率最高,超过>4,效率降低,因为线程上下文切换导致效率降低
线程安全函数和线程不安全函数,不安全函数可以重入变为安全函数,可重入是线程安全的真子集
P,V会导致死锁,如果使用顺序错误的话,导致死锁发生