c++ createtoolhelp32snapshot取进程路径_理解进程和线程
进程和线程是操作系统里很重要的概念,但是所有的东西都会落实到代码。看起来很复杂的进程线程,其实在操作系统的代码里。也只是一些数据结构和算法。只不过他比一般的数据结构和算法可能复杂点。但是学习方法还是一样的,就是深入源码,一探究竟。
进程在操作系统里,是用一个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.进程间的通信方式 3.线程同步和互斥 4.上下文切换 5.什么是用户模式和内核模式? 1.线程和进程 (1)什么是进程? 程序由指令和数据组成,但这些指令要运行,数据要读写, ...
- c++ createtoolhelp32snapshot取进程路径_Linux进程间通信(上)之管道、消息队列实践
1.进程间通信简述 进程间通信的几种方式:无名管道.有名管道.消息队列.共享内存.信号.信号量.套接字(socket). 进程间通信是不同进程直接进行的一些接触,这种接触有简单,有复杂.机制不同,复杂 ...
- python中加入绝对路径_理解Python中的绝对路径和相对路径
本文介绍了Python中的绝对路劲和相对路径,分享给大家,也给自己留个笔记 1.绝对路径 os.path.abspath("文件名"): 显示的是一个文件的绝对路劲 eg: > ...
- 假设一个进程的页表如下所示_理解进程的新建和执行过程
本文以linux0.11版本为基础,分析进程的内存布局,现代版本已经发生比较大的变化,都是很多原理都是类似的. 系统维护了一个全局的数据结构叫GDT( Global Descriptor Table) ...
- hash是线程安全的吗?怎么解决?_这次进程、线程、多线程和线程安全问题,一次性帮你全解决了...
1. 什么是进程 一个软件,在操作系统中运行时,我们称其为进程. 进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元. 2. 什么是线程 在一个进程中,每个独立的功能都需要独立的去运行,这 ...
- 深入理解python.md_从python角度,理解进程,线程,协程.md-Go语言中文社区
写在前面 文中有较多的内容为转载,尽量指出转载来源. 1 进程(process) 定义:进程是正在运行程序的实例. 如chrome 进程的三种状态: 就绪态 执行态 阻塞态 进程是基于计算机系统的异常 ...
- Python不用理解进程,线程实现多任务就是这么简单
安装 pip3 install apscheduler -i https://pypi.doubanio.com/simple import time from apscheduler.schedul ...
- 从根上理解高性能、高并发(七):深入操作系统,一文读懂进程、线程、协程
本文引用了"一文读懂什么是进程.线程.协程"一文的主要内容,感谢原作者的无私分享. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早 ...
最新文章
- 如何使用myFocus插件制作焦点图效果
- 怎样调用php的足球联赛接口,足球赛事查询接口调用文档
- Can not get new positive sample
- Java机器学习库ML之二Feature Selection(特征选择)
- avaya http文件服务器,avaya 通讯服务器配置
- ubuntu上安装python3.7教程_Day1: 如何在ubuntu 18.04中升级python 3.6到3.7
- 知识点:图说 Mysql 权限管理
- eclipseEE连接mysql_mysql-eclipseEE连接MySQL出现问题,哪位大神可以帮我看看*^__^*,非常感谢...
- 网易:层次遍历二叉树
- 函数递归/二分法/列表,字典生成式/三元表达式/匿名函数/内置函数
- node_modules/css-loader?{sourceMap:true}!./node_modules/vue-loader/lib/style-compiler?报错问提解决方案
- 对于os.walk()的认识--python遍历文件执行相应操作
- Android获取安装应用Apk包大小 缓存大小 getPackageSizeInfo StorageManager
- WPS通过宏工具批量修改图片尺寸
- Apache Doris 在京东广告报表查询场景下的应用
- yum rpm 命令
- 408 の 操作系统
- Day06-Python文件和数据格式化
- python数据分析-成图
- php 摘要算法,MD5摘要算法 - lvk618的个人空间 - OSCHINA - 中文开源技术交流社区
热门文章
- 比特币技术公司创始人:ICO是一场被骗子玩弄的网络泡沫
- [已解决]从微软合作伙伴资源和MSDN下载系统和软件Microsoft download Manager无效
- Sublime Text 3已卸载
- 关于request.getParameter(java.lang.String name)
- 在Linux中实现https访问站点
- RAC 中 ASM 实例名 与 节点的对应关系
- UISC-User Interface States Control ;Murphy 用户界面状态控制(Beta)
- 调用Xmlrpc接口
- Canvas入门03-绘制弧线和圆
- Django-Model操作数据库(增删改查、连表结构)