`
jack
  • 浏览: 392479 次
  • 来自: 温州
社区版块
存档分类
最新评论

项目事故和安全语言

阅读更多
  有个从表面上看起来很奇怪的事实是:司机戴安全带比不带安全带时发生的行车事故要多。不带安全带时,司机死亡率比较高,但是带了安全带时,司机死亡率是降低了,但是行人死亡率却提高了。

  不带安全带时,司机需要谨慎缓慢的开车,带了安全带,司机却会 更快,更放肆地开车。
这个方面的资料 可以看下 Automobile Safety Regulation and the Incentive to Drive Recklessly:Evidence from NASCAR 和Automobile Safety Regulation

  编程语言,从一种不安全语言(比如c/c++)发展到一种相对安全语言(比如C#)时,语言上安全程度提高,并不因此能够大量的减少项目事故,只能减少对开发人员威胁程度而已。而对于客户平均威胁程度却是提高了。

   安全性高的语言,就像司机有了安全带一样,使得原本那些担心做不好而使得自己饭碗不保地不合格开发人员更加-------放肆了。

  同样的项目 用c/c++开发,开发人员知道c/c++极易出错,开发速度故而缓慢,谨慎。尽量避免在开始就出错。项目运行时,初期出错。小错误还好,如果是系统崩溃之类的错误,有麻烦的是开发人员。

  用C#开发,则因为C#和.net平台有各种各样的保证机制。相对不容易出错,比如c/c++中最麻烦的内存,资源回收和指针问题。项目运行初期也很难发现.等运行一段时间之后,出错了很有可能就需要重新设计了。

  开发语言虽安全,请各位"新人司机"缓慢,谨慎驾驶。
分享到:
评论
39 楼 robbin 2006-09-26  
ddd 写道
我解释不了,不过还是那句话:不能解释不代表一定是apache或php的错。


我连换两个不同的Linux发行版本,并且都update到最新的patch,但是状况依旧,所以我相信kernel没有问题。
38 楼 ddd 2006-09-26  
我解释不了,不过还是那句话:不能解释不代表一定是apache或php的错。
37 楼 buaawhl 2006-09-26  

结果是,我知道有这么回事了。
通过charon给的link,可以知道,通过handle进行堆的管理。以前的malloc API呢?
不过,jack给的那个图里面有Global Memory, Local Memory的区别。Global Memory应该是进程间通信使用的。不知道具体如何管理。
我也没有这些编程环境,也没有尝试。

另外,谢谢3D兄弟称我一声牛人。这个称呼我还听得很少。(窃喜中,对自己的能力有了新的认识,竟然也忝列牛人行列)
牛人这东西,还真需要相互吹捧,才铸造得出来。
一开始可能是客气,后来就成习惯了,就巩固了。
36 楼 robbin 2006-09-26  
ddd 写道
robbin 写道
完了,是不是因为Java太普及了,就没有人懂C了?

C指针引用越界,你怎么回收?

虽然你是老大,不过我也得说,您在不掌握的领域内也不要动用这样的语气。

我给您解释,linux下。
一个进程开启,系统给分一个堆空间让你可以malloc,但这个堆空间是虚拟内存地址块。
你每次malloc都在这个堆里面分配一块出去。

地址越界,可以,只要你越界后的地址在堆地址空间内(这里论述还是不精确,应该是数据段,数据段包括堆,并且越界后的地址必须要已被映射),当时不会出现问题。
如果越界到了堆地址空间外,那么回core dump。

进程结束了,这个数据段被统一回收,你根本没有访问数据段外面的可能性,一访问立刻由cpu保证出现地址异常。


嗯,我查了一下,指针越界,在Unix上面确实会导致core dump,这里不会导致内存泄漏,我犯了一个明显的错误。


但不知我遇到那种情况做何解释?因为都是用户空间的进程,用PHP就内存泄漏,关闭PHP照样内存无法回收,只要不用PHP就一切回复正常。

35 楼 ddd 2006-09-26  
robbin 写道
完了,是不是因为Java太普及了,就没有人懂C了?

C指针引用越界,你怎么回收?

虽然你是老大,不过我也得说,您在不掌握的领域内也不要动用这样的语气。

我给您解释,linux下。
一个进程开启,系统给分一个堆空间让你可以malloc,但这个堆空间是虚拟内存地址块。
你每次malloc都在这个堆里面分配一块出去。

地址越界,可以,只要你越界后的地址在堆地址空间内(这里论述还是不精确,应该是数据段,数据段包括堆,并且越界后的地址必须要已被映射),当时不会出现问题。
如果越界到了数据段地址空间外,那么会core dump。

进程结束了,这个数据段被统一回收,你根本没有访问数据段外面的可能性,一访问立刻由cpu保证出现地址异常。
34 楼 ddd 2006-09-26  
中午睡了一大觉,醒来这么热闹了。
buaawhl一贯敢装牛人,这次倒要看看结果如何。
33 楼 charon 2006-09-26  
buaawhl 写道

charon给的那个link打不开,不过至少知道有这么一回事了。
jack给的信息。在win32中,malloc也是用heap,不过有跟踪过程。就是说进程只要不是异常被关闭,内存就会被释放。这里的异常,是指不是OS来控制的关闭动作。

我怎么感觉这是说 handle 呢?

可有win32 malloc api的详细说明?我没有搜索到。


csdn上找到另一篇文章:
http://dev.csdn.net/article/83995.shtm
对堆讲的很清楚. 不过它有张直观的图片没有贴上
同一篇文章可以去看下面这个(这个布老大可能还是看不到)
http://www.chinavideo.org/index.php?option=com_content&task=view&id=291&Itemid=5

我的感觉在windows xp/2000下,杀掉进程并不会导致堆空间泄露.
其实测试一下很简单,写一段死循环的ruby/python程序,在cmd窗口下面跑,然后强行关闭,看有没有泄露,有多少泄露(几K字节的不算,那个是操作系统自己的消耗).
32 楼 jack 2006-09-26  
buaawhl 写道

charon给的那个link打不开,不过至少知道有这么一回事了。
jack给的信息。在win32中,malloc也是用heap,不过有跟踪过程。就是说进程只要不是异常被关闭,内存就会被释放。这里的异常,是指不是OS来控制的关闭动作。

我怎么感觉这是说 handle 呢?

可有win32 malloc api的详细说明?我没有搜索到。


呵呵  debug出来的,malloc() 然后跟踪下去. 或者你可以看下 MSDN:Platform SDK: Memory Management部分的信息,不过不是很详细。

31 楼 buaawhl 2006-09-26  

charon给的那个link打不开,不过至少知道有这么一回事了。
jack给的信息。在win32中,malloc也是用heap,不过有跟踪过程。就是说进程只要不是异常被关闭,内存就会被释放。这里的异常,是指不是OS来控制的关闭动作。

我怎么感觉这是说 handle 呢?

可有win32 malloc api的详细说明?我没有搜索到。
30 楼 jack 2006-09-26  
buaawhl 写道

先给一个权威link吧。说明32位计算机的堆变量,会在进程退出的时候,能够自动释放。我还是第一次听到这样的新鲜事。

另外,内存越界是很正常的。从数据段越界到代码段都有可能。32位就没有这个问题了?我还以为32位就是提供了更大的寻址空间呢,没想到还有这个智能。


这里和是否32位到是没有关系,只是现在的os进程和进程是隔离的。进程和os也是隔离的。一般的用户经常都是user level的。比如win32的系统,进程用的api和os级别代码用的api更本是两套系统。你想越界,请先获得kernel的代码运行权限(比如写成某个驱动程序)。

进程内指针越界,这种情况多的很,但是影响范围也就是仅限于当前进程而已。
29 楼 jack 2006-09-26  
疯掉 成了讨论gc 和进程内存的贴了。
好吧 说说我的win32 进程知识
win32下面内核对象 包括以下

Access token
Change notification
Communications device
Console input
Console screen buffer
Desktop
Event
Event log
File
File mapping
Heap <------------- 大家的针对地方
Job
Mailslot
Module
Mutex
Pipe
Process
Semaphore
Socket
Thread
Timer
Timer queue
Timer-queue timer
Update resource
Window station

这些object由OS管理,不同的OS能够同时打开,创建的object数目有限。由user level的程序创建和使用。

如果某个程序只开,不关闭。那么这些object只会越来越少,最后就不能用了,于是程序也就是不能跑了。
当然还有User Object 和GDI object也是差不多的道理,但是情况不是太严重而已
Heap,同样的,如果专门用操作heap的api去操作,来个故意泄漏。哪其他的程序也会出大麻烦了。

在win32中,malloc也是用heap,不过有跟踪过程。就是说进程只要不是异常被关闭,内存就会被释放。这里的异常,是指不是OS来控制的关闭动作(这个很难)。

以上 和C无关,主要看OS和malloc的最后实现如何

GC 就我的理解是在某个进程中,能够自动识别无用内存块,加以回收。是进程级别的。 进程的内存回收则是OS级别的。没有啥好比较的。



28 楼 charon 2006-09-26  
charon 写道
给个链接:
http://www.chinavideo.org/index.php?option=com_content&task=view&id=291&Itemid=5
不过不是权威的.hehe
估计布老大和兄弟我一样都是古董年代过来的吧
兄弟我10年前开始用c/c++写程序,5年前就洗手不干了.
32位操作系统进程空间都是相对独立的.如果是在进程堆里面分配的东西,进程kill掉之后一点渣都留不下(操作系统帮程序清理).
如果是对内核堆操作,那就另说了,不过,我还没见到过俺们写应用程序的会用到内核堆


谁能把这个删掉?
刚才改了一下上面的跟贴,居然出来一个新的引用贴,不知道是我的误操作还是系统的bug
判断完毕,是误操作.和系统无关.
27 楼 charon 2006-09-26  
给个链接:
http://www.chinavideo.org/index.php?option=com_content&task=view&id=291&Itemid=5
不过不是权威的.hehe
估计布老大和兄弟我一样都是古董年代过来的吧
兄弟我10年前开始用c/c++写程序,5年前就洗手不干了.
32位操作系统进程空间都是相对独立的.如果是在进程堆里面分配的东西,进程kill掉之后一点渣都留不下(操作系统帮程序清理).
如果是对内核堆操作,那就另说了,不过,我还没见到过俺们写应用程序的会用到内核堆
26 楼 buaawhl 2006-09-26  

先给一个权威link吧。说明32位计算机的堆变量,会在进程退出的时候,能够自动释放。我还是第一次听到这样的新鲜事。

另外,内存越界是很正常的。从数据段越界到代码段都有可能。32位就没有这个问题了?我还以为32位就是提供了更大的寻址空间呢,没想到还有这个智能。
25 楼 runes 2006-09-26  
buaawhl 写道
charon 写道
buaawhl 写道
忍不住了.
难道现在的学校都不教 C 语言了?

如果进程申请的堆空间,能够自动释放,java的GC还有什么可吹嘘的呢?
GC = Gabage Collection。

Java等vm语言为了做到GC,还是做了很多工作的。直接影响了语言的运行效率。是一个巨大的牺牲。


老大,GC的内存释放是动态的,程序照样在跑,而进程退出时的内存释放则是另外一回事情,要释放内存必须频繁启动/关闭程序,这个就比较e了。
进入真正的多进程操作系统时代之后,杀掉进程,这个进程相关的所有资源都会被干掉(当然对于fork出来的子进程某些情况下会有麻烦,但是子进程本身也是可以被kill掉的).系统资源被占用的原因多数是存在大量僵尸进程或孤儿进程.


GC的含义包括动态内存释放。同样包括整个VM的memory的管理,都可以理解为这样。一个VM申请了一个巨大的栈空间,所有的堆内存都从这个里面获取,跑不出进程控制的范围。当然,实际原理不是这样,而是一个复杂的追踪纪录过程。pointer reference counting。

至于说这个进程关闭,资源就会全部释放掉。看你说的是什么资源,如果是数据库,文件,自然会释放,如果是申请的系统堆内存,怎么会释放?这不是成了个GC吗?
不知道charon老大是否用过c。

不过,我对charon的动态语言功底是比较佩服的。
:D 有空加MSN聊聊Python。

charon 写道

老大,虽然我没试过(兄弟我的机器上没有装C编译器),但是基本判断这里不会有内存泄露
现代的32位操作系统里面,每个进程都是单独的寻址空间.kill掉就挂了.
国内的很多操作系统教材,多数还停留在16位的年代吧


每个进程分配一个单独的堆空间?如果不够呢?




你启动一个的那个jvm 也是一个进程。


每个进程分配一个单独的堆空间?如果不够呢?
----没有听明白, 能否具体说说?

24 楼 runes 2006-09-26  
robbin 写道
完了,是不是因为Java太普及了,就没有人懂C了?

C指针引用越界,你怎么回收?


实话说 看到 robbin 这样回答 我真的不知道说什莫好?

在32位下,你指针能指到哪去? 还不是在你那个 4G 空间里面转悠 ?(算上 OS限制的部分,剩下的3G都不到), 进程都没有了, 还轮得到指针说话?

23 楼 buaawhl 2006-09-26  
charon 写道
buaawhl 写道
忍不住了.
难道现在的学校都不教 C 语言了?

如果进程申请的堆空间,能够自动释放,java的GC还有什么可吹嘘的呢?
GC = Gabage Collection。

Java等vm语言为了做到GC,还是做了很多工作的。直接影响了语言的运行效率。是一个巨大的牺牲。


老大,GC的内存释放是动态的,程序照样在跑,而进程退出时的内存释放则是另外一回事情,要释放内存必须频繁启动/关闭程序,这个就比较e了。
进入真正的多进程操作系统时代之后,杀掉进程,这个进程相关的所有资源都会被干掉(当然对于fork出来的子进程某些情况下会有麻烦,但是子进程本身也是可以被kill掉的).系统资源被占用的原因多数是存在大量僵尸进程或孤儿进程.


GC的含义包括动态内存释放。同样包括整个VM的memory的管理,都可以理解为这样。一个VM申请了一个巨大的栈空间,所有的堆内存都从这个里面获取,跑不出进程控制的范围。当然,实际原理不是这样,而是一个复杂的追踪纪录过程。pointer reference counting。

至于说这个进程关闭,资源就会全部释放掉。看你说的是什么资源,如果是数据库,文件,自然会释放,如果是申请的系统堆内存,怎么会释放?这不是成了个GC吗?
不知道charon老大是否用过c。

不过,我对charon的动态语言功底是比较佩服的。
:D 有空加MSN聊聊Python。

charon 写道

老大,虽然我没试过(兄弟我的机器上没有装C编译器),但是基本判断这里不会有内存泄露
现代的32位操作系统里面,每个进程都是单独的寻址空间.kill掉就挂了.
国内的很多操作系统教材,多数还停留在16位的年代吧


每个进程分配一个单独的堆空间?如果不够呢?


22 楼 charon 2006-09-26  
buaawhl 写道

进程申请的堆空间,是无法释放的。只有栈空间才会释放。

查查 进程控制块 Process Control Block 吧。
里面的数据结构记录的信息很有限,无法做到自动追踪和记录这个进程申请的所有块。

引用

windows 下面 开个 cmd, 写个不释放 内存的cpp 程序,run 完已后,把这个dos 窗口关闭了,刚才不释放 内存的cpp 程序还会对os 有影响?


YES。有影响。这叫做内存泄漏。



老大,虽然我没试过(兄弟我的机器上没有装C编译器),但是基本判断这里不会有内存泄露
现代的32位操作系统里面,每个进程都是单独的寻址空间.kill掉就挂了.
国内的很多操作系统教材,多数还停留在16位的年代吧
21 楼 robbin 2006-09-26  
完了,是不是因为Java太普及了,就没有人懂C了?

C指针引用越界,你怎么回收?
20 楼 buaawhl 2006-09-26  

进程申请的堆空间,是无法释放的。只有栈空间才会释放。

查查 进程控制块 Process Control Block 吧。
里面的数据结构记录的信息很有限,无法做到自动追踪和记录这个进程申请的所有块。

引用

windows 下面 开个 cmd, 写个不释放 内存的cpp 程序,run 完已后,把这个dos 窗口关闭了,刚才不释放 内存的cpp 程序还会对os 有影响?


YES。有影响。这叫做内存泄漏。

相关推荐

    go语言项目实战源码资料

    理解如何创建和管理goroutines,以及如何通过channels进行安全的数据通信是Go语言的一大特色。 4. **网络编程**:Go语言提供了强大的net和http标准库,使得网络编程变得简单。你可能会学习到如何创建HTTP服务器,...

    Go 语言课程和项目源码

    非类型安全指针 Go语言切片 作业 Day04 重点知识回顾与答疑 Day05 字符串 Go语言Map Go语言接口 错误处理 空接口与类型断言 函数式编程 面向对象 面向接口 作业 Day06 IO操作 反射与AST 文件读写 包与工程 单元测试...

    基于python开发的Ai助手项目源码(集成了语言识别、图像识别和自然语言处理).zip

    基于python开发的Ai助手项目源码(集成了语言识别、图像识别和自然语言处理).zip基于python开发的Ai助手项目源码(集成了语言识别、图像识别和自然语言处理).zip基于python开发的Ai助手项目源码(集成了语言识别、...

    go开源项目大全(目前最完整)

    因此我自己根据go语言中文社区提供的资料,还有互联网企业架构设计中的常见组件分类, 共精心挑选了100多个开源项目(项目不限于在github开源的项目), 分成以下十几个大类。 这个项目可以理解为互联网IT人打造的...

    PanUmlTools项目一个java语言实现的

    Java是一种广泛应用于开发各种类型应用程序的编程语言,具有跨平台、面向对象、高性能和安全性等特点。Java项目可以用于开发各种类型的应用程序,包括桌面应用程序、Web应用程序、移动应用程序和企业级应用程序等。 ...

    (完整版)项目部安全管理体系.pdf

    3. 安全标准与程序:制定工程项目安全操作规范和流程,包含紧急应对预案和安全检查制度。 4. 安全培训与教育:定期对员工进行安全知识与技能的培训,提升安全意识和应急处理能力。 5. 安全监督与检查:开展日常安全...

    Perl语言编程.pdf

    * 不适合大型项目:Perl语言不适合用于大型项目,例如操作系统、数据库管理系统等。 * 安全性欠缺:Perl语言的安全性欠缺,需要用户小心地编写代码来避免安全问题。 Perl语言的发展历史: * 1987年,Larry Wall...

    公路水运项目工程施工企业主要负责人和安全生产管理人员考核大纲模拟试题库.doc

    同时,综合能力测试了语言沟通、规范理解、道德评价、心理承受和突发事件处理等公共基本能力,以及安全法规执行、监督、隐患排查、事故分析和信息处理等安全管理行为能力。 2. 法律法规及规章规程:考核人员需熟悉...

    基于Go语言和Gin框架的完善Web项目骨架.zip

    通过深入学习和使用这个项目骨架,开发者不仅可以掌握Go语言和Gin框架的基本用法,还能了解到如何优化应用性能,实现高效、安全的企业级服务。同时,通过研究`skeleton-main`文件,可以学习到如何组织代码结构,处理...

    建设项目的安全和职业健康“三同时”管理.pdf

    1. 建设项目安全管理制度:公司需建立完善的建设项目安全管理制度,涵盖从可行性研究、设计、施工到验收的全过程,确保所有环节遵循国家和行业的安全标准。 2. 可行性研究阶段:在项目启动初期,需对可能存在的危险...

    基于Unity3d和C#语言开发的回合制RPG游戏项目源码+sln解决方案(课程作业).zip

    1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通。 2.主要针对各个计算机相关...基于Unity3d和C#语言开发的回合制RPG游戏项目源码+sln解决方案(课程作业).zip

    基于Java语言的福建师范大学计算机与信息安全学院2021级软件工程&新意科技项目实训课程第四组设计源码

    该项目是福建师范大学计算机与信息安全学院2021级软件工程与新意科技项目实训课程的第四组设计源码,采用Java语言开发,并集成了Vue、JavaScript、CSS和HTML等多语言技术。项目包含28个文件,具体分布为7个Vue文件、...

    Rust语言相关项目的示例

    Rust是一种系统级编程语言,由Mozilla研发,旨在提供内存安全、并发性能和速度的完美平衡。这个压缩包文件“Rust语言相关项目的示例”很可能是包含了一系列使用Rust编程语言开发的实际项目实例,旨在帮助学习者深入...

    锂日历记事本-Gin后端项目,基于go语言Gin框架开发.zip

    它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如...

    基于深度学习的建筑安全事故预防策略综述.pdf

    其在计算机视觉、自然语言处理和语音识别等多个技术领域的成功应用,为建筑安全事故的预防提供了新的思路。深度学习技术能够通过多层神经网络结构,对复杂的数据进行有效建模和特征提取,从而实现对施工现场的自动...

    技术服务方案、项目实施方案及项目管理组织机构.pdf

    这个项目的技术服务方案、项目实施方案及项目管理组织机构全面覆盖了工程的各个环节,从前期的技术准备到后期的施工管理,都旨在保证工程的安全、质量和进度,同时注重环境保护和文明施工,展现了严谨的项目管理流程...

    基于Energyplus、Golang、React和R语言的建筑能耗计算系统源码+项目说明.zip

    基于Energyplus、Golang、React和R语言的建筑能耗计算系统源码+项目说明.zip 【说明】 【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,...

    网络安全大语言模型.zip

    网络安全大语言模型 ----- 毕业设计,课程设计,项目源码均经过助教老师测试,运行无误,欢迎下载交流 ----- 下载后请首先打开README.md文件(如有),某些链接可能需要魔法打开。 ----- 毕业设计,课程设计,项目...

    信息安全大作业-CA系统的设计和实现源码(电子认证服务系统-数字证书数字签名python语言)+项目详细说明

    信息安全大作业-CA系统的设计和实现源码(电子认证服务系统-数字证书数字签名python语言)+项目详细说明, CA代表Certificate Authority。也就是电子认证服务或机构,为电子签名相关各方提供真实性和可靠性验证,是...

Global site tag (gtag.js) - Google Analytics