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/

  • 相关阅读:
    Oracle(日期函数)
    Oracle(数值函数)
    Oracle(字符函数)
    Oracle(order by)
    Oracle(限定查询2)
    Oracle(限定查询1)
    Oracle其他简单查询
    Oracle简单语句查询
    SQLPlus
    解决方案
  • 原文地址:https://www.cnblogs.com/zhuojun/p/4002797.html
Copyright © 2011-2022 走看看