并发编程基础
并发编程基础:
多道技术:
1. 空间上的复用
多个程序共用一套计算机硬件
2. 时间上的复用 (切换+保存状态)
2.1 当一个程序遇到 IO 操作,操作系统会剥夺该程序的 cpu 执行权限(提高了 cpu 的利用率 并且也不影响程序的执行效率)
IO 操作(input 、 ouput、 sleep、 accept、 recv 等阻塞态)
2.2 当一个程序长时间占用 cpu 操作系统也会剥夺该程序的 cpu 执行权限(降低了程序的执行效率)
并发:看起来像同时运行的就可以
并行:真正意义上的同时执行
注:单核的计算机能不能实现并行,但是可以实现并发
程序:就是未执行的代码块
进程:正在运行的程序
进程调度:(规则)
要想多个进程交替运行,操作系统必须对这些进程进行调度,这个调度也不是随即进行的,而是需要遵循一定的法则,由此就有了进程的调度算法。
时间片轮转法 + 多级反馈队列:https://www.cnblogs.com/Dominic-Ji/articles/10929384.html
进程状态:程序不会立刻进入运行态,都会先在就绪态等待cpu的执行
进程三状态图:
同步 & 异步:表示的是 任务的提交方式
同步:任务提交之后,原地等待 的任务的执行并 拿到返回结果 才走,期间不做任何事(程序层面的表现就是卡住了)
异步:任务提交之后,不再原地等待,而是继续执行下一行代码( 结果是要的 ,但是是用过其他方式获取)
阻塞 & 非阻塞:表示的 程序的运行状态
阻 塞:阻塞态
非阻塞:就绪态,运行态
强调:同步 & 异步、阻塞 & 非阻塞 是两对概念 不能混为一谈
僵尸进程 & 孤儿进程
所有的进程都会步入僵尸进程:
父进程回收子进程资源的两种方式:
1. join方法
2. 父进程正常死亡
孤儿进程:
子进程没死,父进程意外死亡(会被系统的儿童福利院回收,重新成为子进程)
互斥锁:
当多个进程操作同一份数据的时候,会造成数据的错乱,这个时候必须加锁处理
在进行数据操作的时候,将并发变成串行,虽然降低了效率但是提高了数据的安全
注:1. 锁不要轻易使用 容易造成死锁现象
2. 只在处理数据的部分加锁 不要在全局加锁
3. 锁必须在主进程中产生,交给子进程去使用