linux高级编程-1.Linux内存管理**

1.Linux内存管理

进程内存空间管理
任意一个程序内存空间分为四个基本部分:
1>.代码区 常量,函数
2>.全局区栈区 :全局变量,static静态变量
3>.堆 指针,进程中会被动态分配的内存段
4>.局部栈 变量
上面所展示的不是物理地址,而是为逻辑内存分布,逻辑地址仅仅是编号,编号使用int4字节整数表示。逻辑地址与物理地址关联才有意义–这个过程就是内存映射。
进程对内存具体是如何进行分配和管理的。
逻辑地址-通过段机制->线性地址-通过页机制->物理地址。(但是我们要知道Linux系统虽然保留了段机制,但是将所有程序的段地址都定死为0-4G,所以虽然逻辑地址和线性地址是两种不同的地址空间,但在Linux中逻辑地址就等于线性地址,它们的值是一样的)。
Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。该空间是块大小为4G的线性虚拟空间,用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存),而且更重要的是,用户程序可使用比实际物理内存更大的地址空间(具体的原因请看硬件基础部分)。
段错误:无效访问,地址没有映射到物理地址。
合法访问:例如malloc分配空间之外的空间是非法访问。
物理内存管理(页管理)
Linux内核管理物理内存是通过分页机制实现的,它将整个内存划分成无数个4k(在i386体系结构中)大小的页,从而分配和回收内存的基本单位便是内存页了。
内核中分配空闲页面的基本函数是get_free_page/get_free_pages,它们或是分配单页或是分配指定的页面(2、4、8…512页)。

注意:get_free_page是在内核中分配内存,不同于malloc在用户空间中分配,malloc利用堆动态分配,实际上是调用brk()系统调用,该调用的作用是扩大或缩小进程堆空间(它会修改进程的brk域)。如果现有的内存区域不够容纳堆空间,则会以页面大小的倍数为单位,扩张或收缩对应的内存区域,但brk值并非以页面大小为倍数修改,而是按实际请求修改。因此Malloc在用户空间分配内存可以以字节为单位分配,但内核在内部仍然会是以页为单位分配的。

另外,需要提及的是,物理页在系统中由页结构struct page描述,系统中所有的页面都存储在数组mem_map[]中,可以通过该数组找到系统中的每一页(空闲或非空闲)。而其中的空闲页面则可由上述提到的以伙伴关系组织的空闲页链表(free_area[MAX_ORDER])来索引。
linux高级编程-1.Linux内存管理**_第1张图片
内存映射函数–brk/sbrk
sbrk/brk: brk和sbrk主要的工作是实现虚拟内存到内存的映射.

**进程的一些相关命令:**
**1./proc**一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
目录中包含许多以数字命名的子目录,这些数字表示系统当前正在运行进程的进程号,里面包含对应进程相关的多个信息文件。
cd /proc, ll /proc
**2.cmdline** — 启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息;
more /proc/2674/cmdline 
**3.cwd** — 指向当前进程运行目录的一个符号链接;
**4.environ** — 当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示;
more /proc/2674/environ 
**5.exe** — 指向启动当前进程的可执行文件(完整路径)的符号链接,通过/proc/N/exe可以启动当前进程的一个拷贝;
**6.fd** — 这是个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接;
 ll /proc/2674/fd
**7.maps** — 当前进程关联到的每个可执行文件和库文件在内存中的映射区域及其访问权限所组成的列表;
cat /proc/2674/maps 

2.linux 权限问题:
在linux系统中,一切皆是文件,一切文件皆有权限
目录是一个特殊的文件,而目录记录的是此目录下所有文件和目录的权限
在linux系统中,权限分为r(可读)w(可写)x(可执行) p(保护/私有)
查看目录的权限ll或者ls -l
权限的是针对用户的owner(主)group(组)other(其它用户)
对于一个用户来说,没有任何一个用户是没有组的,在新建一个用户的时候,如果没有给此用户指定组,系统则自动以此用户名新建一个组。
权限位和修改:
rwx rwx rwx 所有者 所有者所在的组 其他用户
如果用数字表示,r=4,w=2,x=1。
使用chmod 命令修改权限:chmod [参数] [模式] <文件或者目录>;
[参数] -c 只有在文件的权限确认改变才进行详细说明
-f 不输出权限不能改变的文件的错误
-v 详细说明权限的变化
-r 改变目录及其子目录的文件的权限(比较有用)
[模式] [ugoa] [±=] [rwxXs]
u:文件的所有者
g:所有者所在的组
o:其他的组
a:其他的用户
+:增加
-:去掉
=:指定文件的权限

r:是读的意思
w:是写的意思
x:是执行
X:只有目标文件对某些用户是可执行的火灾该目标文件是目录是才追加X属性。
t:T位,拒绝删除的权限位
s:设置SUID,SGID,指拥有这样的权限的可执行程序当某一用户执行的时候拥有属主或者属主所在的组的权限。

当然,你也可以使用数字来表示权限,用数值请注意了
XYZ,四个位
x代表文件的类型,你只有通过mc才能看到。
y代表SUID,SGID,T位,其中SUID=4,SGID=2,T位=1
Z代表权限位r=4,w=2,x=1

比如现在我要修改一个文件的权限,让它的权限为属主拥有所有权限,属主所在的组拥有读和写的权限,其他用户拥有读的权限,并防止其他用户删除我的文件。那么执行
#chmod 1764 myfile
用字符表示就是
#chmod u+rwx,g+rw,o+r,a+T myfile
修改属主和属主所在的组
使用chown来修改
比如你要将myfile的属主修改为nicry的,那么请使用
#chown nicry myfile
如果你要将文件的属主所在的组改为sohubbs组,请使用
#chown .sohubbs myfile
和在一块就是
#chown nicry.sohubbs myfile
注意,该命令为root专用。

进程线程

你可能感兴趣的:(linux操作系统)