进程与线程

 

进程

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

线程来源

一个进行在运行的过程中,不可能一直占据着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第四次博客作业--第四单元总结及课程总结

    一.总结第四单元两次作业的架构设计 1.1 第一次作业 类图如下: 为了突出类.接口.方法.属性.和参数之间的层次结构关系,我为 Class 和 Interface 和 Operation 分别建立了 ...

  2. Canal Server发送binlog消息到Kafka消息队列中

    Canal Server发送binlog消息到Kafka消息队列中 一.背景 二.需要修改的地方 1.canal.properties 配置文件修改 1.修改canal.serverMode的值 2. ...

  3. 热身训练3 Palindrome

    Palindrome 简要题意:  我们有一个字符串S,字符串的长度不超过500000. 求满足S[i]=S[2n−i]=S[2n+i−2](1≤i≤n)(n≥2)的子串个数.  分析: 我们能通过简 ...

  4. 2021.7.29考试总结[NOIP模拟27]

    T1 牛半仙的妹子图 做法挺多的,可以最小生成树或者最短路,复杂度O(cq),c是颜色数. 我考场上想到了原来做过的一道题影子,就用了并查集,把边权排序后一个个插入,记录权值的前缀和,复杂度mlogm ...

  5. SCons - 简单而强大的项目编译脚本(原文https://www.cnblogs.com/binchen-china/p/5646791.html)

    N年前学的makefile,当时还勉强能写一些简单的工程编译,现在已经基本忘了.makefile确实编写复杂,而且平时也不是经常使用,容易忘记.偶识了scons,一切都变的简单了.最近研究了下scon ...

  6. JS控制文本框禁止输入特殊字符

    JS 控制不能输入特殊字符<input type="text" class="domain" onkeyup="this.value=this. ...

  7. PCIE学习笔记--PCIe错误源详解(二)

    转载地址:http://blog.chinaaet.com/justlxy/p/5100057799 这篇文章主要介绍事务(Transaction)错误.链路流量控制(Link Flow Contro ...

  8. (总结)Linux下su与su -命令的本质(转)

    转载地址:http://www.ha97.com/4001.html 本人以前一直习惯直接使用root,很少使用su,前几天才发现su与su -命令是有着本质区别的! 大部分Linux发行版的默认账户 ...

  9. 面试题系列:工作5年,第一次这么清醒的理解final关键字?

    面试题:用过final关键字吗?它有什么作用 面试考察点 考察目的: 了解面试者对Java基础知识的理解 考察人群: 工作1-5年,工作年限越高,对于基础知识理解的深度就越高. 背景知识 final关 ...

  10. 腾讯云星星海SA2云服务器特点

    一.腾讯云星星海SA2云服务器特点 腾讯云深度定制AMD处理器.AMD EPYC ROME ,频率3.3Ghz.提供超大单核 L3 Cache.(基础频率2.6Ghz,睿频3.3Ghz).企业级服务器 ...