TTTTTTZZZZZZ(系统编程)2

所谓的进程就是,当我们双击一个可执行程序的时候,就会将这个可执程序从磁盘中加载到内存中,然后操作系统用就会建立一个结构体,来 描述这个进程,从而管理这个进程。(程序运行起来就会形成进程)
总结起来就是一句话,操作系统对于我们的进程就是先描述再组织的,组织用的就是数据结构中的双向链表来进行组织的。创建一个进程就是在那个链表上增加一个test_struct结构体,一个进程退出也就是从链表上将某个结点销毁掉。

根据进程名来找进程,或者根据进程ID来找进程都是ps aux | grep 进程名,或者进程ID,进程名就是可执行文件的名字,就是你运行起来

创建子进程失败的原因有两个,一个是内存空间不足,另一个是不能创建了,因为每一个父进程能创建多少子进程都是有限制的。

父进程先于子进程退出,还在运行中的子进程就是孤儿进程,孤儿进程就会被1号进程收养
子进程先于父进程退出,父进程还未退出执行的子进程就是僵尸进程,短时间内过多的僵尸进程为被释放就会造成资源泄露

孤儿进程不是一种进程的状态,不是S,T,之类的,而是一种代号
1号进程在很多系统上就是init进程,也就是刚一开机就启动的进程
pcb是对进程的通常
tack_struct:只针对Linux因为在别的操作系统上可能就不是这个叫法了。

task_struct:
1.pid
2.内存指针:标记程序在内存中的位置,方便读取
3.进程状态
4.进程优先级:是一个数字表示进程被调度的顺序 用top命令来查看
5.上下文:因为每一个cpu都会并发式的去执行好几个进程,然而程序在执行的时候,会将需要计算的数据,加载到
   cpu中,并切cpu还是在多个进程之间来回调度的,所以很容易正在执行某一个指令的时候,就要切换到其他进程
   了,此时就要把当前进程执行到的位置,以及数据,以及利用PC指针指向的下一条要执行的位置都保存在内存
   中,以方便下次切换回来的时候再去接着执行。
6.记账信息:每个进程已经在cpu上执行力多久的统计信息

在这里插入图片描述
在Linux下PR所代表的数字越小则就说明优先级越高

最终的优先级 = PR + NI(优先级的修正值)
可以通过指令去修改进程的NI值从而调整进程的优先级,但是具体的调度还是得看调度器,就算修改了,但是从用户角度看不一定会有宏观的改变。

环境变量:

环境变量是一个键值对结构,键:变量名,值,变量内容

env查看到系统所所有的环境变量

echo $ + 环境变量名,查看某个环境变量的内容

用PATH举例:
在命令行可以通过export +PATH=$PATH:你想要添加的路径,那么就会把你所添加的路径加入到环境变量中
去,这样当你键入可执行文件的名字的时候,就会直接去环境变量里面的所有路径下去查找,然后执行。不用像之前
需要 ./可执行文件名,的方式去执行可执行程序,可以直接,键入可执行文件名去运行可执行程序,直接在命令行修
改环境变量,在关机之后,或者切换终端之后可能就会失效,要想永久的修改环境变量,就需要在环境变量的配置文
件中去修改(~/.bashrc),加上export +PATH=$PATH:你想要添加的路径。
PATH:shell中敲下的指令,去那些目录中去查找对应的可执行程序,对于PATH我们一般都只是增加而不会修改,
增加的方式是这样export  PATH=$PATH:你想要添加的路径
替换的方式是这样export  PATH=你想要添加的路径,
int main(int argc char* argv[],char* env[])
argc指的是用户在命令行输入的字符串个数,空格隔开
argv指的就是一个字符串指针数组,一个数组中的所有的变量都是字符串指针
env指的就是当前的环境变量都有哪些,env数组中也有一个结束标记NULL,所以可以使用
for(int i = 0;i !=NULL;++i)
{
	printf("%s",env[i]);  //来打印环境变量
}

假如你创建了某个变量,但是你并没有使用这个变量,在不同的编译器中,有的编译器会认为这是一个警告,此时就可以使用 (void) 变量名;这种方式来消除警告,类似于告诉编译器,我就不用,你别管我

栈空间在Linux下大概是默认大概是8M左右,但是是可以修改的ulimit -a可以查看一些系统的默认数据大小,ulimit -s 数字,就可以修改栈的大小
程序地址空间:
如果是大对象,那么就必须在堆上分配。
如果是小对象,并且需要频繁创建和销毁,推荐在栈上。因为在栈上分配内存更高效,只需要修改栈指针就可以了。堆上申请 内存就很复杂了。(malloc底层很复杂)

怎样对代码进行性能优化:要先对代码进行性能测试,看到底是哪里比较差,然后再对症下药,进行优化。对写出的
代码进行分模块,然后在每个模块开始之前进行计时,结束后再计时,做差结果就是这个部分的运行时间,然后再分
别从各个部分找到性能瓶颈。再优化

进程虚拟内存地址空间:

在这里插入图片描述

其实弄这个虚拟内存实际上是降低了效率,但是为啥还要这么做呢?是因为,为了让各个进程之间相互独立,不要影响其他进程,在页表上找不到映射的部分,那么就不会真的在物理内存中修改,万一直接修改到其他的进程的数据就出错了。所以才有了虚拟地址空间。应该还可以充分利用系统资源,让数据零零散散的分布在物理内存中,然后只要在下虚拟地址中是连续的,就可以通过页表去找到数据,给用户的感觉就是每个进程自己内部的变量的空间是连续的。

页表的数据结构就是哈希表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值