进程与线程

 

进程

进程就是在操作系统中运行的程序,是操作系统资源管理的最小单位。一个进程可以管理多个线程,线程相对轻量,可以共享进程地址空间

线程来源

一个进行在运行的过程中,不可能一直占据着CPU进行逻辑运算,中间很可能在进行磁盘I/O或者网络I/O,为了充分利用CPU运算资源,有人设计了线程的概念。线程最大的特点就是和创建它的进行共享地址空间
开多个进程提高CPU利用率的难点?缺点?
有人认为要提升CPU的利用率,开多个进程可以达到,但是开多个进程的话,进程间通信又是个麻烦的事情,毕竟进程之间地址空间是独立的,没法像线程那样做到数据的共享,需要通过其他的手段来解决,如管道等
 

线程

线程有内核线程、用户线程还有协程。一般操作系统都会分为内核态和用户态,用户态线程之间的地址空间是隔离的,而在内核态,所有线程都共享同一内核地址空间。
 

线程池

由来:不管是用户线程还是内核线程,和进程一样,均由操作系统的调度器来统一调度。所以开辟太多线程,系统调度的开销会很大,另外线程本身的数据结构需要占用内存,频繁创建和销毁线程会加大系统的压力
线程可以在初始化的时候批量创建线程,然后用户后续通过队列等方式提交业务逻辑,线程池中的线程进行逻辑的消费工作,这样就可以在操作的过程中降低线程创建和销毁的开销,但是调度的开销还是存在的

协程

由来:在多核场景下,如果是I/O密集型场景,就算开多个线程来处理,也未必能提升CPU的利用率,反而会增加线程切换的开销。另外,多线程之间假如存在临界区或共享数据,那么同步的开销也是不可忽略的。
协程是轻量级线程,在一个用户线程上可以跑多个协程,这样就可以提升单核的利用率。
协程不像进程或线程,可以让系统负责相关的调度工作,协程是处于一个线程当中的,系统无感知的,所以需要在该线程中阻塞某个协程的话,就需要手工进程调度
 
1. 多进程的出现是为了提升CPU的利用率,特别是I/O密集型运算,不管是多核还是单核,开多个进程必然能有效提升CPU的利用率。
2. 多线程是可以共享同一进程地址空间上的资源,为了降低线程创建和销毁的开销,又出现了线程池的概念。
3. 为了提升用户线程的最大利用率,又有了协程的概念。
 

进程的调度

1. 在一个CPU中,同一时刻最多只能支持有线的进程或线程同时运行(这取决于CPU核数量)。但是在一个运行的操作系统上往往可以运行很多进程,假如运行的进程占据进程时间很长,就有可能让其他进程饿死。为了解决这个问题,操作系统引入了进程调度器来进行进程的切换,目的是轮流让其他进程获取CPU资源
2. 在每个进程运行完毕时,系统可以进行调度的工作,但是系统不可能总是在等进程运行完才调度,不然其他进程估计还没被调度就饿死了。系统还需要一个重要的机制:中断机制,来周期性地触发调度算法进行进程切换

3. 需要进程切换的场景有以下几种:

  1. 该进程分配的CPU的时间片用完
  2. 该进程主动放弃CPU(例如IP操作,某些进程的工作大部分为IO操作,占据CPU空跑会导致资源浪费,这样的进程需要主动放弃CPU)
  3. 某一进程抢占CPU获得执行机会
  4. 一个进程在某一时刻只能存在一个CPU的运行队列里
 

Memcached线程池模型分析

Memcached是一款服务内存管理软件,它主要是由pthread创建的用户工作线程模型来处理主要逻辑的
1. mthread主线程,主要监听socket事件,并建立连接,然后把连接和相应的时间分发到cq连接队列中(每个分线程都拥有一个连接队列)
2. cthread分线程,用于从连接队列中获取连接的读写时间, 并进行业务逻辑的处理工作
3. Memcached在创建工作线程的时候,同样会用pipe管道调用创建管道,用于和主线程之间的通信
4. 在业务逻辑繁忙并且I/O开销比较大的情况下,多线程模型提高系统的吞吐率。但缺点是当多线程同时访问同一数据的时候就存在竞争,需要额外的并发解决开销(锁)
5. 加入系统中线程数量开得太多,那么线程切换的开销也会上升,需要根据实际场景谨慎设置线程池的大小
 

Nginx进程模型分析

Nginx只要创建CPU核心数量相等的工作进程,即可满足高并发、搞吞吐量的需求,原因是它的每个工作进程都有一个基于I/O多路复用的epoll池子,这样每个进程只有在事件被触发的场景下才进行工作,否则就会让出CPU进行其他事件的处理,特别是upstream的场景下,工作进程可以悠闲地等待后端数据准备好之后再进行工作,CPU的利用率也大大提升
在Nginx中master进程通过fork调用派生完子进程后,又通过socketpair创建了管理来进程父子进程之间的通信
 
 

Linux 进程与线程的更多相关文章

  1. Linux进程或线程绑定到CPU

    Linux进程或线程绑定到CPU 为了让程序拥有更好的性能,有时候需要将进程或线程绑定到特定的CPU,这样可以减少调度的开销和保护关键进程或线程. 进程绑定到CPU Linux提供一个接口,可以将进程 ...

  2. Linux进程和线程的比較

    进程与线程 參考:http://www.cnblogs.com/blueclue/archive/2010/07/16/1778855.html 首先比較Linux进程和线程的创建的差别,以此展开: ...

  3. Linux 进程、线程运行在指定CPU核上

    /******************************************************************************** * Linux 进程.线程运行在指定 ...

  4. linux进程、线程与cpu的亲和性(affinity)

    参考:http://www.cnblogs.com/wenqiang/p/6049978.html 最近的工作中对性能的要求比较高,下面简单做一下总结: 一.什么是cpu亲和性(affinity) C ...

  5. Linux进程与线程的区别

    进程与线程的区别,早已经成为了经典问题.自线程概念诞生起,关于这个问题的讨论就没有停止过.无论是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.一般程序员而言,搞清楚二者的概念, ...

  6. linux进程与线程的区别【转】

    知乎上总结: "linux使用的1:1的线程模型,在内核中是不区分线程和进程的,都是可运行的任务而已.fork调用clone(最少的共享),pthread_create也是调用clone(最 ...

  7. Linux进程和线程

    一.进程产生的方式 1.描述进程的ID号通常叫做PID,即进程ID,PID的变量类型为pid_t. 2.getpid(void)返回当前进程的ID号,getppid(void)返回当前进程的父进程的I ...

  8. Linux -- 进程或线程独占CPU

    如果想让特定进程或线程独占某一或某些CPU,我们需要做三件事. 一,隔离CPU,避免其它线程run在被隔离的CPU上. 二,绑定所有的interrupts到非隔离的CPU上,避免被隔离的CPU收到in ...

  9. 操作系统:Linux进程与线程

    这里是一部分内容,还会做修改. 一:目的及内容 学习fork(),exec,pthread库函数的使用,阅读源码,分析fork,exec,pthread_create函数的机理 代码实现: 进程A创建 ...

  10. linux --> 进程和线程

    进程和线程 进程(process)和线程(thread)是操作系统的基本概念,下面用一个类比,来解释它们. 1. 计算机的核心是CPU,它承担了所有的计算任务.它就像一座工厂,时刻在运行. 2. 假定 ...

随机推荐

  1. oo第三次博客-JML规格

    这三周的作业主要是围绕以JML来约束代码开发,以确保程序的正确性与鲁棒性. Part 1:三次作业的实现与bug 第一次作业没有任何算法和数据结构上的难度,对于Path和PathContainer的各 ...

  2. stm32直流电机驱动与测速学习总结

    通过实验发现,定时器的一个通道控制一个pwm信号. 在正式开始之前也可以参考这个视频学习资料 (stm32直流电机驱动) http://www.makeru.com.cn/live/1392_1218 ...

  3. Spring Security:如何在Postman中优雅地测试后端API(前后端分离)

    前言 在Postman中可以编写和执行自动化测试,使用 JavaScript 编写基本的 API 测试,自由编写任何用于自动化测试的测试方案. 在POSTMAN中读取Cookie值 1. 我们需要向& ...

  4. TypeError: 'encoding' is an invalid keyword argument for this function 解决Python 2.7

    在python2.7中这样调用代码 open('file/name.txt','r',encoding= 'utf-8').read() 会出现 TypeError: 'encoding' is an ...

  5. 力扣 - 剑指 Offer 58 - I. 翻转单词顺序

    题目 剑指 Offer 58 - I. 翻转单词顺序 思路1 假如题目要求我们翻转字符串,那么我们可以从末尾往前开始遍历每一个字符,同时将每一个字符添加到临时空间,最后输出临时空间的数据就完成翻转了, ...

  6. Go语言实现APPID登录

    package thirdparty import ( "crypto/rsa" "fmt" "github.com/dgrijalva/jwt-go ...

  7. python基本数据类型操作

    str 字符串 #1.进行字符串转换 首字母转换成大写 # name = 'wangjianhui' # v = name.capitalize() # print(v) #2. 字符转换小写 # n ...

  8. maven控制台出现乱码

    maven默认环境为GBK,只需要改如下即可: 在IDEA中,打开File | Settings | Build, Execution, Deployment | Build Tools | Mave ...

  9. 微信小程序小窗无效

    这里算是踩过一个坑吧 1.自己的调试版本库是否在这个版本或者以上 2.编辑器是不能看到小窗效果的,只能在真机运行 3.播放的内容是否有效,是否能播放 4.跳转页面时内容是否处于播放状态 5.当前页面是 ...

  10. mybatis-plus查询指定字段

    show me the code :mybais-plus版本:3.1.1 1,排除某些字段,可以同时排除多个字段排除多个字段写法: .setEntity(new User()) .select(c ...