首页
学习
活动
专区
工具
TVP
发布

Linux】对进程PCB的理解&&查看进程信息的方法

进一步的说,正是对系统调用函数进行了封装,才使诸如C语言,C++等各种编程语言具有了跨平台性,我上层同样都是调用printf函数,在linux操作系统下我就去调用linux下的系统调用函数(封装在C标准库...所以,操作系统在加载可执行程序形成进程的同时,会创建一个描述该进程的结构体,称为PCB(process control block,进程控制块),linux操作系统下称之为task_struct。...此后,操作系统对于进程的管理,就转换成了对于PCB链表的增删查改。进一步的,我们可以了解到,进程就等于内核数据结构加可执行程序。...未来,所有对进程的操作和控制,都只和进程PCB有关,和进程的可执行程序没有关系。 PCB的大致属性信息 标示符: 描述本进程的唯一标示符,用来区别其他进程。...三、查看进程 ps axj:在Linux系统中用于查看关于进程的更多信息 其中pid就是进程对应的标识符,ppid就是进程的父进程对应的标识符 ps ajx | head -1 && ps ajx |

2000

操作系统进程的实现---中---05

下面先来看看sys_fork执行完后的代码 将当前线程PCB赋值给eax 判断PCB的状态是否为0,在linux 0.11中,0是就绪状态,而非0是阻塞状态 如果调用了相关sys_read和...难点分析 参考: Linux0.11内核–进程的调度schedule和switch_to解析 任务状态段TSSTSS描述符、局部描述符表LDT及LDT描述符 Linux 0.11用tss切换,但也可以...首先,新创建的内核级线程的内核栈使用的是上面申请的PCB内存中的一部分: 对于申请的空闲页来说,下面是PCB内存,上面是内核栈 tss.ss0指向的是内核数据段 ---- 对于用户栈来说...首先,将当前父进程的eip和cs放在tss中,说明子进程一会如果执行的话,会从父进程在中断进入内核态时,压入栈中的eip和cs处开始执行 然后eax设置为了0,这一点很重要 因为linux 0.11...hello程序了 ---- 小结 Linux 0.11的TSS方式: 对于TSS方式完成内核线程的切换而言,主要通过一条长跳转指令,通过将CPU状态拍到老进程TSS上,而将新进程TSS拍到当前

73160
您找到你想要的搜索结果了吗?
是的
没有找到

进程 进程表】页表通常存在PCB

通俗解释进程-科学家做蛋糕 科学家做蛋糕 然后女儿被蜜蜂蛰了 进程表–在内核 内存管理 经典 老式 管理方法: 基址寄存器(程序开始的地方) + 界限寄存器(程序长度) 空闲内存管理...每个页框有一个编号,即“页框号”(页框号=页帧号=内存块号=物理块号=物理页号),页框号从0开始 将进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分称为一个“页”或“页面”。...操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。也就是说,进程的页面与内存的页框有一一对应的关系。 各个页面不必连续存放,可以放到不相邻的各个页框中。...重要的数据结构——页表 为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表。...注:页表通常存在PCB中 一个进程对应一张页表 进程的每个页面对应一个页表项 每个页表项由“页号”和“块号”组成 页表记录进程页面和实际存放的内存块之间的映射关系

1.1K20

通过linux0.11源码理解进程的虚拟地址、线性地址、物理地址

在保护模式下,段寄存器保存的是段选择子,当进程被系统选中执行时,会把tss和ldt等信息加载到寄存器中,tss是保存进程上下文的,ldt是保存进程代码和数据段的首地址偏移以及权限等信息的。...long eflags,long esp,long ss) { struct task_struct *p; int i; struct file *f; // 申请一页存pcb...p) return -EAGAIN; // 挂载到全局pcb数组 task[nr] = p; // 复制当前进程的数据 *p = *current; /...#define switch_to(n) {\ struct {long a,b;} __tmp; \ // ecx是第n个进程对应的pcb首地址,判断切换的下一个进程是不是就是当前执行的进程,是就不需要切换了...最后根据tss中的cs和ip执行进程。这就是文章开头的过程。这就是linux0.11版本中进程地址管理的实现。下面是fork后的结构图。 ?

1.4K60

进程实现原理

init()函数中,便是用来调用linux的shell脚本程序,从而可以与用户进行交互。那么问题来了,fork是如何做到进程的创建的呢?系统如何让两个进程或多个进程并发的执行呢?...所以,通过上述总结,进程调度的实现原理就是在线程调度的基础上,加上了内核栈与用户栈的关联步骤,并且在内核态进行两个栈的切换,即PCB的切换。来分析代码咯!...该函数的主要作用是: 创建新的PCB,并且给该进程控制块分配新的物理内存 初始化PCB的内容,并且将父进程的内核栈信息全部复制给子进程的内核栈。 函数成功调用后,最终返回系统进程调用号。...代码分析: 将任务n的tss描述赋值给edx寄存器 将edx寄存器的低16位内容,传给临时变量tmp.b 执行长跳转ljmp,ljmp可分为两步: 将寄存器的内容写入当前进程tss当中去,并且把原...还记得fork出p->tss.eax为什么等于0了嘛,此时切换的子进程tss.eax=0,那就意味着swicth_to后,cpu寄存器的eax=0,那么等中断返回后,!fork()条件就变成了真!

1.3K40

linux0.11系统调用过程和fork源码解析

pcb地址赋值给eax movl _current,%eax // 判断当前进程状态,0是可执行,即判断当前进程是否可以继续执行 cmpl $0,state(%eax)...p) return -EAGAIN; // 挂载到全局pcb数组 task[nr] = p; // 复制当前进程的数据 *p = *current; /...,即if (__res >= 0) p->tss.eip = eip; p->tss.eflags = eflags; // 子进程从fork返回的是0,eax会赋值给__res...tss信息中的ldt索引首先从gdt找到进程ldt 结构体数据的首地址,然后根据当前段的属性,比如代码段, 则从cs中取得选择子,系统从ldt表中取得进程线性空间 的首地址、限长...和ldt地址到gdt,nr << 1即乘以2,这里算出的是第nr个进程距离第一个tss描述符地址的偏移, 单位是8个字节,即选择描述符大小 */ set_tss_desc

1.3K40

进程控制块PCB结构 task_struct 描述

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题...Linux 中处于等待状态的进程分为两种:可中断的等待状态和不可中断的等待状态。...在Linux 系统中,除了初始化进程init,其他进程都有一个父进程(Parent Process)。...进程Linux 内核建立起来后人为创建的一个进程,是所有进程的祖先进程)。...二、进程组织方式 1、内核栈 每个进程都有自己的内核栈,当进程从用户态进入内核态时,CPU 就自动地设置该进程的内核栈,也就是说,CPU 从任务状态段TSS 中装入内核栈指针esp,在/include

1.6K80

操作系统核心知识点整理--进程

Linux 中使用task_struct 结构体作为PCB的实现: Linux中所有进程都是通过一颗进程树来管理的,操作系统启动时会创建一个init进程,接下来所有进程都由该进程之间或者间接创建...---- 进程的切换 我们知道进程是对运行程序的抽象表示,主要负责记录当前程序运行状态,管理当前程序运行需要的资源,进程Linux中使用PCB表示,线程在Linux中使用TCB表示。...那我们考虑一下进程的切换需要做哪些事情: 切换PCB 保存当前CPU各种寄存器的状态,寄存器状态就当前当前程序运行的状态,核心的寄存器有: 程序计数器,栈顶指针等 Linux 0.11是只支持单核,进程实现的操作系统...,因此Linux 0.11中的进程切换采用的是TSS方式完成的: Linux 0.11只支持进程实现,所以Linux 0.11将进程直接叫做线程也是可以的。...使用TSS完成内核线程的切换的过程大致为: 通过一条长跳转指令,将当前CPU状态,拍到老进程TSS上,而将新进程TSS拍到当前CPU上,TSS中保存了当前CPU各种寄存器状态值,这个切换过程代价还是比较大的

54820

xv6(15) 进程一:数据结构

,这个数据结构就是 $PCB(Process\ Control\ Block)$,进程控制块,$Linux$ 里就是 $task_struct$ 结构体。...$PCB$ 中记录了进程运行需要的一切环境和信息,$xv6$ 中的 $PCB$ 定义如下: struct proc { uint sz; // Size of...本文讲述进程数据结构,就是来解释 $PCB$ 中这些属性字段什么意思,有什么用处。...切换进程时 $CPU$ 不会自动地将新任务的内核栈地址写到 $TSS$ 中,需要操作系统自己来做这件事情,这样新任务需要从用户态进入内核他的时候就从 $TSS$ 中获取内核栈地址,这在进程第二篇文章里面会具体展开...准确点来说应该是下图这样: 图中有鲜明显色的区域都是实际映射到了物理内存的区域,其中蓝色部分才是 $malloc\ free$ 作用的区域,在 $Linux$ 中程序在内存中的映像有个属性叫做 $break

17510

深入分析Linux内核源代码阅读笔记 第四章、第五章

task_struct 数据结构来描述,任务(Task)和进程(Process)是两个相同的术语,task_struct 其实就是通常所说的“进程控制块”即 PCB。...Linux 支持多处理机(SMP) Linux 也支持两种进程:普通进程和实时进程 task_struct 数据结构按其功能可做如下划分: 进程状态(State); 进程调度信息(Scheduling...这种行为被称为进程切换,任务切换,或上下文切换。 硬件支持: Intel i386 体系结构包括了一个特殊的段类型,叫任务状态段(TSS)。...每个任务包含有它自己最小长度为 104 字节的 TSS 段,在/include/ i386/processor.h 中定义为 tss_struct 结构;每个 TSS 有它自己 8 字节的任务段描述符。...在 Linux内核中,TSS 并不是属于某个进程的资源,而是全局性的公共资源,只更换 TSS 中的 SS0 和 ESP0,而不更换 TSS 本身,也就是根本不更换 TR 的内容。

78550

linux通过进程名杀死进程_linux关闭进程命令

笔记:根据一个进程的名字或启动此进程的命令(连续的一部分即可)杀死进程 一、使用单条命令 ps -ef | grep 进程名/启动进程的命令 | grep -v grep | awk ‘{print $2...}’ | xargs kill -9 执行结果: [1]-  已杀死               sleep 200 [2]+  已杀死               sleep 200 二、编写脚本 linux.../bin/bash # 脚本名:kill_process.sh # 脚本功能:强制杀死进程 方式kill -9     # 1通过ps查询进程的id     # 2使用kill -9 强制终止进程...函数功能:根据进程名杀死程序     参数:进程名     返回值:无 !...————————————————————— # 根据进程名查询包含进程名的进程 并排除grep查询进程和此脚本进程 ps -ef | grep “$pName” | grep -v grep | grep

15.5K20

Linux进程学习【进程状态】

本文将会带着大家认识的各种 进程 状态 ---- 正文 在谈 进程状态 之前,首先要回顾下之前的 进程 相关知识 OS管理的本质是先描述,再组织 OS并非直接管理 进程 ,而是管理 进程PCB(...task_struct) PCB 中有着进程的各种信息,包括:PID、PPID、进程状态等 我们可以通过函数 getpid() 获取当前进程的 PID 进程 间存在父子关系,可以通过 fork() 主动创建...阻塞挂起) 当 CPU 资源紧张时,将 进程 交换至 磁盘 中挂起,此时内存中只有 PCB 挂起可以看作一种特殊的阻塞状态 比如在我们生活中,一边走路一边玩手机很危险,所以此时我们会将玩手机这个 进程挂起...,即把手机揣进兜里,然后 专心执行走路这个 进程 进程状态 进程 有各种运行状态,方便OS进行管理,在 Windows 中,进程 状态是这样的 而在我们 Linux 中,新建、就绪、运行都可以看作...运行 R 这一个状态,所以比较清晰 而我们今天要学习的正是 Linux 中的 进程 状态 进程是何种状态,取决于此进程PCB在哪里排队 ️运行 R 首先来看看第一种状态 R 以我们以往的认知来说

17230

Linux进程学习【进程地址】

,这种行为称为 写时拷贝 刚开始,父子进程共同使用同一块空间 当子进程修改共享值后 ---- 进程地址空间 下面来好好谈谈 进程地址空间 (虚拟地址) ️虚拟地址 在早期程序中,是没有虚拟地址空间的...因为每个进程都有属于自己的空间,OS 在管理进程时,能够以统一的视角进行管理,效率很高 光有 虚拟地址空间 是不够的,还需要一套完整的 ‘‘翻译’’ 机制进行程序寻址,如 Linux 中的 页表 +...后续对这块进行写入操作时,会直接拒绝 对于这种机制感兴趣的同学可以点击下面这几篇文章查看详细内容: Linux的虚拟内存详解(MMU、页表结构) ARM体系架构——MMU 逻辑地址、页表、MMU等...️写时拷贝 Linux 中存在一个很有意思的机制:写时拷贝 这是一种 赌bo 行为,OS 此时就赌你不会对数据进行修改,这样就可以 使多个 进程 在访问同一个数据时,指向同一块空间,当发生改写行为时...(权限设置) 将 进程管理 和 内存管理 进行 解耦,方便 OS 进行更高效的管理 可以让进程以统一的视角看待自己的代码和数据 ---- 总结 以上就是本篇关于 Linux进程学习【进程地址】的全部内容了

13720

Linux从头学10:理解了这三个概念,才能彻底理解【任务管理】和【任务切换】

Linux 应用层,我们会严格的区分进程、线程,但是在系统的底层,这样的区分界限已经比较模糊了,用任务 task 来称呼更通用些。...TSS 也有起始地址和长度界限,也需要为它在 GDT 中创建一个段描述符。 与 LDT 类似,在处理器中也有一个寄存器 TR,用来指向当前正在执行的那个任务的 TSS。...当进行任务切换的时候: 首先,把处理器中的寄存器内容,存储到 TR 寄存器指向的 TSS 段中(即将被停止的任务); 然后,把新的任务的 TSS 段中的内容,复制到处理器的各寄存器中,并且把 TSS...看一下 Linux 2.6 内核代码中的结构体:struct task_struct{ ... },就知道 TCB 有多复杂了,有些书籍上也称之为 PCB(Process Control Block,进程控制块...当然,Linux 系统中的处理过程更为复杂,它把每一个任务按照优先级放在不同的等待队列中,然后利用哈系桶算法来查找任务。 ------ End ------

66450

linux0.11进程调度源码分析

switch_to(next); } #define switch_to(n) {\ struct {long a,b;} __tmp; \ // ecx是第n个进程对应的pcb首地址,判断切换的下一个进程是不是就是当前执行的进程...,是就不需要切换了 __asm__("cmpl %%ecx,_current\n\t" \ "je 1f\n\t" \ // 把第n个进程tss选择子复制到__tmp.b "movw..." \ // 更新current变量,使current变量执行ecx,ecx指向task[n] "xchgl %%ecx,_current\n\t" \ // ljmp 跟一个tss...\ "clts\n" \ "1:" \ ::"m" (*&__tmp.a),"m" (*&__tmp.b), \ "d" (_TSS(n)),"c" ((long) task...如果时间用完则直接重新调度,否则进程可以继续执行。进程调度的时候,系统会选择时间最长的进程,防止有的进程得不到执行,当所有进程的时间片都消耗完毕,则重新计算时间。

1.7K20

Linux进程调度_linux进程的查看和调度

对于处理器消耗型的进程,调度策略往往是降低他们的执行频率,延长运行时间。 Linux 系统为了提升响应的速度,倾向于优先调度 I/O 消耗型。...一、普通进程Linux 中普通进程依赖称之为 nice 值 的东东来进行进程的优先级描述。nice 值的范围是 [-20, 19]。...—— 小结 实时进程优先级:value 越高,优先级越大 普通进程优先级:nice值越高,普通进程的优先级越小 任何实时进程的优先级 > 普通进程 Linux 调度算法 ---- Linux 中有一个总的调度结构...Linux 调度时机 ---- 一、进程切换 从进程的角度看,CPU是共享资源,由所有的进程按特定的策略轮番使用。...也可以用 pidstat -w 命令查看进程切换的每秒统计值: pidstat -w 1 Linux 3.10.0-229.14.1.el7.x86_64 (bj71s060) 02/01/2018

20.2K10

Linux】静态进程和动态进程

引言 在Linux环境中,进程的加载方式涉及到静态进程和动态进程两个概念。这两种方式都有各自的优势和劣势,而正确选择加载方式对于应用程序的性能和管理至关重要。...本文将深入探讨静态进程和动态进程的特点、优劣势,并为你提供在不同场景下的选择建议。 1....静态进程适用于不经常更新和部署的应用,以及对独立性和部署简便性要求较高的环境。 2. 动态进程 动态进程是一种加载方式,它在程序运行时依赖外部的共享库(动态链接库)。...相对于静态进程,动态进程的可执行文件较小,因为它只包含程序自身的代码,而共享库的加载则在程序启动时由动态链接器完成。...无论选择静态进程还是动态进程,了解它们的特点以及在不同情况下的适用性,可以帮助开发者更好地优化程序的性能和管理。 结论 静态进程和动态进程各有优劣,选择合适的加载方式取决于项目的具体需求。

9810
领券