Linux高级 2019-5-4上午

1.进程基础

1.1 PCB进程控制块

  • 1.在 Linux 下,每一个进程都有一个 PCB ,其是一个描述了进程所有详细信息的结构体,比如 pid 、 栈信息 等;

1.2 程序是静态表现(占用物理磁盘空间);进程是该程序运行后的动态表现(占用物理内存空间,具有CPU使用权)。

1.3 进程的简单形态

  • 1.从高地址到低地址分别是: PCB(4G~3G) 、 环境变量/命令行参数(从3G开始) 、 栈 、 静态库/共享库 、 堆 、 BSS 、 DATA 、 TEXT(代码段) ;
  • 2.4G~3G 称为 Kernel 层,用户不可使用; 3G~1G 称为 User 层;
  • 3.上述的形态是一个进程的虚拟内存空间,每一个进程都会被分配 0~4G 的虚拟内存空间,物理内存有限,根据实际硬件决定大小;
  • 4.上述的 BBS DATA 中保存的是已初始化和未初始化的全局变量/静态变量;

1.4 虚拟内存与物理内存的关系

  • 1.一般来说,物理内存可以映射到虚拟内存;
  • 2.每一个进程都需要找不同的物理内存作映射;

1.5 虚拟内存是由虚拟内存映射表进行管理的

  • 虚拟内存映射表中记录了庞大繁杂的映射关系,是由内存管理器进行管理的。

1.6 所有进程的内核空间共享同一块物理内存,用户空间独立。

1.7 虚拟内存的拟定与分配

  • 1.内存的基本单位: 页(page), 1页=4096Bytes(4k);
  • 2.系统中有一种方式称为内存间接寻址,一共三级间接寻址: 1024 x 1024 x 1024 ,三级间接寻址只能寻 G级 单位;

1.8 操作系统的位数

  • 1.x86 : 32位操作系统,最大处理单位 4字节 ;
  • 2.x64 : 64位操作系统,最大处理单位 8字节 ;
  • 3.64位操作系统能够开启 四级间接寻址 ,最高能够寻 T级 单位;

1.9 内存的权限

  • 1.PORT_WRITE :只写;
  • 2.PORT_READ :只读;
  • 3.PORT_EXEC :执行;
  • 4.PORT_NONE :无;

1.10 判断下列哪种方式更好

  • 现有两种申请空间的方式: 1)malloc(3192) malloc(5000);2)malloc(8192);
  • 分析:第一种需要进行两次申请,由于申请需要与CPU进行交互,但是与CPU交互越少,则越好,因此我们认为直接申请两页的方式比分开申请两页的方式好。

1.11 进程的状态

  • 1.就绪态:等待分配资源与调度;能够向 运行态 终止态 转换;但是不能直接转换到 挂起态;
  • 2.运行态:使用CPU与内存资源;能够向 就绪态 挂起态 终止态;
  • 3.挂起/睡眠态:主动挂机阻塞;能够向 就绪态 终止态 转换,但是不能直接转到 运行态;
  • 4.终止态:任意形态都可转换到终止态,但终止态没有办法向其他状态转换;

1.12 分时复用原则

  • 1.为了让有限的系统核心资源CPU被合理利用,使得少量的资源应用最大化,系统通过分时复用原则管理进程对CPU的使用权;
  • 2.分时复用就是指将CPU的使用权分配切片给若干个进程,一般情况下一个时间片就能够满足当前进程的所有运行需求;
  • 3.分时复用除了时间管理之外,还有个很重要的功能:存储与恢复,用来保存进程的运行状态;
  • 4.一个 Inter单核CPU 具有 运算器 、 控制器 、 寄存器 、 译码器 等,当一个时间片耗尽时,需要保存处理器现场,将当前处理器状态保存到 PCB 的内核栈中,当再来一个时间片给当前进程使用时,再将处理器状态恢复;

1.13 系统调用

  • 1.系统调用是指用户在调用了某个用户层API之后,用户层API自动调用系统层API,系统层API再调用驱动层API,进而完成用户层意图完成的功能的事情;
  • 2.在上述过程中,系统层API及驱动层API是用户无法调用的,但用户可以通过用户层API的调用来让系统调用下层的API来实现功能;
  • 3.系统调用的实质:用户层和内核层的相互切换;

1.14 umask掩码

  • 这个掩码是Linux下创建一个新文件的权限的设置,默认是 0002 ,默认创建的新文件的权限是 0666 ,0666 与 0002 进行按位异或,即可得到新文件的权限。

1.15 env 查看环境变量

  • 1.在终端中输入 env 并按下回车键,我们能够看到当前系统中的环境变量;

1.16 ulimut 命令

  • 用来限制进程对资源的使用情况的,它支持各种类型的限制;

1.17 自己完成 env 命令

  • 1.有个外部变量 environ ,这个变量是二级char指针类型,其中装的就是各个环境变量的字符串;
#include <stdio.h>

int main()
{
	extern char** environ;

	for(int i=0; environ[i]!=NULL; i++)
		printf("%s\n", environ[i]);

	return 0;
}

1.18 与环境变量相关的函数

  • 1.getenv,用来获得某个环境变量的字符串;参数为要查找的环境变量的变量名,是一个char *类型的;
#include <stdio.h>
#include <stdlib.h>

int main()
{
	printf("PWD = %s\n", getenv("PWD"));

	return 0;
}
  • 2.修改环境变量函数: setenv ;第一个参数为要修改的环境变量,char *类型;第二个参数是要修改的值,char *类型;第三个参数是是否要覆盖之前变量的标记,非零则覆盖之前的变量,为0则不覆盖之前的变量(修改环境变量失败);
#include <stdio.h>
#include <stdlib.h>

int main()
{
	printf("PWD before = %s\n", getenv("PWD"));
	setenv("PWD", "adsfasdf", 0);
	printf("PWD after 0 = %s\n", getenv("PWD"));
	setenv("PWD", "adsfasdf", 1);
	printf("PWD after 1 = %s\n", getenv("PWD"));
	
	return 0;
}
  • 3.删除环境变量函数: unsetenv ;参数是要删除的环境变量的名字,char *类型;
#include <stdio.h>
#include <stdlib.h>

int main()
{
	printf("PWD before = %s\n", unsetenv("PWD"));
	unsetenv("PWD");
	printf("PWD after = %s\n", unsetenv("PWD"));

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值