程序

  程序通常以两种面目示人。其一为源码形式,由使用编程语言(比如,C语言)写成的一系列语句组成,是人类可以阅读的文本文件。想要执行程序,则需将源码转换为第二种形式——计算机可以理解的二进制机器语言指令。(这与脚本形成了鲜明对照,脚本是包含命令的文本文件,可以有shell或其他命令解释器之类的程序直接处理。)一般认为,术语“程序”的上述两种含义几近相同,因为经过编译和链接处理,会将源码转换为语义相同的二进制机器码。

过滤器

  从stdin读取输入,加以转换,再将转换后的数据输出到stdout,常常将拥有上述行为的程序称为过滤器,cat、grep、tr、sort、wc、sed、awk均在其列。

命令行参数

  C语言程序可以访问命令行参数,及程序运行时在命令行中输入的内容。要访问命令行参数,程序的main()函数需作出如下声明:

  int main(int argc, char* argv[])

  argc变量包含命令行参数的总个数,argv指针数组的成员指针则逐一指向每个命令行参数字符串。收个字符串argv[0],标识程序名本身。

进程(process)

  进程是正在执行的程序实例。执行程序时,内核会将程序代码载入虚拟内存,为程序变量分配空间,简历内核记账(bookkeeping)数据结构,以记录与进程有关的各种信息(比如,进程ID、用户ID、组ID以及种植状态等)。

  从内核来看,进程是一个个实体,内核必须在他们之间共享各种计算机资源。对于像内存这样的受限资源来说,内核一开始会为进程分配一定数量的资源,并在进程的生命周期内,统筹该进程和整个系统对资源的需求,对这一分配进行调整。程序终止时,内核会释放所有此类资源,供其他进程重新使用。其他资源(如CPU、网络带宽等)都属于可再生资源,但必须在所有进程间平等共享。

进程的内存布局

  逻辑上将一个进程划分为以下几部分(也称为段)

  1、文本:程序的指令

  2、数据:程序使用的静态变量

  3、堆:程序可从该区域动态分配额外内存

  4、栈:随函数调用、返回而增减的一片内存,用于为局部变量和函数调用链接信息分配存储空间。

创建进程和执行程序

  进程可使用系统调用fork()来创建一个新进程。调用fork()的进程被称为父进程,新创建的进程被称为子进程。内核通过对父进程的复制来创建子进程。子进程从父进程处继承数据段、栈段以及堆段的副本后,可以修改这些内容,不会影响父进程“原版”内容。(在内存中被标记为只读的程序文本段则由父、子进程共享。)

  然后,子进程要么去执行与父进程共享代码段中的另一组不同函数,或者,更为常见的情况是使用系统调用execve()去加载并执行一个全新程序。execve()会销毁现有的文本段、数据段、栈段及堆段,并根据新程序的代码,创建新段来替代他们。

进程ID和父进程ID

  每一个进程都有一个唯一的整数型进程标识符(PID)。此外,每一个进程还具有一个父进程标识符(PPID)属性,用以标识请求内核创建自己的进程。

进程终止和终止状态

  可使用以下两种方式之一来终止一个进程:

  其一,进程可使用_exit()系统调用(或相关的exit()库函数),请求退出。

  其二,向进程传递信号,将其“杀死”。

  无论以何种方式退出,进程都会生成“终止状态”,一个非负小整数,可供父进程的wait()系统调用检测。

  在调用_exit()的情况下,进程会指明自己的终止状态。若由信号来“杀死”进程,则会根据导致进程“死亡”的信号类型来设置进程的终止状态。根据惯例,终止状态为0表示进程“功成身退”,非0则表示有错误发生。大多数shell会将前一执行程序的终止状态保存于shell变量$?中。

进程的用户和组标识符(凭证)

  每个进程都有一组与之相关的用户ID(UID)和组ID(GID)。

  真实用户ID和组ID:用来标识进程所属的用户和组。新进程从其父进程处继承这些ID。登录shell则会从系统密码文件的相应字段中获取其真实用户ID和组ID。

  有效用户ID和组ID:进程在访问受保护资源(比如,文件和进程间通信对象)时,会使用这两个ID(并结合下述的补充组ID)来确定访问权限。一般情况下,进程的有效ID与相应的真实ID值相同。改变进程的有效ID实为一种机制,可使进程具有其他用户或组的权限。

  补充组ID:用来标识进程所属的额外组。新进程从其父进程处继承补充组ID。登录shell则从系统组文件中获取其补充组ID。

特权进程

  就传统意义而言,特权进程是指有效用户ID为0(超级用户)的进程。通常由内核所施加的权限限制对此类进程无效。

  由某一特权进程创建的进程,也可以是特权进程。

能力

  Linux把传统上赋予超级用户的权限划分为一组相互独立的单元(称之为“能力”)。每次特权操作都与特定的能力相关,仅当进程具有特定能力时,才能执行相应操作。传统意义上的超级用户进程则相应开启了所有能力。

  赋予某进程部分能力,使得其既能执行某些特权级操作,又防止其执行其他特权级操作。

init进程

  系统引导时,内核会创建一个名为init的特殊进程,即“所有进程之父”,该进程的相应程序文件为/sbin/init。系统的所有进程不是由init(使用fork())“亲自”创建,就是由其后代进程创建。init进程号总为1,且总是以超级用户权限运行。

  任何人(包括超级用户)都不能“杀死”init进程,只有关闭系统才能终止该进程。init的主要任务是创建并监控系统运行所需的一系列进程。

守护进程

  守护进程指的是具有特殊用途的进程,系统创建和处理此类进程的方式与其他进程相同,但以下特征是其所独有的:

  1、“长生不老”。守护进程通常在系统引导时启动,直至系统关闭前,会一直“健在”。

  2、守护进程在后台运行,且无控制终端供其读取或写入数据。

环境列表

  每个进程都有一份环境列表,即在进程用户空间内存中维护的一组环境变量。这份列表的每一元素都由一个名称及其相关值组成。由fork()创建的新进程,会继承父进程的环境副本。这也为父子进程间通信提供了一种机制。当调用exec()替换当前正在运行的程序时,新程序要么继承老程序的环境,要么在exec()调用的参数中制定新环境并加以接收。

  在绝大多数shell中,可使用export命令来创建环境变量(C shell使用setenv命令),例如

  $ export MYVAR='Hello world'

  C语言程序可使用外部变量(char **environ)来访问环境,而库函数也允许进程去获取或修改自己环境中的值。

  shell定义并使用了一系列变量,供shell执行的脚本和程序访问。其中包括:变量HOME(明确定义了用户登录目录的路径名)、变量PATH(指明了用户输入命令后,shell查找与之相应程序时所搜索的目录列表)。

资源限制

  每个进程都会消耗诸如打开文件、内存以及CPU时间之类的资源。使用系统调用setrlimit(),进程可为自己消耗的各类资源设定一个上线。此类资源限制的每一项均有两个相关值:软限制(soft limit)限制了进程可以消耗的资源总量,硬限制(hard limit)软限制的调整上限。非特权进程在针对特定资源调整软限制值时,可将其设置为0到相应硬限制值之间的任意值,但硬限制则只能调低,不能调高。

  fork()创建的新进程,会继承其父进程对资源限制的设置。

  使用ulimit命令(在C shell中为limit)可调整shell的资源限制。shell为执行命令创建的子进程会继承上述资源设置。

转载于:https://www.cnblogs.com/Bird-of-Paradise/p/6797071.html

1-3_基本概念_程序进程相关推荐

  1. 基本概念_程序员基本功——链表的基本概念

    [程序员必须掌握数据结构: 数据结构中必讲链表: 所以,程序员必须掌握链表] 链表是数据元素的线性集合(Linear Collection),物理存储不连续.那么,这种设计的优点是什么?缺点又是什么? ...

  2. 并发编程概念、程序线程进程、线程同步、互斥量、读写锁、协程并发

    多线程: 多线程就是同时执行多个应用程序,需要硬件的支持 同时执行:不是某个时间段同时,cpu切换的比较快,所有用户会感觉是在同时运行 并发与并行: 并行(parallel):指在同一时刻,有多条指令 ...

  3. 02 线程简介 多任务 多线程 普通方法调用和多线程 程序.进程.线程 Proces与Thread 核心概念

    线程简介 任务,进程,线程,多线程 多任务 多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务 多线程 原来是一条路,慢慢因为车太多了,道路堵塞,效率极低. 为了提高使用的 ...

  4. 安卓手机管理器_一款多功能的手机文件/程序/进程管理器

    ES文件浏览器的大名 想必早有耳闻 ES 文件浏览器是一款多功能的手机文件/程序/进程管理器,可以在手机.电脑.远程和蓝牙间浏览管理文件.是一个功能强大的免费的本地和网络文件管理器和应用程序管理器. ...

  5. linux基础知识_压缩—进程管理-网络管理-ftp-nfs-ssh-scp

    linux基础知识_压缩-进程管理-网络管理-ftp-nfs-ssh-scp 1.压缩包管理 gzip .gz格式的压缩包,不打包,分别压缩,原文件消失 bzip2 .bz2格式的压缩包,原文件不会消 ...

  6. java线程概念_《Java基础知识》Java线程的概念

    按照规划,从本篇开始我们开启『并发』系列内容的总结,从本篇的线程开始,到线程池,到几种并发集合源码的分析,我们一点点来,希望你也有耐心,因为并发这块知识是你职业生涯始终绕不过的坎,任何一个项目都或多或 ...

  7. 基于EPOLL+多进程+线程池的server框架设想_程序世界_百度空间

    基于EPOLL+多进程+线程池的server框架设想_程序世界_百度空间 基于EPOLL+多进程+线程池的server框架设想 最近,看了几个开源代码的server框架,有了一些自己的想法,把它记下来 ...

  8. mysql中端口的概念_端口的概念,端口的分类

    端口概念 在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem.集线器.交换机.路由器用于连接其他网络设备的接口,如RJ-45端口.SC端口等等.二是逻辑意义 ...

  9. [日更-2019.4.26、27、28] cm-14.1 Android系统启动过程分析(四)-应用程序进程启动过程...

    2019独角兽企业重金招聘Python工程师标准>>> 声明 前阶段在项目中涉及到了Android系统定制任务,Android系统定制前提要知道Android系统是如何启动的: 本文 ...

最新文章

  1. k近邻算法之 k值的选择
  2. IBATIS + ORACLE(二)
  3. 【勉强采用】反欺诈之血缘关系分析和犯罪传导监测
  4. 第03课:Anaconda 与 Jupyter Notebook
  5. 牛客网编程题python输入输出_牛客网算法题目记录
  6. [TimLinux] JavaScript 元素动态显示
  7. 妲己机器人怎么升级固件_台湾重金设计的3D妲己,亮瞎了
  8. python列表属于什么类型的游戏_1.4 python数据类型之list类
  9. python字符串一(字符串的书写输入输出)
  10. 1102. Invert a Binary Tree (25)-PAT甲级真题
  11. 华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)
  12. 360 组织全局 HOOK 的 dll 加载
  13. NPDP产品经理认证:创新性解决问题方法(TRIZ)的工具与应用
  14. 有什么简单办法从格式复杂的 Excel中提取数据
  15. 程序员基础的硬件知识(cpu、主板、显卡、内存条等)
  16. 解决 Vue3.0 globalThis is note defined
  17. php小数点后保留一位或两位小数
  18. Android开发越来越式微了吗?,flutter二维码扫描第三方
  19. hexo 博客小功能添加-评论、相册、字数统计...
  20. Syntax error on token Invalid Regular Expression Options, no accurate corr

热门文章

  1. Python 工具列表
  2. SVD在推荐系统中的应用详解以及算法推导
  3. Android中级篇之百度地图SDK v3.5.0-一步一步带你仿各大主流APP地图定位移动选址功能
  4. MP4大文件虚拟HLS分片技术,避免服务器大量文件碎片
  5. win 7 DHCP获取不到ip的解决办法
  6. 发送语音+讯飞翻译 项目案例
  7. python-文件基本操作(二)
  8. 鼠标拖动div移动js代码
  9. 使用 MTR 诊断网络问题
  10. Boost库学习(0)