系统调用

Interview_操作系统_day21

為{幸葍}努か 提交于 2020-03-09 21:45:12
并发和并行 并发: 同一时刻只能运行一条指令。在宏观上看起来是多个程序同时运行,但微观上是多个程序的指令交替着运行的。并发不能提高计算机的性能,只能提高效率。 并行: 同一时刻可以运行多条指令。无论从宏观还是微观,都是一起执行的。比如多核 \(cpu\) ,多个程序分别运行在不同的核上,互不影响。并行确实提高了计算机的效率。 用户态和内核态区别 操作系统两种 \(CPU\) 状态: 核心态:运行操作系统程序 用户态:运行用户程序 操作系统的指令划分: 特权指令:只能由操作系统使用,用户不能使用的指令。 非特权指令:用户程序可以使用的指令。 特权级: \(R0、R1、R2、R3\) \(R0\) 相当于内核态, \(R3\) 相当于用户态 不同的特权级别可以运行不同的指令 区别: 内核态和用户态是操作系统的两种运行级别。用户态拥有最低的特权级,核心态拥有较高的特权级。 处于用户态时,进程能够访问到的内存空间和对象受到限制,其所占有的处理机是可以被抢占的。 处于内核态时,进程能够访问所有的内存空间和对象,且所占有的处理机是不可以被抢占的。 操作系统为什么要分内核态和用户态 为了安全。在 \(cpu\) 中,如果有些指令用错会使系统崩溃,所以用户程序是不可信的,无论程序员是否有意,都可能把系统弄崩溃。 分了内核态和用户态之后,操作系统对内核级别指令进行封装,然后为用户提供系统服务

SO_LINGER选项

筅森魡賤 提交于 2020-03-09 13:33:12
SO_LINGER选项用于控制close系统调用在关闭TCP连接时的行为。默认情况下,当我们使用close系统调用来关闭一个socket时,close将立即返回,TCP模块负责把该socket对应的TCP发送缓冲区中残留的数据发送给对方。 设置(获取)SO_LINGER选项的值时,我们需要给setsockopt(getsockopt)系统调用传递一个linger类型的结构体,其定义如下: # include <sys/socket.h> struct linger { int l_onoff ; // 开启(非0)还是关闭(0)该选项 int l_linger ; // 滞留时间 } ; 根据linger结构体中两个成员变量的不同值,close系统调用可能产生如下3种行为之一: l_onoff等于0(关闭) :此时SO_LINGER选项不起作用,close用默认行为来关闭socket。 l_onoff不为0(开启) :l_linger等于0。此时close系统调用立即返回,TCP模块将丢弃被关闭的socket对应的TCP发送缓冲区中残留的数据,同时给对方发送一个复位报文段(RST)。因此,这种情况给服务器提供了异常终止一个连接的方法。 l_onoff不为0(开启) :l_linger大于0。此时close的行为取决于两个条件

Linux内存分配机制

不羁岁月 提交于 2020-03-07 14:07:34
原文:https://blog.csdn.net/gfgdsg/article/details/42709943 Linux 的虚拟内存管理有几个关键概念: 1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址; 3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。 基于以上认识,进行了如下分析: 一、Linux 虚拟地址空间如何分布? Linux 使用虚拟地址空间,大大增加了进程的寻址空间,由低地址到高地址分别为: 1、只读段:该部分空间只能读,不可写;(包括:代码段、rodata 段(C常量字符串和#define定义的常量) ) 2、数据段:保存全局变量、静态变量的空间; 3、堆 :就是平时所说的动态内存, malloc/new 大部分都来源于此。其中堆顶的位置可通过函数 brk 和 sbrk 进行动态调整。 4、文件映射区域 :如动态库、共享内存等映射物理空间的内存,一般是 mmap 函数所分配的虚拟地址空间。 5、栈:用于维护函数调用的上下文空间,一般为 8M ,可通过 ulimit –s 查看。 6、内核虚拟空间

linux ptrace系统调用探究

落爺英雄遲暮 提交于 2020-03-06 17:21:43
1. ptrace 函数简介 Ptrace是一个系统调用,它提供了一种方法来让‘父’进程可以观察和控制其它进程的执行,检查和改变其核心映像以及寄存器。 主要用来实现断点调试和系统调用跟踪。利用ptrace函数,不仅可以劫持另一个进程的调用,修改系统函数调用和改变返回值,而且可以向另一个函数注入代码,修改eip,进入自己的逻辑。这个函数广泛用于调试和信号跟踪工具。 ptrace使用场景: 由于ptrace可以跟踪运行进程并修改寄存器与内存,因此可以用于以下用途。 黑客利用该特性进行代码注入。 不退出进程,进行在线升级。 开发追踪调试工具。 函数定义 #include <sys/ptrace.h> long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); 函数参数解释 request:请求执行的行为,可能选择有 PTRACE_TRACEME //指示父进程跟踪某个子进程的执行。任何传给子进程的信号将导致其停止执行,同时父进程调用wait()时会得到通告。之后,子进程调用exec()时,核心会给它传送SIGTRAP信号,在新程序开始执行前,给予父进程控制的机会。pid, addr, 和 data参数被忽略。 PTRACE_PEEKTEXT, PTRACE_PEEKDATA /

如何检查线程是否死锁了?

北战南征 提交于 2020-03-06 08:44:47
产生死锁的四个必要条件 (1) 互斥条件:一个资源每次只能被一个进程(线程)使用。 (2) 请求与保持条件:一个进程(线程)因请求资源而阻塞时,对已获得的资源保持不放。 (3) 不剥夺条件 : 此进程(线程)已获得的资源,在末使用完之前,不能强行剥夺。 (4) 循环等待条件 : 多个进程(线程)之间形成一种头尾相接的循环等待资源关系。 可以使用 jstack或者pstack 和 gdb 工具对死锁程序进行分析。 pstack : 功能是打印输出此进程的堆栈信息。可以输出所有线程的调用关系栈 jstack: jstack 是java虚拟机自带的一种堆栈跟踪工具,所以仅适用于java程序,功能跟pstack一样,但是更强大,可以提示哪个地方可能死锁了。 pstack和jstack判断死锁,都需要多执行几次命令,观察每次的输出结果,才能推测是否死锁了。 gdb : 1 运行程序,设置能影响程序运行的参数和环境 ; 2 控制程序在指定的条件下停止运行; 3 当程序停止时,可以检查程序的状态; 4 当程序 crash 时,可以检查 core 文件; 5 可以修改程序的错误,并重新运行程序; 6 可以动态监视程序中变量的值; 7 可以单步执行代码,观察程序的运行状态。 线程死锁分析: 1. 连续多次执行 $pstack <PID> 其中PID是进程号 查看每个线程的函数调用关系的堆栈

第十一周学习报告

ⅰ亾dé卋堺 提交于 2020-03-06 03:35:58
第八章 异常控制流 指令的地址的过渡称为 控制转移 控制转移序列叫做处理机的 控制流 过程中发生的突变叫做 异常控制流 8.1 异常 异常就是控制流中的突变 一部分由硬件实现,一部分由操作系统实现 当处理器检测到有事情发生时,它就会通过一张叫做异常表的跳转表,进行一个间接程序调用,到一个专门设计用来处理这类事件的操作系统子程序(异常处理程序) 异常处理程序完成处理后: (1) 处理程序将控制返回给当事件发生时正在执行的指令 (2) 处理程序将控制返回给如果没有发生异常将会执行的下一条指令 (3) 处理程序终止被中断的程序 8.1.1 异常处理 每种类型的异常都分配了一个唯一的非负整数的异常号 在程序启动时,操作系统会分配和初始化一张称为异常表的跳转表 异常号是异常表的索引,异常表的起始地址放在一个叫做异常表基址寄存器的特殊CPU寄存器中 在处理程序处理完事件之后,它通过执行一条“从终端返回”指令,可选的返回到被中断的程序 如果异常中断的是一个用户程序,就将状态恢复为用户模式,然后将控制返回给被中断的程序 8.1.2 异常的类别 分为四类:中断、陷阱、故障、终止 1.中断 中断是异步发生的(其他都是同步发生的,叫做故障指令),是来自处理器外部的I/O设备的信号的结果 硬件中断的异常处理程序通常称为中断处理程序 中断处理程序将控制返回给应用程序控制流中的下一条指令 2.陷阱和系统调用

Java NIO 底层原理

旧城冷巷雨未停 提交于 2020-03-05 10:06:43
目录 1.1. Java IO读写原理 1.1.1. 内核缓冲与进程缓冲区 1.1.2. java IO读写的底层流程 1.2. 四种主要的IO模型 1.3. 同步阻塞IO(Blocking IO) 1.4. 同步非阻塞NIO(None Blocking IO) 1.5. IO多路复用模型(I/O multiplexing) 1.6. 异步IO模型(asynchronous IO) 小结一下: 本文的知识,在《 Netty Zookeeper Redis 高并发实战 》 1.1. Java IO读写原理 无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux系统底层开发,都属于输入input和输出output的处理,简称为IO读写。在原理上和处理流程上,都是一致的。区别在于参数的不同。 用户程序进行IO的读写,基本上会用到read&write两大系统调用。可能不同操作系统,名称不完全一样,但是功能是一样的。 先强调一个基础知识:read系统调用,并不是把数据直接从物理设备,读数据到内存。write系统调用,也不是直接把数据,写入到物理设备。 read系统调用,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把数据从进程缓冲区复制到内核缓冲区。这个两个系统调用,都不负责数据在内核缓冲区和磁盘之间的交换。底层的读写交换

通过trace跟踪系统调用

╄→гoц情女王★ 提交于 2020-03-04 15:16:53
简介 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 strace追踪命令详解

穿精又带淫゛_ 提交于 2020-03-04 15:16:25
strace介绍 strace命令是一个集诊断、调试、统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的。当然strace与专业的调试工具比如说gdb之类的是没法相比的,因为它不是一个专业的调试器。 strace的最简单的用法就是执行一个指定的命令,在指定的命令结束之后它也就退出了。在命令执行的过程中,strace会记录和解析命令进程的所有系统调用以及这个进程所接收到的所有的信号值。 简单用法 root@ubuntu:/usr# strace cat /dev/null execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0 brk(0) = 0xab1000 access("/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) = 0x7f29379a7000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory

[strace]跟踪进程的系统调用

你。 提交于 2020-03-04 15:15:02
转自 : https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html 简介 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