操做系统

内容:html

1.操做系统简介node

2.进程python

3.线程linux

4.协程nginx

5.IO多路复用程序员

 

参考:
web

操做系统:http://www.cnblogs.com/Eva-J/articles/8253521.html算法

进程:https://www.cnblogs.com/Eva-J/articles/8253549.html编程

线程:https://www.cnblogs.com/Eva-J/articles/8306047.html小程序

协程:https://www.cnblogs.com/Eva-J/articles/8324673.html

IO:https://www.cnblogs.com/Eva-J/articles/8324837.html

 

 

 

1、操做系统简介

1.什么是操做系统

操做系统位于计算机硬件与应用软件之间,本质也是一个软件。操做系统由操做系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两部分组成

因此,单纯的说操做系统是运行于内核态的,是不许确的。

 

 

2.操做系统做用

  • 基本功能:处理机管理、存储器管理、设备管理和文件管理
  • 隐藏丑陋复杂的硬件接口,提供良好的抽象接口,提供方便的用户接口
  • 管理、调度进程,而且将多个进程对硬件的竞争变得有序
  • 提升系统资源利用率,方便用户使用

 

 

 

3.操做系统发展

  • 穿孔卡片 - 没有操做系统的概念,全部的程序设计都是直接操控硬件
  • 批处理系统 - 依然是串行,批处理,磁带存储
  • 多道程序设计 - 多道技术,空间复用和时间复用(宏观上并行,微观上串行)
  • 多道批处理 - 提升系统资源利用率和系统吞吐量、多道、无交互能力
  • 分时系统 - 多联机终端、多道技术、分时技术(多路性、交互性、及时性、独立性)

 

 

4.补充

多道技术:

  • 产生背景:针对单核,实现并发(如今的主机通常是多核,那么每一个核都会利用多道技术)
  • 例若有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再从新调度,会被调度到4个cpu中的任意一个,具体由操做系统调度算法决定
  • 空间上的复用:如内存中同时有多道程序
  • 时间上的复用:复用一个cpu的时间片
  • 强调:遇到io切,占用cpu时间过长也切,核心在于切以前将进程的状态保存下来,这样才能保证下次切换回来时,能基于上次切走的位置继续运行

 

 

 

2、进程

1.什么是进程

顾名思义,进程即正在执行的一个过程。进程是对正在运行程序的一个抽象

进程的概念起源于操做系统,是操做系统最核心的概念,也是操做系统提供的最古老也是最重要的抽象概念之一。操做系统的其余全部内容都是围绕进程的概念展开的。

狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)

广义定义:进程是一个具备必定独立功能的程序关于某个数据集合的一次运行活动。它是操做系统动态执行的基本单元,在传统的操做系统中,进程既是基本的分配单元,也是基本的执行单元

 

程序和进程的区别

  • 程序是指令和数据的有序集合,其自己没有任何运行的含义,是一个静态的概念。
  • 而进程是程序在处理机上的一次执行过程,它是一个动态的概念。
  • 程序能够做为一种软件资料长期存在,而进程是有必定生命期的。
  • 程序是永久的,进程是暂时的。

 

 

2.进程调度

想多个进程交替运行,操做系统必须对这些进程进行调度,这个调度不是随机进行的,而须要遵循必定的法则,由此就有了进程的调度算法:

  • 先来先服务调度算法
  • 短做业优先调度算法
  • 时间片轮转法
  • 多级反馈队列

 

 

3.进程的并发与并行

并行 : 并行是指二者同时执行(多核同时刻运行多个进程)

并发 : 并发是指资源有限的状况下,二者交替轮流使用资源,目的是提升效率(单CPU多进程并发)

区别:

  • 并行是从微观上,在一个精确的时间点上有不一样的程序在执行,这就要求必须有多个处理器(多核CPU)
  • 并发是从宏观上,在一个时间段不一样的程序在同时执行的,好比一个服务器同时处理多个任务

 

 

4.同步、异步、阻塞、非阻塞

(1)进程3状态

 

如上图进程有三个状态:就绪,运行和阻塞

  • 就绪状态:当进程已分配到除CPU之外的全部必要的资源,只要得到处理机即可当即执行,这时的进程状态称为就绪状态
  • 执行/运行状态:当进程已得到处理机,其程序正在处理机上执行,此时的进程状态称为执行状态
  • 阻塞状态:正在执行的进程,因为等待某个事件发生而没法执行时,便放弃处理而处于阻塞状态。引发进程阻塞的事件可有多种,例如等待I/O完成、申请缓冲区不能知足、等待信件(信号)等

 

进程三状态实例:

 

(2)同步与异步

同步:一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行,同一时间只能作一个操做
异步:一个进程在执行某个任务时,另外一个进程无需等待其执行完毕,就能够继续执行,当有消息返回时,系统会通知后者进行处理,这样能够提升执行效率,同一时间能够作两个操做

 

(3)阻塞与非阻塞

阻塞与非阻塞与线程等待消息通知(无所谓同步异步)时的状态有关,主要是程序(线程)等待消息通知时的状态角度来讲的

注:不少时候同步操做会以阻塞的形式表现出来,而异步操做通常都不会在真正的IO操做处被阻塞

简单说程序到了IO处就中止运行就是阻塞(python),而程序到了IO处继续向后执行就是非阻塞(node.js)

 

 

5.进程的建立与结束

(1)进程的建立

  • 系统初始化(查看进程linux中用ps命令,windows中用任务管理器,前台进程负责与用户交互,后台运行的进程与用户无关,运行在后台而且只在须要时才唤醒的进程,称为守护进程,如电子邮件、web页面、新闻、打印)
  • 一个进程在运行过程当中开启了子进程(如nginx开启多进程,os.fork,subprocess.Popen等)
  • 用户的交互式请求,而建立一个新进程(如用户双击暴风影音)
  • 一个批处理做业的初始化(只在大型机的批处理系统中应用)

注:不管哪种,新进程的建立都是由一个已经存在的进程执行了一个用于建立进程的系统调用而建立的

 

(2)进程的结束

  • 正常退出(自愿,如用户点击交互式页面的叉号,或程序执行完毕调用发起系统调用正常退出,在linux中用exit,在windows中用ExitProcess)
  • 出错退出(自愿,python a.py中a.py不存在)
  • 严重错误(非自愿,执行非法指令,如引用不存在的内存,1/0等,能够捕捉异常,try...except...)
  • 被其余进程杀死(非自愿,如kill -9)

 

 

 

3、线程

1.线程的引入及背景

(1)进程

程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。

程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。

在多道编程中,咱们容许多个程序同时加载到内存中,在操做系统的调度下,能够实现并发地执行。这是这样的设计,大大提升了CPU的利用率。

进程的出现让每一个用户感受到本身独享CPU,所以,进程就是为了在CPU上实现多道编程而提出的

 

(2)有进程为何须要线程

进程虽然有优势,可是也有缺点:

  • 进程只能在一个时间干一件事,若是想同时干两件事或多件事,进程就无能为力了

  • 进程在执行的过程当中若是阻塞,例如等待输入,整个进程就会挂起,即便进程中有些工做不依赖于输入的数据,也将没法执行

而线程能够很好地解决这些缺陷

引入线程的缘由:减小程序在并发执行时所付出的时空开销,使OS具备更好的并发性

 

(3)线程的出现

在80年代,出现了 能独立运行的基本单位——线程(Threads)
注意:进程是资源分配的最小单位,线程是CPU调度和分派的最小单位, 每个进程中至少有一个线程

 

 

2.进程与线程的区别

  • 地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见
  • 通讯:进程间通讯IPC,线程间能够直接读写进程数据段(如全局变量)来进行通讯——须要进程同步和互斥手段的辅助,以保证数据的一致性
  • 调度和切换:线程上下文切换比进程上下文切换要快得多
  • 在多线程操做系统中,进程不是一个可执行的实体

 

 

3.线程的特色

在多线程的操做系统中,一般是在一个进程中包括多个线程,每一个线程都是做为利用CPU的基本单位,是花费最小开销的实体。线程具备如下特色:
  • 轻型实体(不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源)
  • 独立调度和分派的基本单位、切换很是迅速且开销小(在同一进程中的)
  • 在同一进程中的各个线程能够共享进程资源
  • 可并发执行
 

 

4.内存中的线程

多个线程共享同一个进程的地址空间中的资源,是对一台计算机上多个进程的模拟,有时也称线程为轻量级的进程;而对一台计算机上多个进程,则共享物理内存、磁盘、打印机等其余物理资源。多线程的运行也多进程的运行相似,是cpu在多个线程之间的快速切换。

不一样的进程之间是充满敌意的,彼此是抢占、竞争cpu的关系,如迅雷会和QQ抢资源。而同一个进程是由一个程序员的程序建立,因此同一进程内的线程是合做关系,一个线程能够访问另一个线程的内存地址,你们都是共享的

相似于进程,每一个线程也有本身的堆栈,不一样于进程,线程库没法利用时钟中断强制线程让出CPU,能够调用thread_yield运行线程自动放弃cpu,让另一个线程运行

线程一般是有益的,可是带来了不小程序设计难度,线程的问题是:

  • 父进程有多个线程,那么开启的子线程是否须要一样多的线程
  • 在同一个进程中,若是一个线程关闭了文件,而另一个线程正准备往该文件内写内容呢?

所以,在多线程的代码中,须要更多的心思来设计程序的逻辑、保护程序的数据

 

 

 

4、协程

1.协程介绍

协程:是单线程下的并发,又称微线程,纤程

一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序本身控制调度的。、

注意:

1 python的线程属于内核级别的,即由操做系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其余线程运行)
2 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操做系统)控制切换,以此来提高效率(!!!非io操做的切换与效率无关)

 

对比操做系统控制线程的切换,用户在单线程内控制协程的切换

优势:

  • 协程的切换开销更小,属于程序级别的切换,操做系统彻底感知不到,于是更加轻量级
  • 单线程内就能够实现并发的效果,最大限度地利用cpu

缺点:

  • 协程的本质是单线程下,没法利用多核,能够是一个程序开启多个进程,每一个进程内开启多个线程,每一个线程内开启协程
  • 协程指的是单个线程,于是一旦协程出现阻塞,将会阻塞整个线程

 

协程特色:

  1. 必须在只有一个单线程里实现并发
  2. 修改共享数据不需加锁
  3. 用户程序里本身保存多个控制流的上下文栈
  4. 附加:一个协程遇到IO操做自动切换到其它协程(如何实现检测IO,yield、greenlet都没法实现,就用到了gevent模块(select机制))

 

 

2.greenlet模块

(1)安装

pip3 install greenlet

 

(2)greenlet模块使用

 1 # 使用greenlet模块
 2 # 真正的协程就是使用greenlet模块完成切换
 3 from greenlet import greenlet
 4 
 5 
 6 def eat(name):
 7     print('%s eat 1' % name)
 8     g2.switch('egon')
 9     print('%s eat 2' % name)
10     g2.switch()
11 
12 
13 def play(name):
14     print('%s play 1' % name)
15     g1.switch()
16     print('%s play 2' % name)
17 
18 
19 g1 = greenlet(eat)
20 g2 = greenlet(play)
21 
22 g1.switch('egon')  # 能够在第一次switch时传入参数,之后都不须要

 

 

3.gevent模块

(1)介绍

安装:pip3 install gevent

Gevent 是一个第三方库,能够轻松经过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet所有运行在主程序操做系统进程的内部,但它们被协做式地调度

 

(2)用法

 

 

(3)同步与异步

 

 

四、协程应用

(1)爬虫

 

(2)经过gevent实现单线程下的socket并发

 

 

 

5、IO多路复用

相关文章
相关标签/搜索