进程和线程
1. 计算机操作系统中的“中断”的作用
中断是指当操作系统执行一个程序的时候,当该程序遇到IO阻塞,运行时间过长,或急需CPU处理的事件,CPU会终止运行当前的程序切换执行其他的进程,然后再回过来执行原来的进程。
中断可以充分得利用CPU的资源,使CPU高效的工作。
2.”内核态” 和“用户态”
当程序执行系统调用的时候陷入执行内核代码的时候,就称进程处于内核状态,这时CPU可以访问内存中的所有数据。CPU可以自行被其他程序调用。
当程序执行自己代码的时候,就称当前程序处理用户态。此时程序占用CPU的能力被剥夺,CPU资源可以被其他程序获取。
3.进程
进程指的是正在执行的过程,
程序指的是一堆的代码
4.线程
进程相当于一个车间,那么线程就相当于车间里面的一条流水线。
进程是把资源集合在一起,那么线程才是CPU执行的单元。
5.程序执行过程
程序被加载到内存中,然后通过解释器进行处理和调用系统
6.系统调用
系统调用指的是应用程序通过操作系统提供的接口来调用操作系统和硬件
7.进程间的通信方式
- 管道:速度慢,容量有限,只有父子进程能通讯
- FIFO:任何进程间都能通讯,但速度慢
- 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
- 信号量:不能传递复杂消息,只能用来同步
- 共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
8.队列和管道
队列和消息都是用来传递消息的
队列相对比较高级,有优先级等比较高级的用法
管道相对比较单一,管道分PIPE和FIFO,PIPE是无名的,所以只能在进程内或父子进程间通信,FIFO可任何两个进程间通信了
9.join daemon
join是等待线程执行完毕,适用于当主进程执行到某一阶段时,主线程需要等待子线程执行完毕时才能执行。
daemon 为守护进程,即当主线程结束时,子进程立马终止。
10.threading模块event和condition的区别
event来实现线程之间的通信
11.threading中Lock和RLock的相同点和不同点
相同点:都是线程锁
不同点:Lock会造成死锁,Rlock不会造成死锁
12.什么是select,请简述它的工作原理,简述它的优缺点
13.请简述IO多路复用模型的工作原理
当有请求来的时候,会发送到select,然后select再告诉有没有数据要读取,select可以同时监控多个套接字,然后同时返回给套接字。
注意:如果处理的连接数不是很高的话,使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟还更大。select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接
14.什么是select,请简述它的工作原理,简述它的优缺点
select可以同时监控多个socket是否可读可写,IO多路复用的机制
缺点:
(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大
(3)select支持的文件描述符数量太小了,默认是1024