进程和线程是操作系统里很重要的概念,但是所有的东西都会落实到代码。看起来很复杂的进程线程,其实在操作系统的代码里。也只是一些数据结构和算法。只不过他比一般的数据结构和算法可能复杂点。但是学习方法还是一样的,就是深入源码,一探究竟。
进程在操作系统里,是用一个task_struct结构体表示的。因为操作系统是大部分是用c语言实现的,没有对象这个概念。如果我们用高级语言来理解的话,每个进程就是一个对象。每次新建一个进程,就是新建一个对象。task_struct结构体可以说是类的定义。我们看一下一个task_struct的定义。

我们看到task_struct结构体里其实就是保持了一个进程所需要的一些信息,报包括执行状态,执行上下文tss,打开的文件、根目录、工作目录、收到的信号、信号处理函数、代码段、数据段的位置,进程id,执行时间、退出码等等。我们具体看一下这些数据结构的作用。

进程的管理

操作系统里会维护一个task_struct数组或者链表来记录当前系统中所有的进程。每次新建一个进程的时候,就会往里面追加一个task_struct结构体,每次销毁一个进程的时候,该进程的父进程会删除对应的task_struct。

进程的调度

操作系统的运作,很大程度上是由时钟驱动的,电脑中会有一个硬件间歇性地产生时钟中断。中断间隔是由操作系统初始化该硬件时决定的(定时器也是由该硬件驱动的,我们在应用层使用的定时器功能,归根到底还是使用系统的定时器去实现的)。每次时钟中断的时候如果当前执行的进程时间片已到,则会发生进程调度。另外进程阻塞的时候,也会发送进程调度。被调度到的进程,系统就会把task_struct里的tss信息加载到cpu。包括当前执行的代码位置,各种寄存器的值。然后就完成了进程的切换。

进程的执行时间

每次时钟中断的时候,时钟中断处理程序都会累加当前进程的执行时间,我们平时查看的进程的执行时间,这些数据就是由这些字段记录的。一个进程在内核态和用户态下执行的时间,是分开计算的。

信号

task_struct中用三个字段实现了信号相关的功能,一个是signal,记录了进程收到的信号,按位计算。blocked就是记录当前进程不接收哪些信号。sigaction则是记录每个信号对应的处理函数,和signal一一对应。每次我们调用kill的时候,其实就是修改signal字段的值。然后在某些时机下,系统会执行sigaction里对应的函数。这些时机包括系统调用返回,时钟中断处理程序返回、还有其他的硬件中断返回等等。

状态

task_struct用一个字段state记录了进程当前的状态,exit_code记录进程退出时的退出码。

文件系统相关

当前进程的根目录、工作目录。我们平时在进程里打开一个文件的时候,如果没有写明绝对路径,系统就会以工作目录为基础,加上我们传的相对路径拼出绝对路径。从而找到文件。另外filp字段是维护进程打开的文件信息。我们平时拿到的文件描述符就是filp字段的索引。他会逐步找到底层对应的文件或者socket。executable是保存进程对应的二进制文件所在的文件信息。我们都知道程序加载到内存变成进程。executable保存的就是程序对应的文件的信息。

权限

task_struct里用uid、euid、gid、egid等字段记录进程的权限信息。

进程关系信息

pid字段记录了当前进程的id,father记录了父进程的id。pgrp,session,leader分别是组id,会话id,是不是会话leader。多个进程组成一个组,多个组组成一个会话。如果一个进程是这个组或者会话的leader,则他的id会成为组或者会话的id,比如
组1有进程a的id是1(组leader、会话leader)进程b的id是2。
组2有进程c的id是3(组leader),进程d的id是4。
所有进程在一个会话,则组1的所有进程的组id和会话id都是1。组2所有进程的组id是3,会话id是1。

执行上下文

tss_struct和desc_struct结构体记录了进程执行的上下文,每次进程切换的时候,如果是被调度执行,则上下文加载到cpu和对应的硬件中,如果是被挂起,则cpu和硬件的信息保存到上下文。下次执行的时候恢复。

以上就是一个进程所具有的一些属性。我们发现,进程也没有那么难以理解,好比我们平时定义一个人,他有名字,身高,年龄属性一样。每个对象,他都有属于自己的一些属性。

下面我们再来看一下线程。相比进程,线程对很多同学来说可能更难理解。其实对于操作系统来说,没有单独去实现线程这个概念,操作系统把进程和线程抽象成执行上下文。可以说他们是一个东西。但是他们又有一点点区别。我们以linuxthreads线程库为例。了解一下线程是什么。我们知道fork可以新建一个进程。但是这个进程太重了,尽管有些属性是可以共享的。所以操作系统重新实现了一个系统调用clone。他支持更细粒度的属性共享。所以我们称线程是轻量级的进程。顾名思义,线程也是进程,但是他是轻量级的,因为他很多属性都是共享于父进程(父线程)的。共享的属性可以通过clone函数的参数来控制。当我们新建一个线程的时候,系统里会新建一个进程。clone函数会把栈的位置和代码执行的位置(就是我们传进去的函数)告诉系统。系统会从我们定义的函数开始执行。大概如下。

c++ createtoolhelp32snapshot取进程路径_理解进程和线程相关推荐

  1. 如何理解进程与线程(超级简单,人人可以看懂)

    进程与线程 简单的比喻 打开微信,开了一个进程: 开了迅雷,开了一个进程. 在微信的这个进程里,传输文字开一个线程.传输语音开了一个线程.弹出对话框又开了一个线程. 所以运行某个软件,相当于开了一个进 ...

  2. 理解进程、线程以及上下文切换

    目录 1.线程和进程 2.进程间的通信方式 3.线程同步和互斥 4.上下文切换 5.什么是用户模式和内核模式? 1.线程和进程 (1)什么是进程? 程序由指令和数据组成,但这些指令要运行,数据要读写, ...

  3. c++ createtoolhelp32snapshot取进程路径_Linux进程间通信(上)之管道、消息队列实践

    1.进程间通信简述 进程间通信的几种方式:无名管道.有名管道.消息队列.共享内存.信号.信号量.套接字(socket). 进程间通信是不同进程直接进行的一些接触,这种接触有简单,有复杂.机制不同,复杂 ...

  4. python中加入绝对路径_理解Python中的绝对路径和相对路径

    本文介绍了Python中的绝对路劲和相对路径,分享给大家,也给自己留个笔记 1.绝对路径 os.path.abspath("文件名"): 显示的是一个文件的绝对路劲 eg: > ...

  5. 假设一个进程的页表如下所示_理解进程的新建和执行过程

    本文以linux0.11版本为基础,分析进程的内存布局,现代版本已经发生比较大的变化,都是很多原理都是类似的. 系统维护了一个全局的数据结构叫GDT( Global Descriptor Table) ...

  6. hash是线程安全的吗?怎么解决?_这次进程、线程、多线程和线程安全问题,一次性帮你全解决了...

    1. 什么是进程 一个软件,在操作系统中运行时,我们称其为进程. 进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元. 2. 什么是线程 在一个进程中,每个独立的功能都需要独立的去运行,这 ...

  7. 深入理解python.md_从python角度,理解进程,线程,协程.md-Go语言中文社区

    写在前面 文中有较多的内容为转载,尽量指出转载来源. 1 进程(process) 定义:进程是正在运行程序的实例. 如chrome 进程的三种状态: 就绪态 执行态 阻塞态 进程是基于计算机系统的异常 ...

  8. Python不用理解进程,线程实现多任务就是这么简单

    安装 pip3 install apscheduler -i https://pypi.doubanio.com/simple import time from apscheduler.schedul ...

  9. 从根上理解高性能、高并发(七):深入操作系统,一文读懂进程、线程、协程

    本文引用了"一文读懂什么是进程.线程.协程"一文的主要内容,感谢原作者的无私分享. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早 ...

最新文章

  1. 如何使用myFocus插件制作焦点图效果
  2. 怎样调用php的足球联赛接口,足球赛事查询接口调用文档
  3. Can not get new positive sample
  4. Java机器学习库ML之二Feature Selection(特征选择)
  5. avaya http文件服务器,avaya 通讯服务器配置
  6. ubuntu上安装python3.7教程_Day1: 如何在ubuntu 18.04中升级python 3.6到3.7
  7. 知识点:图说 Mysql 权限管理
  8. eclipseEE连接mysql_mysql-eclipseEE连接MySQL出现问题,哪位大神可以帮我看看*^__^*,非常感谢...
  9. 网易:层次遍历二叉树
  10. 函数递归/二分法/列表,字典生成式/三元表达式/匿名函数/内置函数
  11. node_modules/css-loader?{sourceMap:true}!./node_modules/vue-loader/lib/style-compiler?报错问提解决方案
  12. 对于os.walk()的认识--python遍历文件执行相应操作
  13. Android获取安装应用Apk包大小 缓存大小 getPackageSizeInfo StorageManager
  14. WPS通过宏工具批量修改图片尺寸
  15. Apache Doris 在京东广告报表查询场景下的应用
  16. yum rpm 命令
  17. 408 の 操作系统
  18. Day06-Python文件和数据格式化
  19. python数据分析-成图
  20. php 摘要算法,MD5摘要算法 - lvk618的个人空间 - OSCHINA - 中文开源技术交流社区

热门文章

  1. 比特币技术公司创始人:ICO是一场被骗子玩弄的网络泡沫
  2. [已解决]从微软合作伙伴资源和MSDN下载系统和软件Microsoft download Manager无效
  3. Sublime Text 3已卸载
  4. 关于request.getParameter(java.lang.String name)
  5. 在Linux中实现https访问站点
  6. RAC 中 ASM 实例名 与 节点的对应关系
  7. UISC-User Interface States Control ;Murphy 用户界面状态控制(Beta)
  8. 调用Xmlrpc接口
  9. Canvas入门03-绘制弧线和圆
  10. Django-Model操作数据库(增删改查、连表结构)