hz_meeting_学习笔记1_后台通讯·通用链表·结构体实现隐藏

来源:互联网 发布:cisco 根据ip查端口 编辑:程序博客网 时间:2024/05/09 02:56

我超喜欢这个讨论会啊~每周五下午三点半。。。。

会议1: interbank2结构,泛型链表的实现。

interbank2结构

今天周五又开会啦~会上厉工(厉华,很可爱的以为70后啊~)描述了interbank2的结构和原理,基本上涉及的是多进程,进程间通信和互斥访问资源的问题。以及一些细节设计,虽然自己接触进程线程和通信的只是不多~但还是可以听得懂的。

 

其中,

    每个子进程通过信号量进入临界区,从而保证任何时刻有且只有一个进程在accept监听。其中当进程进入临界区的选择是通过操作系统完成。其中每个进程通过一个共享内存与管理进程通信,比如管理进程可以从共享内存中知道进程的状态,进程已经完成的任务数以及其他一些信息。同时管理进程也可以通过这种方式指示进程做什么事(子进程分为,空闲,监听和忙碌状态,每个状态转换的时候都会去读一下共享内存中自己对应的内容,同时也会更改一些自己的状态和日志等,比如状态)。总之这块共享内存是管理进程与子进程的交互之处。其中如果当管理进程检查状态发现某进程的执行人物总数大于Max_mission的时候就会向该进程发出kill信号。要求其销毁,这样做的原因是如果应用端的人员使用的malloc等动态分配内存的时候忘记释放则kill之后会自动释放,提高安全性。同时管理进程也可以通过该共享内存中进程状态来维持相对稳定的空闲进程数目来应对后续任务(多则杀,少则加,但是无论是减还是加都有上限,这个可以由管理进程来读取一个配置文件获得相应的信息,有必要子进程也配备一个配置文件么?用途?)。

这个的好处:

1.       只有一个工作进程才去监听端口,这样就不会有管理进程监听然后传递给工作进程套接字描述符这个步骤(这个步骤很麻烦,不能直接传递套接字描述符)。

2.       还有就是当一个监听到达的时候,只会有一个进程返回,改写状态,退出临界区,然后由操作系统任意选一个空闲进程获得临界区。(也可以用队列的形式代替临界区,优劣?!)

3.       可以一定程度上复用fork资源(这是一个耗时和资源的操作)。

4.       安全性,malloc的解决方法。

泛型链表的实现

参考unixm_queue的实现;

1.       使用节点挂节点的实现方式:

 

     其中有两个必须成员void *memberfree_func_ptr函数指针。

这样实现的方式是可以挂载不同的数据类型的节点,并且释放函数也是自己挂在的的。可以包含malloc的结构中包含一个指针,指向又一个通过malloc的获得的内存对象。这样只可以调用挂在的free函数还实现释放。这样才可以通过一个通用的方式像所有情况提供一个统一的方法,即该方法不知道应用的内存管理方式。虽然释放malloc的内存不需要知道其类型,只需要知道首地址即可(回忆free()的原理,首地址向前偏移一个结构体,然后is_valid = 1的实现)。

其中hz_bank的实现是通过提供一个分配子来进行内存分配。从而可以控制用户行为,而且同时可以自己获得需要的信息而不用应用开发人员来进行管理等。比如获得free_func_ptr函数。就是通过分配子来获得的。从而只需要从分配子中取出其即可(这个不对吧?函数怎么能自动生成?除非只是给出了一些需要释放的const指针数组?)。但是思想还是可以采纳的:即用户通过平台提供的函数来完成其需求,同时平台在未受干预的情况下获得对这个需求的必要后续处理信息(一是安全的平台管理,而是省去了开发人员的细节处理)。然后再提供统一的函数来获取一个节点,下一个节点等函数。

 

2.       就是使用offsetof来进行,但是这种情况需要结构必须挂接这个结构体才行。详细设计参考。m_queuq

 

这种嵌套设计实际上是通过嵌套的结构体作为链表来进行节点的查找等工作,由于大结构体和小结构体(通用)的首地址一样,所以只需要通过通用结构体进行查找等操作,然后进行适当的类型转换即可获得大结构体(实际中的数据携带者),同时,可以用一个char[x]数据在大结构体中保存类型信息。然后应用通过无数个if来判断即可获得类型信息。

还有什么好发放来进行类型信息的携带么?

类型信息隐藏C实现

将结构信息写到.c中,然后在.h中写上相应的方法和一个结构指针即可。使用的时候将指针传给函数。然后便可获得相应的数据。

原创粉丝点击