一切皆是文件:UNIX,Linux 操作系統的設計哲學

Linux的进程、线程、文件描述符是什么

说到进程,恐怕面试中最常见的问题就是线程和进程的关系了,那么先说一下答案:在 Linux 系统中,进程和线程几乎没有区别

Linux 中的进程就是一个数据结构,看明白就可以理解文件描述符、重定向、管道命令的底层工作原理,最后我们从操作系统的角度看看为什么说线程和进程基本没有区别。

一、进程是什么

首先,抽象地来说,我们的计算机就是这个东西:

一切皆是文件:UNIX,Linux 操作系統的設計哲學

就是 Linux 内核对于一个进程的描述,也可以称为「进程描述符」。源码比较复杂,我这里就截取了一小部分比较常见的。

其中比较有意思的是指针和指针。指向的是进程的虚拟内存,也就是载入资源和可执行文件的地方;指针指向一个数组,这个数组里装着所有该进程打开的文件的指针。

二、文件描述符是什么

先说,它是一个文件指针数组。一般来说,一个进程会从读取输入,将输出写入,将错误信息写入。

举个例子,以我们的角度 C 语言的函数是向命令行打印字符,但是从进程的角度来看,就是向写入数据;同理,函数就是进程试图从这个文件中读取数据。

每个进程被创建时,的前三位被填入默认值,分别指向标准输入流、标准输出流、标准错误流。我们常说的「文件描述符」就是指这个文件指针数组的索引,所以程序的文件描述符默认情况下 0 是输入,1 是输出,2 是错误。

我们可以重新画一幅图:

一切皆是文件:UNIX,Linux 操作系統的設計哲學

明白了这个原理,输入重定向就很好理解了,程序想读取数据的时候就会去读取,所以我们只要把指向一个文件,那么程序就会从这个文件中读取数据,而不是从键盘:

一切皆是文件:UNIX,Linux 操作系統的設計哲學

错误重定向也是一样的,就不再赘述。

管道符其实也是异曲同工,把一个进程的输出流和另一个进程的输入流接起一条「管道」,数据就在其中传递,不得不说这种设计思想真的很优美:

一切皆是文件:UNIX,Linux 操作系統的設計哲學

就比如说,结构和结构在线程中都是共享的:

一切皆是文件:UNIX,Linux 操作系統的設計哲學

专注分享 Java、 Kotlin、Spring/Spring Boot、MySQL、redis、neo4j、NoSQL、Android、JavaScript、React、Node、函数式编程、编程思想、”高可用,高性能,高实时”大型分布式系统架构设计主题。

High availability, high performance, high real-time large-scale distributed system architecture design

分布式框架:Zookeeper、分布式中间件框架等
分布式存储:GridFS、FastDFS、TFS、MemCache、redis等
分布式数据库:Cobar、tddl、Amoeba、Mycat
云计算、大数据、AI算法
虚拟化、云原生技术
分布式计算框架:MapReduce、Hadoop、Storm、Flink等
分布式通信机制:Dubbo、RPC调用、共享远程数据、消息队列等
消息队列MQ:Kafka、MetaQ,RocketMQ
怎样打造高可用系统:基于硬件、软件中间件、系统架构等一些典型方案的实现:HAProxy、基于Corosync+Pacemaker的高可用集群套件中间件系统
Mycat架构分布式演进
大数据Join背后的难题:数据、网络、内存和计算能力的矛盾和调和
Java分布式系统中的高性能难题:AIO,NIO,Netty还是自己开发框架br> 高性能事件派发机制:线程池模型、Disruptor模型等等。。。

合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。不积跬步,无以至千里;不积小流,无以成江河。

一切皆是文件:UNIX,Linux 操作系統的設計哲學 图来自《Kotlin从入门到进阶实战》 (陈光剑,清华大学出版社) 一切皆是文件:UNIX,Linux 操作系統的設計哲學

https://kotlinlang.org/

文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树首页概览208940 人正在系统学习中

来源:禅与计算机程序设计艺术

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年7月16日
下一篇 2020年7月16日

相关推荐