系统调用

Linux操作系统 Linux内核

我的未来我决定 提交于 2019-12-08 05:14:18
Linux内核 预备知识: 1、POSIX(Portable Operating System Interface of UNIX-可移植操作系统接口):定义了 操作系统 应该为 应用程序 提供的 接口标准 ,是IEEE为要在 各种UNIX操作系统 上运行的软件而定义的 一系列API标准的总称 。不同的操作系统根据POSIX标准将实现相同的功能的系统调用标准化。 2、一方面,设计程序只需要跟API打交道和系统调用无关紧要,另一方面, 内核 只跟 系统调用 打交道, 库函数及应用程序 是怎么系统调用不是内核所关心的。 3、完成同一功能, 不同内核 提供的 系统调用 (一个函数)是不同的,所以API又分为Windows API和Linux API。根据POSIX标准,在一个 POSIX操作系统 上开发的软件,能够在 任何其它的POSIX操作系统 上编译执行。 4、标准库:POSIX标准的C/C++库,一、BSD,这个库是AOSP使用的标准C库;二、Bionic,这个是BSD的衍生库,用于NDK开发;三、UNIX C/C++,GUN C/C++,MicroSoft Visual C/C++ 5、POSIX 进程间通信 :POSIX消息、POSIX信号量、POSIX共享内存;System V IPC 6、Linux内核的主要模块(或组件)分以下几个部分: 存储管理 、 CPU和进程管理 、

系统调用的前因后果

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-07 16:34:39
系统调用就是系统提供给你的一些函数你可以直接使用的最基础的函数 比如open fock read等 那么系统调用是什么我们要和电脑打交道当然你想要打开一个文件 在vs上打开文件都是通过fopen当然也可以直接调用系统调用如果没有系统调用open 那么就打不开文件 学过c++和c语言的就应该知道printf 这个函数 这个是库里面的函数 vs上不开源但是本质上来说也就是一个系统调用 或者是几个系统调用组合起来 由于window底下不开源 那么我们研究一下linux底下的系统调用 首先得知道我们运行一个程序需要将代码加载到物理内存上(一般来说这个物理内存是4G) 但是实际上我们每一个进程都有4G大小的虚拟内存 其实也就是这样 既然已经知道虚拟地址空间是个怎么样的了那么就来说一下一个系统调用是如何执行的 在linux下比如我们执行fork函数 那么首先我们得包含头文件unistd.h 我们研究的是linux 2.6 版本的 (为什么要说版本应为可能在不同版本下可能会有一些差距但是思想是不变的) 另外可能会有人看到这个头文件了之后直接来找sys_fork 但是实际上系统不是这样做的 而是通过一个宏 再这样把宏给放进去 如果看不懂可以这样理解name就是——NR_fork type就是定义的2 int 0x80 这个代表的一种中断 是指切换到内核的中断

unix环境-文件操作: 带缓冲I/O 和 不带缓冲I/O详解

匆匆过客 提交于 2019-12-07 16:24:22
首先要明白不带缓冲的概念:所谓不带缓冲,并不是指内核不提供缓冲,而是只单纯的系统调用,不是函数库的调用。系统内核对磁盘的读写都会提供一个块缓冲,当用write函数对其写数据时,直接调用系统调用,将数据写入到块缓冲进行排队,当块缓冲达到一定的量时,才会把数据写入磁盘。因此所谓的不带缓冲的I/O是指进程不提供缓冲功能。每调用一次write或read函数,直接系统调用。 而带缓冲的I/O是指进程对输入输出流进行了改进,提供了一个流缓冲,当用fwrite函数往磁盘写数据时,先把数据写入流缓冲区中,当达到一定条件,比如流缓冲区满了,或刷新流缓冲,这时候才会把数据一次送往内核提供的块缓冲,再经块缓冲写入磁盘。 因此,带缓冲的I/O在往磁盘写入相同的数据量时,会比不带缓冲的I/O调用系统调用的次数要少。 举例一: 讨论关于open,write等基本系统IO的带缓冲与不带缓冲的差别 “术语不带缓冲指的是每个read和write都调用了内核中的一个系统调用。所有的磁盘I/O都要经过内核的块缓冲(也称内核的缓冲区-高速缓存),唯一例外的是对原始磁盘设备的I/O。既然read或write的数据都要被内核缓冲,那么术语“不带缓冲的I/O“指的是在用户的进程中对这两个函数不会自动缓冲,每调用一次read或write就要进行一次系统调用。“--------摘自<unix环境编程>

Linux下快速手动产生core文件

你。 提交于 2019-12-06 20:31:25
原文链接: https://blog.csdn.net/jctian000/article/details/79695006 当我们配置好自动生成core文件的环境后,若不想写导致崩溃的程序验证,那要怎么快速产生core呢? 先看下产生core文件的条件: 当程序接收到以下UNIX信号会产生core文件: 在系统默认动作列,“终止w/core”表示在进程当前工作目录的core文件中复制了该进程的存储图像(该文件名为core,由此可以看出这种功能很久之前就是UNIX功能的一部分)。大多数UNIX调试程序都使用core文件以检查进程在终止时的状态。 core文件的产生不是POSIX.1所属部分,而是很多UNIX版本的实现特征。UNIX第6版没有检查条件(a)和(b),并且其源代码中包含如下说明:“如果你正在找寻保护信号,那么当设置-用户-ID命令执行时,将可能产生大量的这种信号”。4.3 + BSD产生名为core.prog的文件,其中prog是被执行的程序名的前1 6个字符。它对core文件给予了某种标识,所以是一种改进特征。 表中“硬件故障”对应于实现定义的硬件故障。这些名字中有很多取自UNIX早先在DP-11上的实现。请查看你所使用的系统的手册,以确切地确定这些信号对应于哪些错误类型。 下面比较详细地说明这些信号。 • SIGABRT 调用abort函数时产生此信号。进程异常终止

深入理解java虚拟机(23):java与多线程

倖福魔咒の 提交于 2019-12-06 12:33:47
线程有以下三种实现方式 1、使用内核线程方式实现,优点内核完成线程切换和操纵调度器进行调度,并且负责将线程任务映射到处理器上。程序一般不使用内核线程会使用一种轻量级进程,轻量级进程与内核线程一对一模型如下图。 由于内核线程支持,一个轻量级进程在系统调用中阻塞了,不会影响进程继续工作。但是轻量级进程基于内核线程实现,所以创建、析构、同步都需要进行系统调用,系统调用的代价太高需要在用户态和内核态切换来去。其次轻量级进程都需要一个内核线程的支持,因此轻量级进程需要消耗一定的内核资源,因此一个系统可以支持的轻量级进程是有限的。 2、用户线程实现 完全建立在用户空间的线程。用户线程的创建、消毁、同步、调度完全在用户态中完成,不需要在内核态完成。优点非常快速且低消耗,也可以支持规模更大的数量,缺点没有内核线程的支援创建、切换和调度都是需要考虑的问题。操作系统只把资源分配给了进程,阻塞如何处理、多处理器系统如何将线程映射到处理器上会异常困难,甚至不可能完成 3、用户级线程和轻量级线程混合实现 用户线程创建还是建立在用户空间,因此用户线程的创建、析构、切换等操作依然廉价,所以可以支持大规模并发。操作系统提供支持的轻量级进程则用作用户线程和内核间的桥梁。这样可以使用内核线程的调度和处理器映射功能,并且系统调用通过轻量进程实现,大大降低整个进程阻塞的风险。 java的线程实现方式

操作系统实验指导书

二次信任 提交于 2019-12-06 07:57:43
《操作系统》实验教学大纲 一、基本信息 课程编码 350424005 课程学时 48 课程类别 学科基础课程 实验总学时 8 开出学期 5 开出单位 计算机系 适用专业 软件工程 网络工程 二、实验安排 序号 实 验 项 目 实验学时 每组人数 实验类型 开出要求 1 实验一 进程管理 2 1 验证 必做 2 实验二 进程通信 6 1 设计 必做 三、实验目的、内容与要求 实验一 进程管理 (一)实验目的 1.加深对进程概念的理解,明确进程和程序的区别。 2.进一步认识并发执行的实质。 3.分析进程竞争资源的现象,学习解决进程互斥与同步的方法。 (二)实验内容 1.Linux系统中进程的创建。 2.Linux系统中进程的控制。 (三)实验要求 1.掌握Linux系统中进程的创建、控制的实现方法。 2.根据实验内容,在Linux平台上用C语言编程实现,上机调试运行得出实验结果。 3.写出预习报告和实验报告。 实验二 进程通信 (一)实验目的 1.理解和掌握Linux系统中进程通信的基本原理。 2.进一步认识进程软中断通信、管道通信和消息队列通信的实质。 3.分析、设计进程软中断通信、管道通信和消息队列通信的实现方法。 4.掌握进程通信的实现机制。 (二)实验内容 1.设计进程的软中断通信。 2.设计进程的管道通信,实现父子进程的单机通信机制。 3. 设计进程的消息队列通信,实现客户机

深入了解Netty【二】零拷贝

别来无恙 提交于 2019-12-06 03:39:13
引言 以下翻译自: Zero Copy I: User-Mode Perspective 零拷贝是什么? 为了更好地理解问题的解决方案,我们首先需要理解问题本身。让我们来看看什么是参与网络服务器的简单过程dæmon服务数据存储在一个文件通过网络客户端。下面是一些示例代码: read(file, tmp_buf, len); write(socket, tmp_buf, len); 看起来很简单;您会认为只有这两个系统调用不会带来太多开销。事实上,这与事实相去甚远。在这两个调用之后,数据至少复制了四次,并且几乎执行了相同数量的用户/内核上下文切换。(实际上这个过程要复杂得多,但我想让它保持简单)。为了更好地了解所涉及的流程,请看图1。顶部显示上下文切换,底部显示复制操作。 图1。复制两个示例系统调用 第一步:read系统调用导致上下文从用户模式切换到内核模式。第一个副本由DMA引擎执行,它从磁盘读取文件内容并将其存储到内核地址空间缓冲区中。 第二步:将数据从内核缓冲区复制到用户缓冲区,read系统调用返回。调用的返回导致上下文从内核切换回用户模式。现在数据存储在用户地址空间缓冲区中,它可以再次开始向下移动。 第三步:write系统调用导致上下文从用户模式切换到内核模式。执行第三次复制,再次将数据放入内核地址空间缓冲区。不过,这一次,数据被放入一个不同的缓冲区

IO概念和五种IO模型

霸气de小男生 提交于 2019-12-05 22:53:47
一、什么是IO? 我们都知道unix世界里、一切皆文件、而文件是什么呢?文件就是一串二进制流而已、不管socket、还是FIFO、管道、终端、对我们来说、一切都是文件、一切都是流、在信息交换的过程中、我们都是对这些流进行数据的收发操作、简称为I/O操作(input and output)、往流中读出数据、系统调用read、写入数据、系统调用write、不过话说回来了、计算机里有这么多的流、我怎么知道要操作哪个流呢?做到这个的就是文件描述符、即通常所说的fd、一个fd就是一个整数、所以对这个整数的操作、就是对这个文件(流)的操作、我们创建一个socket、通过系统调用会返回一个文件描述符、那么剩下对socket的操作就会转化为对这个描述符的操作、不能不说这又是一种分层和抽象的思想。 二、IO交互 通常用户进程中的一个完整IO分为两个阶段: 用户空间<------------->内核空间、 内核空间<------------->设备空间、 内核空间中存放的是内核代码和数据、而进程的用户空间中存放的是用户程序的代码和数据、不管是内核空间还是用户空间、它们都处于虚拟空间中、Linux使用两级保护机制:0级供内核使用、3级供用户程序使用、 操作系统和驱动程序运行在内核空间、应用程序运行在用户空间、两者不能简单地使用指针传递数据、因为Linux使用的虚拟内存机制

1.10系统调用和库函数

丶灬走出姿态 提交于 2019-12-05 18:04:14
1.背景 本文主要是博主针对在apue中的1.10系统调用和库函数的补充,也就是通过查阅其他书籍来进一步深入搞明白linux中的系统调用,在本文最后博主将会把参阅的书籍列出,另外需要注意的是本文主要讲解的linux下的系统调用,其次如果本文中有任何错误的地方,还望提出。 2.内容 系统调用是操作系统给在用户态运行的进程与底层硬件设备进行交互所提供的接口,系统调用的存在,使得编程不再需要学习底层硬件相关的编程,提高了对底层硬件设备访问的安全性,因为系统调用总是会检查参数,其次,系统调用提高了程序的可移植性,设想下,如果所有的内核使用了相同的一组接口,而程序使用的是该接口,则该程序可在这些内核中进行编译运行。 系统调用是通过一系列步骤来实现的,考虑read的调用。在调用read库函数时,调用程序将参数压栈,当调用系统调用sys_read时,必须先通过执行int $0x80指令产生异常,陷入内核态,调用异常处理函数,实际上这个函数就是系统调用函数,另外在陷入时,还会将所谓的系统调用号传递给内核,在x86中系统调用号使用eax寄存器传递给内核,在陷入内核之前,用户空间就把相应的系统调用所对应的调用号放入eax中。系统调用号存储在所谓的系统调用表中,这个表中存储了所有已注册过的系统调用,每一个系统调用在这个表中都只有唯一的系统调用号。除了系统调用号之外,系统调用可能还需要其他参数

从内核文件系统看文件读写过程(转)

荒凉一梦 提交于 2019-12-05 15:31:33
系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境,但是计算机系统的各种硬件资源是有限的,因此为了保证每一个进程都能安全的执行,处理器设有两种模式:“用户模式”与“内核模式”。一些 容易发生安全问题的操作都被限制在只有内核模式 下才可以执行,例如I/O操作,修改基址寄存器内容等。而 连接用户模式和内核模式的接口称之为系统调用 。 应用程序代码运行在用户模式下,当应用程序需要实现内核模式下的指令时,先向操作系统发送调用请求。 操作系统收到请求后,执行系统调用接口,使处理器进入内核模式 。当处理器 处理完系统调用操作后,操作系统会让处理器返回用户模式,继续执行用户代码 。 进程的虚拟地址空间可分为两部分, 内核空间和用户空间 。内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们 都处于虚拟空间中,都是对物理地址的映射 。 应用程序中 实现对文件的操作过程就是典型的系统调用过程 。 回到顶部 虚拟文件系统 一个操作系统可以支持多种底层不同的文件系统(比如NTFS, FAT, ext3, ext4),为了给内核和用户进程提供统一的文件系统视图,Linux在用户进程和底层文件系统之间加入了一个抽象层,即虚拟文件系统(Virtual File System, VFS),进程所有的文件操作都通过VFS