您的位置:首页 > 运维架构 > Linux

linux基础概念

2018-08-14 09:10 465 查看

基础概念

本文主要以个人的角度阐述了几个linux领域的常见概念:
为什么windows上的程序不能在linux上运行?
程序员到底在干什么?
基于系统库的编程和基于API的编程
共享库
写时复制
进程的安全上下文
为什么windows上的程序不能在linux上运行?
计算机的最底层是硬件,硬件再往上是kernel,再向上是库,库并不能自己运行,而是要等待程序的调用来执行,模块也是这样,程序员可以根据库提供的接口来编程,这个库也被我们称之为共享库,根据共享库编的程序,移植到同样的操作系统上照样是可以运行的,可是为什么windows上的程序在linux上不能运行呢?其原因不仅限于库的原因,库是API(程序调用接口),此外还有一个接口就叫做ABI(程序运行接口),windows上的软件linux不能使用原因大部分是因为ABI不同造成的,API的不同是可以弥补的,两个系统使用一样的库就可以解决,但是ABI的不同就很难弥补。
系统体系结构从下向上是顺序是这样的:硬件—驱动—内核—系统—系统调用接口—程序调用接口—虚拟机/程序
注:这里面所说的虚拟机并不是我们使用的虚拟机,而是一种形容,比如我们在windows上写jave程序时,我们通常要安装jave的运行环境,这个java运行的环境我们就称之为jave虚拟机,这个虚拟机里面包括有jave要调用的库,java库其实就是对系统调用接口再抽象加工。
程序员到底在干什么?
做为一名还没入门的运维,以当前自己的角度来看程序员来看程序员在写什么?
我认为程序员写程序就像是玩比较复杂的积木。
当我们买来积木时就是一堆零散的零件,我们可以利用这堆零散的东西拼成各种不同的东西,systemcall和API都是零件库,程序员做就是要将这件零件拼成一个东西,比如都是拼成一个小车,不同的孩子有不同的拼法,有的孩子拼出来的小车结实、大方、跑的流畅,而有的孩子拼出的小车臃肿、丑陋、勉强能跑,程序员亦是如此,不仅是程序员是这样,大部分行业的从业人员都是这样,我认为智商的原因还是其次,主要原因还是“现实“,关于现实的问题,我会专门再写一篇小文谈谈自己的粗浅理解,这里不多说。
接上,从这个角度来看,程序员写程序时还要“零件提供商”提供“零件”才可以,那么“零件“从何而来的呢?现实生活当中的零件是由各个厂商提供的,各个厂商提供好之后再由一家积木厂把这些零件包装起来卖给客户,如下图:





这样看来,程序员就是合理利用资源,结合自己的“逻辑”组成一个程序。辑这个东西每个人都不是一样的,但总有一些通用的模块套路,这可能就是他们所说的框架吧!大部分程序员可能都循规蹈矩,这可能就是“每个人天生都是原创的,可渐渐却活成了盗版”,说来说去,高级程序员拼的思路、想法、创意级程序员应该做的是模仿、思考高手的逻辑套路。
那库里面的模块、函数这些玩意儿是从哪里来的?这些东西是也是程序员写的,人人为我,我为人人嘛!如果是system call的话,库里面的东西就是由写系统的程序员提供的,如果是API的话,可能就是语言的作者提供的。
基于系统库的编程和基于API的编程
基础系统库的编程较为底层,此类程序的编写难度与效率一样高,而基于API的编程较为高级,人类更容易理解,但是运行效率不怎么高,此外还有直接面向硬件的,比如编写操作系统的程序员就要面向硬件的,难度更高,但是运行效率更快。
共享库
程序员编写程序如果是根据于共享库来编写的,那么这个程序运行起来的前提就是这个共享库在内存中,如果别的程序也依赖于这个库的话,那么别的程序就不用再次去硬盘上调用了,直接把内存中的这个库复制一份即可,这样的库又叫做共享库。共享库和程序是平行状态并且都处于内存当中,都被内核控制。
共享的概念如今已经大行其道,我们常用的虚拟机的链接克隆、共享单车、虚拟化技术都或多或少的使用了共享的概念,共享的目的什么呢?我认为共享的目的是合理的利用资源,我们就用经常使用到的虚拟机克隆来说明。我物理机上开三个独立的虚拟linux系统时,内存占用量是百分之六十左右,对于有强迫症的我来说,内存一上百分之五十就已经不舒服了;假如开一台虚拟机,然后在此基础上创建两个链接克隆,同样还是拥有三台虚拟机,但是内存的占用率却只有百分之四十左右。开三台独立的虚拟机是三个虚拟机占用的资源都独立运行于内存当中,所以占用的资源是1+1+1=3,当我们使用链接克隆时,它们共同使用的部分,比如内核就被共享了,也就是说三台虚拟机共同使用一个内核,所以内存的占用率较少。
写时复制
在红帽5,6的时代,用户空间的进程都是父进程fork()自身而来的,父进程和子进程刚开始是共用一段内存空间,等到子进程要对父进程的某些资源进行修改时,父进程是不允许的,这时子进程会把要用的资源复制一份然后自己“另立门户”,当然另立门户的过程少不了内核的参与,因为对新进程分配页框就是内核应该做的工作。
进程的安全上下文
tom和manry在同一台主机上共同发起ls命令,假设ls命令的所有人是tom,那么他们的权限是一样的吗?不一样,那么进程知道不一样吗?
进程是用户是发起的,进程在对计算机而言就是用户的代理,进程以谁的身份发起就属于谁,用户有什么权限,进程就有什么权限,在这里要明确一点,进程也是有所有人和所属组的,ls命令的所有人是tom,如果是tom发起的话,那么进程的所有人也是tom,那么tom就可以正常执行,这叫做进程的安全上下文。这个过程是由内核来完成的。
当manry来访问ls时,如果ls的所有人和所属组都不是manry,那么ls是以其他人的身份来运行的。
SUID其实就是通过打破进程的安全上下文而实现的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  基础 概念