系统调用

[嵌入式操作系统] 嵌入式操作系统复习

好久不见. 提交于 2020-01-04 09:38:44
嵌入式系统的定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适用应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 嵌入式系统的特点: 系统资源受限的系统-面向特定应用的 大多要求低功耗 要求较高的可靠性和稳定性 有实时约束 需要专用工具和特殊方法 开发工具和方法: 资源有限,不具备自主开发能力,产品发布后用户也不能对软件进行修改,必须有一套专门的开发环境。 专门的开发环境包括专门的开发工具(设计、编译、调试、测试等工具),采用交叉开发的方式进行。 嵌入式操作系统的重要指标: 实时性(中断响应时间、任务切换时间等) 尺寸(可剪裁性) 可扩展性(内核、中间件) 微处理器结构: 嵌入式操作系统体系结构:体系结构是操作系统的基础,它定义了硬件与软件的界限、内核与操作系统其他组件的组织关系、系统与应用的接口。 体系结构是确保系统的性能、可靠性、灵活性、可移植性、可扩展性的关键。 目前操作系统的体系结构可分为: 单块结构 层次结构:硬件无关层、硬件抽象层、硬件相关层 微内核结构 ucos:一种专门为嵌入式设备设计的,基于优先级的可抢占式的硬实时EOS内核 实时系统的要求: 计算的逻辑正确性 产生结果的时间 硬实时:系统要确保最坏情况下的服务时间,对于事件的响应时间的截止期限无论如何都必须得到满足。 软实时:从统计的角度来说,一个任务能够得到有确保的处理时间

同步与异步 阻塞与非阻塞

情到浓时终转凉″ 提交于 2020-01-04 04:57:13
1.1所采用生活中的事件: 我要去银行办理存钱业务,因为人多,需要排队等待。 1)排队分为在队伍中等待和取号等待两种。在队伍中等待,那么我就需要不断的看看前面的人办理完了没。如果选择取号等待,那么我就比较安逸了,我就不必去管前面的人是否已经办理,我只需要等待别人通知我就行了。也就是这两种方式,一种是自己去做,一种是别人来做。二者孰优孰劣,一目了然。 2)当然,在排队过程中,我们有时候会打电话发短信看书等来消磨时间。那么如果是在队伍中等待,我进行打电话发短信看书的动作,那么我既要看前面的人是否办理完毕,又要进行打电话发短信和看书的动作,实在是费力啊。而如果我是选择取号等待呢,那么我就坐在沙发上,打电话发短信看书,一心一用,爽哉。 1.2对应技术的问题: 我所选择的排队方式就对应同步与异步。在队伍中等待就是同步,取号等待就是异步。 我在等待过程中,能够进行打电话发短信看书的动作,就是非阻塞。如果在等待过程中,不能够进行打电话发短信看书的动作,那就是阻塞。 1.3小结: 同步和异步仅仅是关于所关注的消息如何通知的机制,而不是处理消息的机制.也就是说,同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者 2.同步、异步、阻塞、非阻塞的理解 2.1同步阻塞I/O 官方解释:用户空间的应用程序执行一个系统调用时,会导致应用程序阻塞。只有等系统调用结束

系统调用 - 与内核通信

扶醉桌前 提交于 2020-01-03 07:15:35
与内核通信 操作系统(内核)相当于是在应用程序和硬件之间添加了一个中间层。所以应用程序是不能够直接访问硬件设备的,只能使用内核向外提供的一组接口,这些接口让应用程序受限地访问硬件设备。我们把调用这些接口的过程叫做系统调用。 这样做的好处是: (1)它为应用程序提供了一种硬件的抽象接口。例如你要读取文件时,不需要关心该机器使用的是机械硬盘还是固态硬盘,也不用去管该操作系统使用的是何种的文件系统,只需要调用操作系统提供的read()函数接口就好了。 (2)系统调用保证了系统的稳定性和安全性。如果没有系统调用,那么每个应用程序都可以不用向内核申请就可以访问硬件资源,如果该硬件资源正在被其它应用程序访问,那么就会出现不可预知的错误,甚至导致操作系统的崩溃。 应用程序接口(API) 那么大家可能就有疑问了 ,我访问磁盘文件,不是调用编程语言所提供的API去访问吗,怎么是系统调用呢。 这是因为如果某些API涉及很底层的操作,那么这些API肯定是调用系统调用来实现的,系统调用提供了对这些底层功能的操作。 其实软件开发行业,API无非是一层一层的调用累积起来的。例如JAVA的API就是构建在操作系统提供的接口之上,而各种框架的API,又构建在JAVA的API之上。 用户态和内核态的切换 操作系统有用户态和内核态两个概念,用户态的权限小于内核态的权限,即某些代码只能在内核态的状态下执行。

系统调用与API

核能气质少年 提交于 2020-01-03 07:15:20
系统调用 在计算机中,系统调用(system call),又称为系统呼叫,指运行在用户空间(用户态)的程序向操作系统内核请求需要更高权限运行的服务。系统调用提供了用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态执行。如设备IO操作、进程间通信。 API API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。 系统调用与API API侧重于向上层提供服务,而系统调用则侧重于通过软中断向下层的内核发出一个明确的请求。API属于用户态,而系统调用属于内核态。 一般来说,操作系统所提供的API库都会遵循一定的标准,以实现应用程序在不同的系统之上的可移植性。标准规定了API向上提供的接口,至于API的功能如何实现,各个操作系统可以有所不同。 API是提供给应用程序的接口,其实现的功能不仅仅只是底层的服务和资源,还包括封装了其他的应用程序,因此,API和系统调用没有必然的联系。第一:一个API可以不调用任何系统调用,只提供用户态的服务(如数学运算的函数)。第二:一个API可能调用多个系统调用。第三:多个API可以调用封装了不同功能的同一系统调用。 来源: https://www.cnblogs.com

Go语言出现后,Java还是最佳选择吗?

我的梦境 提交于 2020-01-02 16:08:18
点击这里,查看 异步与协程的关系,手工异步/Wisp性能比较,适应的Workload等更多重要内容 简介 : 阿里妹导读:随着大量新生的异步框架和支持协程的语言(如Go)的出现,在很多场景下操作系统的线程调度成为了性能的瓶颈,Java也因此被质疑是否不再适应最新的云场景了。4年前,阿里JVM团队开始自研Wisp2,将Go语言的协程能力带入到Java世界。 Java平台一直以生态的繁荣著称,大量的类库、框架帮助开发者们快速搭建应用。而其中大部分Java框架类库都是基于线程池以及阻塞机制来服务并发的,主要原因包括: Java语言在核心类库中提供了强大的并发能力,多线程应用可以获得不俗的性能; Java EE的一些标准都是线程级阻塞的(比如JDBC); 基于阻塞模式可以快速地开发应用。 但如今,大量新生的异步框架和支持协程的语言(如Go)的出现,在很多场景下操作系统的线程调度成为了性能的瓶颈。Java也因此被质疑是否不再适应最新的云场景了。 4年前,阿里开始自研Wisp2。它主要是用在IO密集的服务器场景,大部分公司的在线服务都是这样的场景 (离线应用都是偏向于计算,则不适用)。它在功能属性上对标Goroutine的Java协程,在产品形态、性能、稳定性上都达到了一个比较理想的情况。到现在,已经有上百个应用,数万个容器上线了Wisp1/2。Wisp协程完全兼容多线程阻塞的代码写法

Ubuntu学习笔记

笑着哭i 提交于 2020-01-01 23:33:16
1.进入命令行的方法: alt+ctrl+f1进入命令行的全屏。 通过Ctrl+Alt+(F1,F2,F3,F4,F5,F6)进行六个虚拟控制台之间的切换,可以通过Ctrl+Alt+F7回到图形界面。 2.开机过程:BIOS -> MBR(master boot record,主引导记录) -> boot loader -> kernel -> init process -> login 3.我们可以在多个分区安装boot loader,每个boot loader对应不同的操作系统,在读取MBR的时候选择我们想要启动的boot loader。这就是多操作系统的原理。 4.硬连接(hard link)&软连接(soft link)&删除文件(remove unlink)&连接数目(link count) 当文件出现在一个目录文件中时,我们就把文件接入到文件系统中,我们称建立一个到文件的硬链接(hard link)。一个文件允许出现在多个目录中,这样,它就有多个硬链接。当硬链接的数目(link count)降为0时,文件会被Linux删除。所以很多时候,unlink与remove在Linux操作系统中是一个意思。由于软链接(soft link)的广泛使用(soft link不会影响link count,而且可以跨越文件系统),现在较少手动建立硬连接。 5.文件权限的信息保存在文件信息

Linux 进程间通信系列之 信号

雨燕双飞 提交于 2020-01-01 00:22:04
信号(Signal) 信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持Unix早期信号 语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又 能够统一对外接口,用sigaction函数重新实现了signal函数) 信号种类 每种信号类型都有对应的信号处理程序(也叫信号的操作),就好像每个中断都有一个中断服务例程一样。大多数信号的默认操作是结束接收信号的进程;然而,一个进程通常可以请求系统采取某些代替的操作,各种代替操作是: 忽略信号。随着这一选项的设置,进程将忽略信号的出现。有两个信号 不可以被忽略:SIGKILL,它将结束进程;SIGSTOP,它是作业控制机制的一部分,将挂起作业的执行。 恢复信号的默认操作。 执行一个预先安排的信号处理函数。进程可以登记特殊的信号处理函数。当进程收到信号时,信号处理函数将像中断服务例程一样被调用,当从该信号处理函数返回时,控制被返回给主程序,并且继续正常执行。 但是,信号和中断有所不同。中断的响应和处理都发生在内核空间,而信号的响应发生在内核空间,信号处理程序的执行却发生在用户空间。 那么,什么时候检测和响应信号呢?通常发生在两种情况下: 当前进程由于系统调用

信号中断与异步信号中断安全编程

故事扮演 提交于 2020-01-01 00:21:50
1、什么是中断? 1.1、什么是中断 外围设备的速度远低于CPU的速度,所以为提高CPU计算效率,现代计算机变内核主动为硬件主动,只在硬件需要的时候才发送信号,通知内核来处理数据。这样外围设备与内核的协作方式即为中断机制。而设备发送的信号即为中断,其本质为一种特殊的电信号。 硬中断处理流程: 1、各外围设备与中断管理器各输入引脚相连; 2、中断管理器与CPU之间只存在一条中断管线; 3、设备发送一个中断到中断管理器; 4、中断管理器发送对应电信号给CPU。 5、CPU中断当前工作,开始处理中断,并通知操作系统。 6、操作系统调用中断处理程序。 中断的特点: 1、不同的设备对应不同的中断,并被用数字标识; 2、对应的设备需要对应的中断处理程序; 3、中断值即中断请求线(IRQ),被关联到不同的数值量,如IRQ 0,中断亦可动态分配。 4、设备中断信号可能在任意时刻到来,不与CPU时钟同步,即异步硬件中断。 糕富帅CPU来到女儿国,女儿国的妹子们(中断集合)精心打扮,总在认为打扮完美的时刻向糕富帅抛媚眼露大腿扮性感,引起糕富帅的注意。糕富帅玩弄妹子的手段高超,经验丰富,与最靓的妹纸牵手,喜欢为不同的妹子编号并制定不同的攻略策略,总是上半场激烈,下半场缠绵,中场偷腥不断,并在腻味之后回归原始的浪荡生活。妹纸们总是很傻很天真,屡败屡战,不停地打扮自己,完美自己,期待着与糕富帅的重新开始。

Linux_UNIX编程手册-读书笔记-第十三章(文件I/O缓冲)

岁酱吖の 提交于 2019-12-30 19:14:50
13.1 文件I/O的内核缓冲:缓冲区高速缓冲 read()和write()系统调用都会操作磁盘时不会直接发起磁盘访问,而是仅仅在用户空间缓冲区与内核缓冲区高速缓存之间复制数据。 采用这一机制的原因是使read()和write调用的操作更为快速,因为它们不需要等待缓慢的磁盘操作。 缓冲区大小对I/O调用性能的影响: 如果与文件发生大量的数据传输,通过采用大块空间缓冲数据,以及执行更少的系统调用,可以极大的提高I/O性能。 若强制在数据传输到磁盘前阻塞输出操作,则调用write()所需的时间会显著上升。 13.2 stdio库的缓冲 使用stdio库可以使编程者免于自行处理对数据的缓冲, 使用setvbuf函数,可以控制stdio库使用缓冲的方式,setvbuf()调用将影响后续在指定流上进行的所有I/O操作 stream: 标识将要修改的文件流 buf 和 size 针对stream要使用的缓冲区。(需要动态或静态指定堆上的空间,若buf为NULL,则stdio库会自动分配一个) mode: 1._IONBF 不缓冲,stderr默认属于此类型 2._IOLBF 行缓冲,在输入一个换行符之前缓冲数据 3._IOFBF 全缓冲,单次读写数据的大小与缓冲区相同,磁盘的流默认采用此模式。 该函数相当于setvbuf(fp,buf ,(buf != NULL)? _IOFBF:_IONBF

Linux架构

我的梦境 提交于 2019-12-30 05:27:07
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 我以下图为基础,说明Linux的架构(architecture)。(该图参考《 Advanced Programming in Unix Environment 》) 最内层是硬件,最外层是用户常用的应用,比如说firefox浏览器,evolution查看邮件,一个计算流体模型等等。 硬件 是物质基础,而 应用 提供服务。但在两者之间,还要经过一番周折。 还记得 Linux启动 。Linux首先启动 内核 (kernel),内核是一段计算机程序,这个程序直接管理管理硬件,包括CPU、内存空间、硬盘接口、网络接口等等。所有的计算机操作都要通过内核传递给硬件。 为了方便调用内核,Linux将内核的功能接口制作成 系统调用 (system call)。系统调用看起来就像C语言的函数。你可以在程序中直接调用。Linux系统有两百多个这样的系统调用。用户不需要了解内核的复杂结构,就可以使用内核。系统调用是操作系统的最小功能单位。一个操作系统,以及基于操作系统的应用,都不可能实现超越系统调用的功能。一个系统调用函数就像是汉字的一个 笔画 。任何一个汉字都要由基本的笔画(点、横、撇等等)构成。我不能臆造笔画。 在命令行中输入 $man 2 syscalls 可以查看所有的系统调用