进程与线程

 

进程

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

线程来源

一个进行在运行的过程中,不可能一直占据着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. Java:反射小记

    Java:反射小记 对 Java 中的 反射,做一个微不足道的小小小小记 概念 Java 反射指的是在 Java 程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法:对于给定的一个对象, ...

  2. 2019OO第三单元作业总结

    OO第三单元的作业主题是JML规格化设计,作业以图及图的最短路径相关计算为载体,体现接口的规格化设计. ------------------------------------------------ ...

  3. Linux内核漏洞精准检测如何做?SCA工具不能只在软件层面

    摘要:二进制SCA工具要想更好的辅助安全人员实现安全审计.降低漏洞检测的误报率,必须向更细颗粒度的检测维度发展,而不仅仅停留在开源软件的层面,同时对漏洞库的要求也需要向细颗粒度的精准信息提出的挑战. ...

  4. 同人逼死官方系列!从 DDC 嗅探器到 sddc_sdk_lib 的数据解析

    从 DDC 嗅探器到 sddc_sdk_lib 的数据解析 之前的 DDC 协议介绍 主要讲了设备加入.退出以及维持设备状态,而 SDK框架 sddc_sdk_lib 解析 主要讲了 SDK 库的结构 ...

  5. IM服务器:我的千万级在线聊天服务器集群

    一.服务器特点 01.傻瓜式部署,一键式启动: 02.单机支持10万以上在线用户聊天(8G内存,如果内存足够大,并发量可超过10万): 03.支持服务器集群,集群间高内聚.低耦合,可动态横向扩展IM服 ...

  6. dubbo 配置 loadbalance 不生效?撸一把源码

    背景 很久之前我给业务方写了一个 dubbo loadbalance 的扩展(为了叙述方便,这个 loadbalance 扩展就叫它 XLB 吧),这两天业务方反馈说 XLB 不生效了 我心想,不可能 ...

  7. Zabbix webhook 自定义报警媒介

    场景一:使用企业微信机器人报警 图中的token是:在群组中添加机器人,机器人的webhook地址的key var Wechat = { token: null, to: null, message: ...

  8. Unmount and run xfs_repair

    参考连接:https://blog.csdn.net/qq_35022803/article/details/109287086 如故障图所示,sda3出现问题, 下面的解决办法: 解决办法: 原因: ...

  9. Typecho部署小破站

    写在前面 以前利用 Github Page + Hexo框架 + Next主题搭建过静态博客,没错就是那个黑白色系的网页!但是体验并不是很好,一来本身是静态网页,页面内容要修改都需要在本地修改完上传到 ...

  10. The art of multipropcessor programming 读书笔记-3. 自旋锁与争用(2)

    本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...