Linux系统编程

进程和程序

进程是操作系统分配资源的最小单位
线程是CPU调度的最小单位
协程
一个程序可以对应多个进程

readelf(elf文件格式)
readelf -h test.o 参看elf文件信息
objdump

从代码到程序 g++

在这里插入图片描述

从程序到进程 ./a.out

第一步 操作系统加载程序到内存
第二步 操作系统为进程分配资源
第三步 创建PCB进程控制块 来了解你这个进程的状态
在这里插入图片描述

进程状态

在这里插入图片描述
创建
就绪 创建完成就处于就绪态,a.out
执行
阻塞 磁盘、文件的读写
IO阻塞模式 IO操作 内核去处理 内核读写完成之后
阻塞态只能变为就绪态,而不能直接执行
终止

如何查看进程

windows下 tasklist
linux ps
ps -ef
ps -ef|head -5 看前5行
ps -el | grep a.out 过滤出a.out的进程
ps aux | grep a.out 另一种显示风格

进程状态的标识
在这里插入图片描述

如何创建和杀死进程

执行a.out 创建进程
杀死进程
终端 ctrl+c
命令
kill -l 列出所有kill参数
kill -9 pid 杀死信号 kill -9 21290

并行和并发

并行 多进程或者多线程 多核多cpu
并发 多进程或者多线程 单核

单进程的情况

并发的情况
时间片段 ns 时间中断(硬件来实现) 时间片的切换去执行不同的任务

并行的情况
多核每一个cpu操作自己的进程

单进程一次只处理一个进程
并发一个cpu同时处理了很多进程
并行一个cpu操作一个进程

虚拟地址空间

为什么要有虚拟地址的存在?
早期内存
进程地址空间不隔离:没有用户和进程隔离,一个进程可以改另一个进程里的东西
内存的使用效率较低:内存不够用,程序是一段一段执行,把暂时不跑的段放到磁盘,释放空间给别的运行。内存和磁盘来回切换,效率特别低。
程序运行的地址不确定:分配是随机的

没有什么是加一层解决不了的问题。

为了解决上述问题,增加一个中间层(MMU内存管理单元),用间接的地址访问方法访问物理内存。按这种方法,程序访问的内存地址不再是实际的物理地址,而是一个虚拟地址。然后由操作系统将这个虚拟地址映射到适当的物理内存地址上。只要操作系统处理好虚拟地址到物理地址的映射,就可以保证不同的程序最终访问的内存地址位于不同的区域,彼此没有重叠,就可以达到内存地址空间隔离的效果。
在这里插入图片描述

当创建一个进程时,操作系统就会为该进程分配一个4GB大小的虚拟进程地址空间。与虚拟地址空间相对的,还有一个物理地址空间,这个地址空间对应的时真实的物理内存。如果你的计算机安装了512M大小的内存,那么这个物理地址空间表示的的范围是0x00000000-0x1FFFFFFF。当操作系统做虚拟地址到物理地址映射时,只能映射到这一范围,操作系统也会只映射到这一范围。**当进程创建时,每一个程序都会有自己的4GB虚拟地址空间。**要注意的是这个4GB的地址空间时“虚拟”的,并不是真实存在的,而且每个进程只能访问自己虚拟地址空间中的数据。无法访问别的进程中的数据,通过这种方法实现了进程间的地址隔离
在这里插入图片描述
在这里插入图片描述

更多

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值