zoukankan      html  css  js  c++  java
  • 码农充电站进程与线程 伍卓钧

    码农充电站--进程与线程

     

    进程是容器,本身不是执行实体,线程才是执行实体。

    进程由两部分组成,

    1、内核对象,实质是一个数据结构,由操作系统管理

    2、DLL和执行体(包含堆、栈、代码段)

    32位的平台下,每个进程有4GB的虚拟内存。

    由于进程的开辟和加载,操作系统都要切换上下文环境,因此消耗资源比较大。

     

    而同一进程的多个线程是共享资源的。

    于是首选是用多线程而不是多进程。

    线程由两部分组成;

    1、内核对象,实质是一个数据结构,由操作系统管理

    2、线程自己的堆栈

     

    Windows平台上线程分两种

    工作线程  界面线程

    两者本质上没太大区别,只是工作线程没有消息循环

     

    由于 静态变量  全局变量 是放在内存静态区中

    从汇编角度来解析就是数据段,独立于代码段,在编译时就已经分配内存

    这样的话 那么就是多个线程共享这些资源。也就是说多个线程可以同时访问静态变量和全局变量

    因此,多线程访问静态、全局变量时要注意线程安全问题

     

    解决线程安全问题的方式有以下几种:

    线程同步实现方式有互斥锁、事件对象、关键代码段

    互斥锁和事件对象 属于内核对象  由操作系统直接管理

    使用较复杂 占资源 较多

     

    关键代码段是用户对象

    使用简单 占资源少

    但是容易造成 线程死锁

    关键代码段里 包含另外一个关键代码时要 注意线程死锁问题

    如下:

    线程1   拥有对象A  抢占对象B

    线程2   拥有对象B  抢占对象A

     

    有个例子很好的描述线程死锁问题:

    哲学家进餐

    3个哲学家甲乙丙同时进餐,但每人只有一个筷子。因此每个人都不能吃饭。

    若当中一个哲学家甲将自己筷子交出来给其他两位哲学家时,比如交给乙,那么乙就能进餐。

    乙吃了一点后,将筷子交出来给丙,接着轮番使用。便能解决进餐问题。

    但是这几个哲学家都比较自私和固执,谁也不让于是造成死锁。

    看书、实践、思考、总结 

    转载请注明出处:http://www.cnblogs.com/zhuojun/

  • 相关阅读:
    小程序动态添加input(一)
    vue样式穿透
    小程序判断用户是否授权位置信息
    【超详细】MySQL学习笔记汇总(四)之排序查询
    【超详细】MySQL学习笔记汇总(三)之进阶1、2测试
    【超详细】MySQL学习笔记汇总(二)之条件查询
    【超详细】MySQL学习笔记汇总(一)之基础查询
    【超详细】MakeDown(Typora)+PicGo+Gitee实现图床
    JavaDOC生成文档
    学习Hive遇到的问题
  • 原文地址:https://www.cnblogs.com/zhuojun/p/4002797.html
Copyright © 2011-2022 走看看