自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 问答 (1)
  • 收藏
  • 关注

原创 c++内存分布与Linux进程内存分布的映射关系

Linux用户进程的内存布局c语言的内存分布Linux内核是C程序编写的,可以看出用户进程的内存分布与c基本一致,进程多了一个内存映射区,另外text段里实际包含了常量数据段的内容(.rodata, 包括字符常量和#define宏定义的常量)。内存映射区包含文件映射和匿名内存映射,常见的包括共享库就是映射到这片地址空间。c++的内存分布在c++中,内存分成5个区,分别是栈、堆,自由存储区,全局静态存储区,代码段。这里与c的区别包括:不再区分未初始化和已初始化的全局数据,自由存储区

2021-03-13 11:42:11 525

原创 ARM 常用寄存器

一.数据寄存器   EAX---累加寄存器,存储算数运算的数据   EBX---基址寄存器, 作为存储器指针使用   ECX---计数寄存器,循环或字符串操作时,控制循环计数   EDX---数据寄存器,存储算数运算的默认操作数二. 变址寄存器  ESI,EDI---存放存储单元在段内的偏移三.堆栈指针寄存器  EBP---堆栈栈底寄存器  ESP---堆栈指针

2017-11-07 11:34:15 979

原创 连续内存管理---伙伴系统与slab算法

伙伴系统是页框管理器的核心算法,目标是解决(页)外碎片问题。思想为为了分配连续的页框,管理一些2^x个连续页框的内存区,如果有多个同样大小的内存区,那么应该尽量合并成更大的内存区。slab算法是为了分配小内存时避免内碎片问题的算法。其思想是按对象申请和释放内存。一个slab高速缓存管理一堆slab对象,一个slab对象通常包含跨越一个或多个页框的同种对象。对象析构时内存并不释放回伙伴系

2017-09-06 09:25:43 511

原创 cpu负载均衡

负载均衡基于调度域进行,系统中所有cpu属于一个最顶层的调度域,其中的某些cpu子集属于较底层的调度域,单独的一个cpu属于最底层的调度域(支持超线程时)。本地cpu定期扫描所有调度域,当发现负载最严重的cpu不是自己时,尝试从最繁忙cpu迁移一些进程过来,但是只有当下列条件满足时,迁移才可能成功:1.要迁移的进程没有正在执行2.要迁移的进程允许在本地cpu运行。3.本地cpu空闲

2017-09-01 20:48:33 1868

原创 进程调度-进程切换前后的动作

schedule函数首先检查本地运行队列是否为空,运行队列为空,执行idle进程。运行队列不为空,检查可运行进行中是否存在活动进程,如果不存在,交换活动进程和过期进程。假定已经选中了一个活动进程列表,从最高优先级的活动进程队列中选择第一个执行。

2017-08-30 21:31:55 382

原创 一些关于进程调度的小点总结

调度进程的类型划分:基于FIFO原则的实时进程,基于时间片轮转的实时进程,普通的分时进程。实时进程的优先级是固定的,因一下原因发生进程调度:被更高优先级的实时进程抢占,主动让出时间片,进程阻塞或睡眠,基于时间片轮转的实时进程时间片到期。进程创建时,通过将父进程的剩余时间片减半分给子进程,避免通过不断创建子进程获取无限的cpu执行时间,子进程如果很快执行结束未用完这些时间片,

2017-08-29 22:43:02 318

原创 普通进程的调度策略

需要从两个维度观察非实时进程的调度策略:1.进程的静态优先级,静态优先级决定进程的基本时间片,一个高优先级进程一旦进入running状态,可以获得更长的执行时间片。2.进程的动态优先级,对平均睡眠时间长的进程进行奖励,对高发的进程进行惩罚。交互式进程由于睡眠时间长而容易获得奖励。系统通过公式bonus-5  >= 静态优先级/4-28来识别交互式进程。可以理解为同等优先级下进程

2017-08-28 22:40:02 362

原创 进程抢占

进程抢占可能发生在两种情况下:1.更高优先级的任务进入TASK_RUNNING状态 2.当前进程的时间片到期。无论进程当前运行在内核态还是用户态,都可以发生抢占,被抢占的进程仍然运行在TASK_RUNNING状态。

2017-08-28 09:21:38 1616

原创 内核同步原语

最好的内核同步手段是不需要同步。对于SMP系统,如果数据结构可以设计为每cpu变量,将最有效的避免cpu间的同步。原子锁要求一些寄存器读写动作采用automic_t型变量,并在单条指令内完成,并对该指令加automic锁,提供了对单一寄存器的访问保护。自旋锁用在保护SMP下各cpu间的同步,等待锁的进程会空转直到获取到锁,对系统效率会造成一定的影响。读写锁可以保护一段临界区的数据,

2017-08-25 22:08:30 699

原创 内核抢占

内核可抢占是指系统在内核态运行时允许进程发生切换。内核抢占最大的问题在于对内核中临界资源的保护。对于单cpu而言,执行中断服务程序,软终端或tasklet时,显示的禁止了内核抢占。如果不考虑多中断服务例程访问临界资源(中断的嵌套执行)的可能性,不需要特别考虑内核同步问题。特别是中断服务程序是以禁止IRQ方式运行的,同一类型的tasklet必须串行的执行。对于SMP系统,要复杂一些,同一

2017-08-23 09:08:57 226

原创 中断下半部

硬中断处理函数通常需要在关中断的情况下执行,因此将一些非紧急可延迟又比较耗时的处理从中断处理函数中分离出来,可以提高cpu对硬件中断的 处理效率,这些可延迟函数就是中断的下半部。linux对于中断下半部有几种实现方式:软中断,tasklet和工作队列。软中断和tasklet都是在中断上下文中下执行的,不能被进程中断,但是可以被硬中断处理函数中断。tasklet实际是在软中断基础上执行的,区

2017-08-21 21:39:39 255

转载 工作队列

http://www.cnblogs.com/wwang/archive/2010/10/27/1862202.html

2017-08-21 20:21:13 157

原创 中断门,异常门和任务门

intel将IDT表项分为中断门、异常门和任务门三种类型。linux进一步将其细分为下列类型:1. 中断门用户态不能访问的intel中断门,所有的中断服务程序由中断门激活,DPL=0;2.系统门用户态可以访问的intel陷阱门,包括4号(into指令),5号(bound指令)和0x80(int 0x80),DPL=33.系统中断门用户态可以访问的intel中断门,包括

2017-08-19 08:11:27 784

原创 异常分类

处理器探测异常依据发生异常时eip保存的值而分为3种类型。1. 故障:故障是一种可恢复的异常,故障发生时eip保存的是引起异常的这条指令,当异常处理程序完成时,cpu从该指令不失连贯性的继续执行。常见的故障有缺页异常。2. 陷阱: 保存在eip中的是一个随后要执行的指令地址。异常处理程序执行完,cpu从下一条指令开始不失连贯性的执行。常见的陷阱有调试断点、单步执行和系统调用等。3.异常

2017-08-17 23:11:03 586

原创 同步中断与异步中断

中断是指强制改变了cpu指令执行顺序的一些事件,所谓改变指令执行顺序,首先可以理解为没有到进程调度点就暂停了下一条指令的执行转而执行中断的指令,其次可以理解为同一进程内原本相邻的两条指令间穿插了其它指令的执行。同步中断是由cpu内部的电信号产生的中断,其特点为当前执行的指令结束后才转而产生中断,由于有cpu主动产生,其执行点必然是可控的。异步中断是由cpu的外设产生的电信号引起的中断,

2017-08-16 22:44:09 5753

原创 中断发生如何执行到中断服务程序

首先,PIC(可编程中断控制器)将外设的中断信号映射为一个中断向量,另一方反面将信号发送给cpu的intr管脚。cpu从PIC读取中断向量值i,到IDT(中断描述符表)表的第i项找到中断服务程序的段基址和偏移。执行中断服务程序前,首先进行当前进程寄存器的压栈处理,软后向cs和eip装载中断服务程序的基址和偏移,执行中断服务程序。IDT表是可编辑的,一部分由内核初始化使用,一部分留给用户

2017-08-14 22:39:28 5550

原创 进程撤销

进程撤销要断开与占用资源的关系,如果进程是占用资源的最后一个进程,那么退出处理释放资源相关的内存。撤销进程是领头进程还要从相关的pid散列表中将自己删除。父进程退出,其子进程交给父进程线程组的其它进程,如果父进程是线程组最后一个子进程,子进程交给init进程接管,变成孤儿进程。子进程先与于进程退出的情况,如果父进程有调用wait函数,wait函数负责回收进程描述符;如果没有,子进程变成

2017-08-13 17:24:45 2669

原创 祖先进程0进程和1进程

每当cpu上电,bios或bootloder之类的引导程序会现在一个cpu上创建一个0进程,该进程进而在其它cpu复制一个子进程,并把这些子进程的pid设置为0.0进程是通过全局静态的数据结构来初始化的,特别是主内核页全局目录放在swapper_pg_dir中。0进程,进一步调用init函数创建子进程1号进程。0进程也叫idle进程,实际上只有当系统中没有其它进程处于running态时,才

2017-08-13 15:57:23 1310

原创 进程创建copy_process

为子进程分配进程描述符,thread_info结构和内核栈。进程描述符基本是复制父进程的,除了一些特殊的字段意外,特别是esp要纸箱子进程内核栈的基址,eip要指向ret_from_fork的地址。对于非领头线程,要将grpleader和tgid指向父进程。如果是领头进程,要将自己加入到TGID,PGID这些PID散列表中。fork函数的返回值,对于子进程自己是0,对于父进程是子进

2017-08-13 13:36:24 287

原创 子进程创建do_fork

do_fork首先子进程分配进程id,创建进程描述符。如果父子进程在同一cpu上,把子进程插入到父进程运行队列的前面,子进程先执行这样避免写时复制进行不必要的页面拷贝。如果父子进程在不同的cpu上,子进程插入父进程运行队列的队尾。如果clone_flag标志中设置了clone_vfork,则父进程加入阻塞队列,直到子进程运行结束并释放地址空间。

2017-08-13 12:04:25 235

原创 进程硬件上下文切换

进程硬件上下文切换,即保存当前进程运行的 cpu寄存器,载入下一个要运行的进程的cpu寄存器配置。cs和eip等大部分cpu寄存器被存入进程描述符的thread字段,还有一些寄存器被保留的内核堆栈之中。linux内核通过软件的方式执行上下文切换,以执行必要的载入寄存器值得合法性检查

2017-08-12 17:46:50 872

原创 等待队列

等待资源的进程把自己加入到资源的等待队列,然后执行schedule执行其它进程。内核扫描等待队列,调用队列中每个wait_queye_t元素的 唤醒函数,如果进程被成功唤醒,将自己从等待队列删除。如果等待队列中有互斥进程和飞互斥进程,非互斥进程放在队列的开始,条件满足时被全部唤醒,互斥进程放在非互斥进程的后面,满足条件的第一个互斥进程被唤醒,其余互斥进程继续等待。

2017-08-12 11:13:11 222

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除