![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux进程线程
文章平均质量分 72
芒果520
每天进步一点点
展开
-
linux进程间通信IPC方式
Linux环境下,进程地址空间相互独立、彼此隔离,因此进程间的数据不能直接访问。如果要交换数据,必须要通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷贝到内核缓冲区,进程B再把数据从内核缓冲区拷贝走,内核提供的这种机制称为进程间通信(IPC, InterProcess Communication)。在Linux下由很多种进程间通信的方式,分别是:匿名管道(PIPE)、命名管道(FIFO)、信号、共享内存、消息队列、信号量、UNIX域套接字。现在常用的进程间通信方式有:管道(使用简单)原创 2024-03-27 15:02:26 · 801 阅读 · 0 评论 -
Linux 同步管理(上)
因为现代操作系统是多处理器计算的架构,必然更容易遇到多个进程,多个线程访问共享数据的情况,如下图所示:图中每一种颜色代表一种竞态情况,主要归结为三类:进程与进程之间:单核上的抢占,多核上的SMP;进程与中断之间:中断又包含了上半部与下半部,中断总是能打断进程的执行流;中断与中断之间:外设的中断可以路由到不同的CPU上,它们之间也可能带来竞态;这时候就需要一种同步机制来保护并发访问的内存数据。文章分为两部分,这一章主要讨论原子操作,自旋锁,信号量和互斥锁。原子操作是在执行结束前不可打断的操作,也是最小的执行单原创 2022-12-06 17:51:39 · 320 阅读 · 0 评论 -
进程间IPC通信方式比较
常见的通信方式:1. 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,需要双方通信时,需要建立起两个管道; 而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。2. 命名管道FIFO:有名管道也是半双工的通信方式,支持可靠的、单向或双向的数据通信。但是它允许无亲缘关系进程间的通信。 遵循先进先出(first in first out),对管道PIPE及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。3. 信号 ( sinal ...原创 2021-01-11 17:37:12 · 330 阅读 · 0 评论 -
异步通知 mq_notify函数
System V消息队列的问题之一是无法通知一个进程何时在某个队列中放置了一个消息。采用轮询(poling),是对CPU时间的一种浪费。Posix消息队列容许 异步事件通知,以告知何时有一个消息放置到某个空消息队列中。该通知有两种方式:当一个消息被放置某个空队列时,要么产生一个信号来通知,要么通过创建一个线程来执行一个特定程序,来完成消息到来时的该做的事情。这种通知通过调用mq_notify建立#include <mqueue.h>int mq_notify(mqd_t mq原创 2021-07-06 16:49:00 · 966 阅读 · 0 评论 -
posix_msgqueue 报Error Opening MQ: : Invalid argument
经四处查找,终于发现原因:(1)attr.mq_maxmsg 不能超过文件 /proc/sys/fs/mqueue/msg_max 中的数值,我的机器上面是10。(2)attr.mq_msgsize不能超过 /proc/sys/fs/mqueue/msgsize_max 的数值。(3)消息队列名称前面必须加上斜杆。详细请参考:命令“man mq_overview”在man pages的第7章有关于消息队列的综述。有一段叫/proc interfaces的标签,说明了一些限制问题。原创 2021-07-06 14:56:18 · 228 阅读 · 0 评论 -
socket编程htons(), ntohl(), ntohs(),htons() 函数
网络字节顺序与本地字节顺序之间的转换函数:ntohl()--"Network to Host Long"ntohs()--"Network to Host Short"htonl()--"Host to Network Long"htons()--"Host to Network Short"之所以需要这些函数是因为计算机数据表示存在两种字节顺序:NBO与HBO网络字节顺序NBO(Network Byte Order): 按从高到低的顺序存储,在网络上使用统一的网络...原创 2020-07-28 15:51:49 · 205 阅读 · 0 评论 -
socket编程
对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问:1.什么是TCP/IP、UDP?2.Socket在哪里呢?3.Socket是什么呢?4.你会使用它们吗?什么是TCP/IP、UDP?TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,...原创 2020-07-27 16:35:19 · 142 阅读 · 0 评论 -
vfork和fork的区别
我们知道, fork会创建一个新的进程, 这个新的进程是当前进程的子进程, 区别在于, fork函数会复制父进程的一些资源, 也就是, 仅仅是复制的关系, 而非共享。 而vfork就不同了, 利用vfork创建的子进程和父进程共享地址空间, 下面, 我们通过实际程序来看看: fork函数...原创 2020-02-04 13:13:28 · 205 阅读 · 0 评论 -
pthread_join()函数
一、使用方式pthread_t mythread;pthread_create(&mythread, NULL, thread_run,NULL);pthread_join(mythread,NULL);创建线程之后直接调用pthread_join方法就行了。二、为什么要使用pthread_join() 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的...原创 2020-11-03 17:22:33 · 952 阅读 · 0 评论 -
用户态进程如何得到虚拟地址对应的物理地址?
一般我们不需要从用户态得到进程虚拟地址对应的物理地址,因为一般来说用户进程是完全不关心物理地址的。少数应用场景下,用户可能会关心,比如在用户态做DMA的场景(如DPDK之类的)。还有一些场景,比如想调试剖析每一页的内存占用情况,是否swap出去了等。从用户态得到虚拟地址对应的物理地址,我们不可能去walk进程的page table,也没有权限。不过还好内核给我们提供了一个接口,叫pagemap,而且,这个接口与硬件的体系架构无关。在/proc/pid/下面有个文件叫pagemap,它会每个page,原创 2020-10-10 10:47:11 · 1162 阅读 · 0 评论 -
Linux内核进程上下文切换深入理解
我都知道操作系统的一个重要功能就是进行进程管理,而进程管理就是在合适的时机选择合适的进程来执行,在单个cpu运行队列上各个进程宏观并行微观串行执行,多个cpu运行队列上的各个进程之间完全的并行执行。进程管理是个复杂的过程,例如进程的描述、创建和销毁、生命周期管理、进程切换、进程抢占、调度策略、负载均衡等等。本文主要关注进程管理的一个切入点,那就是进程的上下文切换,来理解linux内核是如何进程进程上下文切换的,从而揭开上下文切换的神秘面纱。(注意:本文以linux-5.0内核源码讲解,采用arm64架构)原创 2020-09-28 16:01:42 · 6808 阅读 · 1 评论 -
linux的进程模型与线程模型
进程可以说是操作系统最为核心的一个抽象,而线程可以认为是一种轻量级的进程,或者说一个进程内的多个迷你进程。一、进程的模型进程(process):进程是一个正在运行的程序的实例。对于一个单核的处理器,每个时刻只能运行一个程序,但在每一个时间段,它可能运行多个进程,这样就产生了并行的错觉。从概念上说,每个进程拥有自己的虚拟CPU,好像它独占了CPU的使用权一样,虽然实际的CPU是不断切换的。进程的另外一大特性,是独立的虚拟地址空间。进程的创建有四种事件导致进程的创建:(1)系统初始化。系统原创 2020-09-20 15:51:18 · 386 阅读 · 0 评论 -
Linux用户线程和内核线程区别
Linux用户级线程和内核级线程区别#线程的实现可以分为两类:用户级线程和内核级线程。在用户级线程中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在。应用程序可以通过使用线程库设计成多线程程序。在内核级线程中,线程管理的所有工作都由内核完成,应用程序没有进行线程管理的代码,只有一个到内核级线程的编程接口。内核为进程及内部的每个线程维护上下文信息,调度也在内核基于线程架构的基础上完成。区别内核级线程:(1)线程的创建、撤销和切换等,都需要内核直接实现,即内核了解每一个...原创 2020-09-22 10:52:50 · 1764 阅读 · 2 评论 -
进程间通信之消息队列
函数原型int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);参数msqid:消息队列的识别码。msgp:指向消息缓冲区的指针,此位置用来暂时存储发...原创 2020-03-06 23:25:42 · 206 阅读 · 0 评论