系统调用

CPU上下文切换详解

二次信任 提交于 2019-12-05 13:54:12
我们都知道CPU上下文切换,会增加系统负载。那什么是CPU上下文,为什么要切换? 什么是CPU上下文 我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。 而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU 寄存器和程序计数器(Program Counter,PC)。 CPU 寄存器,是 CPU 内置的容量小、但速度极快的内存。而程序计数器,则是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。它们都是 CPU 在运行任何任务前,必须的依赖环境,因此也被叫做 CPU 上下文。 而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。 根据任务的不同,CPU的上下文切换可以分为不同的场景,也就是进程上下文切换、线程上下文切换、中断上下文切换。 进程上下文切换 Linux 按照特权等级,把进程的运行空间分为内核空间和用户空间,分别对应着下图中, CPU 特权等级的 Ring 0 和 Ring 3。 内核空间(Ring 0)具有最高权限,可以直接访问所有资源;

[OS] 第一章 引论

耗尽温柔 提交于 2019-12-05 12:46:26
操作系统 硬件与软件 好比 人的头颅与思想 OS : 大脑的司令部 一,操作系统引论 二,进程管理 三,处理机的调度和死锁 四,存储器管理 五,设备管理 六,文件管理 第一章 计算机OS引论 1. 什么是OS? 操作系统是一组控制和管理计算机硬件和软件资源, 合理地对各类作业进行调度以方便用户使用的程序集合。 2. OS的目标 { *1*,方便性 *2*,有效性 3,可扩充性 4,开放性 } (1), 方便性 : 硬件只识别 0 和 1 这样的机器代码。因此,用户要在计算机上运行自己所编写的程序,就必须用机器语言书写! (2), 有效性 : 1), 资源忙, 而得到有效的利用 2), 数据有序而节省存储空间。如何安排数据 : 数据结构(专门的学科) (3), 可扩充性 : 适应硬件与网络发展要求, 应采用层次化结构 (4), 开放性 : 遵循开放系统互连OSI国际标准是90年代计算机技术的核心问题。 OS的主要作用 1,用户与硬件系统的接口 { * 软件接口,给用户提供三种方式 : { 1,命令方式 2,系统调用方式 : OS 提供给用户一些 操作函数 3,图形,窗口方式 } 2,计算机四类资源的管理者 资源 : 指的是硬件资源 1,处理机管理 (为各个进程分配处理机。。。) 2,存储器管理 (内存回收) 3,设备管理 (I/O设备) 4,文件管理 (文件的保护和共享)

Linux进程调度原理

送分小仙女□ 提交于 2019-12-05 07:23:52
Linux进程调度原理 Linux进程调度的目标     1.高效性:高效意味着在相同的时间下要完成更多的任务。调度程序会被频繁的执行,所以调度程序要尽可能的高效;     2.加强交互性能:在系统相当的负载下,也要保证系统的响应时间;     3.保证公平和避免饥渴;     4.SMP调度:调度程序必须支持多处理系统;     5.软实时调度:系统必须有效的调用实时进程,但不保证一定满足其要求; Linux进程优先级   进程提供了两种优先级,一种是普通的进程优先级,第二个是实时优先级。前者适用SCHED_NORMAL调度策略,后者可选SCHED_FIFO或SCHED_RR调度策略。 任何时候,实时进程的优先级都高于普通进程 ,实时进程只会被更高级的实时进程抢占,同级实时进程之间是按照FIFO(一次机会做完)或者RR(多次轮转)规则调度的。    首先,说下实时进程的调度   实时进程,只有静态优先级,因为内核不会再根据休眠等因素对其静态优先级做调整,其范围在0~MAX_RT_PRIO-1间。默认MAX_RT_PRIO配置为100,也即,默认的实时优先级范围是0~99。而nice值,影响的是优先级在MAX_RT_PRIO~MAX_RT_PRIO+40范围内的进程。   不同与普通进程,系统调度时,实时优先级高的进程总是先于优先级低的进程执行。知道实时优先级高的实时进程无法执行

进程用户态和内核态

扶醉桌前 提交于 2019-12-05 00:49:00
Linux有4GB的地址空间: 内核空间是共享的,存在整个内核的代码和所有的内核模块以及内核所维护的数据。 特权级: 最关键的工作必须交给特权级最高的进程去执行,这样可以做到集中管理,减少有限资源的访问和使用冲突。inter x86架构的cpu一共有四个级别,0-3级,0级特权级最高,3级特权级最低。 用户态和内核态: 当一个进程在执行用户自己的代码时处于用户运行态(用户态),此时特权级最低,为3级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。Ring3状态不能访问Ring0的地址空间,包括代码和数据; 当一个进程因为系统调用(write、send)陷入内核代码中执行时处于内核运行态(内核态),此时特权级最高,为0级。执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。 用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。这说的保护模式是指通过内存页表操作等机制,保证进程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程地址空间中的数据。 用户态和内核态的切换: 系统调用 :这是用户态进程主动要求切换到内核态的一种方式。用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。例如fork()就是执行了一个创建新进程的系统调用 异常 :当cpu在执行运行在用户态下的程序时,发生了一些没有预知的异常

Golang 系统调用Syscall

邮差的信 提交于 2019-12-05 00:33:33
最近在研究go语言,发现go语言系统调用源码只有调用函数的定义,没有指导文档,网上也没有相关文档的说明,自己稍微研究了一下,不对的地方欢迎指教 go源码中关于系统调用的定义如下: func Syscall(trap, a1, a2, a3 uintptr ) (r1, r2 uintptr , err Errno) func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr ) (r1, r2 uintptr , err Errno) func RawSyscall(trap, a1, a2, a3 uintptr ) (r1, r2 uintptr , err Errno) func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr ) (r1, r2 uintptr , err Errno) 其中Syscall和RawSyscall区别在于Syscall开始和结束,分别调用了 runtime 中的进入系统调用和退出系统调用的函数,说明Syscall函数受调度器控制,不会造成系统堵塞,而RawSyscall函数没有调用runtime,因此可能会造成堵塞,一般我们使用Syscall就可以了,RawSyscall最好用在不会堵塞的情况下。 func Syscall(trap, a1, a2,

2019-2020-1 20175330 《信息安全系统设计基础》第八周学习总结

与世无争的帅哥 提交于 2019-12-04 18:44:27
学习目标 1、掌握三种并发的方式:进程、线程、I/O多路复用 2、掌握线程控制及相关系统调用 3、掌握线程同步互斥及相关系统调用 学习资源 教材:第十一章《网络编程》简单过一下(刘念老师讲过了,我们只考试),教材:第十二章《并发编程》。 知识点总结 1、三种并发方式 构造并发程序的方法有三种: 进程 线程 I/O多路复用 进程 :用内核来调用和维护,有独立的虚拟地址空间,显式的进程间通信机制。 线程 :运行在一个单一进程上下文中的逻辑流。由内核进行调度,共享同一个虚拟地址空间。 I/O多路复用 :应用程序在一个进程的上下文中显式地调度控制流。逻辑流被模型化为状态机。 2、线程控制及相关系统调用 socket编程中:线程是运行子进程上下文中的逻辑流。 线程与进程的不同: 线程的上下文切换要比进程的上下文切换快得多; 和一个进程相关的线程组成对等,独立于其他线程创建的线程。 主线程和其他线程的区别仅在于它总是进程中第一个运行的线程。 创建线程 pthread create :创建一个新的线程,在新线程的上下文中运行线程例程f。 新线程可以通过**pthread _self**获得自己的线程ID。 终止线程 一个线程的终止方式:当顶层的线程例程返回,线程会隐式地终止; pthread_exit :线程显式地终止。 注:如果主线程调用**pthread _exit**

用户态与内核态的理解

大兔子大兔子 提交于 2019-12-04 15:53:08
1. 系统调用   为了安全应用程序无法直接调用的硬件的功能,而是将这些功能封装成特定的函数。当应用程序需要硬件功能时(例如读写文件),就需要进行系统调用。当进程进行系统调用后就从用户态装换为内核态。 2. 用户态与内核态   我们可以想象cpu只是一个无情的执行代码的工具,并不关心是谁的代码。   (1)用户态:cpu正在执行用户编写的代码。   (2)内核态:由于用户无法操作硬件,必须进行系统调用。系统调用时cpu执行内核代码,那么此时进程处于用户态。 3. 用户态与内核态的区别   在内核创建一个进程时,除了我们所知的在用户内存空间中的(堆,栈)以外,在内核空间中也分配了一个空间(内核栈)。因此,在cpu执行用户代码时使用的是用户栈,而在进行系统调用时(执行内核代码)使用的是内核栈。由于用户空间进程没办法访问到内核空间的数据,在内核栈执行系统调用函数时的过程也不会泄露到用户空间,内核只会在执行完毕后返回结果。 来源: https://www.cnblogs.com/liwangcai/p/11872404.html

进程间通信几种方式

一个人想着一个人 提交于 2019-12-04 07:40:45
一、进程间通信概述 进程通信有如下一些目的: A、数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 B、共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 C、通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 D、资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。 E、进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 Linux 进程间通信(IPC)以下以几部分发展而来: 早期UNIX进程间通信、基于System V进程间通信、基于Socket进程间通信和POSIX进程间通信。 UNIX进程间通信方式包括:管道、FIFO、信号。 System V进程间通信方式包括:System V消息队列、System V信号灯、System V共享内存、 POSIX进程间通信包括:posix消息队列、posix信号灯、posix共享内存。 现在linux使用的进程间通信方式: (1)管道(pipe)和有名管道(FIFO) (2)信号(signal) (3)消息队列 (4)共享内存 (5)信号量 (6)套接字(socket) 二、管道通信

2019-2020-1 20175320 《信息安全系统设计基础》 myod-who-ls功能实现

一曲冷凌霜 提交于 2019-12-04 05:26:02
2019-2020-1 20175320 《信息安全系统设计基础》第十周学习总结 一、教材学习内容总结 本周内容为十章的内容的拓展,以实践为主,通过系统调用实现who、od以及ls -l的功能。在这一过程中,我们不仅要利用第十章中的系统I/O函数,还需要用到man帮助文档以及 man -k XXX 的查询命令。 二、实践内容 1、使用系统调用实现od命令 要求: 1 参考教材第十章内容 2 用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名 3 不要把代码都写入main函数中 4 要分模块,不要把代码都写入一个.c中 5 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息 由于Myod在上个学期的时候进行过实现,所以本次实践的关键在于如何使用Linux I/O 系统调用来实现od。要想实现Myod,首先需要将指定文件的内容读入到程序,在了解系统调用之前,我们可以使用fread函数来打开并读取文件中的内容,而结合第十章的内容以及man帮助文档,我们可以使用open以及read的系统调用来实现文件的打开以及读取,从而实现od -tx -tc的功能。由于不能将代码都写入main函数中,且不能只有一个c文件,我将程序分为两部分,并使用 gcc

2019-2020-1 20175313 《信息安全系统设计基础》第七周学习总结

落爺英雄遲暮 提交于 2019-12-04 04:57:06
目录 一、Linux常用命令学习 二、教材学习中的问题和解决过程 三、心得体会 四、学习进度条 五、参考资料 一、Linux常用命令学习 通过下面这套命令就能够学会Linux的核心系统调用。 使用 man -k key1|grep key2|... 在manpages中搜索你要的内容 使用 whatis key 查看一个Linux命令的功能 使用 man n key 查看manpages中key的详细用法 n代表的含义: n=1:普通的Linux命令 n=2:系统调用 n=3:库函数 grep -nr %s 文件名 查看指定%s内容在文件中的位置具体到某一行。 以下是针对上面这套指令的具体例子操作: 关于查看命令大全 find/locate:查看一个文件在系统中的位置。 whereis/which:查看使用的命令工具装在什么位置 file:查看文件类型 cat:查看文本文件内容 od -tx1:以二进制形式查看文件内容 grep -nr "%s" 文件名:查看%s在文件中的具体行数 ls:查看当前目录下的文件 二、教材学习中的问题和解决过程 问题:虚拟机无法联网 解决方法 :NAT模式,利用虚拟的NAT设备以及虚拟DHCP服务器来使虚拟机连接外网,而VMware Network Adapter VMnet8虚拟网卡是用来与虚拟机通信的。 三、心得体会 本周学习内容较为简单