系统调用

Linux系统之进程状态

让人想犯罪 __ 提交于 2020-01-13 02:50:44
  一、进程状态      1、R (TASK_RUNNING),可执行状态      2、S (TASK_INTERRUPTIBLE),可中断的睡眠状态      3、D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态      4、T/t (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态      5、Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程      6、X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁      7、查看进程状态      二、进程状态转换      1、进程初始状态      2、进程状态变迁      三、进程调度      四、参考      一、进程状态↑      D:uninterruptible sleep (usually IO)      R:running or runnable (on run queue)      S:interruptible sleep (waiting for an event to complete)      T:stopped by job control signal      t:stopped by debugger during the tracing      W:paging

golang中的CSP并发模型

痴心易碎 提交于 2020-01-13 02:19:29
1. 相关概念:   用户态:当一个进程在执行用户自己的代码时处于用户运行态(用户态)   内核态:当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),引入内核态防止用户态的程序随意的操作内核地址空间,具有一定的安全保护作用。这种保护模式是通过内存页表操作等机制,保证进程间的地址空间不会相互冲突,一个进程的操作不会修改另一个进程地址空间中的数据。   用户态与内核态之间的切换:当在系统中执行一个程序时,大部分时间都是运行在用户态下的,在其需要操作系统帮助完成一些用户态自己没有特权和能力完成的操作时就会切换到内核态。有以下三种方式:   (1)系统调用(中断)     用户态进程主动要求切换到内核态的一种方式。   (2)异常     cpu运行时如果发生一些没有预知的异常,会触发当前进程切换到处理此异常的内核相关进程中。   (3)外围设备的中断     用户态进程主动要求切换到内核态的一种方式。   协程:又称微线程,纤程。英文名Coroutine。Coroutine是一种运行在用户态的用户线程,类似于 greenthread。协程与线程都相互独立,且有自己的上下文,不同之处在于,协程的切换由其自身控制,而线程的切换收到系统调度。 2. CSP (通信顺序进程)   CSP模型用来描述两个独立的并发实体通过共享的通讯channel管道进行通信的并发模型。  

CPU的自我控制-异常之于syscall

删除回忆录丶 提交于 2020-01-12 19:53:13
本质上讲,如果一个程序不使用任何库、系统调用,所有代码都是自包含的,它是可以直接在CPU上执行的,有疑问的话可以给我发邮件,我乐意受教。 于是问题就来了,一个用户态的程序在调度到CPU上开始执行,这个程序的指令流是否可以为所欲为。 很明显,这是不可能的,在没有内核的CPU上运行的指令流自己会照顾好自己,它确实可以为所欲为; 但在用户态的程序,如果没有系统调用的话你会发现它没有任何操作硬件的能力(就像不会吃饭的傻孩子) 所有要做点什么涉及硬件,你都能找到设计的很贴心的动态库或系统调用之类。 其实本质上的原理与虚拟化的原理是一样的, 用户态程序受到的限制更多,比如说不可能获得中断,不可能访问外设,仅能访问内核为它建立了映射的那一点点内存。 在此背景下,程序如何做到读取文件、存储数据、显示功能呢? 本质上,系统调用即syscall(可以简单理解为open(),close()等,但其实是被封装过的)为程序完成了这一切, 当然,操作系统用户态提供的库完成了很多很多工作,但是很抱歉,这些工作都是在用户态完成的, 一切真实的硬件操作(除了程序的那点内存)都是由syscall完成的。 可怜的用户态程序,这也是它的运行要依赖于操作系统的原因(先不考虑指令集差异引起程序跨平台的问题,还说没到那层)。 在之前知识不充足的时候,我有过很奇怪的想法, 程序是分为在用户态和内核态的, 当程序进入内核态以后

linux socket常用函数

限于喜欢 提交于 2020-01-12 14:39:08
======== TCP ======== TCP_Server socket() bind() listen() accept() write() read() close() 和shutdown() TCP_Client socket() connect() send() 和recv() close() 和shutdown() ======== UDP ======== UDP_Server socket() bind() sendto() 和recvfrom() close() 和shutdown() UDP_Client socket() sendto() 和recvfrom() close() 和shutdown() getpeername() gethostname() -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- socket() 我们使用系统调用socket()来获得文件描述符: #include<sys/types.h> #include<sys/socket.h> int socket

理解进程

白昼怎懂夜的黑 提交于 2020-01-12 10:24:43
计算机系统中最著名的冯诺依曼体系包括输入输出设备、cpu、存储器。 1.cpu:cpu作为计算机的运算中心主要工作就是完成一些运算,在我们现在的生活中一台设备中会包含不止一个cpu,与此同时cpu也具有一定的存储功能,但是存储量很小,cpu中的寄存器就发挥着这样的作用,他们的特点是空间小、访问快。 2.存储器 ①内存: 存储大小相对外存小,cpu可以直接访问、速度快、断电后数据不会被保存 ②外存: 存储空间相对于内存大、cpu不能直接访问,必须要先加载到内存中才能访问、访问速度慢、断电后数据会被保存 比如说有一个可执行程序,那么实际上它是在外存中存放的,只有在执行它的时候才会被加载到内存,这个时候如果我们删除它是不会影响它的执行的。 那么什么又是操作系统呢? 我们讨论的Linux就是一个操作系统,简单来说就是一个管理硬件和软件资源的东西。我们可以用一张图来理解一下: 通过这张图我们可以将这些部分简单的分成三个部分:用户接口即用户部分、系统调用操作系统以及驱动程序代表的是系统软件部分、底层硬件即硬件部分,从这个图我们就可以看到操作系统是怎么将软硬件和用户部分管理起来的,它其实就是起着一个桥梁的作用。 同样我们也要理解系统调用和库函数的概念: 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。 系统调用在使用上

Linux文件IO操作函数概述

早过忘川 提交于 2020-01-12 09:40:43
文件概述 Linux中,一切皆文件。文件为操作系统服务和设备提供了一个简单而一致的接口。这意味着程序完全可以像使用文件那样使用磁盘文件、串行口、打印机和其他设备。 也就是说,大多数情况下,你只需要使用5个函数: open、close、read、write和ioctl。 例外的情况: 目录的读写,网络连接等特殊文件 目录 文件通常由两部分组成: 内容 + 属性,即管理信息,包括文件的创建修改日期和访问权限等。属性均保存在 inode 节点中。inode - "索引节点",储存文件的元信息,比如 文件的创建者、文件的创建日期、文件的长度和文件在磁盘上存放的位置等等。每个inode都有一个号码,操作系统用inode号码来识别不同的文件。ls -i 查看inode 号。 目录是用于保存其他文件的节点号和名字的文件,每个数据项为指向文件节点的链接。如下图: 当文件链接数变为零,意味文件删除,磁盘空间变成可用空间。 文件和设备 三个重要的设备文件: /dev/console - 系统控制台。 /dev/tty - 访问不同的物理设备。 /dev/null - 空设备,向所有写这个设备的输出都将被丢弃。 设备驱动程序: 操作系统的核心部分,即内核,是由一组设备驱动程序组成。他们是一组对系统硬件进行控制的底层接口,为了向用户提供一个一致的接口,其封装了所有与硬件相关的特性。

操作系统之哲学原理(第2版)

痴心易碎 提交于 2020-01-10 20:51:32
第一篇 基础原理篇 中断是操作系统获得计算机控制权的根本保证。若没有中断,很难想象操作系统能够完成人们所赋予的任务。中断的基本原理是:设备在完成自己的任务后向CPU发出中断,CPU判断优先级,然后确定是否 响应。如果响应,则执行中断服务程序,并在中断服务程序执行完后继续执行原来的程序。 内核态和用户态各有优势:运行在内核态的程序可以访问的资源多,但可靠性、安全性要求高,维护管理都较复杂;用户态程序程序访问的资源有限,但可靠性、安全性要求低,自然编写维护起来比较简单。一个程序到底应该运行在内核态还是用户态则取决于其对资源和效率的需求。 系统调用按照功能可以划分为六大类: ●进程控制类。 ●文件管理类。 ●设备管理类。 ●内存管理类。 ●信息维护类。 ●通信类。 系统调用分为三个阶段,分别是: ●参数准备阶段。 ●系统调用识别阶段。 ●系统调用执行阶段。 第二篇 进程原理篇 进程从根本上说是操作系统对CPU进行的抽象和装扮。进程让每个用户感觉到自己独占CPU。 进程出现的动机是人类渴望的并发。因为要并发,所以我们发明了进程。 进程的出现也让操作系统的复杂性大为增加:由于需要对进程进行分离存储而导致出现内存管理;由于需要让不同进程有条不紊地往前推进而导致进程调度的出现。 进程管理、内存管理和文件管理是操作系统的三大核心功能。 进程就是进展中的程序,或者说进程是执行中的程序。就是说

Linux操作系统概要认识

 ̄綄美尐妖づ 提交于 2020-01-10 13:57:15
01)发展与演变  从ENIARC到Linux,前发展时期从20世纪40年代至20世纪90年代。  Linux出现后的后发展时期,从1992年往后。  认识到GUN/Linux才是操作系统的名称。  更多的就不做介绍了。 02)操作系统开发模式  大型软件开发模式:大教堂式、集市模式  Linux开发模式:集市模式  Windows开发模式:大教堂式 03)操作系统的组成  狭义的操作系统:内核  广义操作系统:内核+应用程序 04)操作系统(内核)功能  1、驱动程序  2、进程管理  3、安全管理  4、网络管理  5、内存管理  6、文件系统  … 05)系统调用接口(Syscall)  操作系统内核全盘接管计算机硬件,用户通过内核功能使用到计算机硬件,内核向上提供系统调用接口(API)为用户提供使用方式。  调用接口的模式还有利于抹平下层的复杂性,为上次提供统一的调用方法,例如不同公司生产的磁盘、CPU,其规格和使用方式不同,通过专门的驱动程序实现与硬件的匹配,但向上提供相同的调用接口,这样上层软件就可以不用管下层硬件。  注:系统调用接口不是给使用者(人)使用的,是给程序使用的 06)库接口(Libcall)  将系统调用进一步封装,以及将一些常用函数进一步封装,为程序提供更便捷的调用,便形成库。  有通用的库,例如glibc,已成为Linux操作系统标准,操作系统自带

字节码联盟成立,WebAssembly 生态将完善网络安全性

岁酱吖の 提交于 2020-01-10 03:34:33
近日 Mozilla、Fastly、Intel 与 Red Hat 宣布成立联合组织 Bytecode Alliance(字节码联盟) ,该联盟旨在通过协作实施标准和提出新标准,以完善 WebAssembly 在浏览器之外的生态。 WebAssembly 也叫 Wasm,它是为基于栈的虚拟机设计的二进制指令格式,Wasm 作为可移植目标,用于编译高级语言(如 C/C++/Rust),从而可以在 Web 上部署客户端和服务器应用。 WebAssembly 描述了一种内存安全的沙箱执行环境,该环境甚至可以在现有 JavaScript 虚拟机内部实现。当嵌入到 Web 中时,WebAssembly 将强制执行浏览器的同源和权限安全策略。 目前 1.0 版本的 Wasm 已经支持 Chrome、Firefox、Safari 与 Edge 浏览器。 此次四家公司为什么结成 Bytecode Alliance 呢?Mozilla 官网博客上 Lin Clark 作了介绍。 Lin 表示,当前网络用户身处越来越大的风险中,目前大家在构建大规模的模块化应用,其中 80% 的代码库来自软件包注册中心,例如 npm、PyPI 与 crates.io。这样的方式当然使得生态繁荣,但是安全问题也在极速增加。 破坏这些安全的人利用的正是用户的信任,当用户使用应用时,他们并不清楚背后这些软件依赖关系

《Linux内核设计与实现》 Chapter4 读书笔记

浪尽此生 提交于 2020-01-09 05:02:22
《Linux内核设计与实现》 Chapter4 读书笔记 调度程序负责决定将 哪个进程投入运行,何时运行以及运行多长时间 ,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统。 一、多任务 多任务操作系统就是能同时 并发地交互执行 多个进程的操作系统。 多任务系统可以划分为两类: 非抢占式多任务 进程会一直执行直到自己主动停止运行 抢占式多任务 Linux/Unix使用的是抢占式的方式;强制的挂起进程的动作就叫做抢占。 像所有unix的变体和许多其他现代操作系统一样,Linux提供了抢占式的多任务模式。 进程的时间片:进程在被抢占之前能够运行的时间是预先设置好的。 二、Linux 的进程调度 O(1)调度器虽然在拥有数以十计(不是数以百计)的多处理器的环境下尚能表现出近乎完美的性能和可扩展性,但是时间证明该调度算法对于调度那些响应时间敏感的程序却有一些先天不足,这些程序我们称其为交互进程一它无疑包括了所有需要用户交互的程序。 因此: O(1)调度程序虽然对于大服务器的工作负载很理想,但是在有很多交互程序要运行的桌面系统上则表现不佳,因为其缺少交互进程,自2.6内核系统开发初期,开发人员为了提高对交互程序的调度性能引入了新的进程调度算法,其中最为著名的是“反转楼梯最后期限调度算法,该算法吸取了队列理论,将公平调度的概念引入了Linux调度程序。并且最终在2.6