系统调用

性能优化-CPU上下文

泄露秘密 提交于 2020-02-17 19:10:27
CPU上下文:CPU中的寄存器和程序计数器。切换出的CPU上下文,会保存到linux系统内核中。 分为3种:1、进程上下文,2、线程上下文,3、中断上下文(硬件通过触发信号,导致中断处理程序运行)。 进程的运行空间:内核空间、用户空间。 内核空间:具有最高权限,可以直接访问所以资源,包括硬件。 用户空间:只有有限资源,不能访问包括内存在内的硬件只有,必须通过系统调用嵌入到内核中,才可以调用这些资源。 从用户态到内核态,是通过系统调用实现的。比如我们要查看一个文件的内容,需要 1、调用系统调用open打开一个磁盘文件, 2、read读取一个文件内容, 3、write输入到标准输入, 4、close关闭文件。 一、 执行系统调用,也是需要切换CPU上下文的。需要先保存CPU上下文的当前状态,然后加载系统调用的上下文,再然后跳转到内核态,执行内核任务。 系统调用完成,需要保存CPU现在的上下文状态,加载上次新的上下文状态,进入用户态,执行。 一次系统调用,发生了2次CPU上下文切换。 系统调用,一直是在同一个进程中运行的。 二、 进程上下文切换 进程切换只能在内核态中运行。进程切换不只切换虚拟内存、栈、全局变量等用户空间资源,也包括内核堆栈、等内核态资源。 保存上下文和恢复上下文,也不是免费操作,需要内核占用CPU运行,进行切换。 如果进程切换太频繁

互斥量和条件变量

a 夏天 提交于 2020-02-13 09:05:33
ps:参考了很多博客,但是当时没记下链接。。。 互斥器和条件变量用法如下: pthread_mutex_lock(&lock); while (condition_is_false) { pthread_cond_wait(&cond, &lock); } 上面那个while能换成if吗?答案是不能,否则会导致spurious wakeup虚假唤醒。因为不仅要在pthread_cond_wait前要检查条件是否成立,在pthread_cond_wait之后也要检查。因为pthread_cond_wait不仅能被pthread_cond_signal/pthread_cond_broadcast唤醒,而且还会被其它信号唤醒,后者就是虚假唤醒。 而且有可能多个线程被同时唤醒。那么在第一个获取完资源后,后面的全都无法获取资源了。 pthread_cond_wait内的互斥量只能保证同步。 linux的 pthread_cond_wait是用futex系统调用,这个是慢速系统调用 ,看过apue知道任何慢速系统调用被信号打断的时候会返回-1,并且把errno置为EINTR,如果慢速系统调用的重启功能被关闭,需要在调用该系统调用的地方手动重启它,像下面这样: while (1) { int ret = syscall(); if (ret < 0 && errno == EINTR)

Socket与系统调用深度分析

試著忘記壹切 提交于 2020-02-13 03:02:32
一、什么是系统调用   linux内核中设置了一组用于实现系统功能的子程序,称为系统调用。系统调用和普通库函数调用非常相似,只是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态。   系统调用的意义如下:   1.把用户从底层的硬件编程中解放出来   2.极大的提高了系统的安全性   3.使用户程序具有可移植性   一般进程是不能访问内核的,而系统调用是用户态进入内核态的唯一入口 二、系统调用与API之间的关系   1.API和系统调用的区别:     API只是一个函数定义     系统调用通过软中断向内核发出一个明确的请求   2.Libc库定义的一些API引起了封装例程(wrapper routine,唯一的目的就是发布系统调用)     一般每个系统调用对应一个封装例程     库再用这些封装例程定义出给用户的API   3.不是每个API都对应一个特定的系统调用     首先,API可能直接提供用户态的服务(比如一些数学函数)     其次,一个单独的API可能调用几个系统调用不同的     API可能调用了同一个系统调用   4.返回值     大部分封装例程返回一个整数,其值得含义依赖于相应的系统调用     -1在多数情况下表示内核不能满足进程的请求     Libc中定义的errno变量包含特定的出错码 三

Socket与系统调用深度分析

陌路散爱 提交于 2020-02-13 02:21:11
系统linux-5.0.1 32位 为加快大家查看源码的调用关系 提供 https://elixir.bootlin.com/linux/v5.0.1/source/net/ipv4/tcp_ipv4.c#L202 以下调试都是基于下图的理解进行的,针对图中1,2两个点,博文主要解决四个问题 1 int 0x80中断向量是如何与中断向量表绑定的? 2 socketAPI是如何进入内核调用socket 接口的? 3 socket接口是如何与传输层协议绑定的? 4 sokcet接口是如何调用具体协议的 Linux 引导过程综述 BIOS->Bootloader->内核初始化:体系结构相关部分-><内核初始化:体系结构无关部分> 内核初始化:体系结构相关部分 1 内核映像结构 2 初始化与保护模式 3 自解压内核 <4 startup_32(head_32.c)> startup_32(head_32.c) 1 初始化参数(设置段的值,清楚BSS,初始化栈) 2 开启分页机制 3 初始化 Eflags 4 检查处理器类型 5 载入 GDT、IDT <6 i386_start_kernel> i386_start_kernel 执行与体系结构无关部分的内核初始化 1 检查中断向量表(IDT)是否已经启动,em,IDT要被初始化第一次 <2 调用start

《操作系统教程》第5版-Chapter1-操作系统概述知识点整理

旧城冷巷雨未停 提交于 2020-02-11 21:17:29
操作系统资源管理技术:复用,虚拟和抽象 复用:时分复用,空分复用 虚拟:物理资源与逻辑资源的对应。如SPOOLing,虚拟内存,VFS 时间换空间:虚拟存储技术 空间换时间:SPOOLing 抽象:资源体现为接口,接口表现为一组操作 操作系统最基础的抽象:进程抽象,虚存抽象,文件抽象 进程抽象:进入内存的执行程序在处理器上操作的状态集的一个抽象。对于用户来说,就是fork(),wait()和exec(),不关心细节操作 文件抽象:设备的一种抽象。open(),write(),read(),不关心细节操作 操作系统: 管理系统资源 控制程序运行 改善人机界面 提供各种服务 组织工作流程 为用户提供良好运行环境的一种系统软件 操作系统的作用:(接口与服务,进程调度,虚拟机,管理资源) 用户接口与公共服务:改善人机界面,提供各种服务 进程执行的控制者和协调者:控制程序运行,组织工作流程 扩展机与虚拟机 资源的管理者和控制者:管理系统资源 操作系统管理的资源:(CPU,硬盘,打印机,文件,网络) 处理器 存储 设备 文件 联网与通信 系统调用:使用系统服务 作用:保证系统安全性,提供一致性接口 系统调用的分类: 1.进程管理 2.文件管理 3.设备管理 4.存储管理 5.进程通信 6.信息维护:系统信息 操作系统的分类 批处理操作系统:批中作业输入作业队列,依次执行 关键机制是

linux文件 IO

拜拜、爱过 提交于 2020-02-11 01:22:36
系统调用: 由操作系统实现并提供给外部应用程序的编程接口,是应用程序同系统之间数据交换的桥梁 open 函数: int open (char* pathname,int flags) #include<unistd.h> 参数: pathname :欲打开的文件路径名 flags :文件的打开方式 : O_RDONLY | O_WRONLY | O_RDWR O_CREAT|O_APPEND(追加)|O_TRUNC(文件清零)|O_EXCL|O_NONBLOCK(设置非阻塞) 返回值: 成功: 打开文件所得到的 对应 文件描述符(整数) 失败: -1 ,设置 errno int open(char* pathname,int flags, mode_t mode) open(pathname,O_RDONLY |O_CREAT ,0664); 参数: pathname:欲打开文件路径名 flags: 文件打开方式: O_RDONLY | O_WRONLY | O_RDWR O_CREAT|O_APPEND|O_TRUNC|O_EXCL|O_NONBLOCK mode: 参数3使用前提 惨2指定了 O_CREAT 取值8进制数,用来描述文件的访问权限 创建文件的最终权限 mode& ~umask 返回值: 成功: 打开文件所得到的 对应 文件描述符(整数) 失败: -1 ,设置

多进程《一》进程理论

[亡魂溺海] 提交于 2020-02-08 05:06:50
一 什么是进程 进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。 二 进程与程序的区别 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。 举例: 想象一位有一手好厨艺的计算机科学家egon正在为他的女儿元昊烘制生日蛋糕。 他有做生日蛋糕的食谱, 厨房里有所需的原料:面粉、鸡蛋、韭菜,蒜泥等。 在这个比喻中: 做蛋糕的食谱就是程序(即用适当形式描述的算法) 计算机科学家就是处理器(cpu) 而做蛋糕的各种原料就是输入数据。 进程就是厨师阅读食谱、取来各种原料以及烘制蛋糕等一系列动作的总和。 现在假设计算机科学家egon的儿子alex哭着跑了进来,说:Hey, Dad, my head got stung by a bee. 科学家egon想了想,处理儿子alex蛰伤的任务比给女儿元昊做蛋糕的任务更重要,于是 计算机科学家就记录下他照着食谱做到哪儿了(保存进程的当前状态),然后拿出一本急救手册,按照其中的指示处理蛰伤。这里,我们看到处理机从一个进程(做蛋糕)切换到另一个高优先级的进程(实施医疗救治),每个进程拥有各自的程序(食谱和急救手册)。当蜜蜂蛰伤处理完之后,这位计算机科学家又回来做蛋糕,从他 离开时的那一步继续做下去。 需要强调的是:同一个程序执行两次,那也是两个进程,比如打开暴风影音,虽然都是同一个软件,但是一个可以播放苍井空,一个可以播放饭岛爱。 三

Linux-内核态与用户态

馋奶兔 提交于 2020-02-07 15:52:57
Linux-内核态与用户态 内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序 用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取 为什么要有用户态和内核态 由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态 和 内核态 用户态与内核态的切换 所有用户程序都是运行在用户态的, 但是有时候程序确实需要做一些内核态的事情, 例如从硬盘读取数据, 或者从键盘获取输入等. 而唯一可以做这些事情的就是操作系统, 所以此时程序就需要先操作系统请求以程序的名义来执行这些操作. 这时需要一个这样的机制: 用户态程序切换到内核态, 但是不能控制在内核态中执行的指令 这种机制叫 系统调用 , 在CPU中的实现称之为 陷阱指令 (Trap Instruction) 他们的工作流程如下: 用户态程序将一些数据值放在寄存器中, 或者使用参数创建一个堆栈(stack frame), 以此表明需要操作系统提供的服务. 用户态程序执行陷阱指令 CPU切换到内核态, 并跳到位于内存指定位置的指令, 这些指令是操作系统的一部分, 他们具有内存保护, 不可被用户态程序访问

操作系统用户态和内核态

我们两清 提交于 2020-02-07 15:52:06
内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序 用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取 为什么要有用户态和内核态 由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态 和 内核态 用户态与内核态的切换 所有用户程序都是运行在用户态的, 但是有时候程序确实需要做一些内核态的事情, 例如从硬盘读取数据, 或者从键盘获取输入等. 而唯一可以做这些事情的就是操作系统, 所以此时程序就需要先操作系统请求以程序的名义来执行这些操作. 这时需要一个这样的机制: 用户态程序切换到内核态, 但是不能控制在内核态中执行的指令 这种机制叫 系统调用 , 在CPU中的实现称之为 陷阱指令 (Trap Instruction) 他们的工作流程如下: 用户态程序将一些数据值放在寄存器中, 或者使用参数创建一个堆栈(stack frame), 以此表明需要操作系统提供的服务. 用户态程序执行陷阱指令 CPU切换到内核态, 并跳到位于内存指定位置的指令, 这些指令是操作系统的一部分, 他们具有内存保护, 不可被用户态程序访问 这些指令称之为陷阱(trap

操作系统用户态和内核态

狂风中的少年 提交于 2020-02-07 15:51:07
内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序 用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取 为什么要有用户态和内核态 由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态 和 内核态 用户态与内核态的切换 所有用户程序都是运行在用户态的, 但是有时候程序确实需要做一些内核态的事情, 例如从硬盘读取数据, 或者从键盘获取输入等. 而唯一可以做这些事情的就是操作系统, 所以此时程序就需要先操作系统请求以程序的名义来执行这些操作. 这时需要一个这样的机制: 用户态程序切换到内核态, 但是不能控制在内核态中执行的指令 这种机制叫 系统调用 , 在CPU中的实现称之为 陷阱指令 (Trap Instruction) 他们的工作流程如下: 用户态程序将一些数据值放在寄存器中, 或者使用参数创建一个堆栈(stack frame), 以此表明需要操作系统提供的服务. 用户态程序执行陷阱指令 CPU切换到内核态, 并跳到位于内存指定位置的指令, 这些指令是操作系统的一部分, 他们具有内存保护, 不可被用户态程序访问 这些指令称之为陷阱(trap