系统调用

聊聊Linux 五种IO模型

▼魔方 西西 提交于 2019-12-04 04:48:18
#0 系列目录# 聊聊远程通信 Java远程通讯技术及原理分析 聊聊Socket、TCP/IP、HTTP、FTP及网络编程 RMI原理及实现 RPC原理及实现 轻量级分布式 RPC 框架 使用 RMI + ZooKeeper 实现远程调用框架 深入浅出SOA思想 微服务、SOA 和 API对比与分析 聊聊同步、异步、阻塞与非阻塞 聊聊Linux 五种IO模型 聊聊IO多路复用之select、poll、epoll详解 聊聊C10K问题及解决方案 上一篇 《聊聊同步、异步、阻塞与非阻塞》 已经通俗的讲解了,要理解同步、异步、阻塞与非阻塞 重要的两个概念点 了,没有看过的,建议先看这篇博文理解这两个概念点。在认知上,建立统一的模型。这样,大家在继续看本篇时,才不会理解有偏差。 那么,在正式开始讲Linux IO模型前,比如:同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。 #1 概念说明# 在进行解释之前,首先要说明几个概念: 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 IO ##1.1 用户空间与内核空间## 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。 操作系统的核心是内核,独立于普通的应用程序

wait,waitpid

 ̄綄美尐妖づ 提交于 2019-12-04 04:08:05
要求 用man wait, man waitpid学习wait waitpid的使用 2 写出wait 的测试代码,要能说明你理解了wait 的返回值的每一位的含义 实验: ---------- man wait(wait 帮助) 所有这些系统调用都用于等待子进程中的状态更改的调用过程,并获取有关其的子进程的信息状态已经改变了。状态更改被认为是:子ter\u2010管理层;子进程被一个信号拦住了;或者子进程被一个信号。对于终止的子进程,执行等待是允许的释放与子进程关联的资源的系统;如果一个不执行等待,则终止的子进程仍然处于“僵死状态” 如果一个孩子已经改变了状态,那么这些调用将返回immedi\u2010吃了。否则,它们将阻塞,直到子节点更改状态或信号处理程序中断调用(假设系统调用没有中断)使用sigaction(2)的SA_RESTART标志自动重新启动。在此页面的其余部分为状态已更改的子元素和状态已更改的子元素还没有被这些系统调用中的一个称为可等待。 wait系统调用会使父进程暂停执行,直到它的一个子进程结束为止。 返回的是子进程的PID,它通常是结束的子进程 状态信息允许父进程判定子进程的退出状态,即从子进程的main函数返回的值或子进程中exit语句的退出码。 返回值:如果成功返回等待子进程的ID,失败返回-1 对于waitpid的p i d参数的解释与其值有关: pid

线程的实现模型

被刻印的时光 ゝ 提交于 2019-12-04 01:47:53
一 用户级线程(User-Level Thread,ULT): (1)定义:应用程序可以通过使用线程库来设计多线程程序。线程库是用户级线程管理的一个包,它包含用于创建和销毁线程、在线程间传递信息和数据、调度线程执行的代码以及保存和恢复线程上下文的代码。 (2)优点: 1.最快的切换时间:所有线程的管理数据结构都在一个进程的地址空间内,线程切换不需要内核支持。 2.调度可以是和应用程序相关的。 3.用户级线程可以在任何操作系统上运行,不需要对底层内核进行修改以支持用户级线程。 (3)缺点: 1.内核看不到多线程的存在,继续以进程为单位进行调度,当执行系统调用时,不仅这个线程会被阻塞,进程中的所有线程都被阻塞。 2.在纯粹的用户级线程策略中,一个多线程应用程序不能利用多处理技术,内核一次只为一个进程分配给一个处理器。 二 内核级线程(Kernel-Level Thread,KLT): (1)定义:在一个纯粹的内核级线程中,有关线程管理的所有工作都由内核完成(Windows)。调度是内核基于线程完成的。 (2)优点: 1.内核可以同时把一个进程中的多个线程调度到多个处理器上。 2.一个线程被阻塞,内核可以调度同一个进程中的另外一个线程执行。 (3)缺点: 1.线程环境切换速度相对较慢:把控制从一个线程转移到同一进程的另一个线程时需要到内核的状态切换。 三 轻量级进程(LWP):本质是进程

用户级线程与核心级线程

时间秒杀一切 提交于 2019-12-04 01:44:29
1、用户级线程 把整个线程实现部分放在用户空间中,内核对线程一无所知,内核看到的就是一个单线程进程。 只有一个用户栈 优点: 1)整个用户级线程的切换发生在用户空间,这样的线程切换至少比陷入内核要快一个数量级(不需要陷入内核、不需要上下文切换、不需要对内存高速缓存进行刷新,这就使得线程调度非常快捷) 2)用户级线程有比较好的可扩展性,线程能够利用的表空间和堆栈空间比内核级线程多,这是因为在内核空间中内核线程需要一些固定的表格空间和堆栈空间,如果内核线程的数量非常大,就会出现问题。 3)可以在不支持线程的操作系统中实现。 4)创建和销毁线程、线程切换代价等线程管理的代价比内核线程少得多, 因为保存线程状态的过程和调用程序都只是本地过程 5)允许每个进程定制自己的调度算法,线程管理比较灵活。这就是必须自己写管理程序,与内核线程的区别 6)线程的调度不需要内核直接参与,控制简单。 缺点: 1)一个线程阻塞,会阻塞该进程中其他所有的线程(具体,举个例子) 比如:线程发生I/O或页面故障引起的阻塞时,如果调用阻塞系统调用则内核由于不知道有多线程的存在,而会阻塞整个进程从而阻塞所有线程 页面失效也会产生类似的问题。 2)如果一个线程开始运行,那么该进程中其他线程就不能运行,除非第一个线程自动放弃CPU。因为在一个单独的进程内部,没有时钟中断,所以不能用轮转调度(轮流)的方式调度线程 2

2018-2019-1 20175234 《信息安全系统设计基础》有关系统调用的部分学习

眉间皱痕 提交于 2019-12-03 15:04:18
目录 2018-2019-1 20175234 《信息安全系统设计基础》有关系统调用的学习 man 指令 通过man学习系统调用 whatis指令 系统调用指令Who 参考资料 2018-2019-1 20175234 《信息安全系统设计基础》有关系统调用的学习 man 指令 在终端输入 man man ,可以看到man 对自己的解释,如下图 man的使用方法 向后翻一屏:space   向前翻一屏:b 向后翻一行:Enter  向前翻一行:k 当然也可以用鼠标滑 退出man:q man的一些用法 NAME    命令名称及功能简要说明 SYNOPSIS   用法说明,包括可用的选项 DESCRIPTION 命令功能的详细说明,可能包括每一个选项的意义 OPTIONS 说明每一项的意义 FILES 此命令相关的配置文件 EXAMPLES 使用示例 SEE ALSO 另外参照 通过man学习系统调用 通过 man grep 可以了解,grep是 用来查找的 找到娄老师博客提到的两项 用 man 2 intro 查看 再用 man 2 syscalls 查看,我们找到了系统调用的相关信息 whatis指令 用于查询一个命令执行什么功能,并将查询结果打印到终端上。 系统调用指令Who ysz@ysz-VirtualBox:~$ whatis who who (1) - show who

进程_Linux内核设计与实现笔记

断了今生、忘了曾经 提交于 2019-12-03 10:44:58
进程 进程是处于执行期的程序以及相关资源的总称,是正在执行的代码的实时结果. 进程部分位于Kernel的PM层.进程是Unix操作系统的抽象概念中最基本的一种,操作系统的存在就是为了运行用户程序,所以进程管理是所有操作系统的心脏所在. 程序本身不是进程,进程不局限于可执行程序代码段(text section),完全可能出现多个不同的进程,执行的是同一个程序, 多个进程之间还可以共享一些资源,如打开的文件,地址空间等. 线程 执行线程简称线程,是进程中的活动对象,每个线程都具有 独立的程序计数器 , 进程栈 ,和 一组进程寄存器 . 调度对象是进程中的活动对象 线程 ,而不是进程本身,通常一个进程包含多个线程,即 多线程序 . 虚拟处理器与虚拟内存 进程提供两种机制, 虚拟处理器 和 虚拟内存 ,实际可能是许多进程分享同一个处理器,虚拟处理器会让进程觉得自己在独享处理器,虚拟内存同样,会让进程觉得自己拥有整个系统的内存资源. 包含在同一个进程中的线程之间可以共享虚拟内存.但是每个线程都拥有各自的虚拟处理器. 从内核的角度说,没有线程的概念,对Linux来说线程只不过是进程之间共享资源的一种手段. 创建进程 使用fork函数创建进程 ... NAME fork - create a child process SYNOPSIS #include <sys/types.h>

系统调用软中断处理程序system_call分析

匿名 (未验证) 提交于 2019-12-03 00:38:01
最近学习了系统调用的整个流程,这里总结并记录。同时作为学习孟宁老师的linux内核课程的作业。 1、概述   系统调用整个过程为:API――封装例程――system_call――系统调用程序。   上一篇文件我们测试了read和open 系统调用。本节我更换了一个简单的系统调用getpid(sys_getpid)。 ‘ 可以看到,我们将系统调用处理函数断住后,当使用系统调用,就会断住。 3、system_call分析:D:\学习资料\linux\linux-3.18.6\linux-3.18.6\arch\x86\kernel\entry_32.S ‘ 4、总结   system_call主要流程:save_all――系统调用应用程序――restore_all 原文:https://www.cnblogs.com/tjyuanxi/p/9231599.html

分散/聚集IO(scatter/gather)及iovec结构体

匿名 (未验证) 提交于 2019-12-03 00:34:01
分散/聚集 I/O是一种可以在单次系统调用中对多个缓冲区输入输出的方法,可以把多个缓冲区的数据写到单个数据流,也可以把单个数据流读到多个缓冲区中。其命名的原因在于数据会被分散到指定缓冲区向量,或者从指定缓冲区向量中聚集数据。这种输入输出方法也称为向量 I/O(vector I/O)。与之不同,标准读写系统调用(read,write)可以称为线性I/O(linear I/O)。 与线性 I/O 相比,分散/聚集 I/O 有如下几个优势: 编码模式更自然 如果数据本身是分段的(比如预定义的结构体的变量),向量 I/O 提供了直观的数据处理方式。 效率更高 单个向量 I/O 操作可以取代多个线性 I/O 操作。 性能更好 除了减少了发起的系统调用次数,通过内部优化,向量 I/O 可以比线性 I/O 提供更好的性能。 支持原子性 和多个线性 I/O 操作不同,一个进程可以执行单个向量 I/O 操作,避免了和其他进程交叉操作的风险。 函数原型 #include <sys/uio.h> ssize_t readv ( int fd , const struct iovec * iov , int iovcnt ); ssize_t writev ( int fd , const struct iovec * iov , int iovcnt ); ssize_t preadv ( int fd

6.用户态和核心态的区别

匿名 (未验证) 提交于 2019-12-03 00:19:01
用户态和核心态的区别 1. 操作系统需要两种 CPU 状态: 内核态( Kernel Mode ):运行操作系统程序 用户态( User Mode ):运行用户程序 2. 指令划分: 特权指令: 只能由操作系统使用、用户程序不能使用的指令。 举例:启动 内存清零 修改程序状态字 设置时钟 允许 / 禁止终端 停机 非特权指令:用户程序可以使用的指令。 举例:控制转移 算数运算 取数指令 访管指令(使用户程序从用户态陷入内核态) 3. 特权级别: 特权环: R0 、 R1 、 R2 和 R3 R0 相当于内核态, R3 相当于用户态; 不同级别能够运行不同的指令集合; 4.CPU 状态之间的转换: 用户态 ---> 内核态: 唯一途径是通过中断、异常、陷入机制(访管指令) 内核态 ---> 用户态: 设置程序状态字 PSW 5. 内核态与用户态的区别: 1 ) 内核态与用户态是操作系统的两种运行级别,当程序运行在 3 级特权级上时,就可以称之为运行在用户态。 因为这是最低特权级,是普通的用户进程运行的特权级, 大部分用户直接面对的程序都是运行在用户态; 2 ) 当程序运行在 0 级特权级上时,就可以称之为运行在内核态。 3 ) 运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。 当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在