1.进程 线程 协程
1.进程是程序的一次执行,是资源分配的基本单位。一个进程可以拥有多个线程。每个进程间往往是独立的。从Java内存区域来讲...
2.线程是CPU调度的基本单位,可以有多个协程。线程间往往会相互影响。线程开销小。线程依赖于进程而存在,一个进程至少有一个线程;进程有自己的独立地址空间,线程共享所属进程的地址空间;
3.协程
在一个子程序中断,之后执行其他函数,但不是函数调用。下面中的输出结果就是执行了函数A后可能随机执行B,又可能随时执行A。每个协程有独立的栈,而栈既保留了变量的值,也保留了函数的调用关系、参数和返回值。
优势:
- 没有线程切换的开销
- 只有一个线程,因此操作共享资源不需要加锁
def A():
print '1'
print '2'
print '3'
def B():
print 'x'
print 'y'
print 'z'
//可能的输出
1
2
x
y
3
z
2.进程通信方式
1.匿名管道(父子进程或兄弟进程)
特点:
- 半双工(数据只能由一端流向另外一端,通信需要两个管道)
- 有亲缘关系的进程
- 写的一端写到尾部,读的一段从头部读
- 没有格式的字节流,双方要知道每次读写多少字节
- 只存在内存中的文件
2.管道
- 读写类似匿名管道,只是可以扩展到任意进程
- 以读的方式打开管道前,必须有另外一个进程以写的方式打开管道,否则会阻塞。
- 存在磁盘上
3.信号
- 信号可以在任何时候发给某一进程,而无需知道该进程的状态。
- 如果接受信号的进程未处于Running,则由内核保存起来,等进程恢复执行时再传递给它
- 信号可以再用户进程和内核交互
- 来源由ctrl+c kill命令等
4.消息队列
- 存在于内核中的消息链表
- 某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。
5.共享内存
- 进程共享的一块内存区域
6.信号量
7.套接字
3.线程通信方式
- volatile
- synchronized+wait/notify
- yield()
- Condition
- join
- CountDownLatch CyclicBarrier Semaphore
4.虚拟内存
- 使得可以用户多于物理地址大小的内存空间
- 使得应用程序认为自己有连续的可用内存
5.从硬盘加载到内存的过程
6.页面置换算法
- FIFO
- LRU
- LFU
- 淘汰用的最少的
- OPT
7.分页分段
5.进程调度算法
抢占式指的是当前有进程正在进行,此时新来一个高优先级的进程,此时就切换到该进程执行。下面的3,4,6支持抢占
1.先来先服务
- 选择就绪队列中等待时间最长的进程
2.短作业优先 - 下一次执行耗时最短的作业
3.时间片轮转法
分配一个时间片,就绪队列中每个进程都执行这么长的时间。如果用不了这么长时间就执行完了,就会调度下一个进程。
4.最短剩余时间优先 - 每次选剩余执行时间最少的进程执行,如果突然来了一个更小的,则抢占。
5.最高响应比优先
相应比 = (已经等待的时间 + 进程执行要花的时间)/ 进程执行要花的时间
6.多级反馈队列 - 设置多个就绪队列,并为各个队列赋予不同的优先级。在优先权越高的队列中,为每个进程所规定的执行时间片就越小。
- 当一个新进程进入内存后,首先放入第一队列的末尾,按照先来先去原则排队等候调度。如果他能在一个时间片中完成,便可撤离;如果未完成,就转入第二队列的末尾,同样等待调度.....如此下去,当一个长作业(进程)从第一队列依次将到第n队列(最后队列)后,便按第n队列时间片轮转运行。
- 仅当第一队列空闲的时候,调度程序才调度第二队列中的进程运行;仅当第1到(i-1)队列空时,才会调度第i队列中的进程运行,并执行相应的时间片轮转。
- 如果处理机正在处理第i队列中某进程,又有新进程进入优先权较高的队列,则此新队列抢占正在运行的处理机,并把正在运行的进程放在第i队列的队尾。
12.虚拟地址空间
c语言中的地址
6.为什么要有协程
每个协程有独立的栈,而栈既保留了变量的值,也保留了函数的调用关系、参数和返回值在64位linux中,线程的栈有 8MB,而协程栈的大小通常只有几十 KB。
- 节省CPU。当线程时间片用完或调用了阻塞的函数后会进行线程上下文的切换,造成CPU资源的浪费。协程是用户态的线程,用户可以自行控制协程的创建于销毁,极大程度避免了系统级线程上下文切换造成的资源浪费。
- 节省内存。在 64 位的 Linux 中,一个线程需要分配 8MB 栈内存和 64MB 堆内存,系统内存的制约导致我们无法开启更多线程实现高并发。而在协程编程模式下,可以轻松有十几万协程,这是线程无法比拟的
- 开发效率,使用协程在开发程序之中,可以很方便的将一些耗时的 IO 操作异步化,例如写文件、耗时 IO 请求等。