系统调用

java常用的IO模型

半城伤御伤魂 提交于 2019-12-29 22:51:26
IO模型 区分 一个输入操作通常包括两个阶段: 等待数据准备好 从内核向进程复制数据 对于一个套接字上的输入操作,第一步通常涉及等待网络数据从网络到达。当所等待数据到达后,它被复制到内核中的某个缓冲区。第二部就是把数据从内核缓冲区复制到应用进程缓冲区。 同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求过程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO复用、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。 阻塞IO和非阻塞IO的区别在第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。 阻塞式IO 应用进程被阻塞,知道数据复制到应用进程缓冲区才返回。在阻塞过程中,其他程序还可以执行,因此阻塞并不意味着整个操作系统被阻塞。因为其他程序还可以运行,因此不消耗CPU时间,这种模型的CPU利用率会比较高。 非阻塞IO 应用程序执行系统调用之后,内核返回一个错误码。应用程序还可以继续运行,但是需要不断的执行系统调用来获知IO是否完成,这种方式成为轮询。 由于CPU要处理更多的系统调用,因此这种模型的CPU利用率比较低。 IO复用 使用select或者poll等待数据,并且可以等待多个套接字中的任何一个变为可读。这一过程会被阻塞,当某一个套接字可读时返回

[linux内存]linux内存学习(一)

一曲冷凌霜 提交于 2019-12-28 13:21:27
1,内存中各个地址范围的含义 按照地址范围由低到高的顺序:0-3G的地址范围: 代码段: 代码的可执行文件,一般为只读并且是共享的。(RO code/data) 数据段 :存已经被初始化的全局变量(RW data) static char *user="jiangsu" BSS段: 存一些未被初始化的全局变量(ZI data) static char*user 堆: maoolc()或者new()申请的段,给程序员使用,地址向高地址范围增长(通过brk()函数扩展) mmap区间: (一些动态库文件) 栈: 函数参数等,由系统自动分配释放,地址向低地址范围增长(可以通过ulimit -s查看每个进程最大使用的栈的大小) 补充:正常代码段都不是从用户空间0地址开始的,比如arm linux嵌入式设备从0x8000(32K)开始的,前面的32k可以用来存储一些error code,如果一个函数返回一个地址,但是该地址大小小于0x8000,那么则认为此函数发生 了错误~ 正常stack和kernel space之间有一段空白,BSS和heap之间也有一段空白,heap和mmp之间也有一段空白,这个称为ASLR技术,防止地址被其他人知道而遭到攻击 3-4G的空间是内核空间,用户空间的代码不能访问到。 malloc函数详解~ malloc只是一个库函数,在不同的平台对malloc有不同的实现

Linux驱动开发——gpio(3)

坚强是说给别人听的谎言 提交于 2019-12-28 03:43:54
文章目录 linux内核字符设备硬件操作接口之ioctl ioctl系统调用函数的使用 使用参考: 对应的底层驱动的ioctl接口 LED灯使用示例: 操作流程: linux内核字符设备硬件操作接口之ioctl ioctl系统调用函数的使用 对于ioctl这个系统调用接口,Linux的创始人在2.0版本之前并没有进行添加,仅有write和read两个接口,但是后来发现当需要去控制文件的某些操作的时候,很显然这两个接口根本不够用。所以才有了这个万能控制接口ioctl,但是作为Linux的创始人Linus本人一直排斥该接口,因为这个ioctl接口的在内核中的使用相当于对应用层开设了一个能够直接交互的窗口,很影响内核整体的权限控制,不过由于目前还暂时没有更好可以替代的方法,所以还是继续保留了这个接口的使用。 对应驱动开发来说,ioctl的接口使用真的很方便,能够帮助我们解决很多同设备或者驱动在应用层或者用户态下调用的问题。 ioctl函数原型: int ioctl(int fd, int request, …) 函数功能: 1.向硬件设备发送控制命令 2.还可以和硬件设备进行读或者写操作 参数: fd:文件描述符 request:给硬件设备发送的控制命令,此命令有驱动开发者自行定义,例如我们在LED驱动下可以定义: #define LED_ON 0x100001 #define LED

Linux strace命令

房东的猫 提交于 2019-12-28 01:21:18
简介 strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 输出参数含义 root@ubuntu:/usr# strace cat /dev/null execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0brk(0) = 0xab1000access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)...brk(0) = 0xab1000brk(0xad2000) = 0xad2000fstat(1, {st_mode=S_IFCHR|0620, st

Linux程序设计 Beginning_Linux_Programming

£可爱£侵袭症+ 提交于 2019-12-28 00:01:25
好文: https://blog.csdn.net/qq_29996285/article/details/94191750 2019-06-17 21:48:55 终于知道为啥C语言开头要include<stdio.h> 了! Write系统调用: OPEN系统调用: Close 系统调用: ioctl系统调用: 一个文件复制程序: 改进版: 一个目录扫描程序:P103 改进main函数,使其变成一个更有用的目录浏览器。 输出结果将分页显示,用户可以通过翻页查看其输出。 可以说,用户现在有了一个非常方便,通用的目录树浏览器。 3.10 /proc文件系统 该目录中包含了许多特殊文件用来对驱动程序和内核信息进行更高层的访问 查看CPU: 查看内存: 查看内核版本信息: 查看网络套接字的使用统计 查看系统中所有运行的程序同时能打开的文件总数: ps命令会给出当前正在运行进程的列表。 第四章: Linux环境: 4.1程序参数 这个程序利用计数参数argc建立一个循环来检查所有的程序参数。 4.2 环境变量 4.2.2 environ变量。 程序可以通过environ变量直接访问这个字符串数组。 这个程序遍历environ遍历,并打印出整个环境。 4.3 时间和日期 这个程序演示了time函数的用法 以从1970年开始计算的秒数来表示时间和日期。 为了提供(对人类)更有意义的时间和日期

poll, select & epoll 原理比较分析

 ̄綄美尐妖づ 提交于 2019-12-26 23:46:52
因为需要了解底层设备访问的原理,所以惯用高层应用语言的我,需要了解一下Linux的设备访问机制,尤其是处理一组非阻塞IO的原理方法,标准的术语好像是叫多路复用。以下文章部分句子有引用之处,恕没有一一指出出处。 对于接触过Linux内核或设备驱动开发的读者,一定清楚poll和select系统调用,以及从2.5版本引入的epoll机制(epoll机制包含三个系统调用)。网上关于它们的文章,有说用法的,甚为详细,更有分析源代码的,又比较深入,且枝节颇多。经过几篇文章的阅读,我把觉得比较核心的东西写下来吧。我的用意是尽可能以简单的概念,比对他们三者的异同。 几经查找我才确定下来,poll和select应该被归类为这样的系统调用,它们可以阻塞地同时探测一组支持非阻塞的IO设备,是否有事件发生(如可读,可写,有高优先级的错误输出,出现错误等等),直至某一个设备触发了事件或者超过了指定的等待时间——也就是它们的职责不是做IO,而是帮助调用者寻找当前就绪的设备。同类型的产品是Windows的IOCP,它也是处理多路复用,只是把IO和探测封装在了一起了。 准备的知识有两点:1、fd;2、op->poll。 在Linux里面,设备都被抽象为文件,一系列的设备文件就有自己独立的虚拟文件系统,所以,设备在系统调用参数中的表示就是file description。fd其实就是一个整数(特别地,标准输入,输出

EINTR中断产生错误

前提是你 提交于 2019-12-26 23:03:15
1、介绍慢系统调用 该术语适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用永远无法返回,多数网络支持函数都属于这一类。如:若没有客户连接到服务器上,那么服务器的accept调用就会一直阻塞。 慢系统调用可以被永久阻塞,包括以下几个类别: (1)读写‘慢’设备(包括pipe,终端设备,网络连接等)。读时,数据不存在,需要等待;写时,缓冲区满或其他原因,需要等待。读写磁盘文件一般不会阻塞。 (2)当打开某些特殊文件时,需要等待某些条件,才能打开。例如:打开中断设备时,需要等到连接设备的modem响应才能完成。 (3)pause和wait函数。pause函数使调用进程睡眠,直到捕获到一个信号。wait等待子进程终止。 (4)某些ioctl操作。 (5)某些IPC操作。 2、EINTR错误产生的原因 如果进程在一个慢系统调用(slow system call)中阻塞时,当捕获到某个信号且相应信号处理函数返回时,这个系统调用被中断,调用返回错误,设置errno为EINTR(相应的错误描述为“Interrupted system call”)。 如下表所示的系统调用就会产生EINTR错误,当然不同的函数意义也不同。 系统调用函数 errno为EINTR表征的意义 write 由于信号中断,没写成功任何数据。 The call was interrupted by a signal

常见的操作系统有哪些?

和自甴很熟 提交于 2019-12-26 22:40:27
一、常见的操作系统有哪些? 1、 Windows 操作系统 应用比较广泛。 2、 Linux 操作系统 免费使用,类UNIX 3、 Unix 操作系统 无界面,使用命令操作,一般安装在服务器上面。 4、 Mac 操作系统 苹果公司开发的,一般PC不能使用。 摘自: https://blog.csdn.net/a15028596338/article/details/83021719 二、我们现在常见的操作系统的体系结构有哪些呢? 第二节 操作系统的体系结构 目前流行的操作系统有Windows操作系统、UNIX操作系统、Linux操作系统和Android操作系统等。 一、Windows操作系统的体系结构 Windows体系结构是分层的模块系统,主要层次有 硬件抽象层HAL、内核、执行体和大量的子系统集合 。 子系统又分为环境子系统和保护子系统,其中环境子系统仿真不同的操作系统,保护子系统提供安全功能。 1、内核 内核执行Windows操作系统中最基本的操作,主要提供 线程调度、陷入处理和异常调度、中断处理和调度、多处理器同步、供执行体使用 的基本内核对象。 Windows操作系统的内核始终运行在核心态,代码短小紧凑,可移植性也好。通常,除了中断程序例程,正在运行的线程是不能抢先内核的。 2、硬件抽象层 Windows操作系统设计的一个至关重要的方面就是在 多种硬件平台上的可移植性

linux系统调用

只谈情不闲聊 提交于 2019-12-25 02:15:47
2016-03-18 17:10:19 张超《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 我的实验平台以及代码见 https://www.shiyanlou.com/courses/reports/986221 实验要求: 扒开系统调用的三层皮 使用库函数触发一个系统调用 C代码中嵌入汇编代码的写法 使用嵌入式汇编代码触发同一个系统调用 系统调用在内核代码中的处理过程 系统调用: 操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用 把用户从底层的硬件编程中解放出来 极大的提高了系统的安全性 使用户程序具有可移植性 API和系统调用 应用编程接口(application program interface, API) 和系统调用是不同的 API只是一个函数定义 系统调用通过软中断向内核发出一个明确的请求 Libc库定义的一些API引用了封装例程(wrapper routine,唯一目的就是发布系统调用) 一般每个系统调用对应一个封装例程 库再用这些封装例程定义出给用户的API 不是每个API都对应一个特定的系统调用。 API可能直接提供用户态的服务 一个单独的API可能调用几个系统调用 不同的API可能调用了同一个系统调用 返回值 大部分封装例程返回一个整数

系统调用

那年仲夏 提交于 2019-12-25 02:15:00
所谓系统调用就是内核提供的功能十分强大的一系列函数,这些系统调用在内核中实现,再通过一定的方式把系统调用给用户。系统调用是用户程序和内核交互的交口。 二、 系统调用的作用 系统调用在Linux系统中发挥着巨大的作用.如果没有系统调用,那么应用程序就失去了内核的支持。 我们在编程时用到的很多函数,如fork、open等这些函数最终都是在系统调用里实现的,比如说我们有这样一个程序: C代码 #include <unistd.h> #include <stdio.h> int main() { fork(); exit(0); }   这里我们用到了两个函数,即fork和exit,这两函数都是glibc中的函数,但是如果我们跟踪函数的执行过程,看看glibc对fork和exit函数的实现就可以发现在glibc的实现代码里都是采用软中断的方式陷入到内核中再通过系统调用实现函数的功能的。具体过程我们在系统调用的实现过程会详细的讲到。 由此可见,系统调用是用户接口在内核中的实现,如果没有系统调用,用户就不能利用内核。 来源: https://www.cnblogs.com/FuRongTao/archive/2012/03/14/2396265.html