Linux 内存管理 pt.3

哈喽大家好,我是咸鱼

在《Linux 内存管理 pt.2》中我们学习了多级页表和大页,我们知道了由于历史遗留的问题,Linux 的页通常为 4KB

这样就会导致一个页表里面会有特别多页,为了解决这个问题,Linux 提供了两种解决方案——多级页表和大页

那么今天继续我们的 Linux 内存管理学习,我们今天要学习的是——内存的分配和回收

在 Linux 中,内存是如何被分配和回收的呢?

内存分配

在 Linux 中,内存的分配通常由 C 标准库提供的内存分配函数 malloc() 实现

当malloc() 函数需要分配内存时,它会调用这两个系统调用——即 brk() 和 mmap()

  • brk()

对于小块内存(小于 128K大于 4K),使用 brk() 来分配,通过移动堆顶的位置来分配内存

这些内存释放后并不会立刻归还系统,而是被缓存起来,这样就可以重复使用

优缺点:

  1. 减少缺页异常的发生,提高内存访问效率

  2. 由于不会立刻归还释放的内存给系统,所以在内存工作繁忙时,频繁的内存分配和释放会造成内存碎片

  • mmap()

对于大块内存(大于 128K),则直接使用内存映射 mmap() 来分配,也就是在文件映射段找一块空闲内存分配出去,释放时直接归还系统

优缺点:

  1. 在释放时直接归还系统,所以每次 mmap 都会发生缺页异常

  2. 在内存工作繁忙时,频繁的内存分配会导致大量的缺页异常,使内核的管理负担增大。这也是 malloc 只对大块内存使用 mmap 的原因

需要注意的是,一开始调用内存分配函数的时候,其实是没有真正分配到物理内存
只有在进程首次访问时才分配,即通过缺页异常进入内核中,再由内核来分配内存

Linux 伙伴系统(buddy)

在 Linux 中,光知道如何分配内存还不行,还得知道该怎么分配

伙伴管理器是 Linux 系统中一种常见的内存分配算法,它可以让系统在分配物理内存时,快速地找到相应大小的可用内存块

前面说到,MMU 是一种硬件设备,负责虚拟内存和物理内存的映射关系。当内核需要访问某个虚拟内存时,MMU 将该虚拟地址转换为对应的物理内存地址,并通过伙伴系统的分配算法来定位相应的内存块

当内存释放时,伙伴系统将其标记为空闲,用于重新分配给其他进程。因此,伙伴系统和 MMU 相互协作,实现 Linux 操作系统的内存管理功能

上面说到,对于4K 至 128K 的内存用 brk() 来分配,对于大于 128k 的内存使用内存映射 mmap() 来分配。那如果要分配的内存小于 4K 呢?

实际系统运行的时候,有着许多内存小于 4K 的对象,如果为他们分配单独的页,那就太浪费内存了

所以 Linux 通过下面两种方式来分配小于 4K 的内存:

1、伙伴系统

当需要分配小于4K的内存时,内核会为之保留一个完整的物理页,并尽量将物理页分割成大小相同的小块。当有多个小块被请求时,内核会合并这些小块,最终分配

2、slab分配器

slab 分配器是 Linux 内核中的一个重要组成(你可以将slab 看成构建在伙伴系统上的一个缓存)它将一小块内存分配称为缓存(cache)

当需要分配小于 4K 的内存时,Slab 分配器会创建一个小的缓存来保存请求内存的块。每个缓存都有一个物理页的大小

如果已经分配完了所有内存块,Slab 分配器会重新分配一个完整的物理页作为缓存,以供后续请求使用

为了防止内存碎片化,slab 分配器会保留已经使用完的 slab 块并重复使用其中未被使用的空间,而不是将其释放回系统

内存回收

如果内存只分配而不释放,就会造成内存泄漏,甚至会耗尽系统内存

所以,在应用程序用完内存后,还需要调用 free() 或 unmap() ,来释放这些不用的内存

那么系统是如何回收内存的呢?

1、使用 LRU(Least Recently Used)算法,回收最近使用最少的内存页面

2、回收不常访问的内存,把不常用的内存通过交换分区(swap)直接写到磁盘中

Swap 其实就是把一块磁盘空间当成内存来用

它可以把进程暂时不用的数据存储到磁盘中(这个过程称为换出),当进程访问这些内存时,再从磁盘读取这些数据到内存中(这个过程称为换入)

通常只在内存不足时,才会发生 Swap 交换。并且由于磁盘读写的速度远比内存慢,Swap 会导致严重的内存性能问题

3、杀死进程,内存紧张时系统还会通过 OOM(Out of Memory),直接杀掉占用大量内存的进程

OOM(Out of Memory),其实是内核的一种保护机制,使用 oom_score 为每个进程的内存使用情况进行评分

一个进程消耗的内存越大,oom_score 就越大;

一个进程运行占用的 CPU 越多,oom_score 就越小

进程的 oom_score 越大,代表消耗的内存越多,也就越容易被 OOM 杀死

感谢阅读,喜欢作者就动动小手[一键三连],这是我写作最大的动力

本文转载于网络 如有侵权请联系删除

相关文章

  • 如何通过采购管理系统细化企业采购管理?

    采购流程是企业最敏感的问题之一。一般来说,在公司所有费用中,采购成本平均占30%。采购流程越可控、越透明、越高效,获得的利润就越多。近日,客户在咨询电子采购管理系统的时候,常有提到现在都在使用电子化管理,不能落伍所以要上电子化企业采购平台来实现无纸化办公、在线管理采购流程,那么采用电子化企业采购平台有什么好处呢?企业选择采购系统的主要动机有3个:(1)盈利和高效的采购流程(2)可见性、透明度和可追溯性(3) 简单快捷的采购电子采购系统是完全集成的系统,从需求管理开始,通过供应商信息、电子招标、供应商管理、订单管理、物流、支付和记账、仓库和合同管理,将整个流程数字化。不仅能提高效率,还有助于保护道德价值,如透明度和准确的评标。 1、节约成本:通过电子采购系统,企业可以获得高达65%的成本削减优势,如人工成本的削减。通过与供应商更好的谈判,增加采购数量,获得更好的价格。 2、流程效率:如果企业提供诸如支出分析、交易分析、市场分析等与战略活动相关的工具,这些工具的合理使用将更好地改善电子采购流程。 3、企业和供应商之间更好的信息流动:在现有计算机系统和互联网的帮助下,企业和供应商可以在

  • ES6中模块导入遇到的问题及其解决办法

    前言今天遇到了一个小的问题,我们来看一下,情况是这样的:在没遇到过这个坑之前,如果需要引入一个模块,我通常的做法都是在HTML文件中内嵌一个script标签,并通过指定type="module"来实现;然而今天我却没有按照往常这样做,而是指定两个js文件,其中一个文件通过export暴露出需要的变量和函数,在另一个文件中通过import导入,结果就遇到了报错,来给各位看下报错信息: 请各位小伙伴注意报错信息中标红的部分,接下来将我们讲解两种修复此错误的方法。通过script标签来引入首先,来看第一种方式,给各位看看我的文件目录信息:其中,demo.js文件中包含我们需要暴露的变量和函数,在index.html文件中,我们需要通过内嵌script标签来引入。请看demo.js文件: exportletname="shipudong" exportletsayName=function(){ console.log('我的名字叫做hahaCoder') } 复制请看index.html文件: <!DOCTYPEhtml>

  • 私人5G:工业无线的未来(cs.NI)

    高性能无线通信在工业4.0和工业互联网计划推动的工业系统数字化转型中至关重要。在各类工业无线技术中,5G(蜂窝/移动)具有巨大潜力。在工业环境中运行私有(非公共)5G网络有望充分释放这一潜力。本文提供了私有5G网络的技术概述。介绍了私有5G的概念和功能架构,同时强调了关键优势和工业用例。它探索了私人5G网络的频谱机会。还讨论了私有5G的设计问题以及主要挑战。最后,探索了新兴的5G标准化和开放创新系统。原文标题:Private5G:TheFutureofIndustrialWireless原文:High-performancewirelesscommunicationiscrucialindigitaltransformationofindustrialsystemswhichisdrivenbyIndustry4.0andtheIndustrialInternetinitiatives.Amongthecandidateindustrialwirelesstechnologies,5G(cellular/mobile)holdssignificantpotential.Operatio

  • 「我们该谈谈LSTM是谁原创?」图灵奖得主Hinton霸气回击Jürgen

    机器之心报道参与:魔王、泽南Jürgen的质疑迎来了深度学习之父、图灵奖得主GeoffreyHinton的迅速回击,老爷子显得很愤怒。前几天,计算机科学家、LSTM之父JürgenSchmidhuber发文,以六条理由批评GeoffreyHinton不应获得2019年本田奖。其中第一条理由就是「反向传播并非Hinton原创」。这件事在reddit等平台上引发了大量讨论。昨日,Hinton亲自下场,在帖子上表示「我只回应这一次」,并对Jürgen喊话:「或许Jürgen应该谈谈谁发明了LSTM?」以下是Hinton的回应:和JürgenSchmidhuber就学术信用进行公开辩论是不明智的,因为这只会鼓励他,而他愿意投入无限的时间和精力让他所认为的对手失去信用。他甚至还耍一些把戏,比如在维基百科上有好几个别名,让别人以为有人附和他。Jürgen网站上对阿兰·图灵的介绍就是他贬低别人贡献的一个典型案例。图源:http://people.idsia.ch/~juergen/turing.html 我知道不应该理他,但我认为不能让他的指控完全不做回应,因此我决定回应,且仅此一次。我从未说过反向

  • OCR是RPA机器人的眼睛

    OCR就如同RPA的眼睛,RPA机器人的运行离不开它。OCR(OpticalCharacterRecognition)光学字符识别,是指电子设备(扫描仪、数码相机等)将手写或印刷的字符转换为计算机可识别的数字字符代码技术。它可将纸质材料转化为数字化的电子信息。早期的OCR,由于精度不够高、坐标设置难、需要预先统一可读资料的格式,可用范围十分有限。随着OCR技术的不断发展,出现了与AI相结合的AI-OCR技术,弥补了原先的不足,提高了通用性。借助AI-OCR这双慧眼,RPA可利用AI的自主学习,实现包括手写文字在内的高精度字符识别,使文字信息数据化,并由RPA自动进行提取和输入工作,提高处理纸质文档的业务效率,避免人为输入错误。以下,列举几个RPA与AI-OCR相结合,实现处理纸质文档业务流程效率化的案例。订单处理的自动化通过将RPA与AI-OCR技术相结合,可以实现订单处理的自动化。收到订单邮件后,通过AI-OCR读取信息。然后,RPA可以自动处理订单信息,将信息内容填入账簿中,并在订单完成时自动向下单者发送电子邮件。此外,RPA还可以自动发出订单指示,并自动执行相应的库存管理。名片管

  • 这个坑,是时候填上了~

    一、背景​  这两天,在网上逛的时候,发现了如下的一道面试题,感觉还有蛮有意思的,要是不仔细看还真容易掉到坑里面。第一眼看起来比较绕,所以比较难理解。最终我跳出了这个坑,也想把这个跳坑的经历分享出来。题目如下,请问输出的是什么?为什么?/**  * @author hafiz.zhang  * @description: 一个奇怪的现象  * @date Created in 2018/7/2 22:44.  */ public class Test {     public static void main(String[] args) {         String ermao = "a";         String bb = addStr(ermao);         System.out.println(ermao);     }     private static String addStr(String ermao) {         ermao = ermao + "b";         return ermao;

  • 区块链加上云存储,能玩出什么花样?

    一夜之间硬盘会坏掉,网站也会倒闭,难道就没有一个数据安全存储的地方吗?当然是有的!当云存储首次出现时,被誉为革命性的,即使在今天的技术革命中,它仍然发挥着作用。但是,FIGTOO(无花果)认为数据存储可以离开云端,加入最新的区块链技术。那么,加入区块链技术的去中心化云存储有哪些优点?小编将通过以下几个场景,带您尽数区块链+云存储的优点。场景一:意外硬件损坏导致数据丢失当中心存储服务器发生故障后,上传至此处的所有文件就都会遭殃,要么丢失要么损毁,总之就是一句话,你可能永远的失去它了。而基于区块链技术的存储空间,以FIGTOO(无花果)为例,它是去中心化的分布式文件存储系统,即使文件受到黑客攻击,他们也需要破解每个文件碎片的秘钥,用以恢复文件。当黑客试图篡改数据时,客户存有加密校验将提醒用户注意,用户可以随时取回文件并销毁云存储数据。这是区块链+云存储的2个显著优点。场景二:云存储用户信息泄露风险普遍存在之前有一篇名为《我在百度网盘上看到上万条车主个人信息,企业、政府高官信息、各种数据库和无穷无尽的盗版》的文章,引发了人人自危,在你浑然不觉的时候,你的私密信息早就已经泄露了。在安全性方面,

  • 基于Ext.Panel扩展一个更容易操作的Canvas

    /*     画布类     xtype:"beidasoft.oe.canvas.panel"     <script type="text/javascript" language="javascript" src="/modules/oe/view/canvas/panel.js"></script>     eg:     var panel = new BeidaSoft.OE.Canvas.Panel() */ Ext.namespace("BeidaSoft.OE.Canvas") BeidaSoft.OE.Canvas.Panel = function (config) {     BeidaSoft.OE.Canvas.Panel.superclass.constructor.call(this,config); } Ext.extend(BeidaSoft.OE.Canvas.Panel, Ext.Panel, {     width: 50

  • Java基于Itext7实现Html转PDF的方法,解决老版本缺陷。

    写在前面 以下路径问题根据项目结构自己修改,以下是我使用springboot打成jar包的写法。 一、需求背景 在前端编辑器中输入任意的文本,包括css样式变化,保存为html文本。通过Java后台将html文本转换为PDF文档并加上页眉、页脚、水印等。因为网上开源的方案用的工具版本都比较老,也无法满足要求。所以只能用目前比较新的Itext7,网上的资料不多,只能看文档自己学习。 二、解决方案 1.开发工具Itext7(https://itextpdf.com/itext7):首先jar包一定要引对,要不Demo也运行不了。我项目使用的是maven,以下是pom.xml最新版jar可以通过官方文档中寻找。 <!--pdfHTML--> <dependency> <groupId>com.itextpdf</groupId> <artifactId>html2pdf</artifactId> <version>1.0.2</version> </dependency> <!-

  • XCode v9.6.2017.0830

    新生命团队基础框架X组件,包括网络、数据库、安全、多线程、反射、序列化、模版引擎、服务代理、远程过程调用等模块,包括Mvc后台魔方、超级码神工具、消息队列等子系统,支持Mono/Android/iOS/NetStandard。 新生命开发团队 网站:http://www.NewLifeX.comQQ群:1600800 项目源码位置 国内 http://git.NewLifeX.com/NewLife/X国外 https://github.com/NewLifeX/X   数据中间件XCode主要功能:1,实体数据添删改查,支持复杂查询表达式2,数据分页查询,经历过最大单表60亿行的考验3,数据缓存,大部分命中率超过99%4,反向工程,支持根据模型和实体类变更,来创建或修改数据库表结构5,数据模型架构,通过IEntity/IEntityOperate编写通用的实体处理模块6,多数据库支持,SQLite、MSSQL、MySql、Oracle、PostgreSQL7,支持数据库切片,分表分库8,支持大数据分析,ETL同步、统计9,内置Membership权限体系

  • 记一个有想法没能力实现的产品形态——实时公交

    0:前言 在app打车刚刚兴起的时候,让人感觉“哎呦,移动互联网要搞交通行业了”,然后突然想到为什么没有人在做“实时公交”的产品呢,然后上网搜了搜,还真有,他们的特点是不过用户量不大,以城市来下载软件,到另外一个城市则换软件。然后查北京地区的一款app,装上之后没有打开就闪退。然后突然发现在这是个需求,然后那一晚失眠了,从产品的需求到产品的变现能力再到产品运营天马行空的想了一遍,然后想怎么样说服团队成员,然后想现阶段存在的困难。那一晚好兴奋,如果做成这个产品,保守估计这绝对是一个上千万用户量级别的产品,能够给人们的生活带来极大方便的产品。 昨天晚上又失眠了,因为有2个月没在北京了,今天有朋友打电话说北京的公交有wifi覆盖了,当时我和我的小伙伴们儿就惊呆了,之前因为公交车上没有wifi而罢手的“实时公交”的条件渐渐成熟了。 笔者最近在无锡,而无锡市物联网被炒的最热的地方,市里的公交站牌有到站提醒,例如还有几站到此站,也有专门针对无锡的实时公交提醒,我试用了一下,总体感觉,有的车辆信息不准确,有延误,有的车次没有,界面好难看,没有到站提醒 写的不好,如果您看了有什么补充,欢迎留言,一

  • 卡片

    时间限制:1Sec  内存限制:128MB 题目描述 你有一叠标号为1到n的卡片。你有一种操作,可以重排列这些卡片,操作如下:1.将卡片分为前半部分和后半部分。2.依次从后半部分,前半部分中各取一张卡片,放到新的序列中。例如,对卡片序列(1,2,3,4,5,6)操作后的结果为(4,1,5,2,6,3)。现在你有一个初始为(1,2,3,⋯,n)的卡片序列,你需要求出进行m次操作之后第x个位置上的卡片的标号。   输入 第一行包含三个非负整数n,m,x。   输出 输出一行一个数,表示答案。   样例输入 623 复制 样例输出 6 复制   提示 对于60%的数据,m≤107。对于100%的数据,0≤n,m,x≤109。数据有梯度,保证n为偶数。   题解: 假设原始位置为x(同时也是数值),当前位置为p; 因为变换一次后,位置要么变为2x,要么变为2x-(n+1),所以有等式(2^m)*x+(n+1)*y=p; 由于我们只需要求出x,所以等式可以写成((2^m)%(n+1))*x+(n+1)*y=p; 简单理

  • BSS Audio&#174; Introduces Full-Bandwidth Acoustic Echo Cancellation Algorithm for Soundweb London Conferencing Processors

    BSSAudio®IntroducesFull-BandwidthAcousticEchoCancellationAlgorithmforSoundwebLondonConferencingProcessors December13,2010       SALTLAKECITY,Utah–BSSAudio®,aHarmanInternationalCompany(NYSE-HAR),todayintroducedanewfull-bandwidthAcousticEchoCancellation(AEC)algorithmforitsSoundweb™Londonconferencingprocessors.Thenewfull-bandwidthAECalgorithmisreleasedwithHiQnetLondonArchitectv3.04andcanbeusedwithexistingSoundwebLondonAECInputCardsandtherecently-introducedSoundwebLondonBLU-101andB

  • HT7A6312—— 离线开关电源小功率初级转换开关IC 记录总结

    1.芯片特性 a.固定60KHz开关频率; b.宽Vcc输出电压范围:9V-38V; c.宽交流输入电压范围:85Vac-265Vac; d.电流模式PWM控制; e.带迟滞的辅助欠压锁定功能; f.高压启动电流源; g. 内置730VMOSFET; h.轻载条件下Burst模式控制; 2.设计记录

  • Sysfs文件系统接口调试

    首先需要初始化操作: s32gtp_sysfs_init(void) { s32ret; debug_kobj=kobject_create_and_add("gtp",NULL); //SET_INFO_LINE_INFO("Startinginitlizinggtp_debug_sysfs"); if(debug_kobj==NULL) { GTP_ERROR("%s:subsystem_registerfailed\n",__func__); return-ENOMEM; } ret=sysfs_create_file(debug_kobj,&dev_attr_rawdata.attr); if(ret) { GTP_ERROR("%s:sysfs_create_rawdata_filefailed\n",__func__); returnret; } return0; } 复制 staticDEVICE_ATTR(rawdata,S_IRUGO|S_IWUSR,gtp_sysfs_rawdata_show,gtp_sysfs_rawdata_store); 创建

  • 以todomvc为例分析knockout、backbone和angularjs

    一、整体结构 项目github地址https://github.com/tastejs/todomvc/  排除通用的css样式文件和引用的js库文件,仅看html和js 1.1knockoutjs版todoapp文件结构 knockoutjs --index.html --js ----app.js 复制 1.2backbonejs版todoapp文件结构 backbonejs --index.html --js ----collections ------todos.js ----models ------todo.js ----routers ------router.js ----views ------app-view.js ------todo-view.js ----app.js 复制 1.3angularjs版todoapp文件结构 angularjs --index.html --js ----controllers ------todoCtrl.js ----directives ------todoEscape.js ---

  • Core Animation编程指南

       本文是《CoreAnimationProgrammingGuide》2013-01-28更新版本的译文。本文略去了原文中关于OSX平台上CoreAnimation相关内容。因为原文的类型属于编程指南,所以示例代码并不多,更多的是理论层面的探讨。所以译文中加入了大量的示例代码,以提高本文的可操作性。希望本文能够对你有所帮助。 本文由海水的味道翻译,转载请注明译者和出处,请勿用于商业用途! 关于CoreAnimation CoreAnimation是iOS与OSX平台上负责图形渲染与动画的基础设施。CoreAnimation可以动画视图和其他的可视元素,为你完成了动画所需的大部分绘帧工作。你只需配置少量的动画参数(如开始点位置和结束点的位置)即可施展CoreAnimation魔法。CoreAnimation将大部分实际的绘图任务交给了图形硬件来处理,图形硬件会加速图形渲染的速度。这种自动化的图形加速技术让动画拥有更高的帧率并且更加的平滑,而且不会加重CPU的负担而影响程序的运行速度。 如果你正在开发一个iOS应用,此刻你就已经运用了CoreAnimat

  • 暗链原理与攻击&amp;检测手法

    0x00原理学习 暗链(黑链、隐链)是指看不见,却被搜索引擎计算权重的外链,欺骗搜索引擎,使其误判,将高权重分配给无价值的网站甚至是钓鱼站点。因多为黑客所为,被叫做黑链黑链是当前SEO最喜欢做的一种方式:增加权重、提升排名、提高PR黑链的含义是:站点被黑客利用技术入侵,并且取得权限,经过代码的添加,实现隐藏的一个或者多个导出链接,这样的方式是为了不让站长以及管理员发现链接的存在。 暗链的存在说明网站存在安全漏洞,带有暗链的网站更容易被黑客入侵。带有暗链的网站提供下载的资源也不可信,会含木马或后门。 复制 0x01攻击手法 通过将display属性设置为none或visibility:hidden等使得链接信息不可见。 注解:修改级联样式表(CascadingStyleSheet,CSS)的样式。在CSS样式表中,通过将标签的效果设置为透明隐藏的,能够用来美化网页的页面展示效果,而暗链利用此方法到达隐藏链接的目的。具体设置方法可以采用为标签添加属性信息,例如                       style=

  • Luogu P3489 [POI2009]WIE-Hexer 最短路

    https://www.luogu.org/problemnew/show/P3489 普通的最短路,不过我觉得这个复杂度按道理来说边数不应该是m*2^13吗,不知道是数据比较水还是实际上能证明复杂度低一些。 代码如下 #include<bits/stdc++.h> usingnamespacestd; constintmaxn=210; #definepapair<int,int> intn,m,p,k; intdis[maxn][8200]={},kn[maxn]={}; boolvis[maxn][8200]={}; priority_queue<pa,vector<pa>,greater<pa>>q; structen{ inty,v,t,next; }e[8000]; inthead[maxn]={},tot=0; voidinit(intx,inty,intv,intt){ e[++tot].next=head[x];e[tot].y=y; e[tot].t=t;e[tot].v=v;head[x]=tot

  • 微信中web页面实现和公众号中查看图片一样的效果

      最近开发了一套资讯相关的web页面,嵌套在微信中,可支持点赞、评论等...在文章详情中,图片需要点击放大,随手势放大缩小,左右可滑动切换,总之类似于微信公众号效果。   开始想的方案是用轮播插件、或者在img外面套一层a标签,a标签的链接放图片链接。   那么我来总结一下这两种方案的优缺点: 使用轮播插件:     1、效果酷炫;     2、可支持多种操作,如:手势缩放、旋转、滑动切换...;     3、缺点则是,插件无疑加大的移动端加载效率;     4、安卓设备下支持性不佳,出现卡顿。 使用a标签方法:     1、使用简单;     2、也是调用微信自带的照片浏览器,加载效果高、同样支持缩放手势操作;     3、界面简陋~low;     4、新开链接,有明显跳走效果。      有没有一种解决方案可以取长补短的?要求不高只要跟公众号打开图片浏览效果一样就可以了。   答案是:有,使用previewImage。   那么这是个什么鬼呢?(微信开发-预览图片接口)     http://mp.weixin.qq.com/wiki/11/74ad127c

  • 置换群1

    我们把集合$\sum$到自身的一个一一对应$\sum$叫做$S$上的一个置换,以$S(\sum)$表示$\sum$上的全体置换构成的集合,我们定义两个置换$\sigma,\tau$的乘法运算为二者关于映射的复合运算$$\sigma\cdot\tau=\sigma\circ\tau\Leftrightarrow(\sigma\circ)a=\sigma(\tau(a)),\foralla\inS$$显然在此运算下$S(\sum)$构成一个群,幺元是恒等映射.这个群称为集合$\sum$上的对称群,他的子群均叫做集合$\sum$上的置换群. 我们不难看出两个群$S(\sum),S(\sum')$的本质区别就是集合$\sum,\sum'$的基数区别,如果基数一样$|\sum|=|\sum'|=n$,那么两个对称群是同构,因此我们一般上把这个群记作$S_n$,称作$n$元对称群,而$S_n$的子群均叫做$n$元置换群. 对于$n$元集合上任意的置换$\sigma$,可以把他记作$$\sigma=\left(\begin{matrix}1&2&\cdots&n\\\sigm

相关推荐

推荐阅读