进程与线程

 

进程

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

线程来源

一个进行在运行的过程中,不可能一直占据着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. 力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I

    题目 剑指 Offer 53 - I. 在排序数组中查找数字 I 思路1 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录target数组出现的次数,但是这样的时间复杂度是O(n),还是 ...

  2. eclipse javase版安装插件开发web项目

    最近学习开发javaweb,但是安装的却是java se版的eclipse,但其无法新建web项目,即找不到Dynamic Web.所以需要下载相应插件.以下为操作过程. 1. 在联网的情况下,打开e ...

  3. 轻量级 Java 基础开发框架,Solon & Solon Cloud 1.5.52 发布

    Solon 已有120个生态扩展插件,此次更新主要为细节打磨: 插件 mybatis-solon-plugin 增加 mappers 单行配置支持 之前的多行模式: mybatis.db1: type ...

  4. 2021.6.17考试总结[NOIP模拟8]

    T1 星际旅行 其实就是求两条只走一遍的边的方案数. 考场上第一眼就感觉不可做,后来画了几个图,发现好像只要两个边是相连的就可以只走一遍,居然还真拿了30.. 其实是一道欧拉路的题,把每条非自环的边看 ...

  5. 汇编--LDR

    转载:https://my.oschina.net/zengsai/blog/23733 ARM LDR 伪指令的格式: LDR Rn, =expr 如果name是立即数的话LDR R0,=0X123 ...

  6. path-sum-ii leetcode C++

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  7. AtCoder Grand Contest 055题解

    我太菜啦!!!md,第一题就把我卡死了...感觉对构造题不会再爱了... A - ABC Identity 先来看这个题吧,题意就是给定你一个字符串,让你将这个字符串最多分成6个子串,使得每个字符都在 ...

  8. PHP笔记4__函数/全局、静态变量/函数参数/加载函数库/,,

    <?php header("Content-type: text/html; charset=utf-8"); echo table(5,5); function table ...

  9. nohup java -jar xx.jar & ,关闭窗口后退出进程

    nohup java -jar dw-report..jar > dw-report.log  & 自动退出命令在后台运行 xx.jar程序 明明已经加了"&" ...

  10. 几十行js实现很炫的canvas交互特效

    几十行js实现很炫的canvas交互特效 废话不多说,先上效果图! 本篇文章的示例代码都是抄的一个叫Franks的老外在yutube上的一个教学视频,他还出了很多关于canvas的视频,十分值得学习, ...