系统调用

c++共享内存通信如何实现

萝らか妹 提交于 2020-01-15 04:36:52
c++共享内存通信如何实现 前言 mmap机制-对应cyber中共享内存通信模式中的PosixSegment 小结 System V共享内存-对应cyber中XsiSegment 小结 参考链接 前言 现在很多对性能要求高的项目都会支持共享内存的进程间通信(IPC)方式,本文会以百度Apollo自动驾驶项目为例,展示两种c++中实现共享内存通信的方式(对应linux中两种不同的机制)。 共享内存实际上就是两个不相关的进程访问同一块逻辑内存,相应的肯定需要额外的同步机制来保证读写正确。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。 mmap机制-对应cyber中共享内存通信模式中的PosixSegment 内存映射机制mmap是POSIX标准的系统调用,mmap(

Linux编程期末复习(超实用)

若如初见. 提交于 2020-01-14 19:52:19
所用教材:徐钦桂、徐治根、黄培灿、谢伟鹏(编著) 出版社:清华大学出版社 实战和理论相结合的一本好书,但也很晦涩抽象。以下为考试原题! 一、简答及编程 1. 写出20条命令。 P24 su ls touch tar gcc mkdir rmdir chmod apt wc cd pwd cp kill mv grep cat more less find remove read ln rm 2. 写出shell脚本的执行方法。 P27 3. 说明linux程序的执行时间包括哪些部分。 P110 用户态:执行用户地址空间中的指令 内核态:执行内核地址空间中的指令 睡眠:执行其他进程的时间 实用时间:用户态+内核态 真实时间:用户态+内核态+睡眠 在Linux系统中,进程以时间片的形式分享CPU;同时,当进程被调度进入运行状态时,进程的执行有两种运行模式,用户态和内核态。当进程执行的是用户地址空间中的代码时,我们称进程运行于用户态;当进程进入系统调用或陷入硬件中断时,则称进程处于内核态。因此,可以从不同的角度为进程计时。 进程并非每时每刻都在运行,而是在用户态、内核态和休眠态之间切换。 4. Shell脚本编程。 (1)写一个脚本计算整数1至1000的和 #!/bin/bash sum=0 for i in `seq 1 1000` do sum=$[$i+$sum] done

操作系统 系统调用

浪尽此生 提交于 2020-01-14 16:35:19
系统调用:向操作系统发出请求 ,然后操作系统去管理这些请求,而不是直接去实现相应操作,避免了资源冲突和混乱 操作系统的接口:向操作系统发出请求的途径 操作系统两个接口:(Windows可以被用户直接使用,也可以借助程序客户端使用) 面对程序的 :程序接口 面对用户的: 命令接口 汇编语言(CPU中读取完当前所有指令后) -》CPU发出(遗诏)陷入指令(找到对应的中断类型)-》CPU立刻进入核心态去和操作系统商量-》事件处理完后CPU恢复用户态 陷入指令的发出实在用户态,操作系统调用相应处理实在核心态 陷入指令是唯一一个只能在用户态执行的指令 来源: CSDN 作者: AKUANer 链接: https://blog.csdn.net/AKUANer/article/details/103825337

OS期末预习与PPT翻译(PPT7~13)

倖福魔咒の 提交于 2020-01-14 09:10:23
黄底的字是我还不懂的地方,如果有知道的小伙伴可以私戳我或者评论,感激不尽ღ( ´・ᴗ・` ),期末加油! Exception 概念 中断 指CPU 在收到外部中断信号后,停止原来工作,转去处理该中断事件,完毕后回到原来断点继续工作。 操作系统-复习笔记整理 exception:非法的程序操作 interrupt:硬件设备发出的信号 system call:用户程序通过系统调用请求操作系统服务 CPU每执行完一条指令,都要检查是否有未响应的中断信号( 这张图里的interrupt包括exception,interrupt和system call吗?还是仅仅是interrupt ),如果是,则保护被中断的CPU环境。 获取中断号并由此找到中断处理程序 ,中断处理程序处理完后再继续执行下一条指令。 中断向量表 每种设备都配以相应的中断处理程序。当某种设备发来中断请求信号时,中断处理器会确定中断号。然后去查找中断向量表。 中断向量表存着所有中断号和对应的中断处理程序的入口地址。因此找到中断号对应的中断处理地址并把地址放在PC中,就可以去执行中断处理程序了。 中断的分类 ppt标题的这个User->Kernel是什么意思? 是否中断可以分成interrupt和exception,同时也可以分成device interrupt,software interrupt 和program

Goroutine 调度模型猜想

折月煮酒 提交于 2020-01-14 08:57:25
前言 近日在学习go语言,go语言的一个重大特色就是支持协程(coroutine),即用户级线程。由运行在用户态程序实现“执行体”的调度和切换(本文将一个可并发执行的逻辑单元称为“执行体”),整个过程运行在一个或多个线程上,执行体切换过程不用“陷入”内核态,因此较为轻量。 这种方式也有一定的缺点,因为协程概念提出的很早,主流语言却没有提供支持,必有原因,这个我们以后讨论。 当然,为了更好的了解goroutine,我们就有必要谈谈goroutine调度模型的实现。不过,作者是java开发人员,对分析c及汇编源码之类的事情能力有限,虽然有很多参考资料及公开的源码,分析来分析去,我也是醉了。所以在看了一些goroutine scheduler资料后,本文从另一个角度切入,描述下一个简单的协程调度模型如何实现。最后的分析可能与goroutine实际的实现不太一致,还望大家见谅。 单线程上的协程调度模型 假设只有一个线程,该线程运行一个调度程序,调度程序从其管理的执行体集合中取出一个执行体交给线程执行。该线程执行逻辑如下: 如果考虑执行体各种非正常退出的情况: 由此我们可以确定,实现该线程逻辑需要两个抽象:执行体和调度程序。 执行体包含:执行体的上下文环境,执行逻辑等 调度程序:执行体集合(链表),执行体切换等 该模型有两个问题: 除非执行体执行完毕、主动放弃或调用系统调用,执行体将一直

linux socket常用函数

痞子三分冷 提交于 2020-01-14 01:43:36
======== TCP ======== TCP_Server socket() bind() listen() accept() write() read() close() 和shutdown() TCP_Client socket() connect() send() 和recv() close() 和shutdown() ======== UDP ======== UDP_Server socket() bind() sendto() 和recvfrom() close() 和shutdown() UDP_Client socket() sendto() 和recvfrom() close() 和shutdown() getpeername() gethostname() -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- socket() 我们使用系统调用socket()来获得文件描述符: #include<sys/types.h> #include<sys/socket.h> int socket

系统调用

梦想与她 提交于 2020-01-14 00:46:57
为什么要有系统调用? 我认为有以下原因: 用户空间想要访问硬件 用户空间之间访问硬件是不安全的 因此,系统调用就作为用户空间进程和硬件设备的中间层出现,它使得用户进程可以受限制的访问硬件设备。这样既保证了安全,又可以使用了。 API POSIX和C库 用户进程不是直接调用的系统调用,而已调用的应用编程接口( API )。 unix世界中,流行的API是基于 POSIX 标准的。 C库 实现了unix系统的主要API,提供了POSIX的绝大部分API 从程序员的角度看,他们只和API打交道 从内核角度看,他们只和系统调用打交道 也就是说,API再封装了系统调用,但它们的关系不是一一对应的,一个API可能调用了多个系统调用。 系统调用号 每个系统调用都有一个系统调用号 所有已经注册过的系统调用存储在一个列表sys_call_table中。 系统调用处理程序 软中断号 0x80 会陷入系统调用异常,导致系统切换到内核态并执行这个0x80对应的中断处理程序 system_call() 。 一个系统调用的实现 以后补充吧 来源: CSDN 作者: Rebecca_Chou 链接: https://blog.csdn.net/Rebecca_Chou/article/details/103836399

库调用 系统调用

杀马特。学长 韩版系。学妹 提交于 2020-01-13 20:09:32
系统调用产生中断。也有函数调用部分。在内核空间执行。调用了系统内核的服务,引起从用户到内核再到用户的 两次上下文切换(保存现场恢复现场)。慢。 库调用是函数调用。在用户空间执行。调用了库里的一段程序,是过程调用(没有保存恢复)。快。 ※函数库调用 VS 系统调用 函数库调用 系统调用 在所有的ANSI C编译器版本中,C库函数是相同的 各个操作系统的系统调用是不同的 它调用函数库中的一段程序(或函数) 它调用系统内核的服务 与用户程序相联系 是操作系统的一个入口点 在用户地址空间执行 在内核地址空间执行 它的运行时间属于“用户时间” 它的运行时间属于“系统”时间 属于过程调用,调用开销较小 需要在用户空间和内核上下文环境间切换,开销较大 在C函数库libc中有大约300个函数 在UNIX中大约有90个系统调用 典型的C函数库调用:system fprintf malloc 典型的系统调用:chdir fork write brk; 库函数调用通常比行内展开的代码慢,因为它需要付出函数调用的开销。但系统调用比库函数调用还要慢很多,因为它需要把上下文环境切换到内核模式。 来源: https://www.cnblogs.com/flowerslip/p/5998178.html

socket常用函数

谁说胖子不能爱 提交于 2020-01-13 09:37:57
======== TCP ======== TCP_Server socket() bind() listen() accept() write() read() close() 和shutdown() TCP_Client socket() connect() send() 和recv() close() 和shutdown() ======== UDP ======== UDP_Server socket() bind() sendto() 和recvfrom() close() 和shutdown() UDP_Client socket() sendto() 和recvfrom() close() 和shutdown() getpeername() gethostname() -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- socket() 我们使用系统调用socket()来获得文件描述符: #include<sys/types.h> #include<sys/socket.h> int socket

linux socket 常用函数

萝らか妹 提交于 2020-01-13 02:51:39
socket() bind() connect() listen() accept() send() 和recv() sendto() 和recvfrom() close() 和shutdown() getpeername() gethostname() socket() 我们使用系统调用socket()来获得文件描述符: #include<sys/types.h> #include<sys/socket.h> int socket(int domain,int type,int protocol); 第一个参数domain设置为“AF_INET”。 第二个参数是套接口的类型:SOCK_STREAM或 SOCK_DGRAM。第三个参数设置为0。 系统调用socket()只返回一个套接口描述符,如果出错,则返回-1。 [目录] bind() 一旦你有了一个套接口以后,下一步就是把套接口绑定到本地计算机的某一个端口上。但如果你只想使用connect()则无此必要。 下面是系统调用bind()的使用方法: #include<sys/types.h> #include<sys/socket.h> intbind(int sockfd,struct sockaddr*my_addr,int addrlen); 第一个参数sockfd是由socket()调用返回的套接口文件描述符。