系统调用

操作系統-進程管理3(進程通信)

别说谁变了你拦得住时间么 提交于 2020-01-25 23:06:31
操作系统-进程管理3(进程通信) 进程通信 进程间的通信分为控制信息的传送和大量信息的传送两种,控制信息的传送称为 低级通信 ,大批量数据的传送称为 高级通信 。 高级通信分为 共享存储系统、消息传递系统和管道通信系统 。 共享存储系器系统 共享存储器系统类型:在共享存储系统中,相互通信的进程共享某些 数据结构 或 共享存储区 ,进程之间能通过这些空间进行通信。 共享数据结构的通信:在这种方式中,要使各进程间共享某些数据结构以实现进程间的信息交换。如生产者-消费者问题中,生产进程和消费进程共享了empty和full的信号量,使得彼此知道能否放置或拿走产品。这种方式只适用于传递少量的数据。 共享存储区的通信:为了实现高级通信,在存储区划出一块共享存储区,各进程可通过对共享存储区的读或写来实现通信。进程在通信前,先向系统申请获得共享存储区的一块分区,并指定该分区的一个关键字;若系统已经给其他进程分配了这样的分区(如本进程是读进程,但是已经有同类的读进程在读这块数据),则将该分区的描述符返回给申请者,由申请者去连接共享存储区。 Linux共享存储区通信的实现 1).共享存储区的建立:当进程要利用共享存储区与另一个进程进行通信时,必须先让系统调用shmget()建立一块共享存储区。 2).共享存储区的操纵:系统可以调用shmctl()对共享存储区的状态信息进行查询,如长度、所连接的进程数

操作系統-進程管理4(線程)

放肆的年华 提交于 2020-01-25 23:03:51
操作系统-进程管理(线程) 线程 线程的基本概念 线程是比进程更小的、能够独立运行的基本单位,线程比进程能更好地提高程序的并行执行速度,充分利用多处理机的优越性。引用线程主要是为了提高系统的处理效率,减少处理机的空转时间和进行调度时因保护CPU现场浪费的时间。 线程是 进程中执行运算的最小单位 ,即执行处理机调度的基本单位。在引入线程的操作系统中,可以在一个进程内部进行线程的切换。 进程是资源分配的基本单位,同一进程的所有线程共享该进程的所有资源。线程是分配处理机的基本单位,真正在处理机上运行的是线程。 Linux系统中没有区分进程和线程,它们都使用相同的描述方法,使用相同的调度和管理策略。 线程的状态与转换操作 线程只有三种基本状态: 执行、阻塞和就绪 。针对线程的三种状态,存在五种操作来转换线程的状态。 派生(Spawn) 线程在进程中派生出来,也可再派生线程。用户可以通过相关的系统调用来派生自己的线程。Linux系统中,库函数clonc()和create_thread()分别用来派生不同执行模式的线程。 一个新派生出的线程具有相应的数据结构指针和变量,这些指针和变量作为 寄存器上下文 放在本线程的寄存器和堆栈中。新派生出来的线程被放入就绪队列。 调度(Schedule) 选择一条就绪线程进入执行状态。 阻塞(Block) 如果一个线程在执行过程中需要等待某个事件发生,则被阻塞

Linux下查看文件内容的命令

牧云@^-^@ 提交于 2020-01-25 20:47:35
转: Linux下查看文件内容的命令 查看文件内容的命令: cat 由第一行开始显示内容,并将所有内容输出 tac 从最后一行倒序显示内容,并将所有内容输出 more 根据窗口大小,一页一页的现实文件内容 less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符 head 只显示头几行 tail 只显示最后几行 nl 类似于cat -n,显示时输出行号 tailf 类似于tail -f 1.cat 与 tac cat的功能是将文件从第一行开始连续的将内容输出在屏幕上。但是cat并不常用,原因是当文件大,行数比较多时,屏幕无法全部容下时,只能看到一部分内容。 cat语法:cat [-n] 文件名 (-n : 显示时,连行号一起输出) tac的功能是将文件从最后一行开始倒过来将内容数据输出到屏幕上。我们可以发现,tac实际上是cat反过来写。这个命令也不常用。 tac语法:tac 文件名。 2.more和less(常用) more的功能是将文件从第一行开始,根据输出窗口的大小,适当的输出文件内容。当一页无法全部输出时,可以用“回车键”向下翻行,用“空格键”向下翻页。退出查看页面,请按“q”键。另外,more还可以配合管道符“|”(pipe)使用,例如:ls -al | more more的语法:more 文件名 Enter 向下n行,需要定义,默认为1行; Ctrl f

read系统调用

烈酒焚心 提交于 2020-01-24 15:22:07
可参考上一篇文章: struct file结构体 read系统调用是glibc库里面的一个函数,是对系统调用函数sys_read()的封装与实现。glic库会将read函数在用户态下进行解析,通过寄存器将参数保存起来,并借助于系统调用名称获得系统调用号,该系统调用号又可以作为系统调用函数在sys_call_table中的索引获取函数入口地址,该表位于linux-4.13.16\arch\x86\entry\syscalls\syscall_64.tbl中,接下来就是即将要分析的sys_read调用了 1.内核源码特殊用法 [1]__user属性 该属性的主要目的是便于通过 sparse 工具检查 Linux内核代码。[include/linux/compile.h] 中定义了该属性: # define __user __attribute__((noderef, address_space(1))) 其中__attribute__是gcc的编译属性,主要用于改变所声明或定义的函数或数据的特性,它有很多子项,用于改变作用对象的特性。比如对函数,noline将禁止进行内联扩展、noreturn表示没有返回值、pure表明函数除返回值外,不会通过其它(如全局变量、指针)对函数外部产生任何影响。此处的__user告诉编译器它是一个用户数据,这样在进行内核编译时就可以进行语法检查

进程和线程

你。 提交于 2020-01-24 02:50:38
1. 进程: (1)进程模型:一个进程就是一个程序的执行实例,程序是静态的,进程是动态的。一个进程有一个地址空间和一个控制线程,其中地址空间包含有:程序计数器、寄存器、变量的当前值。当一个进程被挂起时,进程的物理程序计数器值被保存在该进程的程序计数器中。下次进程运行时,再从程序计数器中取出计数值装入内存的程序计数器中。 (2)进程的创建:在unix系统中,创建新进程的方式只有一个:fork()函数,即创建一个子进程。子进程是父进程的一个副本,和父进程拥有相同的存储映像、相同的环境字符串和相同的打开文件。但是,子进程和父进程有各自不同的地址空间,不同的PID。通过系统调用execve()函数,可以替换地址空间中的程序段。( ps:子进程和父进程拥有不同的地址空间,但地址空间中的内容相同 ) (3)进程的三种状态:运行态、就绪态、阻塞态。( ps:系统调用pause()可以使进程进入阻塞态 ) (4)多进程的实现:操作系统维护着一张进程表,每个进程占用一个表项。该表项包含着进程状态的重要信息,包括:寄存器、程序计数器、堆栈指针、内存分配状况、打开文件的状态、调度信息、从运行态转为就绪态或阻塞态时所保存的信息(程序计数器值和寄存器中的相关信息)。当内核切换进程时,会将旧进程的信息装入进程表,保证下次该进程能正确启动,然后载入新进程的程序计数器和寄存器等相应信息到内存中,从而切换到新进程。

CPU-内核态和用户态的区别

余生长醉 提交于 2020-01-24 02:40:32
CPU的两种工作状态:内核态和用户态(或者称管态和目态) 内核态 系统中既有操作系统的程序,也由普通用户的程序。为了安全和稳定性操作系统的程序不能随便访问,这就是内核态 内核态可以使用所有的硬件资源 用户态 不能直接使用系统资源,也不能改变CPU的工作状态,并且只能访问这个用户程序自己的存储空间 用户态和内核态 特权级 Linux使用了Ring3级别运行用户态,Ring0标识内核态 Ring0作为内核态,没有使用Ring1和Ring2。 Ring3状态不能访问Ring0的地址 空间,包括代码和数据。 Linux进程的4GB地址空间,3G-4G部分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块, 以及内核所维护的数据。用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过 write,send等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入3GB-4GB中的内核地址空间去执 行这些代码完成操作,完成后,切换回Ring3,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。 用户态和内核态的转换 系统调用 这 是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使 用操作系统提供的服务程序完成工作

SYSCALL_DEFINEx宏源码解析

流过昼夜 提交于 2020-01-22 19:34:10
1.定义 显然SYSCALL_DEFINE1是系统调用的入口,其中1表示函数参数的个数,name表示系统调用函数的名字,同理下面的2,3,4,5,6表示参数个数。其具体定义位于linux-4.13.16\include\linux\syscalls.h中,具体定义如下: # define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__) # define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__) # define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__) # define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__) # define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__) # define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)

操作系统导论读书笔记—虚拟化CPU之调度

那年仲夏 提交于 2020-01-22 16:11:09
虚拟化CPU之调度 1. 底层机制 1.1 用户模式与内核模式 1.1.1 系统调用 1.1.2 用户态与内核态切换过程 1.2 进程间切换 1.2.1 协作方式:等待系统调用 1.2.2 非协作方式:操作系统控制 1.2.3 保存和恢复上下文 1.2.4 时间中断进程切换 2. 调度策略 2.1 进程调度的相关概念 2.1.1 调度的性能指标 2.1.2 IO消耗型和CPU消耗型进程 2.1.3 进程优先级 2.1.4 时间片 2.2 几种基本调度算法 2.2.1 先入先出FIFO 2.2.2 最短任务优先SJF 2.2.3 最短完成时间优先STCF 2.2.4 轮转调度RR 2.2.5 总结对比 2.3 经典调度算法 2.3.1 多级反馈队列MLFQ 2.3.2 比例份额调度 2.4 多处理器调度 2.4.1 多处理器的特性 2.4.2 单队列调度 2.4.3 多队列调度 2.4.4 linux多处理器调度 1. 底层机制 操作采用时分共享CPU的方式实现虚拟化CPU。在实现虚拟化的同时,我们要保证整体性能且不失去CPU的控制权。 1.1 用户模式与内核模式 为了防止某个任务抢夺所有资源或者影响其它任务的运行,我们需要限制进程的操作,保证操作系统的控制权。 在用户模式下,应用程序不能完全访问硬件资源。在内核模式下,操作系统可以访问机器的全部资源。并提供了内核态与用户态的切换方式

操作系统概念- Silberschatz 期末复习

我是研究僧i 提交于 2020-01-22 05:47:13
第一章——导论 1>操作系统是一组控制和管理计算机软硬件资源,合理地对各类作业进行调度,及方便用户的程序集合。 用户视角:为用户方便,不在乎资源使用率; 系统视角:资源分配器 &控制程序; 2>陷阱: 软中断,来自出错(除数为0/无效存储访问..)和用户程序的特别请求、系统调用。 中断:来自硬件。 3>os结构 ①多道程序设计 ②分时系统:操作系统将时间划分为若干时间在用户之间快速切换,这种快速切换使得用户感到整个系统只为自己所用,以时间片为单位,且因为频度高,用户可以在程序运行期间与之进行交互。 4>特权指令:特权指令是拥有特殊权限的指令,用于调用系统函数或系统软件等,因为在执行程序时,为了方式用户随意调用特权指令,系统又分成了用户态和核心态。由此延申模式位,1:用户态,0:内核模式,用于保证特权指令只能由操作系统完成,保护操作系统和用户程序不受错误用户程序的影响。 5>高速缓存一致性 6>上下文切换, CPU 从一个 进程 或线程切换到另一个进程或线程,不可以在用户态实现,而系统调用是操作系统提供的服务,用户态可以使用。 第二章——操作系统结构 1>系统调用:OS内核提供一系列的预定功能,通过一组称为系统调用的接口来呈现给编程人员,相应内核函数完成处理并返回给编程人员;它把应用程序请求传给内核,其相应内核函数完成处理并返回给程序;系统调用是内核的一部分。

深入Linux内核架构-进程管理和调度(四)

假如想象 提交于 2020-01-20 21:20:19
一、进程管理相关的系统调用 讨论 fork 和 exec 函数族( 用来用指定的程序替换当前进程的所有内容 )系统调用的实现。通常这些调用不是由应用程序直接发出 的,而是通过一个中间层调用,即负责与内核通信的C标准库。 从用户状态切换到核心态的方法,依不同的体系结构而各有不同。用于在这两种状态之间切换的机制,并解释了用户空间和内核空间之间如何交换参数。就目前而言,将内核视为由C标准库使用的“ 程序库 ”即可。 1、进程复制 传统UNIX中用于复制进程的系统调用是fork。但fork并不是Linux为此实现的唯一调用,实际上Linux实现了3个。 (1) fork 是重量级调用,因为fork建立了父进程的一个完整副本,然后作为子进程执行。为减少与该调用相关的工作量,Linux使用写时复制( copy-on-write )技术。 (2) vfork 类似于 fork ,但vfork 并不创建父进程数据的副本。相反,父子进程之间共享数据。这节省了大量CPU时间(如果一个进程操纵共享数据,则另一个会自动注意到)。 vfork 设计用于子进程形成后立即执行 exec 系统调用加载新程序的情形。在子进程退出或开始新程序之前,内核保证父进程处于堵塞状态。由于 fork 使用了写时复制技术, vfork 在速度方面不再有优势,因此应该避免使用 vfork 。 (3) clone 来源: CSDN