什么是进程、进程的概念?

进程的概念主要有两点:

  • 第一,进程是一个实体。每一个进程都有它自己的地址空间,
  • 一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。
  • 文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
  • 第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),
  • 它才能成为一个活动的实体,我们称其为进程。
  • [3]进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,
  • 描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
什么是线程、进程的概念?
  • 通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源,
  • 在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,
  • 而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,
  • 故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。
  • 当下推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。
 
 
线程通信
    线程通信方法:
         多个线程共用线程空间,所以进程的全局变量对进程内线程均可见
         线程的通信方法就是使用去全局变量通信
    注:
         线程间使用全局变量进程通信时,全局变量为共享资源
         往往需要同步互斥机制
线程同步互斥:
    线程Event
         创建对象:
             e = threading.Event()
         事件阻塞函数:
             e.wait([timeout])
         设置事件:
             e.set()
         清除事件:
             e.clear()
 
    线程锁 Lock:
         创建锁对象
             lock = threading.Lock() 
         上锁:
             lock.acquire()
         解锁:
             lock.release()
 
Pyhthon线程GIL问题:
    GIL (全局解释器锁
    Python --->支持线程操作--->出现IO同步互斥--->加锁--->超级锁,给解释器加锁
    由于Python为后端语言 所有的后端语言都支持线程操作、IO同步互斥、由于线程间
    的数据安全及稳定性所以要加锁,如果每个线程都加锁开发以及运行的效率是非常低的
    所以就出现了超级锁  就是给Python解释执行器加锁 由于加锁的原因而导致了GIL的出现
    什么是GIL?
  • GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念
  • 由于不同的执行环境(解释器)所导致的例如Jpython  C#py都没有GIL
  • Python的多线程在多核CPU上,只对于IO密集型计算产生正面效果;
  • 而当有至少有一个CPU密集型线程存在,那么多线程效率会由于GIL而大幅下降。
  • GIL其实是功能和性能之间权衡后的产物,它尤其存在的合理性,也有较难改变的客观因素
    后果:
        同一时刻一个解释器只解释一个线程 
        此时其他线程需要等待。大大降低了Python线程的执行效率
        只能实现并发不能实现并行
 
Python GIL问题解决方案:
     由于太多的库依赖于GIL的这种环境 并没有太好的解决方案
     帮助:
       1.修改c解释器
       2.尽量使用多进程进行并行操作
       3.Python线程尽量用在高延迟多阻塞的IO情形
       3.不使用CPython   使用C#、JAVA 做的得解释器
 
效率测试:
    分别测试 多进程、多线程、单进程
    执行相同的IO操作和CPU操作的时间
  • Line cpu: 8.15166711807251   单进程cpu密集操作
  • Line IO: 6.841825246810913   单进程IO密集操作
  • Thread cpu 8.414522647857666    多线程cpu密集操作
  • Thread IO 6.023292541503906      多线程IO密集操作
  • Process cpu 4.079084157943726  多进程cpu密集操作
  • Process IO 3.2132551670074463  多进程IO密集操作
 
测试环境:VM 2核虚拟机
由此我们可以看出  多次线程不仅执行实现没有单进程快 反而更慢了 这就是GIL所导致的
相比来说多进程就快很多 内核越多效率越明显  由于全局锁的原因 多线程并没有实现
并行只是并发效果
 
 
 
进程和线程的区别和联系
    1.两者都是多任务编程的方式  都能够使用计算机的多核
    2.进程创建和删除比线程消耗更多的计算机资源
    3.进程空间独立,数据安全性好,有专门的进程间的通信方法
    4.线程使用进程的全局变量,更加简单,但需要同步互斥操作
    5.一个进程可以包含多个线程,线程共享进程空间资源
    6.进程线程都独立执行自己的特有属性
 
使用情况:
    1.一个进程中并发任务比较,比较简单适合使用多线程
    2.如果数据程序比较复杂特别是可能多个任务通信比较多的时候
      要考虑使用线程同步互斥的复杂性
    3.多个任务存在明显差异,和功能分离的时候没有必要一定入到一个进程中
    4.使用Python要考虑到GIL问题
 
服务器模型:
    硬件服务器:主机 集群
         厂商:IBM、HP、联想、浪潮
    软件服务器:
         编写的服务端程序 依托于硬件服务器运行,提供给用户一定的功能服务
 
服务器种类:
    webserver:
         网络后端应用程序,提供数据处理和逻辑处理
    httpserver:
         接受http请求,返回http响应
    邮箱服务器
         处理邮件请求,进行邮件收发
    文件服务器
         提供文件的上传下载存储
 
功能实现上分类:
    网络连接、逻辑处理、数据运算、数据交互、协议实现、网络数据传输.....
 
模型结构分类:
    C/S 架构:
        客户端服务器模型
    B/S 架构:
        浏览器服务器模型
服务器目标:
    处理速度更快,数据安全更强并发更高
    硬件提高:
        更好的配置,更好的硬件搭配,更高的网络速度,更多的主机,网络安全投入
    软件提高:
        占有更少的计算机资源更稳定的运行效率更流畅速度更强大算法,更合理技术搭配
 
 
 
网络服务器基础:
    循环服务器:
        单进程程序,循环接受客户请求,处理请求,处理完毕后再接受下一次请求
        特点:
            每次只能处理一个客户端请求,如果客户端长期占有服务器则无法处理其他客户端
            请求
        优点:
            实现简单占用资源少
        缺点:
            无法同时处理多个客户端,体验差
        使用情况:
            任务短暂,可以快速完成,udp比tcp更适合循环
    并发服务器:
        能够同时处理多个客户端任务请求
        IO并发:
            IO多路复用、协程
            优点:
                可以实现IO并发操作,占用系统资源少
            缺点:
                不能监控CPU密集的情况,并不能长期阻塞
        多进程/线程并发:
            为每个客户端单独提供一个进程或线程,处理客户端请求
            优点:
                客户端可以长期占有服务器
            缺点:
                消耗计算机资源比较多
 
 
 
 
 
1. 进程线程的区别和关系
    区别:
        进程和线程之间都有自己的特有属性 如TID PID 指令集、线程栈、进程栈等。。。
        进程创建删除消耗计算机资源比较大而进程就很小理论上是20倍的关系但实际和电脑配置等差异颇大
        进程的数据安全性较高,空间独立,运行独立,有专门的通信方法
        而线程也可以运行独立但是空间是同进程内所有线程共享资源 没有专门通信方法 
        通信比较简单 但是这种通信会导致临界资源的安全性、稳定性、等不确定因素发生
        使用线程是要考虑临界资源的问题  可以用同步互斥的方法解决
        相对于Python而言由于Cpython解释器的运行环境原因导致GIL的问题  多进程的效率
        以及等方面要高于多线程很多  多进程可以实现并行 而多线程由于全局锁的原因导致
        只能并发而不能并行
        线程是系统非配资源的最小单位 而线程没有资源的分配它是系统内核最小的使用单位
   关系:
        一个进程可以包含多个线程
       线程的说有空间都是由线程空间分配出来的  多线程和主进程(线程)使用的全局变量都是同一个
       线程和进程的创建都是需消耗计算机资源并且线程和进程都是一个相互独立运行的过程
       单进程也可以叫做单线程
2. 进程间通信方式都用过哪些,有什么特点
      进程间常用的通信方法有管道、消息队列、共享内存、信号、信号量、套接字等
      管道、队列、共享内存都是在内存中开辟一快空间来进行通信的
      管道和队列的特点多进程都可见都能够进行存取操作效率都一般 创建管道对象的函数有一个参数
      可以设置管道的通信方法 队列当然也有他自己的特点 虽然多进程都可以进行读写操作但是
      写入的数据都是顺序进行的取出也是一样 任意读取 数据是先进先出的顺序 并且两者都可以
      写入python几乎所有数据类型 而共享内存虽说效率较高但是只能同时写入或读取一个数据或数据结构
      共享内存的数据写入的字符串必须是二进制格式数据结构内的数据类型必须相同  每次写入会覆盖之前的
      内容并且共享内存的读取数据不会清除内存中的数据而管道和队列会每次读取过的数据都会清除
      共享内存内的临界资源存入的是数据结构若要输出打印需要for或while循环遍历输出 直接print会报错
      信号一种通知利用一个进程对另一个进程发送信号另一个进程捕获信号并处理该信号对应的相应操作
      例如:SIGKILL 终止进程  SIGSTOP暂停进程 当然也可以给自己发送信号 SIGALRM是一个时钟信号代表制定时间后结束进程
  信号量是一定的数量根据数量的多少来进行不同的进程操作在内存中他就是一个数字 多进程都可以对信号量做加减操作
  套接字和其他都不同进程与进程间的通信是以套接字服务来进行网络通信或磁盘通信 网络通信例如TCP/Ip协议
  磁盘通信是本地套接字的进程通信方式 既然说是磁盘那么就是在磁盘中纯在的文件作为通信的临界区
3. 同步和互斥是怎么回事,你都用哪些方法实现了同步互斥
       互斥:
              互斥是一种制约关系,当一个进程或者线程进入临界区操作资源时采用上锁的方式,阻止其他进程操作,直到解锁后才能让出资源
 
             就是某一个资源只能允许一个进程或线程访问(访问者),来达到唯一性和非他性,但是无法限制访问的顺序所以访问是无须的
             是有在多个访问者或者多任务编程的情况下才会出现的一种各访问者间抢占临界资源的现象
       同步:
            同步是一种合作关系,为完成某个任务,多进程或者多个线程之间形成的一种协调按照约定执行,相互告知,共同完成任务
 
            大多数情况下是在互斥的基础上,通过其他机制实现访问的有序性、而且一般情况下同步已经实现了互斥
            特别是在写入资源的情况下尤为明显少数情况是许多访问者可以访问资源 例如数据库的读锁和写锁 当然
            数据库的锁是由引擎自动加或解的
       实现方法:
                 可以利用控制信号量的方式来实现也可以用Event事件来实现  当然更可以以使用线程锁来实现
                 其实用信号的自定义处理机制的方式也可以实现不过比较麻烦
 
4. 什么是僵尸进程,怎么处理的
            是由于父进程不知道子进程什么时候结束父进程没有wait子进程退出状态 丢失子进程的结束信息无法处理
            从而导致子进程结束后变为僵尸进程系统所能使用的进程号是有限的,如果大量的产生僵死进程
              将因为没有可用的进程号而导致系统不能产生新的进程危害还是比较大的
           可以创建二级子进程  就是创建一个子进程然后用子进程创建二级子进程 让二级子进程执行 子进程退出
           可以达到让二级子进程变为孤儿进程 进程有退出只有3中方式 
           也可以让父进程只用来创建和回收子进程 把说有的事情交各个子进程做
           如果父进程不想关心子进程的退出可以也可以发送signal(SIGHLD, SIG_IGN)忽略信号给内核
           让内核进行处理一切后事 并且不会在来骚扰父进程
           最后就是可以使用wait或waitpid阻塞函数等待子进程退出 然后进行处理其实这种效率是不高的
           因为不知道子进程的退出时间 就是死等  曾经有一份真挚的爱情摆在我面前我没有珍惜,等到失去后才后悔莫及
            如果上天能再给我一次机会 我会对那个女孩说 我爱你 如果非要在这个爱上加一个期限的话 我希望是 一万年......................
           孤儿进程:父进程先退出 子进程被系统制定进程收养并且处理一切后事
           僵尸进程:子进程先退出 父进程不知道子进程退出 没有处理退出状态
           正常退出:父进程等待子进程先退出处理退出状态后然后父进程退出
          
5. python线程的效率怎么样?GIL是怎么处理的
 
                 上面好像说了...吧  键盘敲坏了  溜了溜了...

Python网络编程(线程通信、GIL、服务器模型)的更多相关文章

  1. python网络编程--线程(锁,GIL锁,守护线程)

    1.线程 1.进程与线程 进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率.很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观 ...

  2. python网络编程--线程event

    一:线程event作用 Python提供了Event对象用于线程间通信,它是线程设置的信号标志,如果信号标志位真,则其他线程等待直到信号结束. Event对象实现了简单的线程通信机制,它提供了设置信号 ...

  3. python网络编程--线程GIL(全局解释器锁)

    一:什么是GIL 在CPython,全局解释器锁,或GIL,是一个互斥体防止多个本地线程执行同时修改同一个代码.这把锁是必要的主要是因为当前的内存管理不是线程安全的.(然而,由于GIL存在,其他特性已 ...

  4. python网络编程-线程队列queue

    一:线程queu作用 Python中,queue是线程间最常用的交换数据的形式. 队列两个作用:一个是解耦,一个是提高效率 二:语法 1)队列的类 class queue.Queue(maxsize= ...

  5. python网络编程--线程锁(互斥锁Mutex)

    一:为什么需要线程锁 一个进程下可以启动多个线程,多个线程共享父进程的内存空间,也就意味着每个线程可以访问同一份数据,此时,如果2个线程同时要修改同一份数据,会出现什么状况? 很简单,假设你有A,B两 ...

  6. python网络编程--线程join和Daemon(守护进程)

    一:什么情况下使用join join([timeout])调用join函数会使得主调线程阻塞,直到被调用线程运行结束或超时. 参数timeout是一个数值类型,用来表示超时时间,如果未提供该参数,那么 ...

  7. python网络编程--线程使用threading

    一:线程使用 线程使用有两种方法,一种是直接使用,二是通过继承threading.Thread类使用 二:函数式使用 函数式:调用thread模块中的start_new_thread()函数来产生新线 ...

  8. python网络编程--线程的方法,线程池

    一.线程的其他方法(Thread其他属性和方法) ident() 获取线程id Thread实例对象的方法 isAlive() 设置线程名 getName() 返回线程名 setName() 设置线程 ...

  9. python网络编程--线程Semaphore(信号量)

    一:Semaphore(信号量) 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才 ...

  10. python网络编程--线程递归锁RLock

    一:死锁 所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进 ...

随机推荐

  1. 【luoguP1086】【2004NOIP-Ua】花生采摘

    P1086 花生采摘 题目描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!――熊字”. 鲁宾逊先生和多多都 ...

  2. HDU1285_确定比赛名次

    HDU1285_确定比赛名次 题目大意 有 n 个队伍, 只知道 m 条关于两支队伍之间胜负的关系. 求 排名. 排名不唯一, 此时输出编号较小的队伍的排名. 输入数据保证有一个符合要求的排名. 思路 ...

  3. tomcat解决端口号占用问题

    1.第一种方法 更改tomcat自己的端口号: conf 目录下 找到 server.xml,把默认的8080端口改个别的试试,tomcat 一般端口号改的要大于 6000,. 2.第二种方法 关闭端 ...

  4. java的异常分类

    结构关系 throwable error   exception checked异常 runtime异常 checked异常也叫io异常这种异常一般我们会在程序块加入trycatch处理它. runt ...

  5. Do not mutate vuex store state outside mutation handlers.

    组件代码: selectItem(item,index) { this.selectPlay({ list: this.songs, index }) }, ...mapActions([ 'sele ...

  6. toad for sql server

    数据库连接工具 toad for sql  sever

  7. 如何在match中使用正则表达式

    这是在实现搜索功能的时候遇到的一个问题,在搜索的场景中,会根据搜索框中输入的内容,匹配出包含搜索内容的部分.简单模拟还原使用场景: 首先定义一个遍历 value 用来接收输入的内容 var value ...

  8. Vue--- Vue(Pubsub + Ajax) 数据交互

    案例知识点 兄弟组件儿的通信     使用了Pubsub    订阅与发布 ajax数据请求    获取前   获取中   获取后   获取为空    获取异常 获取成功后显示数据给到  原先定义号的 ...

  9. C++继承和派生练习(一)--关于vehicle基类

    Target:定义一个车(vehicle)基类 具有MaxSpeed.Weight等成员变量,Run.Stop等成员函数,由此派生出自行车(bicycle)类.汽车(motorcar)类. 自行车(b ...

  10. 一个关于 json ,加密,测试,集多功能为一体的在线工具

    很多情况下我们会序列化json或者解析json,那么要解析json也许使用json实体类会好很多,或者你有时候需要压缩转义json的时候, 有一个网站真的是非常好用,里面什么都有......是真的啥都 ...