
并发
文章平均质量分 65
robch
Stay foolish Stay hungry!
展开
-
浅谈select-epoll
综上:一次普通网络IO操作需要4次状态切换以及4次数据拷贝。以上只是操作系统底层流程,至于具体代码(欢迎去看linux源码)。我们编写的应用程序在进行IO的操作时,系统调用read() 和 write()。今天的话题还是得从最开始的IO开始。内核缓冲区和进程缓冲区(用户态缓冲区)。1.阻塞性IO(BIO,NIO).用户态和内核态切换。转载 2022-09-26 11:44:03 · 242 阅读 · 0 评论 -
深度理解同步异步和阻塞非阻塞
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。本文讨论的背景是Linux环境下的networ转载 2022-05-04 18:26:04 · 525 阅读 · 0 评论 -
select和epoll
之所以能够同时处理多个客户端的请求,原因是可以查询哪个客户端准备好了,对于准备好的客户端(例如客户端已经发了信息过来,本服务器用read读取数据的时候不会阻塞;另外,客户端已经关闭了连接,那么本服务read的时候,返回0,也不会阻塞),则和它进行通信,而未准备好的,就暂时先不理会。select是对加进去的所有fd进行轮询,返回之后也要对整个fd进行一次轮询,才能找到准备好的fd。epoll采用事件触发的方式,当某个fd准备好后会触发事件,这样减少了内核的轮询。现今用的多的是epoll。转载 2022-09-26 11:39:01 · 212 阅读 · 0 评论 -
4-Linux 进程组的精确理解和 Daemon进程
为了验证 if you log into a machine, your shell starts a session from: https://blog.youkuaiyun.com/cpxsxn/article/details/107371177。为了验证 os.setsid();executor.py 主体就是一个真正的 daemon 进程。shell 进程: http://c.biancheng.net/view/739.html。为了验证:父子进程是一个进程组,但是子进程不是进程组组长。原创 2022-09-23 12:07:29 · 518 阅读 · 0 评论 -
MySQL的 performance_schema.threads 和操作系统的线程 ID
在和同事讨论 systemtap 的时候, 提到 performance_schema 里的 threads 表,只要 client 连接上 server之后,在该 session 里面执行的所有 SQL 都有共同的线程 ID:mysql> select processlist_id,thread_os_id from performance_schema.threads where processlist_info like 'select process%';+----------------原创 2020-09-15 21:53:08 · 1695 阅读 · 1 评论 -
Pyhon 线程里获取操作系统层面的进程 ID 和 线程 ID,太棒了
python的多线程坑坑不断… …python的threading因为封装的太好, 很多本源的东西在threading对象里是拿不到的. 首先需要说明的是 python threading的name跟ident,这些看起来是线程名字,线程id其实只是个标识,注意是标识而已. 简单过了下threading创建对象及启动线程的代码,发现ident跟pstree查到的线程id是两码事. 该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新http://xiaorui.cc/?p=3转载 2020-09-10 11:01:48 · 1742 阅读 · 0 评论 -
Go MPG 模型之详解
MPG 模型概述Golang 中的 MPG 线程模型对两级线程模型进行一定程度的改进,使它能够更加灵活地进行线程之间的调度。它由三个主要模块构成,如下图所示:machine,一个 machine 对应一个内核线程,相当于内核线程在 Golang 进程中的映射processor,一个 prcessor 表示执行 Go 代码片段的所必需的上下文环境,可以理解为用户代码逻辑的处理器goroutine,是对 Golang 中代码片段的封装,其实是一种轻量级的用户线程。为了减轻描述工作,下面的介绍中转载 2020-09-06 20:50:47 · 1784 阅读 · 5 评论 -
Go MPG 模型之铺垫-常见的线程模型
今天我们来了解一下 Go 语言的协程并发机制,这也可能是 Go 语言最为吸引人的特性了,了解它的原理和底层机制对于掌握 Go 语言大有裨益,话不多说开始吧!并发和并行并发和并行都是为了充分利用 CPU 多核计算资源所提出来的概念,相信我们或多或少都对二者的概念有所了解:并发指的是在同一时间段内,多条指令在 CPU 上同时执行;并行指的是在同一时刻内,多条指令在 CPU 上同时执行。并发程序并不要求 CPU 具备多核计算的能力。在同一时间段内,多个线程会被分配一定的执行时间片,在 CPU 上被快转载 2020-09-06 20:25:51 · 260 阅读 · 0 评论 -
signal(SIGCLD,SIG_IGN)
遇到信号量的问题?signal(SIGCLD,SIG_IGN)SIGCHLD的语义为:子进程状态改变后产生此信号,父进程需要调用一个wait函数以确定发生了什么。对于SIGCLD的早期处理方式如下:如果进程特地设置该信号的配置为SIG_IGN,则调用进程的子进程将不产生僵死进程。如果将SIGCLD的配置设置为捕捉,则内核立即检查是否有子进程准备好被等待,如果是这样,则调用SIGCLD处理程序。APUE上SIGCLD语义写的有点不清楚,到底我们的系统是如何来处理SIGCLD信号呢?1.SIG_DF转载 2020-08-19 17:11:43 · 1058 阅读 · 0 评论 -
并发和并行的区别
并发同一时间有两个需求,需求A和B分配到了你的手上,而且这两个需求都很急,你为这两个需求分别开了两个分支A和B,一会儿需求A催你改代码,你切到了A的分支,一会儿B催你改代码,你又切到了需求B,你是一个人但是你具有处理并发事件的能力,在两个需求之间来回穿梭。并行同一事件有两个需求,同样也很急,但是这个时候你不是一个人在战斗了,你有了新同事;需求A分配给了你,需求B分配了你的新同事,那么你就不用再去关心需求B做了什么,两个人分别处理各自在自己的分支上做需求。最后引用深入理解计算机系统CSAPP的回答并原创 2020-07-16 14:48:18 · 152 阅读 · 0 评论 -
2-怎么编写一个标准的 daemon 进程_Adv
一、概述Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户(root)权限运行转载 2020-07-15 21:54:17 · 518 阅读 · 0 评论 -
解决 wait() 带来的阻塞可以用两次 fork
为什么有时候有些代码会调用两次fork呢?(1)调用一次fork的作用:第一次fork的作用是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面的setsid服务,因为调用setsid函数的进程不能是进程组组长,如果不fork出子进程,则此时的父进程是进程组组长,就无法调用setsid。当子进程调用完setsid函数之后,子进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。(2)第二次fork的作用:虽然当前关闭原创 2020-07-15 21:09:06 · 1054 阅读 · 0 评论 -
Python 的 daemon 线程的精讲---通透
关于 Python 中的 daemon 的设置说明:https://www.cnblogs.com/xfiver/p/5189732.htmlDaemons are only useful when the main program is running,and it’s okay to kill them off once the other non-daemon threads have exited.Without daemon threads, we have to keep track o原创 2020-06-30 11:51:00 · 2100 阅读 · 0 评论 -
为什么多线程可以利用到多核
对于这个基础知识,做个记录:首先还是复习下线程和进程的区别。 最主要的点就是:进程是资源分配的最小单位,线程是CPU调度的最小单位。(一个是相当于一个容器,一个是具体被CPU操作的) 进程间资源不共享,而多个线程是共享同个进程分配的资源的。 由于线程分用户线程和内核线程。内核线程再调用的时候可以去不同的核心去操作。所以多线程是可以利用到多核的。from: https://blog.51cto.com/jesnridy/2084498Java线程可以在运行在多个cpu核上吗?我转载 2020-05-13 16:58:37 · 5273 阅读 · 0 评论 -
协程 和 线程、函数调用的本质区别
协程和函数调用有什么区别:函数调用是顺序执行的,如果调用2次,每次 sleep 10 秒,则总共休息20秒;如果用协程,调用2次,每次休息 10秒,则总共 10 秒就完成了。所有的协程分享进程的时间片,每个时间点只能有一个协程在执行代码。如果正在执行的某个协程发生 IO 阻塞,则会把其换出,从而去执行其他协程。相当于说“利用IO 阻塞等待的时间去执行其他就绪的协程。# -*- codin...原创 2020-04-29 16:18:07 · 1790 阅读 · 2 评论 -
Django runserver 默认是多线程模式---通透
本文目录1.Django 多线程1.1 环境1.2 Django原生单线程1.3 Django server 默认多线程2. 使用 uWSGI 服务器启动 django2.1 启动 uWSGI2.2 给uWSGI加进程数3. 总结关于django的多线程问题1.Django 多线程Django 多线程1.1 环境Python3.7.3Django==2.0.7uWSGI==2.0.181.2 Django原生单线程django 原生为单线程序,当第一个请求没有完成时,第二个请求辉阻塞,知转载 2020-05-13 17:28:46 · 3743 阅读 · 0 评论 -
MySQL 的事务和事务的隔离级别
mysql数据库,当且仅当引擎是InnoDB,才支持事务。对于一个MYSQL数据库(InnoDB),事务的开启与提交模式无非下面这两种情况:1>若参数autocommit=0,事务则在用户本次对数据进行操作时自动开启,在用户执行commit命令时提交,用户本次对数据库开始进行操作到用户执行commit命令之间的一系列操作为一个完整的事务周期。若不执行commit命令,系统则默认事务回滚。...原创 2020-01-17 20:46:16 · 377 阅读 · 0 评论 -
MySQL 悲观锁
悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在应用层中实现了加锁机制,也无法保证外部系统不会修改数据)。需要注意的是,在事务中,只有SELECT … FOR UPDATE 或LOCK IN SHARE MODE 相同数据时会等待其它事务结束后才执行,一般SELECT … 则不受此影响。拿上面的实例来说,当我执行select stat...原创 2020-01-17 20:12:31 · 496 阅读 · 0 评论 -
Django 管理并发操作之乐观锁
乐观锁其实并不是锁。通过SQL的where子句中的条件是否满足来决定是否满足更新条件来更新数据库,通过受影响行数判断是否更新成功,如果更新失败可以再次进行尝试,如果多次尝试失败就返回更新失败的结果。为了验证乐观锁的使用情况:使用乐观锁时必须设置数据库的隔离级别是Read Committed(可以读到其他线程已提交的数据)。如果隔离级别是Repeatable Read(可重复读,读到的数据都是开启...原创 2019-09-02 14:47:02 · 724 阅读 · 0 评论 -
Django 管理并发操作之悲观锁即select_for_update
对于后端的服务,有可能要承受很大的并发,比如火车票购买系统,后端服务需要准确的反应出剩余的票数。那么后端怎么处理并发呢? select … for update 是数据库层面上专门用来解决并发取数据后再修改的场景的,主流的关系数据库 比如mysql、postgresql都支持这个功能, 新版的Django ORM甚至直接提供了这个功能的shortcut。那么我们就来讨论怎么使用 select_...原创 2019-08-29 18:42:51 · 2631 阅读 · 0 评论