Browsed by
月份:2015年9月

计算机网络的体系结构(Computer Network Architecture)

计算机网络的体系结构(Computer Network Architecture)

计算机网络的体系结构

几个重要概念: 接口 服务 协议

哲学家模型:

[哲学家模型的图片]

哲学家模型体现了两个重要的问题:

  • 不同系统的对等层(peer layer)之间(秘书1与秘书2 翻译1与翻译2)存在协议   同一系统的上下层之间(哲学家1 与翻译1 , 翻译1 与 秘书1 )是服务和被服务的关系,不存在协议,服务的调用通过两层之间的接口进行
  • 保持对上下层提供的服务不变的前提下, 对等层的协议可任意规定(如 两个翻译家可以都使用Spanish或者都使用Dutch进行交流 不影响哲学家收到正确的信息)

计算机网络的体系结构

1.ISO提出的 OSI/RM 七层结构

[七层结构图]

空间 - 1

2.TCP/IP RM 结构

[五层结构图]

空间 - 2

每一层的作用:

  • 应用层: 提供各种应用程序服务
  • 传输层:保证报文能够正确,按序到达
  • 网络层:路由
  • 网络硬件, 后来分为两层:
    • 数据链路层: 比特差错校验
    • 物理层: 实现透明的比特传输

 

__attribute__ in C

__attribute__ in C

__atrribute__ in C

Take a look at this code for example (in Cygwin master branch /winsup/cygwin/winsup.h)

Then gcc xxx.c and then run the code it will print out “Hello World” ~

So why it works?

The code with constructor attribute run before main function and code with destructor attr run after main function

The __attribute__ can do more than above

Another usage of __attribute__ is to customize the section of a certain code , take a look at this example:

Then compile the code and run readelf tool to check the section in the code:
$ readelf -S a.out

You can see a section called my_custom_section and with AX acess(alloc + executable)

This proves that we can use __attribute__ to customize the section

Linking

Linking

Linking

Compiler Drivers

  • When you run gcc -O2 -g -o p main.c swap.c ,These things happen

    • First the C preprocessor translate main.cpp into main.i

      main.cpp—->(cpp)—->main.i

      cpp main.c /tmp/main.i

    • Then main.i was compiled by C Compiler (cc1) into main.s

      main.i—->(cc1)—->main.s

      cc1 /tmp/main.i main.c -O2 -o /tmp/main.s

    • Then the driver runs the assembler(as) and create a relocatable object file main.o
      main.s—->(as)—->main.o

      as -o /tmp/main.o /tmp/main.s

    • Same things are done for swap.c

    • Finally it runs the linker(ld) which combines main.o and swap.o and other necessary files to create excuteable object file p

      main.o + swap.o + other system object files —->(ld)—->p

  • What is Static Linking

Windows 下同步(多线程协调)的实现 的简单解释

Windows 下同步(多线程协调)的实现 的简单解释

Windows下的多个线程之间的通信,是通过各种Object进行的, 目前我只了解到EventObject, 下面简单介绍一下什么是EventObject .

我们可以把各个线程想象成一些不同的流水线,比如制作面包的流水线, 一个线程(流水线)负责制作面包,另一个流水线负责将面包包装好,那么这两个流水线就存在逻辑上的顺序, 即使他们同时工作,包装的如果不等制作面包的制作好,是无法进行的. 在系统里也是这样 两个(或者多个)线程之间有依赖关系, 比如B要在A完成后才可以处理,C要等D E完成之后才能处理. 那么,多个线程之间如何协调好这个关系呢. 这时候Windows就使用EventObject来给各个线程发送信号,EventObject可以有名字也可以没有名字, 带名字的在多线程同步时很常用(这里说明一下 ,多个线程之间协调工作就叫同步), 在多线程同步处理事件的时候 , 首先建立好一系列的EventObject(和其他Object) ,然后 线程A执行开始的时候 将EventObjectA设置为FALSE(没被触发状态) 这时 线程B在等待EventObjectA的信号(就是保持挂起状态,一旦有信号激活就会开始执行) , 然后线程A执行完毕之后 , 就会将EventObjectA设置为TRUE (触发状态) 这时, 由于EventObjectA被触发, 线程B也就同时启动了,然后开始执行线程B,这样就实现了线程之间的同步

有关NtCreateEvent和 EventObject的说明 参见msdn文档

https://msdn.microsoft.com/en-us/library/windows/hardware/ff566423(v=vs.85).aspx NtCreateEvent 的介绍

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682655(v=vs.85).aspx EventObject的介绍