进程、协程篇

进程、线程、协程篇
1.操作系统发展史
①手工操作(无操作系统):将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
②批处理系统:加载在计算机上的一个系统软件,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(这作业包括程序、数据和命令)。
③联机批处理系统:作业的输入/输出由CPU来处理。成批地读入、输出。
④脱机批处理系统:增加一台不与主机直接相连而专门用于与输入/输出设备打交道的卫星机。
⑤多道程序系统:指允许多个程序同时进入内存并允许它们交替在CPU中运行。单处理机系统中多道程序
⑥多道批处理系统:(简称:批处理系统)系统内可同时容纳多个作业,不允许用户与其作业发生交互作用。
⑦分时系统:把处理机的运行时间分成很短的时间片,按时间片轮流把处理机分配给各联机作业使用。
⑧实时系统:即系统能够及时响应随机发生的外部事件,并在严格的时间范围内完成对该事件的处理。
2.进程与线程
程序是指令的集合,它是进程运行的静态描述文本;
进程是程序的一次执行活动,属于动态概念。
线程是进程的细分,执行进程总事件下很多不同类别的事件。
3.Python GIL(Global Interpreter Lock)
无论你启多少个线程,你有多少个cpu, Python在执行的时候会淡定的在同一时刻只允许一个线程运行。
4.线程的调用方式:
直接调用
继承式调用
Join & Daemon:守护线程
线程锁(互斥锁Mutex)
①用户级的lock与GIL的区别:加入GIL主要的原因是为了降低程序的开发的复杂度,
你自己的程序 里的线程和 py解释器自己的线程是并发运行的,lock可以解决程序线程的先后,而GIL解决解释器的线程先后。
RLock(递归锁):在一个大锁中还要再包含子锁
Semaphore(信号量):互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据
Timer:设定时间后运行
Events:实现两个或多个线程间的交互,红绿灯的例子、员工进公司门要刷卡。
5.queue队列:在多线程中要求数据安全修改时,特别有效。
6.生产者消费者模型:该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
①生产者就是生产数据的线程,消费者就是消费数据的线程。
②生产者消费者模式是通过一个容器(缓冲区)来解决生产者和消费者的强耦合问题。
7.多进程multiprocessing
①进程间通讯:不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法:
Queues
Pipes
Managers
进程同步
②进程池:进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。
进程池中有两个方法:
apply
apply_async

2018/03/09 周五

协程

协程,又称微线程,纤程。英文名Coroutine。协程是一种用户态的轻量级线程。

协程拥有自己的寄存器上下文和栈。重入时,进入上一次离开时所处逻辑流的位置。


2018/03/10 周六

1.数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,

RDBMS即关系数据库管理系统(Relational Database Management System)
Mysql是最流行的关系型数据库管理系统

2.orm英文全称object relational mapping,就是对象映射关系程序

通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,
在使用编程语言对数据库进行操作的时候,可以直接使用编程语言的对象模型进行操作

2018/03/11 周日

1.协程
Gevent:并发同步或异步编程
gevent.joinall 函数:阻塞当前流程,并执行所有给定的greenlet。
执行流程只会在所有greenlet执行完后才会继续向下走。

协程与进程、线程在服务器处理模型中的比较:
(1)每收到一个请求,创建一个新的进程,来处理该请求;
(2)每收到一个请求,创建一个新的线程,来处理该请求;
(3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求
①创建新的进程的开销比较大,所以,会导致服务器性能比较差,但实现比较简单。
②要涉及到线程的同步,有可能会面临死锁等问题。
③在写应用程序代码时,逻辑比前面两种都复杂。
结论:一般普遍认为第(3)种方式是大多数网络服务器采用的方式

2.编程范式:单线程、多线程以及事件驱动编程模型
①单线程同步模型:程序不必要的等待,降低了运行速度
②多线程版本:程序员必须写代码来保护共享资源,防止其被多个线程同时访问。
③事件驱动版本:3个任务交错执行,但仍然在一个单独的线程控制中。
当处理I/O或者其他昂贵的操作时,注册一个回调到事件循环中,然后当I/O操作完成时继续执行。

事件驱动编程,可以联系到 协程的gevent非阻塞I/O,或者 异步I/O

3.关于I/O 的介绍
①用户空间与内核空间
②进程切换:
(1)保存处理机上下文,包括程序计数器和其他寄存器。
(2)更新PCB信息。
(3)把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
(4)选择另一个进程执行,并更新其PCB。
(5)更新内存管理的数据结构。
(6)恢复处理机上下文。
进程控制块(Processing Control Block):操作系统核心中一种数据结构,主要表示进程状态。
存放着操作系统用于描述进程情况及控制进程运行所需的全部信息
③进程的阻塞:
正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,
则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。
④文件描述符fd:
它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。
⑤缓存 I/O (大多数文件系统的默认 I/O 操作)
数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
4.IO模式:
- 阻塞 I/O(blocking IO)
- 非阻塞 I/O(nonblocking IO)
- I/O 多路复用( IO multiplexing)
- 信号驱动 I/O( signal driven IO)
- 异步 I/O(asynchronous IO)

IO执行的两个阶段:准备数据、拷贝数据

①阻塞 I/O:准备数据和拷贝数据 两个阶段都会block直至完成
②非阻塞 I/O:准备数据阶段不block,用户进程需要不断的主动询问kernel数据好了没有
③I/O 多路复用:
用户进程调用了select/poll/epoll函数,那么整个进程会被block。
kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。
用户进程再调用read操作,将数据从kernel拷贝到用户进程。

优点:通过一种机制(select,poll,epoll都是IO多路复用的机制。)
一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,
select()函数就可以返回。
④异步 I/O:
两个阶段都不block,I/O操作完成后,kernel会给用户进程发送一个signal,告知read操作完成了。

synchronous IO和asynchronous IO的区别:
synchronous IO做”IO operation”的时候会将process阻塞。
如blocking IO,non-blocking IO,IO multiplexing

non-blocking IO和asynchronous IO的区别:
在non-blocking IO中,虽然进程大部分时间都不会被block,但仍然要求进程去主动的check,
并当数据准备完成后,也需进程主动再次调用recvfrom来将数据拷贝到用户内存。
而asynchronous IO则完全不同。它就像是用户进程将整个IO操作交给了他人(kernel)完成,
然后他人做完后发信号通知。在此期间,用户进程不需要去检查IO操作的状态,也不需要主动的去拷贝数据。

5.I/O 多路复用之select、poll、epoll详解
select,poll,epoll都是IO多路复用的机制。I/O多路复用就是通过一种机制,
一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
①select:调用后select函数会阻塞,直到有描述副就绪(有数据 可读、可写、或者有except),
或者超时(timeout指定等待时间,如果立即返回设为null即可),函数返回。
当select函数返回后,可以 通过遍历fdset,来找到就绪的描述符。
②poll:不同于select使用三个位图来表示三个fdset的方式,poll使用一个 pollfd的指针实现。
③epoll:select和poll的增强版本

**到此,联系协程的gevent,通过gevent实现单线程下的多socket并发,对比select单进程下,多并发socket。

posted @ 2018-07-28 15:48  心平万物顺  阅读(188)  评论(0编辑  收藏  举报